Как правильно использовать хэндл индикатора в советниках и индикаторах - страница 2

 
Tango_X:

Ума даже не представляю как можно написать собственный индикатор без помощи других индикаторов.Тот же MACD использует 2 хэндла.

Да уж...великий и могучий MQL язык...

Всё рассчитывается. MACD - это разница двух MA. МА можно рассчитать самому по данными таймсерий. И так любой индикатор. Например, в СБ в файле MovingAverages.mqh есть все расчёты МА.

Подключайте его к вашему файлу (#include <MovingAverages.mqh>) и используйте.

 
Tango_X:

Только что добавил в MACD копирование хендлов стандартных индикаторов т.е. НЕ через iCustom()  - ВСЕ РАБОТАЕТ МОМЕНТАЛЬНО И БЫСТРО. В чем же все таки дело??

iCustom работает медленно. Именно это я и имел в виду, когда предлагал вынести код из индикатора-обертки. А если устраивают стандартные, так конечно надо их и использовать .

 
Artyom Trishkin:

Всё рассчитывается. MACD - это разница двух MA. МА можно рассчитать самому по данными таймсерий. И так любой индикатор. Например, в СБ в файле MovingAverages.mqh есть все расчёты МА.

Подключайте его к вашему файлу (#include <MovingAverages.mqh>) и используйте.

Артем прав, в вашем случае все действительно элементарно.

 
Alexey Volchanskiy:

Артем прав, в вашем случае все действительно элементарно.

у меня есть 6 индикаторов, по сигналам которых я хочу написать мультитаймфреймового советника (индикаторы не по пересечению МА, как MACD и др., а более сложные, МАСD был взят для простоты понимания проблемы) то мне необходимо создавать отдельный индикатор и вытягивать код и 6-ти этих же индикаторов в один свой индикатор, разбираясь в логике работы каждого индикатора? Вы это предлагаете? 


P/S/

какие негодяи придумали тогда хэндлы))

 
Tango_X:

у меня есть 6 индикаторов, по сигналам которых я хочу написать мультитаймфреймового советника (индикаторы не по пересечению МА, как MACD и др., а более сложные, МАСD был взят для простоты понимания проблемы) то мне необходимо создавать отдельный индикатор и вытягивать код и 6-ти этих же индикаторов в один свой индикатор, разбираясь в логике работы каждого индикатора? Вы это предлагаете? 


P/S/

какие негодяи придумали тогда хэндлы))

Если стандартные работают быстро, оставьте все, как есть. Это негодяи, которые используют индикаторы для отображения на экране, а не чисто для расчетов.

Хотите быстро - приложите усилия. Я расчетные индикаторы всегда препарирую и вставляю в код только расчетную часть.

 
Alexey Volchanskiy:

Если стандартные работают быстро, оставьте все, как есть. Это негодяи, которые используют индикаторы для отображения на экране, а не чисто для расчетов.

Хотите быстро - приложите усилия. Я расчетные индикаторы всегда препарирую и вставляю в код только расчетную часть.

Спасибо за помощь!

 
Alexey Volchanskiy:

Если стандартные работают быстро, оставьте все, как есть. Это негодяи, которые используют индикаторы для отображения на экране, а не чисто для расчетов.

Хотите быстро - приложите усилия. Я расчетные индикаторы всегда препарирую и вставляю в код только расчетную часть.

А если расчётная часть зависит от предыдущего значения? А та в свою очередь зависит от своей предыдущей...

 
Alexey Viktorov:

А если расчётная часть зависит от предыдущего значения? А та в свою очередь зависит от своей предыдущей...

Значит надо это учесть и модифицировать расчеты. Простое избавление от индикаторной обертки ускоряет расчеты, которые внутри индикатора до 2-х раз.

 
Alexey Viktorov:

А если расчётная часть зависит от предыдущего значения? А та в свою очередь зависит от своей предыдущей...

Расчётный буфер. В индикаторе естественно.

В функции - переменная, хранящая прошлое рассчитанное значение.

 

Внёс изменения в советник: теперь можно вызывать или "Examples\\MACD" или "Examples\\MACD handels".

"Examples\\MACD handels" - это стандартный MACD в котором есть этот код:

//--- MA handles
int                      ExtFastMaHandle;
int                      ExtSlowMaHandle;
//--- handles
int            handle1,handle2,handle3,handle4,handle5,handle6;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtMacdBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ExtFastMaBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,ExtSlowMaBuffer,INDICATOR_CALCULATIONS);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpSignalSMA-1);
//--- name for Dindicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"MACD("+string(InpFastEMA)+","+string(InpSlowEMA)+","+string(InpSignalSMA)+")");
//--- get MA handles
   ExtFastMaHandle=iMA(NULL,0,InpFastEMA,0,MODE_EMA,InpAppliedPrice);
   ExtSlowMaHandle=iMA(NULL,0,InpSlowEMA,0,MODE_EMA,InpAppliedPrice);
//---
   handle1=iCustom(NULL,0,"Examples\\Alligator");
   handle2=iCustom(NULL,0,"Examples\\RSI");
   handle3=iCustom(NULL,0,"Examples\\Stochastic");
   handle4=iCustom(NULL,0,"Examples\\Fractals");
   handle5=iCustom(NULL,0,"Examples\\ATR");
   handle6=iCustom(NULL,0,"Examples\\ADX");

   if(handle1<0 || handle2<0 || handle3<0 || handle4<0 || handle5<0 || handle6<0)
     {
      Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");
     }
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+


В самом советнике в OnInit() прописал "дёргать нужные символы по всем таймфреймам":

//--- дёргаем нужные символы на всех таймреймах
   string array_symbols[3]={"EURUSD","GBPUSD","USDCHF"};
   ENUM_TIMEFRAMES array_timiframes[21]=
     {
      PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,
      PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M20,
      PERIOD_M30,PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,
      PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,
      PERIOD_MN1
     };
   double array[1000];
   int size_symbols=ArraySize(array_symbols);
   int size_timiframes=ArraySize(array_timiframes);
   for(int i=0;i<size_symbols;i++)
      for(int j=0;j<size_timiframes;j++)
         CopyClose(array_symbols[i],array_timiframes[j],0,1000,array);
//--- Получаем хэндл индикатора


Теперь можно быстро сравнивать быстродействие при вызове или "Examples\\MACD" или "Examples\\MACD handels".

Файлы:
Test.mq5  23 kb
Причина обращения: