Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1501

 
Николай К:

Подскажите пожалуйста, как решается ошибка 4806 - запрошенные данные не найдены. Хочу из индикатора получать данные разных периодов усреднения для болинджера. По букварю хендл в OnInit получают, а для моей цели он должен быть в OnCalculate отсюда и ошибка, видимо. Помогите разобраться на примере.


код
 
//+------------------------------------------------------------------+
//|                                                          вап.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   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 limit=rates_total-prev_calculated;
   if(limit>1) 
     {
      limit=rates_total-1;                 
     }
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      if(i>=rates_total-10) 
         continue;

      ArrayInitialize(middle1,0);
      ArrayInitialize(middle2,0);


      for(BandsPeriod=2; BandsPeriod<=5; BandsPeriod++)
        {
         int T=3;
         Handle1=iMA(Symbol(),PERIOD_CURRENT,BandsPeriod,InpBandsShift,MODE_SMA,PRICE_HIGH);
         Handle2=iMA(Symbol(),PERIOD_CURRENT,BandsPeriod,InpBandsShift,MODE_SMA,PRICE_LOW);
         count=Bars(Symbol(),PERIOD_CURRENT)-10;
         if(!iGetArray(Handle1,BASE_LINE,start_pos,count,middle1) ||
            !iGetArray(Handle2,BASE_LINE,start_pos,count,middle2))// ||
            //CopyRates(Symbol(),PERIOD_CURRENT,start_pos,count,rates)!=count)

           {
            return(false);
           }
        }
      //--- return value of prev_calculated for next call
      return(rates_total);
     }
     }
//+------------------------------------------------------------------+
   
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      if(1==1)
         PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code
      if(1==1)
         PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                     __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+
Организовано примерно так, извините за целостность.
 
Николай К:
Организовано примерно так, извините за целостность.

Хенд индикатора в MQL5 нужно создавать в OnInit()!

 
Vladimir Karputov:

Хенд индикатора в MQL5 нужно создавать в OnInit()!

Тогда на каждый период усреднения отдельный хендл будет?

 
Николай К:
Организовано примерно так, извините за целостность.

Освобождение ресурса не происходит..а так всё корректно, хоть и не эффективно

после iMA(...) и операций с ним, надо вызывать IndicatorRelease если он более ненужен

Для освобождения памяти компьютера от неиспользуемого больше индикатора служит функция IndicatorRelease(), которой передается хэндл этого индикатора.

А хендл индикатора можно создавать в любом месте кроме OnDeinit. Только озаботиться "что делать при ошибке создания"

 
@Vladimir Karputov @Maxim Kuznetsov Приклеить или прибить? )) Простая задача - сложная подготовка, в mql4 на один два делалось. И всё-таки как собрать данные болинджера по разным таймфреймам и периодам усреднения в один массив без ошибок?
 
Николай К:
@Vladimir Karputov @Maxim Kuznetsov Приклеить или прибить? )) Простая задача - сложная подготовка, в mql4 на один два делалось. И всё-таки как собрать данные болинджера по разным таймфреймам и периодам усреднения в один массив без ошибок?

у вас всё правильно, просто вы все хендлы съели, это исчерпаемый ресурс...их надо освобождать. 

hdl=iMA(....)

if (hdl!=INVALID_HANDLE) {

    /// do something

   IndicatorRelease(hdl);

}

подсмотрите как у fxsaber в его библиотеках сделано, для упрощения переезда с 4 на 5

 
MakarFX:
Первое что приходит в голову - это проверить работу индикатора, а потом смотреть советник

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

весь м1 нет сигнала пока не сменится бар и новый сигнал, напомню сигнал все тики смотрит, обработки новый бар нет.

и напомню, что мне приходится тестировать сразу в 3 терминалах. похоронят меня с тремя терминалами в руке.

 
Fast235:

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

весь м1 нет сигнала пока не сменится бар и новый сигнал, напомню сигнал все тики смотрит, обработки новый бар нет.

и напомню, что мне приходится тестировать сразу в 3 терминалах. похоронят меня с тремя терминалами в руке.

Возможно в индикаторе сигнал только при смене бара...

Лучше конечно видеть код.

 
Здравствуйте, Артем !
С завистью смотрю, как товарищи на MQL5 быстро кодят, используя классы CTrade и другие, изначально встроенные в МТ5.
По разным, труднопреодолимым обстоятельствам, я вынужден до сих пор кодить на MQL4 и придумывать свои корявые конструкции.
М.б. уже есть есть такой набор классов для MQL4 ?
Заранее благодарю)
Причина обращения: