+ Чтобы если позиций нет, ничего не делать.
Можно и без хэндлов, сделать свою функцию, которая сама считает значение данного индикатора в данной точке графика(или двух-трёх последних, а не всей истории) для данного символа.
в 5-рке все таки хендл
Перечитал справку по индикаторным хэндлам и вычитал что:
Технические индикаторыНельзя обратиться к данным индикатора сразу после его создания, так как на расчет значений индикатора требуется некоторое время, и поэтому создавать хэндлы индикаторов лучше всего в OnInit().
То есть не смогу я в цикле создавать каждый раз новый хэндл, получать значение индикатора, использовать их и чистить хэндл. Не факт что значения индикатора в момент запроса будут готовы.
Перечитал справку по индикаторным хэндлам и вычитал что:
Технические индикаторыНельзя обратиться к данным индикатора сразу после его создания, так как на расчет значений индикатора требуется некоторое время, и поэтому создавать хэндлы индикаторов лучше всего в 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. Немного дополнил код, не проверял, но визуально без ошибок
Создать хендл на лету и получить значение индикатора.
P.S. Немного дополнил код, не проверял, но визуально без ошибокСпасибо, попробую применить.
Спасибо, попробую применить.
Отзыв хотелось бы.
Создать хендл на лету и получить значение индикатора.
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 }
Только хэндл пришлось тоже сделать статическим, а то он сбрасывался при каждом вызове.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Мне требуется получать значения индикатора в том случае, если по символу существуют открытые позиции.
Заранее неизвестно по каким символам будут открываться позиции и сколько таких символов будет. Получается, я не могу заранее получить хэндлы в OnInit(); Нужно их находу создавать, получать значения индикаторов, использовать и удалять, потому как на следующем тике позиция по символу может быть закрыта, а какой хэндл отвечал за значение индикатора на этом символе я не узнаю.
Есть какой-то способ оптимально работать с хэндлами индикаторов в моём случае? Пока что по моим прикидкам мне потребуется цикл перебора позиций для сохранения символов по которым идёт торговля. Затем ещё один цикл перебора символов, где я буду объявлять хэндл индикатора для данного символа, получать значение индикатора, использовать его и сразу чистить хэндл на этой же итерации, чтобы не насоздавать новых хэндлов на тот же индикатор на следующем тике и чтобы не было хэндлов для символов, по которым уже отсутствуют позиции.
Можно ли это как-то оптимальнее сделать, не меняя условие задачи: Количество рабочих символов заранее неизвестно и в процессе работы может меняться?