Использование MovingAverages.mqh в MQL4

 

Использую в индикаторах на MQL4 включаемый файл <MovingAverages.mqh> для расчета. Индикаторы на нем работают быстро.

При вызове в советнике индикатор работает корректно, но если его поместить в тело условного оператора "if", то советник не открывает сделок, хотя логика советника остается та же. 

#include <MovingAverages.mqh>
#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1  Lime
#property indicator_color2  Red
#property indicator_level1 -25           // значение уровня #0 на вертикальной оси
#property indicator_level2 25            // значение уровня #1 на вертикальной оси
#property indicator_level3 0           
//--- input parameters
extern int       p2 =7;
extern int       p3 =5;
extern int       p4 =3;
extern int       p5 =3;
//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];
double ExtMapBuffer7[];
double ExtMapBuffer8[];
double ExtMapBuffer9[];
double ExtMapBuffer10[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   IndicatorBuffers(10);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexBuffer(3,ExtMapBuffer4);
   SetIndexBuffer(4,ExtMapBuffer5);
   SetIndexBuffer(5,ExtMapBuffer6);
   SetIndexBuffer(6,ExtMapBuffer7);
   SetIndexBuffer(7,ExtMapBuffer8);
   SetIndexBuffer(8,ExtMapBuffer9);
   SetIndexBuffer(9,ExtMapBuffer10);
//---
   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,BEGUN;
//--- если это первый вызов 
   BEGUN=1+p2+p3+p4+p5;
   if(prev_calculated==0) limit=rates_total-1-p2-p3-p4-p5;
   else limit=1;
   for(i=limit;i>=0;i--){ExtMapBuffer3[i]=close[i]-close[i+1];}
   for(i=limit;i>=0;i--){ExtMapBuffer4[i]=MathAbs(close[i]-close[i+1]);}
   ExponentialMAOnBuffer(rates_total,prev_calculated,BEGUN,p2,ExtMapBuffer3,ExtMapBuffer5);
   ExponentialMAOnBuffer(rates_total,prev_calculated,BEGUN,p2,ExtMapBuffer4,ExtMapBuffer6);
   ExponentialMAOnBuffer(rates_total,prev_calculated,BEGUN,p3,ExtMapBuffer5,ExtMapBuffer7);
   ExponentialMAOnBuffer(rates_total,prev_calculated,BEGUN,p3,ExtMapBuffer6,ExtMapBuffer8);
   ExponentialMAOnBuffer(rates_total,prev_calculated,BEGUN,p4,ExtMapBuffer7,ExtMapBuffer9);
   ExponentialMAOnBuffer(rates_total,prev_calculated,BEGUN,p4,ExtMapBuffer8,ExtMapBuffer10);

   for(i=limit;i>=0;i--){if(ExtMapBuffer10[i]!=0)ExtMapBuffer1[i]=100*ExtMapBuffer9[i]/ExtMapBuffer10[i];}
   ExponentialMAOnBuffer(rates_total,prev_calculated,BEGUN,p5,ExtMapBuffer1,ExtMapBuffer2);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
forexman77:

Использую в индикаторах на MQL4 включаемый файл <MovingAverages.mqh> для расчета. Индикаторы на нем работают быстро.

При вызове в советнике индикатор работает корректно, но если его поместить в тело условного оператора "if", то советник не открывает сделок, хотя логика советника остается та же. 

Его это кого? Индикаторы надо вызывать на каждом баре, хотя бы раз. Хотя, по идее, он должен заново пересчитываться и все. 

 

Лимит надо как-то так высчитывать:

limit=rates_total-prev_calculated;
Дело в том, что при пропуске нескольких баров, индикатор не рассчитывается заново (prev_calculated!=0, как было когда-то). Получается, что несколько баров пропущено, а limit всегда равен 1.
 
Dmitry Fedoseev:

Его это кого? Индикаторы надо вызывать на каждом баре, хотя бы раз. Хотя, по идее, он должен заново пересчитываться и все. 

К примеру, как раньше делал, когда индикатор сглаживал с помощью "iMAOnArray":

if (tsi1 > tsi2)
{
line1=iCustom(NULL,0,"tsiErgodic",Period_MA_1,p2,p3,p4,p5,0,1);
signal_line1=iCustom(NULL,0,"tsiErgodic",Period_MA_1,p2,p3,p4,p5,1,1);
if (line1 > signal_line1)OpnB=true;
}

 а теперь только так работает

line1=iCustom(NULL,0,"tsiErgodic",Period_MA_1,p2,p3,p4,p5,0,1);
signal_line1=iCustom(NULL,0,"tsiErgodic",Period_MA_1,p2,p3,p4,p5,1,1);
if (line1 > signal_line1 && tsi1 > tsi2)OpnB=true;
 
Dmitry Fedoseev:

Лимит надо как-то так высчитывать:

Дело в том, что при пропуске нескольких баров, индикатор не рассчитывается заново (prev_calculated!=0, как было когда-то). Получается, что несколько баров пропущено, а limit всегда равен 1.

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

Да, вообщем пойдет и так. Просто думал, что кто-то уже сталкивался с этой проблемой. 

 
forexman77:

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

Да, вообщем пойдет и так. Просто думал, что кто-то уже сталкивался с этой проблемой. 

Специально сейчас проверил - все нормально. Оригинал (который здесь) вызывается на каждом баре, с моей коррекцией вызывается на каждом баре и раз в пять баров, значения совпадают абсолютно точно.
 
Dmitry Fedoseev:
Специально сейчас проверил - все нормально. Оригинал (который здесь) вызывается на каждом баре, с моей коррекцией вызывается на каждом баре и раз в пять баров, значения совпадают абсолютно точно.

Спасибо Гуру!

Не получалось потому что пробовал так:

if(prev_calculated==0) limit=rates_total-1-p2-p3-p4-Period_MA_1;
   else limit=rates_total-prev_calculated;

 заработало вот так без "if(prev_calculated==0) limit=rates_total-1-p2-p3-p4-Period_MA_1;":

limit=rates_total-prev_calculated;
 
Раньше на "iMAOnArray" оптимизация длилась примерно часа три. Сейчас на "MovingAverages.mqh" 57 минут показывает. Вообще классно получается)
Причина обращения: