Индикатор строится на ТФ <= 1 час. Последнее значение индикатора = ADX(ТФ=1час) с запаздыванием на 1 бар.
Автор модификации
evge
Автор кода ADX в АД4
AlfaDirect. 2016. OX
Входящие параметры
Period - период в таймфрейме H1 для формирования ADX
Примеры работы
Исходный код
Код: Выделить всё
function Initialize()
{
  IndicatorName = "ADXHour";
  PriceStudy = false;
  AddInput("Input", Inputs.Candle);         
  AddParameter("Period", 14);
  AddSeries("ADX", DrawAs.Line, Color.Blue);   
  AddSeries("DIP", DrawAs.Line, Color.Green);   
  AddSeries("DIN", DrawAs.Line, Color.Red);     
  AddGlobalVariable("DIp", Types.Double, 0.0);
  AddGlobalVariable("DIn", Types.Double, 0.0);
  AddGlobalVariable("vATR", Types.Double, 0.0);
  AddGlobalVariable("H", Types.Double, 0.0);
  AddGlobalVariable("L", Types.Double, 0.0);
  AddGlobalVariable("C", Types.Double, 0.0);
  AddGlobalVariable("H1", Types.Double, 0.0);
  AddGlobalVariable("L1", Types.Double, 0.0);
  AddGlobalVariable("C1", Types.Double, 0.0);
}
function Evaluate()
{
// AlfaDirect. 2015. OX 
// ADX (Average Directional Index) Сглаживание EMA.
// Реализация MQL
//
// evge 20.06.2016 ADXHour модификация
double KC = (double)2.0 / (Period + 1.0);
double KE = 1.0 - KC;
if (CurrentIndex == 0)
{
   DIp = 0.0;    DIn = 0.0;    
   H = Input.High[0]; L = Input.Low[0]; C = Input.Close[0];
   H1 = H; L1 = L; C1 = C;  
}
else
{
ADX = ADX[1]; DIP = DIP[1]; DIN = DIN[1];
if ( BarTime().Hours == BarTime(-1).Hours ) {
//определяем H L C текущего часа
if (Input.High[0] > H) H = Input.High[0];
if (Input.Low[0] < L) L = Input.Low[0];
C = Input.Close[0];
} else {
    // Расчет (DX+    DX-) --------------------------
   double dH = H - H1;
   double dL = L1 - L;
   double DXp = 0.0; 
   double DXn = 0.0; 
    if (dH > 0.0) DXp = dH; else DXp = 0.0;
    if (dL > 0) DXn = dL; else DXn = 0.0; 
    if (DXp == DXn) { DXn = 0.0; DXp = 0.0; }    
    if (DXp > DXn) DXn = 0.0;     
    if (DXp < DXn) DXp = 0.0; 
    
    // Расчет TR --------------------------------------------------
    double TR = Math.Max(Math.Max(Math.Abs(H - L), Math.Abs(H - C1)), Math.Abs(L - C1));
       vATR = KE*vATR + KC*TR;
         
    // Расчет (DI+  DI-) ----------------------------------------------
    if (vATR < 0.00000000001)
    { 
        DIp = KE*DIp;  
        DIn = KE*DIn;  
        DIP = DIP[-1];
        DIN = DIN[-1];
    }
    else
    {
        DIp = KE*DIp + KC*DXp;  
        DIn = KE*DIn + KC*DXn;  
        DIP = DIp / vATR * 100.0;
        DIN = DIn / vATR * 100.0;
    }
    // ADX --------------------------------
    double  div = ( DIP[0] + DIN[0] );
    double  Buffer = 0.0;
    if (div == 0.0)  
        Buffer = 0.0;
    else
        Buffer = 100.0 * (Math.Abs(DIP[0]-DIN[0]) / div);
    ADX = KE*ADX[-1] + KC*Buffer;  
   H1 = H; L1 = L; C1 = C; 
   H = Input.High[0]; L = Input.Low[0]; C = Input.Close[0];
    
} //Hours != Hours[-1]
} //CI != 0;
}
Скачать исходный текст
 Изображения (1057)
 Изображения (1057) Архивы (82)
 Архивы (82) Текстовые файлы (9)
 Текстовые файлы (9) Документы (7)
 Документы (7) Скрипты Альфа-Директ 4 (30)
 Скрипты Альфа-Директ 4 (30)