Как переделать индикатор под MQL 5

 
Пытаюсь переделать простой индикатор с МТ4 под МТ5, кто знает, подскажите как это сделать, уже всю голову сломал... скрин идюка будет внизу

 

вот МТ4

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_width1 1
#property indicator_width2 1




extern double sl=0.1;




double redline[5];
double blueline[5];




//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   
  
//---- indicators
   SetIndexBuffer(0,redline);
   SetIndexBuffer(1,blueline);
  
//----
   
    SetIndexStyle(0, DRAW_ARROW, 0);
    SetIndexArrow(0, 158);
//----
    SetIndexStyle(1, DRAW_ARROW, 0);
    SetIndexArrow(1, 158);
     
   return(0);
  }
  


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[])
  {
   redline[0]=Ask+0.1;
   blueline[0]=Bid-0.1;
   redline[1]=Ask+0.1;
   blueline[1]=Bid-0.1;
   redline[2]=Ask+0.1;
   blueline[2]=Bid-0.1;
   redline[3]=Ask+0.1;
   blueline[3]=Bid-0.1;
   redline[4]=NULL;
   blueline[4]=NULL;
   
   return(0);
  }


вот МТ5

#property link      ""
#property version   "1.00"
#include <Trade\SymbolInfo.mqh>
#property indicator_chart_window

#property indicator_buffers 2
#property indicator_plots   2
#property indicator_color1 clrRed
#property indicator_color2 clrBlue
#property indicator_width1 1
#property indicator_width2 1

#property indicator_type1   DRAW_ARROW
#property indicator_style1  STYLE_SOLID

#property indicator_type2   DRAW_ARROW

#property indicator_style2  STYLE_SOLID


CSymbolInfo       c_symbol;

input double sl=0.1;


double redline[5];
double blueline[5];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,redline,INDICATOR_DATA);
   SetIndexBuffer(1,blueline,INDICATOR_DATA);
  
//----
   PlotIndexSetInteger(0,PLOT_ARROW,151);
   PlotIndexSetInteger(1,PLOT_ARROW,151);
   
   
  PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
   
    PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,1);
    
    PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,1);
   //IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
   
    //ArraySetAsSeries(redline,true);
    // ArraySetAsSeries(blueline,true);
   
  // PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
  
  
  // PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
    //SetIndexStyle(0, DRAW_ARROW, 0);
    //SetIndexArrow(0, 158);
//----
    //SetIndexStyle(1, DRAW_ARROW, 0);
    //SetIndexArrow(1, 158);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---

//for (int i=5; i>0; i--)
// {
// redline[i]=close[i];
// }
 
  c_symbol.Name();
   redline[0]=c_symbol.Ask()+0.1;
   blueline[0]=c_symbol.Bid()-0.1;
  // redline[1]=open[0];
  // blueline[1]=close[0];
   redline[1]=c_symbol.Ask()+0.1;
   blueline[1]=c_symbol.Bid()-0.1;
   redline[2]=c_symbol.Ask()+0.1;
   blueline[2]=c_symbol.Bid()-0.1;
   redline[3]=c_symbol.Ask()+0.1;
   blueline[3]=c_symbol.Bid()-0.1;
   redline[4]=0;
   blueline[4]=0; 
   
  
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }

вот сам индикатор, на заданном интервале от цены выстраивает линии из точек

вот сам индюк

 
Aleksandr Goryachev:
Пытаюсь переделать простой индикатор с МТ4 под МТ5, кто знает, подскажите как это сделать, уже всю голову сломал... скрин идюка будет внизу

 

вот МТ4


вот МТ5

вот сам индикатор, на заданном интервале от цены выстраивает линии из точек


У вас нечто странное написано под МТ5. Во первых, у индикаторных ордеров не задаются размеры, они динамические и размер определяет система. Потом, вы пишете в четыре ячейки буфера одно и то же, а в пятое нули. Смысл сего действия.

Короче, возьмите исходники самого простого индикатора, например мувинга, и посмотрите, как индикаторы правильно пишутся. Ваш код надо полностью переписывать. А неужели под МТ4 это работает? Не верю ))

 
Alexey Volchanskiy:

У вас нечто странное написано под МТ5. Во первых, у индикаторных ордеров не задаются размеры, они динамические и размер определяет система. Потом, вы пишете в четыре ячейки буфера одно и то же, а в пятое нули. Смысл сего действия.

Короче, возьмите исходники самого простого индикатора, например мувинга, и посмотрите, как индикаторы правильно пишутся. Ваш код надо полностью переписывать. А неужели под МТ4 это работает? Не верю ))

на мт4 всё отлично, вот начал мт5 осваивать и не выходит ничего... я картинку прикрепил, что бы понятно было. Суть в том, что бы отображать 4 точки на одном уровне от цены, а пятая с нулём, что бы затирать "след", это для лучшего восприятия, когда работаешь с переменным масштабом. На другие индюки уже смотрел, но ни чего не понял...

Файлы:
2BRENTM1.png  36 kb
 
Alexey Volchanskiy:

У вас нечто странное написано под МТ5. Во первых, у индикаторных ордеров не задаются размеры, они динамические и размер определяет система. Потом, вы пишете в четыре ячейки буфера одно и то же, а в пятое нули. Смысл сего действия.

Короче, возьмите исходники самого простого индикатора, например мувинга, и посмотрите, как индикаторы правильно пишутся. Ваш код надо полностью переписывать. А неужели под МТ4 это работает? Не верю ))

Прикол в том, что в 4 работает (судя по скрину, не запускал), а поправленный должным образом для 5 (буферы и т.п.) - ни в какую, т.е. инспектор буферы видит, но в них пусто. Сам чешу репу, не понимаю (хотя нюансов 5 не знаю, пишу под 4).
 

А почему буферы статические?

И в mql4

double redline[5];
double blueline[5];



   SetIndexBuffer(0,redline);
   SetIndexBuffer(1,blueline);

и в mql5

double redline[5];
double blueline[5];



   SetIndexBuffer(0,redline,INDICATOR_DATA);
   SetIndexBuffer(1,blueline,INDICATOR_DATA);

Следующий вопрос: Зачем назначать стиль для точек?

#property indicator_type1   DRAW_ARROW
#property indicator_style1  STYLE_SOLID

#property indicator_type2   DRAW_ARROW

#property indicator_style2  STYLE_SOLID
 
Alexey Viktorov:

А почему буферы статические?

И в mql4

и в mql5

Следующий вопрос: Зачем назначать стиль для точек?

С буферами уже разобрались. Стиль для точек пофиг, не нужен, но ни на что не влияет.

 

Короче, вот эта портянка должна, по идее, работать как в 4. Но пятёрка - такая пятёрка )) ща пятёрочники зашеймят )))

#property link      ""
#property version   "1.00"
#include <Trade\SymbolInfo.mqh>
#property indicator_chart_window

#property indicator_buffers 2
#property indicator_plots   2
#property indicator_color1 clrRed
#property indicator_color2 clrBlue
#property indicator_width1 1
#property indicator_width2 1

#property indicator_type1   DRAW_LINE
#property indicator_style1  STYLE_SOLID

#property indicator_type2   DRAW_LINE
#property indicator_style2  STYLE_SOLID

CSymbolInfo  c_symbol;

input double sl = 0.1;

double       redline[];
double       blueline[];

// +------------------------------------------------------------------+
// | Custom indicator initialization function                         |
// +------------------------------------------------------------------+
int OnInit()
{
        c_symbol.Name(Symbol());

        // --- indicator buffers mapping
        SetIndexBuffer(0, redline, INDICATOR_DATA);
        SetIndexBuffer(1, blueline, INDICATOR_DATA);

        // ----
        PlotIndexSetInteger(0, PLOT_ARROW, 151);
        PlotIndexSetInteger(1, PLOT_ARROW, 151);

        PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0);
        PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0.0);

        PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, 1);
        PlotIndexSetInteger(1, PLOT_DRAW_BEGIN, 1);

        // ---
        return INIT_SUCCEEDED;
}

// +------------------------------------------------------------------+
// | Custom indicator iteration function                              |
// +------------------------------------------------------------------+
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[])
{
        ArraySetAsSeries(redline, false);
        ArraySetAsSeries(blueline, false);

        c_symbol.RefreshRates();

        redline[0]  = c_symbol.Ask() + 0.1;
        blueline[0] = c_symbol.Bid() - 0.1;
        redline[1]  = c_symbol.Ask() + 0.1;
        blueline[1] = c_symbol.Bid() - 0.1;
        redline[2]  = c_symbol.Ask() + 0.1;
        blueline[2] = c_symbol.Bid() - 0.1;
        redline[3]  = c_symbol.Ask() + 0.1;
        blueline[3] = c_symbol.Bid() - 0.1;
        redline[4]  = 0;
        blueline[4] = 0;

        PrintFormat("Ask: %f, Bid: %f", c_symbol.Ask(), c_symbol.Bid());

        // --- return value of prev_calculated for next call
        return rates_total;
}
 

Бл, запостил и нашёл ашипку )) массивы в серию же надо, а не наоборот, бестолочь )) ТС, пользуйтесь.

#property link      ""
#property version   "1.00"
#include <Trade\SymbolInfo.mqh>
#property indicator_chart_window

#property indicator_buffers 2
#property indicator_plots   2
#property indicator_color1 clrRed
#property indicator_color2 clrBlue
#property indicator_width1 1
#property indicator_width2 1

#property indicator_type1   DRAW_ARROW
#property indicator_style1  STYLE_SOLID

#property indicator_type2   DRAW_ARROW
#property indicator_style2  STYLE_SOLID

CSymbolInfo  c_symbol;

input double sl = 0.1;

double       redline[];
double       blueline[];

// +------------------------------------------------------------------+
// | Custom indicator initialization function                         |
// +------------------------------------------------------------------+
int OnInit()
{
        c_symbol.Name(Symbol());

        // --- indicator buffers mapping
        SetIndexBuffer(0, redline, INDICATOR_DATA);
        SetIndexBuffer(1, blueline, INDICATOR_DATA);

        // ----
        PlotIndexSetInteger(0, PLOT_ARROW, 159);
        PlotIndexSetInteger(1, PLOT_ARROW, 159);

        PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0);
        PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0.0);

        PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, 1);
        PlotIndexSetInteger(1, PLOT_DRAW_BEGIN, 1);

        // ---
        return INIT_SUCCEEDED;
}

// +------------------------------------------------------------------+
// | Custom indicator iteration function                              |
// +------------------------------------------------------------------+
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[])
{
        ArraySetAsSeries(redline, true);
        ArraySetAsSeries(blueline, true);

        c_symbol.RefreshRates();

        redline[0]  = c_symbol.Ask() + 0.1;
        blueline[0] = c_symbol.Bid() - 0.1;
        redline[1]  = c_symbol.Ask() + 0.1;
        blueline[1] = c_symbol.Bid() - 0.1;
        redline[2]  = c_symbol.Ask() + 0.1;
        blueline[2] = c_symbol.Bid() - 0.1;
        redline[3]  = c_symbol.Ask() + 0.1;
        blueline[3] = c_symbol.Bid() - 0.1;
        redline[4]  = 0;
        blueline[4] = 0;

        // --- return value of prev_calculated for next call
        return rates_total;
}
 
SeriousRacoon:

Бл, запостил и нашёл ашипку )) массивы в серию же надо, а не наоборот, бестолочь )) ТС, пользуйтесь.

Огромнейшая благодарность, понял наконец в чём суть... всю голову с этим мт5 сломал

 
Aleksandr Goryachev:

Огромнейшая благодарность, понял наконец в чём суть... всю голову с этим мт5 сломал

Да и в четверке тоже ArraySetAsSeries(redline, trueиспользуют. Сейчас отличий четверки от пятерки не так много, как года полтора и более назад.