Вопрос по хэндлам индикаторов

 

Мне требуется получать значения индикатора в том случае, если по символу существуют открытые позиции.

Заранее неизвестно по каким символам будут открываться позиции и сколько таких символов будет. Получается, я не могу заранее получить хэндлы в OnInit(); Нужно их находу создавать, получать значения индикаторов, использовать и удалять, потому как на следующем тике позиция по символу может быть закрыта, а какой хэндл отвечал за значение индикатора на этом символе я не узнаю. 

Есть какой-то способ оптимально работать с хэндлами индикаторов в моём случае? Пока что по моим прикидкам мне потребуется цикл перебора позиций для сохранения символов по которым идёт торговля. Затем ещё один цикл перебора символов, где я буду объявлять хэндл индикатора для данного символа, получать значение индикатора, использовать его и сразу чистить хэндл на этой же итерации, чтобы не насоздавать новых хэндлов на тот же индикатор на следующем тике и чтобы не было хэндлов для символов, по которым уже отсутствуют позиции.

Можно ли это как-то оптимальнее сделать, не меняя условие задачи: Количество рабочих символов заранее неизвестно и в процессе работы может меняться?


 
if(PositionsTotal()>0)...
 
Renat Akhtyamov:
if(PositionsTotal()>0)...

+ Чтобы если позиций нет, ничего не делать. 

 
Можно и без хэндлов, сделать свою функцию, которая сама считает значение данного индикатора в данной точке графика(или двух-трёх последних, а не всей истории) для данного символа.
 
JRandomTrader:
Можно и без хэндлов, сделать свою функцию, которая сама считает значение данного индикатора в данной точке графика(или двух-трёх последних, а не всей истории) для данного символа.
в 5-рке все таки хендл
 
Renat Akhtyamov:
в 5-рке все таки хендл
У меня - не всегда.
 

Перечитал справку по индикаторным хэндлам и вычитал что: 

Технические индикаторы

Нельзя обратиться к данным индикатора сразу после его создания, так как на расчет значений индикатора требуется некоторое время, и поэтому создавать хэндлы индикаторов лучше всего в OnInit().

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

 
Oleg Remizov:

Перечитал справку по индикаторным хэндлам и вычитал что: 

Технические индикаторы

Нельзя обратиться к данным индикатора сразу после его создания, так как на расчет значений индикатора требуется некоторое время, и поэтому создавать хэндлы индикаторов лучше всего в OnInit().

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

Создать хендл на лету и получить значение индикатора.

double MA(string symb,ENUM_TIMEFRAMES tf,int period,int ma_shift,
                                      ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int index) {
 #ifdef __MQL4__
  return(iMA(symb,tf,period,ma_shift,method,price,index));
 #else
  double buf[1];
  int handle=-1;  //Хэндл индикатора.
  static bool flag=true;                            
   if(flag) { // Создадим хендл один раз и установим флаг при удаче
    handle=iMA(symb,tf,period,ma_shift,method,price);
    if(handle<0) {
      PrintFormat("Failed to create handle MA %s/%s, Error: %d",symb,tf,GetLastError());
      return(-1);
     } else
      flag=false;
   }
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator MA %s/%s, Error: %d",symb,tf,GetLastError());
     return(-1);
    }
   return(buf[0]);
 #endif
 }
P.S. Немного дополнил код, не проверял, но визуально без ошибок
 
Vitaly Muzichenko:

Создать хендл на лету и получить значение индикатора.

P.S. Немного дополнил код, не проверял, но визуально без ошибок

Спасибо, попробую применить.

 
Oleg Remizov:

Спасибо, попробую применить.

Отзыв хотелось бы. 

 
Vitaly Muzichenko:

Создать хендл на лету и получить значение индикатора.

P.S. Немного дополнил код, не проверял, но визуально без ошибок
double MA(string symb, ENUM_TIMEFRAMES tf, int period, int ma_shift,
          ENUM_MA_METHOD method, ENUM_APPLIED_PRICE price, int index)
  {
#ifdef __MQL4__
   return(iMA(symb, tf, period, ma_shift, method, price, index));
#else
   double buf[1];
   static int handle = -1; //Хэндл индикатора.
   static bool flag = true;
   if(flag)   // Создадим хендл один раз и установим флаг при удаче
     {
      handle = iMA(symb, tf, period, ma_shift, method, price);
      if(handle < 0)
        {
         PrintFormat("Failed to create handle MA %s/%s, Error: %d", symb, tf, GetLastError());
         return(-1);
        }
      else
         flag = false;
     }
   if(CopyBuffer(handle, 0, index, 1, buf) < 0)
     {
      PrintFormat("Failed to copy data from the indicator MA %s/%s, Error: %d", symb, tf, GetLastError());
      return(-1);
     }
   return(buf[0]);
#endif
  }

Только хэндл пришлось тоже сделать статическим, а то он сбрасывался при каждом вызове.

Причина обращения: