Индикатор строится на ТФ <= 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;
}
Скачать исходный текст