Подскажите, что я не так делаю

 

Всем доброго здоровья.

Попробовал перенести индикатор из mql4 (построение локальных экстремумов на основе ParabolicSAR). Экстремумы находит правильно, но начиная с Н1 и выше -  заполняет каждый бар дополнительными стрелками.

#property copyright "Copyright 2010, E. Kovalev"
#property link      "er-kov@yandex.ru"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   1
#property indicator_type1   DRAW_ARROW
#property indicator_color1  Red 
#property indicator_label1  "Цвет стрелки"


input double SARStep = 0.02;     // Шаг
input double SARMaxi = 0.02;     // Максимум
double step;
double maxi;

int    handle_ma;
int    handle_sar;
double buf_extrim[];
double buf_sar[];
double buf_ma[];

int OnInit()
{
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    if(SARStep < 0.0)
    {
        step = 0.02;
        Print("Входные параметры введены некорректно." 
        "Будет использовано значение SARStep - по умолчанию = ", step);
    }
    else step = SARStep;
    if(SARMaxi < 0.0)
    {
        maxi = 0.02;
        Print("Входные параметры введены некорректно.", 
        "Будет использовано значение SARMaxi - по умолчанию = ", maxi);
    }
    else maxi = SARMaxi;      
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::     
    
    SetIndexBuffer     (0, buf_extrim, INDICATOR_DATA);
    SetIndexBuffer     (1, buf_sar, INDICATOR_CALCULATIONS);
    SetIndexBuffer     (2, buf_ma,  INDICATOR_CALCULATIONS);
    
    PlotIndexSetInteger(0, PLOT_ARROW, 139);
    
    ArraySetAsSeries(buf_extrim, true);
    ArraySetAsSeries(buf_sar, true);
    ArraySetAsSeries(buf_ma,  true);
    ArrayInitialize (buf_extrim, 0.0);
    ArrayInitialize (buf_sar, 0.0);
    ArrayInitialize (buf_ma,  0.0);
    
    handle_ma  = iMA (NULL, 0, 10, 0, MODE_SMA, PRICE_MEDIAN);
    if(handle_ma < 0)
    {
        Print("iMA не создан: handle_ma = ", INVALID_HANDLE);
        Print("Ошибка исполнения = ", GetLastError());
       return(-1);
    }

    handle_sar = iSAR(NULL, 0, step, maxi);
    if(handle_sar < 0)
    {
        Print("iSAR не создан: handle_sar = ", INVALID_HANDLE);
        Print("Ошибка исполнения = ", GetLastError());
       return(-1);
    }
    
   return(0);
}

void OnDeinit(const int reason)
{
    IndicatorRelease(handle_ma);
    IndicatorRelease(handle_sar);
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime & time[],
                const double & open[],
                const double & high[],
                const double & low[],
                const double & close[],
                const long & tick_volume[],
                const long & volume[],
                const int & spread[])
{
    bool   rev_up, rev_dn;
    int    extr, up_dn = 0;
    
    int bars = rates_total; 
    int limit = prev_calculated - 1;
    if(prev_calculated == 0)     
    {
        limit = 0;  
        ArraySetAsSeries(low,  true);
        ArraySetAsSeries(high, true);
        if(CopyBuffer(handle_ma,  0, 0, bars-1, buf_ma)  <= 0) 
        {
            Print("MA NO-copy");
            return(0);
        }
        if(CopyBuffer(handle_sar, 0, 0, bars-1, buf_sar) <= 0) 
        {
            Print("SAR NO-copy");
            return(0);
        }
    }
    for(int i = limit; i < bars-1; i++)
    {
        rev_up = false; if((buf_sar[i] > buf_ma[i]) && (buf_sar[i+1] < buf_ma[i+1])) { rev_up = true; up_dn = 1;  }
        rev_dn = false; if((buf_sar[i] < buf_ma[i]) && (buf_sar[i+1] > buf_ma[i+1])) { rev_dn = true; up_dn = -1; }
        if( (rev_up) || (rev_dn) )
        {
            extr = FindExtrim(up_dn, i, buf_sar[i], bars-2, low, high);
            if(up_dn > 0) buf_extrim[extr] = high[extr];
            if(up_dn < 0) buf_extrim[extr] = low[extr];
        }
    }
   return(rates_total);
}

//=========================================================================================================

int FindExtrim(int u_d, int dt, double pr, int bar_totl, const double & low[], const double & high[])
{
    int ret;
    double pr_extr;
    for(int i = dt; i < bar_totl; i++)
    {
        if(u_d > 0) pr_extr = high[i];
        else        pr_extr = low [i];
        ret = i;
        if (pr_extr == pr) break;
    }
   return(ret);
}

Не могу понять в чем ошибка (многое перепробовал - пока безуспешно.....

С уважением, Э. Ковалев

Файлы:
extrim_1.mq5  5 kb
 
erkov:

Всем доброго здоровья.

Попробовал перенести индикатор из mql4 (построение локальных экстремумов на основе ParabolicSAR). Экстремумы находит правильно, но начиная с Н1 и выше -  заполняет каждый бар дополнительными стрелками.

Не могу понять в чем ошибка (многое перепробовал - пока безуспешно.....

С уважением, Э. Ковалев

Оригинальный код MQL4 есть?
 
Interesting:
Оригинальный код MQL4 есть?

Здравствуйте Владимир

Да, конечно есть. В МТ4 работает

Файлы:
extrimum.mq4  3 kb
 

А можно по подробней о дополнительных стрелках.

сверял результаты отрисовки индюка в MT4 и MT5. На первый взгляд разницы не обнаружил, если не считать разницы в отрисовки баров на разных ДЦ.


 
Interesting:

А можно по подробней о дополнительных стрелках.

сверял результаты отрисовки индюка в MT4 и MT5. На первый взгляд разницы не обнаружил, если не считать разницы в отрисовки баров на разных ДЦ.


Вот рисунок Н3  (до М30 - рисует нормально)б а начиная с Н1 "пририсовывает дополнительные стрелки)

уже долго пытаюсь разобраться - и никак ...

С уважением ...

Файлы:
eurusdh3.png  94 kb
 

А вот что рисуется на Н1 (рисунок совсем другой)



Файлы:
eurusdh1.png  103 kb
 

Релиз 305, EURUSD 1H.



 

Странно

Может в МТ5 что-то не так???

У меня build 305,  

 

Вот с другого ТФ Daily
Файлы:
eurusddaily.png  112 kb
 
erkov:

Вот с другого ТФ Daily

На D1 один раз подобная картинка появилась, но только один раз.

Нужно разбираться что к чему...

PS

при выполнении OnInit какой-то баг возникает, но какой понять не могу.
 
Interesting:

На D1 один раз подобная картинка появилась, но только один раз.

Нужно разбираться что к чему...

PS

при выполнении OnInit какой-то баг возникает, но какой понять не могу.

Может из-за новой версии МТ5 для х64???