Есть ли развернутый Гайд для создания индиктаров пошагово с максимальным описанием всех функций?

 
Доброго времени суток!

Работал ранее в основном на МТ4, сейчас перешел на МТ5, однако не могу найти нужную информацию по тому, как строить индикаторы правильно. 
Единственный костыль который придумал выглядит так: но по факту, вместо i должен идти limit и if(ReDraw) удаляется, однако если я делаю его таким образом, то при дальнейшем вызове через CopyBuffer - копируется только последнее значение индикатора, на 0 баре для всех ячеек массива. 

Буду рад помощи.
//+------------------------------------------------------------------+
//|                                                         Sto2.mq4 |
//|                                                          VockCap |
//|                                              https://VockCap.com |
//+------------------------------------------------------------------+
#property copyright "VockCap"
#property link      "https://VockCap.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 2
#property indicator_plots   2
//--- построение Stochastic
#property indicator_label1  "Stochastic"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrLightSeaGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- построение Signal
#property indicator_label2  "Signal"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- зададим граничные значения индикатора
#property indicator_minimum 0
#property indicator_maximum 100
//--- input parameters
input int HighLevel=90, LowLevel=10;
input int InpKPeriod=5;
input int InpDPeriod=3;
input int InpSlowing=3;
input ENUM_TIMEFRAMES TF=PERIOD_CURRENT;
ENUM_MA_METHOD  MM=MODE_SMA;
//---
double MainBuffer[], SignalBuffer[], MainBuffer1[], SignalBuffer1[];
datetime ReDraw[1]= {0};
//---
int STO_Handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//Mapping:
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- set levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,LowLevel);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,HighLevel);
//--- set maximum and minimum for subwindow
   IndicatorSetDouble(INDICATOR_MINIMUM,0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);
//--- name for DataWindow and indicator subwindow label
   string short_name=StringFormat("Stoch(%d,%d,%d)",InpKPeriod,InpDPeriod,InpSlowing);
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
   PlotIndexSetString(0,PLOT_LABEL,"Main");
   PlotIndexSetString(1,PLOT_LABEL,"Signal");
//NameOfIndicator:
//IndicatorSetString(INDICATOR_SHORTNAME,"MultiFrame Stoch("+IntegerToString(InpKPeriod)+","+IntegerToString(InpDPeriod)+","+IntegerToString(InpSlowing)+","+string(TF)+")");
//MQL_Parrams:
   STO_Handle=iStochastic(Symbol(),TF,InpKPeriod,InpDPeriod,InpSlowing,MODE_SMA,STO_LOWHIGH);
   MqlParam pars[5];
//--- период K для расчетов
   pars[0].type=TYPE_INT;
   pars[0].integer_value=InpKPeriod;
//--- период D для первичного сглаживания
   pars[1].type=TYPE_INT;
   pars[1].integer_value=InpDPeriod;
//--- период K для окончательного сглаживания
   pars[2].type=TYPE_INT;
   pars[2].integer_value=InpSlowing;
//--- тип сглаживания
   pars[3].type=TYPE_INT;
   pars[3].integer_value=MM;
//--- способ расчета стохастика
   pars[4].type=TYPE_INT;
   pars[4].integer_value=STO_LOWHIGH;
   STO_Handle=IndicatorCreate(_Symbol,TF,IND_STOCHASTIC,5,pars);
//--- покажем на какой паре символ/таймфрейм рассчитан индикатор Stochastic Oscillator
   short_name=StringFormat("iStochastic(%s/%s, %d, %d, %d, %s, %s)",Symbol(),EnumToString(TF),InpKPeriod,InpDPeriod,InpSlowing,MM,STO_LOWHIGH);
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//---
   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[])
  {
//---
   int i,limit;
//Limit
   if(prev_calculated==0)
      limit=100;
   else
      limit=prev_calculated-1;
//---for
   if(ReDraw[0]!=iTime(NULL,PERIOD_CURRENT,0))
     {
      for(i=0;i<rates_total;i++)
        {
         ChartRedraw(0);
         if(CopyBuffer(STO_Handle,0,time[i],1,MainBuffer1)<0)
           {
            //Alert("Ошибка копирования буферов индикатора AC - номер ошибки:",GetLastError());
            return(0);
           }
         if(CopyBuffer(STO_Handle,1,time[i],1,SignalBuffer1)<0)
           {
            //Alert("Ошибка копирования буферов индикатора AC - номер ошибки:",GetLastError());
            return(0);
           }
         MainBuffer[i]= MainBuffer1[0];
         SignalBuffer[i]=SignalBuffer1[0];
        }
      ArrayFill(ReDraw,0,1,iTime(NULL,PERIOD_CURRENT,0));
     }
//---
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Indicator deinitialization function                              |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(STO_Handle!=INVALID_HANDLE)
      IndicatorRelease(STO_Handle);
//--- почистим график при удалении индикатора
   Comment("");
  }
//+------------------------------------------------------------------+


 
Статьи читать
 
Rashid Umarov #:
Статьи читать

Есть ссылки?

 
Sergei Melnikov #:

Есть ссылки?

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

По сути же. Самое главное отличие индикаторов MQL5 от MQL4 - разное направление нумерации баров. Чтобы в MQL5 установить нумерацию, совпадающую с MQL4, для всех буферов индикатора проделайте следующее:

ArraySetAsSeries(buffer, true);
Статьи по MQL5
Статьи по MQL5
  • www.mql5.com
Статьи по программированию на языке MQL5
 
Ihor Herasko #:

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

По сути же. Самое главное отличие индикаторов MQL5 от MQL4 - разное направление нумерации баров. Чтобы в MQL5 установить нумерацию, совпадающую с MQL4, для всех буферов индикатора проделайте следующее:

Благодарю.