Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
forexman77
2140
forexman77  

Использую в индикаторах на 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);
  }
Dmitry Fedoseev
43501
Dmitry Fedoseev  
forexman77:

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

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

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

Dmitry Fedoseev
43501
Dmitry Fedoseev  

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

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

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

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

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

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

Dmitry Fedoseev
43501
Dmitry Fedoseev  
forexman77:

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

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

Специально сейчас проверил - все нормально. Оригинал (который здесь) вызывается на каждом баре, с моей коррекцией вызывается на каждом баре и раз в пять баров, значения совпадают абсолютно точно.
forexman77
2140
forexman77  
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;
forexman77
2140
forexman77  
Раньше на "iMAOnArray" оптимизация длилась примерно часа три. Сейчас на "MovingAverages.mqh" 57 минут показывает. Вообще классно получается)
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий