Общие вопросы по разработке > ADX

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
Сергей
Сообщения: 34
Зарегистрирован: 01 апр 2016, 17:03

ADX

Непрочитанное сообщение Сергей » 03 ноя 2017, 23:57

дОБРЫЙ ВСЕМ...вот пытаюсь написать индюк адх чтоб отображался 2 шт в одном окне....чот не получается((((

Код: Выделить всё

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; 
}
}

где косяк??

Аватара пользователя
Den
Сообщения: 352
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 14 раз
Поблагодарили: 4 раза

Re: ADX

Непрочитанное сообщение Den » 04 ноя 2017, 01:42

для наглядности :)


Код: Выделить всё

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;
}
}

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

Re: ADX

Непрочитанное сообщение evge » 04 ноя 2017, 09:15

Сергей писал(а):вот пытаюсь написать индюк адх чтоб отображался 2 шт в одном окне....чот не получается((((


Код: Выделить всё

function Initialize()
{
IndicatorName = "ADX2";
PriceStudy = false;
AddInput("Input", Inputs.Candle);
AddSeries("ADX1", DrawAs.Line, Color.Blue);
AddSeries("PosDI1", DrawAs.Line, Color.Green);
AddSeries("NegDI1", DrawAs.Line, Color.Red);
AddSeries("ADX2", DrawAs.Line, Color.Blue);
AddSeries("PosDI2", DrawAs.Line, Color.Green);
AddSeries("NegDI2", DrawAs.Line, Color.Red);

AddParameter("Period1", 20);
AddParameter("Period2", 50);
}

function Evaluate()
{
var A1 = ADX(Input, Period1);
var A2 = ADX(Input, Period2);

ADX1 = A1["ADX"][0];
PosDI1 = A1["PosDI"][0];
NegDI1 = A1["NegDI"][0];

ADX2 = A2["ADX"][0];
PosDI2 = A2["PosDI"][0];
NegDI2 = A2["NegDI"][0];
}
никогда такого не было и вот опять

Сергей
Сообщения: 34
Зарегистрирован: 01 апр 2016, 17:03

Re: ADX

Непрочитанное сообщение Сергей » 09 ноя 2017, 15:31

Спасибо большое...


Вернуться в «Общие вопросы по разработке»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 16 гостей