Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
На MQL5.community есть возможность хранить исходные коды в MQL5 Storage. Попробуй сам!
forexman77
2071
forexman77 2016.04.09 12:49 

Использую в индикаторах на 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
41190
Dmitry Fedoseev 2016.04.10 09:18  
forexman77:

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

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

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

Dmitry Fedoseev
41190
Dmitry Fedoseev 2016.04.10 09:42  

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

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

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

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

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

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

Dmitry Fedoseev
41190
Dmitry Fedoseev 2016.04.10 16:32  
forexman77:

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

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

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