Код: Выделить всё
function Initialize()
{
IndicatorName = "ADX";
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);
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("DIp", Types.Double, 0.0);
AddGlobalVariable("DIn", Types.Double, 0.0);
AddGlobalVariable("vATR", Types.Double, 0.0);
}
function Evaluate()
{
// AlfaDirect. 2015. OX
// ADX (Average Directional Index) Сглаживание EMA.
// Реализация MQL
double KC = (double)2.0 / (Period + 1.0);
double KE = 1.0 - KC;
if (CurrentIndex == 0)
{
DIp = 0.0; DIn = 0.0; DIP = 0.0; DIN = 0.0; ADX = 0.0;
vATR = Input.High[0] - Input.Low[0];
}
else
{
// Расчет (DX+ DX-) --------------------------
double dH = Input.High[0] - Input.High[-1];
double dL = Input.Low[-1] - Input.Low[0];
double DXp = 0.0;
double DXn = 0.0;
double DXp+ = 0.0;
double DXn- = 0.0;
if (dH > 0.0)
DXp = dH;
else
DXp = 0.0;
if (dH > 0.0)
DXp+ = dH;
else
DXp+ = 0.0;
if (dL > 0)
DXn = dL;
else
DXn = 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; DXp+ = 0.0;
}
if (DXp > DXn)
DXn = 0.0;
if (DXp < DXn)
DXp = 0.0;
if (DXp+ > DXn-)
DXn- = 0.0;
if (DXp+ < DXn-)
DXp+ = 0.0;
// Расчет TR --------------------------------------------------
double TR = Math.Max(Math.Max(Math.Abs(Input.High[0] - Input.Low[0]), Math.Abs(Input.High[0] - Input.Close[-1])), Math.Abs(Input.Low[0] - Input.Close[-1]));
vATR = KE*vATR + KC*TR;
// Расчет (DI+ DI-) ----------------------------------------------
if (vATR < 0.00000000001)
{
DIp = KE*DIp;
DIn = KE*DIn;
DIp = KE*DIp+;
DIn = KE*DIn-;
DIP = DIP[-1];
DIN = DIN[-1];
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;
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;
}
}
где косяк??