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

 


Всем привет! 

Беру стандартный индикатор MACD из папки Example, и хочу получить хендл этого индикатора в эксперте по 3-м валютным парам и по всем таймфреймам до Н12. Все хорошо, и работает как надо, НО если я добавляю кусочек кода в сам индикатор MACD, в котором хочу получить хендлы еще 5-ти индикаторов (кусочек кода выделен красным цветом ниже в индикаторе MACD) то начинается очень огромная нагрузка на процессор и ОЗУ. ЧТО Я ДЕЛАЮ НЕПРАВИЛЬНО?

//+------------------------------------------------------------------+
//|                                                       Expert.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

int               Handle_EURUSD_M1, Handle_EURUSD_M2, Handle_EURUSD_M3, Handle_EURUSD_M4, Handle_EURUSD_M5, Handle_EURUSD_M6, Handle_EURUSD_M10, Handle_EURUSD_M12, Handle_EURUSD_M15, Handle_EURUSD_M20, Handle_EURUSD_M30, Handle_EURUSD_H1, Handle_EURUSD_H2, Handle_EURUSD_H3, Handle_EURUSD_H4,  Handle_EURUSD_H6, Handle_EURUSD_H8, Handle_EURUSD_H12, Handle_EURUSD_D1; // Хэндл индикатора SRP
int               Handle_GBPUSD_M1, Handle_GBPUSD_M2, Handle_GBPUSD_M3, Handle_GBPUSD_M4, Handle_GBPUSD_M5, Handle_GBPUSD_M6, Handle_GBPUSD_M10, Handle_GBPUSD_M12, Handle_GBPUSD_M15, Handle_GBPUSD_M20, Handle_GBPUSD_M30, Handle_GBPUSD_H1, Handle_GBPUSD_H2, Handle_GBPUSD_H3, Handle_GBPUSD_H4,  Handle_GBPUSD_H6, Handle_GBPUSD_H8, Handle_GBPUSD_H12, Handle_GBPUSD_D1; // Хэндл индикатора SRP 
int               Handle_USDCHF_M1, Handle_USDCHF_M2, Handle_USDCHF_M3, Handle_USDCHF_M4, Handle_USDCHF_M5, Handle_USDCHF_M6, Handle_USDCHF_M10, Handle_USDCHF_M12, Handle_USDCHF_M15, Handle_USDCHF_M20, Handle_USDCHF_M30, Handle_USDCHF_H1, Handle_USDCHF_H2, Handle_USDCHF_H3, Handle_USDCHF_H4,  Handle_USDCHF_H6, Handle_USDCHF_H8, Handle_USDCHF_H12, Handle_USDCHF_D1; // Хэндл индикатора SRP
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//--- Получаем хэндл индикатора
      
      Print("Начало.....");
      Handle_EURUSD_M1=iCustom("EURUSD",PERIOD_M1,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_EURUSD_M2=iCustom("EURUSD",PERIOD_M2,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_EURUSD_M3=iCustom("EURUSD",PERIOD_M3,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_EURUSD_M4=iCustom("EURUSD",PERIOD_M4,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_EURUSD_M5=iCustom("EURUSD",PERIOD_M5,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_EURUSD_M6=iCustom("EURUSD",PERIOD_M6,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_EURUSD_M10=iCustom("EURUSD",PERIOD_M10,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_EURUSD_M12=iCustom("EURUSD",PERIOD_M12,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_EURUSD_M15=iCustom("EURUSD",PERIOD_M15,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_EURUSD_M20=iCustom("EURUSD",PERIOD_M20,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_EURUSD_M30=iCustom("EURUSD",PERIOD_M30,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_EURUSD_H1=iCustom("EURUSD",PERIOD_H1,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_EURUSD_H2=iCustom("EURUSD",PERIOD_H2,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_EURUSD_H3=iCustom("EURUSD",PERIOD_H3,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_EURUSD_H4=iCustom("EURUSD",PERIOD_H4,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_EURUSD_H6=iCustom("EURUSD",PERIOD_H6,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_EURUSD_H8=iCustom("EURUSD",PERIOD_H8,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_EURUSD_H12=iCustom("EURUSD",PERIOD_H12,"Examples\\MACD",12,26,9,PRICE_CLOSE);

      Handle_GBPUSD_M1=iCustom("GBPUSD",PERIOD_M1,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_GBPUSD_M2=iCustom("GBPUSD",PERIOD_M2,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_GBPUSD_M3=iCustom("GBPUSD",PERIOD_M3,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_GBPUSD_M4=iCustom("GBPUSD",PERIOD_M4,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_GBPUSD_M5=iCustom("GBPUSD",PERIOD_M5,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_GBPUSD_M6=iCustom("GBPUSD",PERIOD_M6,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_GBPUSD_M10=iCustom("GBPUSD",PERIOD_M10,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_GBPUSD_M12=iCustom("GBPUSD",PERIOD_M12,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_GBPUSD_M15=iCustom("GBPUSD",PERIOD_M15,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_GBPUSD_M20=iCustom("GBPUSD",PERIOD_M20,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_GBPUSD_M30=iCustom("GBPUSD",PERIOD_M30,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_GBPUSD_H1=iCustom("GBPUSD",PERIOD_H1,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_GBPUSD_H2=iCustom("GBPUSD",PERIOD_H2,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_GBPUSD_H3=iCustom("GBPUSD",PERIOD_H3,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_GBPUSD_H4=iCustom("GBPUSD",PERIOD_H4,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_GBPUSD_H6=iCustom("GBPUSD",PERIOD_H6,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_GBPUSD_H8=iCustom("GBPUSD",PERIOD_H8,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_GBPUSD_H12=iCustom("EURUSD",PERIOD_H12,"Examples\\MACD",12,26,9,PRICE_CLOSE);

      Handle_USDCHF_M1=iCustom("USDCHF",PERIOD_M1,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_USDCHF_M2=iCustom("USDCHF",PERIOD_M2,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_USDCHF_M3=iCustom("USDCHF",PERIOD_M3,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_USDCHF_M4=iCustom("USDCHF",PERIOD_M4,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_USDCHF_M5=iCustom("USDCHF",PERIOD_M5,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_USDCHF_M6=iCustom("USDCHF",PERIOD_M6,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_USDCHF_M10=iCustom("USDCHF",PERIOD_M10,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_USDCHF_M12=iCustom("USDCHF",PERIOD_M12,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_USDCHF_M15=iCustom("USDCHF",PERIOD_M15,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_USDCHF_M20=iCustom("USDCHF",PERIOD_M20,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_USDCHF_M30=iCustom("USDCHF",PERIOD_M30,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_USDCHF_H1=iCustom("USDCHF",PERIOD_H1,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_USDCHF_H2=iCustom("USDCHF",PERIOD_H2,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_USDCHF_H3=iCustom("USDCHF",PERIOD_H3,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_USDCHF_H4=iCustom("USDCHF",PERIOD_H4,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_USDCHF_H6=iCustom("USDCHF",PERIOD_H6,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_USDCHF_H8=iCustom("USDCHF",PERIOD_H8,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Handle_USDCHF_H12=iCustom("EURUSD",PERIOD_H12,"Examples\\MACD",12,26,9,PRICE_CLOSE);
      Print("Конец.....");

//--- Проверка корректности хэндлов
   if(Handle_EURUSD_M1<0 || Handle_EURUSD_M2<0 || Handle_EURUSD_M3<0 || Handle_EURUSD_M4<0 || Handle_EURUSD_M5<0 || Handle_EURUSD_M6<0 || Handle_EURUSD_M10<0 || Handle_EURUSD_M12<0 || Handle_EURUSD_M15<0 || Handle_EURUSD_M20<0 || Handle_EURUSD_M30<0 || Handle_EURUSD_H1<0 || Handle_EURUSD_H2<0 || Handle_EURUSD_H3<0 || Handle_EURUSD_H4<0 || Handle_EURUSD_H6<0 || Handle_EURUSD_H8<0 || Handle_EURUSD_H12<0
      || Handle_GBPUSD_M1<0 || Handle_GBPUSD_M2<0 || Handle_GBPUSD_M3<0 || Handle_GBPUSD_M4<0 || Handle_GBPUSD_M5<0 || Handle_GBPUSD_M6<0 || Handle_GBPUSD_M10<0 || Handle_GBPUSD_M12<0 || Handle_GBPUSD_M15<0 || Handle_GBPUSD_M20<0 || Handle_GBPUSD_M30<0 || Handle_GBPUSD_H1<0 || Handle_GBPUSD_H2<0 || Handle_GBPUSD_H3<0 || Handle_GBPUSD_H4<0 || Handle_GBPUSD_H6<0 || Handle_GBPUSD_H8<0 || Handle_EURUSD_H12<0
      || Handle_USDCHF_M1<0 || Handle_USDCHF_M2<0 || Handle_USDCHF_M3<0 || Handle_USDCHF_M4<0 || Handle_USDCHF_M5<0 || Handle_USDCHF_M6<0 || Handle_USDCHF_M10<0 || Handle_USDCHF_M12<0 || Handle_USDCHF_M15<0 || Handle_USDCHF_M20<0 || Handle_USDCHF_M30<0 || Handle_USDCHF_H1<0 || Handle_USDCHF_H2<0 || Handle_USDCHF_H3<0 || Handle_USDCHF_H4<0 || Handle_USDCHF_H6<0 || Handle_USDCHF_H8<0 || Handle_EURUSD_H12<0)
     {
      Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");
     }
//---

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   IndicatorRelease(Handle_EURUSD_M1);
   IndicatorRelease(Handle_EURUSD_M2);
   IndicatorRelease(Handle_EURUSD_M3);
   IndicatorRelease(Handle_EURUSD_M4);
   IndicatorRelease(Handle_EURUSD_M5);
   IndicatorRelease(Handle_EURUSD_M6);
   IndicatorRelease(Handle_EURUSD_M10);
   IndicatorRelease(Handle_EURUSD_M12);
   IndicatorRelease(Handle_EURUSD_M15);
   IndicatorRelease(Handle_EURUSD_M20);
   IndicatorRelease(Handle_EURUSD_M30);
   IndicatorRelease(Handle_EURUSD_H1);
   IndicatorRelease(Handle_EURUSD_H2);
   IndicatorRelease(Handle_EURUSD_H3);
   IndicatorRelease(Handle_EURUSD_H4);
   IndicatorRelease(Handle_EURUSD_H6);
   IndicatorRelease(Handle_EURUSD_H8);
   IndicatorRelease(Handle_EURUSD_H12);

   IndicatorRelease(Handle_GBPUSD_M1);
   IndicatorRelease(Handle_GBPUSD_M2);
   IndicatorRelease(Handle_GBPUSD_M3);
   IndicatorRelease(Handle_GBPUSD_M4);
   IndicatorRelease(Handle_GBPUSD_M5);
   IndicatorRelease(Handle_GBPUSD_M6);
   IndicatorRelease(Handle_GBPUSD_M10);
   IndicatorRelease(Handle_GBPUSD_M12);
   IndicatorRelease(Handle_GBPUSD_M15);
   IndicatorRelease(Handle_GBPUSD_M20);
   IndicatorRelease(Handle_GBPUSD_M30);
   IndicatorRelease(Handle_GBPUSD_H1);
   IndicatorRelease(Handle_GBPUSD_H2);
   IndicatorRelease(Handle_GBPUSD_H3);
   IndicatorRelease(Handle_GBPUSD_H4);
   IndicatorRelease(Handle_GBPUSD_H6);
   IndicatorRelease(Handle_GBPUSD_H8);
   IndicatorRelease(Handle_GBPUSD_H12);

   IndicatorRelease(Handle_USDCHF_M1);
   IndicatorRelease(Handle_USDCHF_M2);
   IndicatorRelease(Handle_USDCHF_M3);
   IndicatorRelease(Handle_USDCHF_M4);
   IndicatorRelease(Handle_USDCHF_M5);
   IndicatorRelease(Handle_USDCHF_M6);
   IndicatorRelease(Handle_USDCHF_M10);
   IndicatorRelease(Handle_USDCHF_M12);
   IndicatorRelease(Handle_USDCHF_M15);
   IndicatorRelease(Handle_USDCHF_M20);
   IndicatorRelease(Handle_USDCHF_M30);
   IndicatorRelease(Handle_USDCHF_H1);
   IndicatorRelease(Handle_USDCHF_H2);
   IndicatorRelease(Handle_USDCHF_H3);
   IndicatorRelease(Handle_USDCHF_H4);
   IndicatorRelease(Handle_USDCHF_H6);
   IndicatorRelease(Handle_USDCHF_H8);
   IndicatorRelease(Handle_USDCHF_H12);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+


ИНДИКАТОР МАКД
//+------------------------------------------------------------------+
//|                                                         MACD.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2009-2017, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Moving Average Convergence/Divergence"
#include <MovingAverages.mqh>
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   2
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_type2   DRAW_LINE
#property indicator_color1  Silver
#property indicator_color2  Red
#property indicator_width1  2
#property indicator_width2  1
#property indicator_label1  "MACD"
#property indicator_label2  "Signal"
//--- input parameters
input int                InpFastEMA=12;               // Fast EMA period
input int                InpSlowEMA=26;               // Slow EMA period
input int                InpSignalSMA=9;              // Signal SMA period
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price
//--- indicator buffers
double                   ExtMacdBuffer[];
double                   ExtSignalBuffer[];
double                   ExtFastMaBuffer[];
double                   ExtSlowMaBuffer[];
//--- MA handles
int                      ExtFastMaHandle;
int                      ExtSlowMaHandle;

//--- handles for MAs
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);

   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(),"!!");
     }

//--- 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);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
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[])
  {
//--- check for data
   if(rates_total<InpSignalSMA)
      return(0);
//--- not all data may be calculated
   int calculated=BarsCalculated(ExtFastMaHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtFastMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
   calculated=BarsCalculated(ExtSlowMaHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtSlowMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
//--- we can copy not all data
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) to_copy++;
     }
//--- get Fast EMA buffer
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtFastMaHandle,0,0,to_copy,ExtFastMaBuffer)<=0)
     {
      Print("Getting fast EMA is failed! Error",GetLastError());
      return(0);
     }
//--- get SlowSMA buffer
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtSlowMaHandle,0,0,to_copy,ExtSlowMaBuffer)<=0)
     {
      Print("Getting slow SMA is failed! Error",GetLastError());
      return(0);
     }
//---
   int limit;
   if(prev_calculated==0)
      limit=0;
   else limit=prev_calculated-1;
//--- calculate MACD
   for(int i=limit;i<rates_total && !IsStopped();i++)
      ExtMacdBuffer[i]=ExtFastMaBuffer[i]-ExtSlowMaBuffer[i];
//--- calculate Signal
   SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
//--- OnCalculate done. Return new prev_calculated.

   if(prev_calculated==0) Print("Индикатор расчитан на ",rates_total," - ти барах");

   return(rates_total);
  }
//+------------------------------------------------------------------+






 
Tango_X:


Всем привет! 

Беру стандартный индикатор MACD из папки Example, и хочу получить хендл этого индикатора в эксперте по 3-м валютным парам и по всем таймфреймам до Н12. Все хорошо, и работает как надо, НО если я добавляю кусочек кода в сам индикатор MACD, в котором хочу получить хендлы еще 5-ти индикаторов (кусочек кода выделен красным цветом ниже в индикаторе MACD) то начинается очень огромная нагрузка на процессор и ОЗУ. ЧТО Я ДЕЛАЮ НЕПРАВИЛЬНО?

зачем при инициализации индикатора создавать хендлы, если их использование отсутствует? Если уже само создание хендлов увеличивает нагрузку, то в сервисдек

 

Может быть дело в том, что в советнике Вы делаете 54 хэндла индикатора, а каждый из них (МАСД) делает еще 6. Итого вы создаете не 54, как раньше, а 54*6 = 324 хэндла.

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

 
Konstantin Erin:

зачем при инициализации индикатора создавать хендлы, если их использование отсутствует? Если уже само создание хендлов увеличивает нагрузку, то в сервисдек

Хендлы в индикаторе ИСПОЛЬЗУЮТСЯ! Просто я сделал пример чтобы не нагружать лишний код. Представьте что они используются)

 
Sergey Savinkin:

Может быть дело в том, что в советнике Вы делаете 54 хэндла индикатора, а каждый из них (МАСД) делает еще 6. Итого вы создаете не 54, как раньше, а 54*6 = 324 хэндла.

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

Т.е. если мой индикатор создан на основании показаний к примеру 6-ти индикаторов, т.е. мой индикатор использует 6 хендлов, то этот индикатор я не смогу использовать в советнике на всех таймфреймах? Потому как у меня не хватит ОЗУ (к примеру у меня 4 гб)?

Как тогда вообще пишут мультивалютные и мультитаймфреймовые советники?

 
Tango_X:

Хендлы в индикаторе ИСПОЛЬЗУЮТСЯ! Просто я сделал пример чтобы не нагружать лишний код. Представьте что они используются)

Ну раз используются, то никак вы это в том виде, что есть, не оптимизируете. Выхода два:

  1. Уходить от индикаторов MACD и все вычисления делать внутри кода
  2. Использовать OpenCL, ваш код должен отлично распараллеливаться/ Но надо иметь современную карту с поддержкой OpenCL.
  3. Использовать внешнюю DLL на С++, в VS C++ есть средства авто-распараллеливания кода на CPU.

 
Tango_X:

Т.е. если мой индикатор создан на основании показаний к примеру 6-ти индикаторов, т.е. мой индикатор использует 6 хендлов, то этот индикатор я не смогу использовать в советнике на всех таймфреймах? Потому как у меня не хватит ОЗУ (к примеру у меня 4 гб)?

Как тогда вообще пишут мультивалютные и мультитаймфреймовые советники?

Это было предположение. Может, дело в самих кастомных индикаторах. Проверьте скорость на стандартных вариантах iRSI, iATR и т.д. Если работает быстро (пусть и не правильно, для теста скорости это не важно), значит, дело в коде какого-то из 6-ти хэндлов.

 
Sergey Savinkin:

Это было предположение. Может, дело в самих кастомных индикаторах. Проверьте скорость на стандартных вариантах iRSI, iATR и т.д. Если работает быстро (пусть и не правильно, для теста скорости это не важно), значит, дело в коде какого-то из 6-ти хэндлов.

Это стандартные 6 индикаторов которые идут с платформой МТ5, там не может быть проблем с кодом

 
Tango_X:

Это стандартные 6 индикаторов которые идут с платформой МТ5, там не может быть проблем с кодом

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

 
Alexey Volchanskiy:

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

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

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

 

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

   ExtFastTickHandle=iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE);
   ExtSlowTickHandle=iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE);
   ExtFastSmaHandle=iMA(NULL,0,7,0,MODE_SMA,PRICE_MEDIAN);
   ExtSlowSmaHandle=iMA(NULL,0,7,0,MODE_SMA,PRICE_MEDIAN);
   ExtFastEmaHandle=iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE);
   ExtSlowEmaHandle=iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE);
   ExtCloseVHandle=iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE);
   ExtMedianVHandle=iMA(NULL,0,7,0,MODE_SMA,PRICE_MEDIAN);
   Ext0FastHandle=iMA(NULL,0,7,0,MODE_SMA,PRICE_MEDIAN);// color AO
   Ext0SlowHandle=iMA(NULL,0,7,0,MODE_SMA,PRICE_MEDIAN);//color AO
   Ext10CloseHandle=iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE);
   Ext10MedianHandle=iMA(NULL,0,7,0,MODE_SMA,PRICE_MEDIAN);
Причина обращения: