Первый индикатор новичка, подскажите что делаю не так

 

Алоха!) Пытаюсь написать свой первый индикатор, даже сказал бы переписать индикатор в свой, но чтот вовсе не выходит..

Был взят самый просто индикатор из статьи _https://www.mql5.com/ru/articles/37 SMA.mql5

Переделал я его в общем вот так (были переименованы некоторые входные данные и добавлены новые.Добавлен новый буфер. И индикатор должен по идее отрисовать 2е одинаковые линии, но у меня это выглядит примерно вот так - скрин прикрепляю)

#property indicator_separate_window

#property indicator_buffers 2

#property indicator_plots   2

#property indicator_type1   DRAW_LINE

#property indicator_color1  Red

#property indicator_type2   DRAW_LINE

#property indicator_color2  Green

  

input int tPeriod = 13;

input int l1Shift = 0; 

input int l2Shift = 0; 

  

double ExtLine1Buffer[]; 

double ExtLine2Buffer[]; 

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+  

void OnInit()

  {

   SetIndexBuffer(0, ExtLine1Buffer, INDICATOR_DATA);

   SetIndexBuffer(1, ExtLine1Buffer, INDICATOR_DATA);

   PlotIndexSetInteger(0, PLOT_SHIFT, l1Shift);

   PlotIndexSetInteger(1, PLOT_SHIFT, l2Shift);

   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, tPeriod - 1);

   PlotIndexSetInteger(1, PLOT_DRAW_BEGIN, tPeriod - 1);

  }

//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])

  {

   if (rates_total < tPeriod - 1)

    return(0);

    

   int first, bar, iii;

   double Sum, SMA;

   

   if (prev_calculated == 0)

    first = tPeriod - 1 + begin;

   else first = prev_calculated - 1;


   for(bar = first; bar < rates_total; bar++)

    {

     Sum = 0.0;

     for(iii = 0; iii < tPeriod; iii++)

      Sum += price[bar - iii];

     

     SMA = Sum / tPeriod;

      

     ExtLine1Buffer[bar] = SMA;

     ExtLine2Buffer[bar] = SMA;

    }

     

   return(rates_total);

  }

//+------------------------------------------------------------------+

Пользовательские индикаторы в MQL5 для начинающих
Пользовательские индикаторы в MQL5 для начинающих
  • 2010.03.03
  • Nikolay Kositsin
  • www.mql5.com
Любой новый предмет для новичка с первого взгляда кажется сложным для понимания. Нам кажется простым и ясным то, что мы уже знаем. Но мы просто не помним, что всем нам когда-то приходилось изучать с нуля, даже родной язык, на котором мы разговариваем. Так и язык MQL5, таящий в себе огромные возможности для написания торговых стратегий, можно начать изучать с базовых понятий и примеров. В этой статье на примере пользовательского индикатора SMA рассматривается взаимодействие технического индикатора с клиентским терминалом MetaTrader 5.
Файлы:
scr1.jpg  178 kb
 
Gnus:

Алоха!) Пытаюсь написать свой первый индикатор, даже сказал бы переписать индикатор в свой, но чтот вовсе не выходит..

......... 

double ExtLine1Buffer[]; 

double ExtLine2Buffer[]; 

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+  

void OnInit()

  {

   SetIndexBuffer(0, ExtLine1Buffer, INDICATOR_DATA);

   SetIndexBuffer(1, ExtLine1Buffer, INDICATOR_DATA);

......................
 

Смотри вкладку эксперты: там пишет, что array out of range в такой-то строке - т.е. индекс получился <0

первый проход в цикле bar==p3-1 , а ты обращаешься low[bar - p3] , т.е. low[-1]

 

 
kazakov.v:

Смотри вкладку эксперты: там пишет, что array out of range в такой-то строке - т.е. индекс получился <0

первый проход в цикле bar==p3-1 , а ты обращаешься low[bar - p3] , т.е. low[-1]

 

Спасибо, я просто добавил проверку. чтоб значение в индексе было больше 0
 
Помогите пожалуйста !

Нужен простой код - индикатор DEMA сглаживающий MFI (два индикатора в одном окне).

Спасибо.
 
Lester: Нужен простой код - индикатор DEMA сглаживающий MFI (два индикатора в одном окне).
 Работа
 
Lester:
Помогите пожалуйста !

Нужен простой код - индикатор DEMA сглаживающий MFI (два индикатора в одном окне).

Накиньте DEMA на MFI, в параметрах DEMA укажите - "данные предыдущего индикатора". И будет у вас два индикатора в одном окне.
 
Yurich:
Накиньте DEMA на MFI, в параметрах DEMA укажите - "данные предыдущего индикатора". И будет у вас два индикатора в одном окне.

Так и сделал. Но код мне нужен для эксперта.


В настоящий момент - просто совместил коды двух индикаторов и даже отображается то что нужно, но когда начинаю перемещать окно индикатора или просто оперировать с окном, то индикатор искажает свои значения.

Индикатор прилагаю.

Файлы:
MFI_DEMA.mq5  6 kb
MFI_DEMA.ex5  12 kb
 
Lester:

Так и сделал. Но код мне нужен для эксперта.

Доступ к индикаторам из эксперта проще сделать так:

   int hmfi=iMFI(_Symbol,_Period,период_MFI,VOLUME_TICK);
   int hdemamfi=iDEMA(_Symbol,_Period,период_DEMA,0,hmfi);

 Через CopyBuffer() получайте значения MFI  и DEMA от MFI.

 
Yurich:

Доступ к индикаторам из эксперта проще сделать так:

 Через CopyBuffer() получайте значения MFI  и DEMA от MFI.


//+------------------------------------------------------------------+
...
//--- входные параметры
input int bands_period=36; // Период Bollinger Bands
input int bands_shift = 0; // Смещение ВВ
input double deviation= 2.0; // Отклонение ВВ
input int PeriodDEMA=36;// Период DEМА
input int ShiftDEMA=0;// Сдвиг DEМА
input ENUM_APPLIED_VOLUME VolumeType=VOLUME_TICK;  // Volumes
input int MFIPeriod=36; // Период MFI
input double Lot=1.0; // Количество лотов
//--- глобальные переменные
int BolBandsHandle=iBands(_Symbol,_Period,bands_period,bands_shift,deviation,PRICE_CLOSE);
int MFI_Handle=iMFI(_Symbol,_Period,MFIPeriod,VolumeType);
int DEMA_Handle=iDEMA(_Symbol,_Period,PeriodDEMA,ShiftDEMA,MFI_Handle);

double BBUp[],BBLow[],BBMidle[]; // динамические массивы для хранения численных значений Bollinger Bands
double MFI[];// массив MFI
double DEMA[];// массив DEMA

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- достаточность баров
   if(Bars(_Symbol,_Period)<60) // общее количество баров
     {
      Alert("Количество баров недостаточно");
      return(-1);
     }
   if(MFI_Handle==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора MFI");
   if(DEMA_Handle==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора DEMA"); 
...
//+------------------------------------------------------------------+

К сожалению, DEMA при этом не отображается на MFI.