Что обнаружил: индикатор установлен в терминале и продолжает выдавать цены обоих точек привязки для графического объекта (который и был создан этим индикатором) как "0.0".
Но если на этот график бросить такой скрипт:
//+------------------------------------------------------------------+ //| 1.mq5 | //| Copyright © 2019, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2019, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.00" #property script_show_inputs input string InpName = "Regression"; // Channel name //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { double price_point_0=ObjectGetDouble(0,InpName,OBJPROP_PRICE,0); double price_point_1=ObjectGetDouble(0,InpName,OBJPROP_PRICE,1); Comment(price_point_0,"\n",price_point_1); //--- } //+------------------------------------------------------------------+
то скрипт при помощи ObjectGetDouble возвращает цены обоих точек привязки правильно.
Изменил индикатор: теперь он НЕ СОЗДАЕТ графический объект "Канал Регрессии" и не передвигает его - а только пытается получить значение цен для точек привязки
//+------------------------------------------------------------------+ //| Trend OBJ_REGRESSION.mq5 | //| Copyright © 2019, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2019, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.000" #property indicator_separate_window #property indicator_buffers 0 #property indicator_plots 0 //--- input parameters input string InpName="Regression"; // Channel name //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate( const int rates_total, // size of input time series const int prev_calculated, // number of handled bars at the previous call const datetime& time[], // Time array const double& open[], // Open array const double& high[], // High array const double& low[], // Low array const double& close[], // Close array const long& tick_volume[], // Tick Volume array const long& volume[], // Real Volume array const int& spread[] // Spread array ) { double price_point_0=0.0; double price_point_1=0.0; int error=0; //--- Point 0 ResetLastError(); if(!ObjectGetDouble(0,InpName,OBJPROP_PRICE,0,price_point_0)) { error=GetLastError(); Comment("Point 0 ERROR#"+IntegerToString(error)); return(rates_total); } if(price_point_0==0.0) { error=GetLastError(); Comment("Point 0 price "+DoubleToString(price_point_0,0)); return(rates_total); } //--- Point 1 ResetLastError(); if(!ObjectGetDouble(0,InpName,OBJPROP_PRICE,1,price_point_1)) { error=GetLastError(); Comment("Point 1 ERROR#"+IntegerToString(error)); return(rates_total); } if(price_point_1==0.0) { error=GetLastError(); Comment("Point 1 price "+DoubleToString(price_point_1,0)); return(rates_total); } Comment((price_point_1-price_point_0)/Point()); //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
и этот вариант работает! То есть если индикатор не создавал и не двигал графический объект - то индикатор через ObjectGetDouble корректно получает цены точек привязки.
Вероятно причина - переполнение очереди?
Из справки по ObjectGetDouble:
Примечание
Функция использует синхронный вызов – это означает, что функция дожидается выполнения всех команд, которые были помещены в очередь графика перед её вызовом, и поэтому данная функция может быть затратной по времени. Нужно иметь это обстоятельство в виду, если ведется работа с большим количеством объектов на графике.
НО в таком случае индикатор должен зависнуть, правильно? Или в индикаторах ObjectGetDouble возвращает "0.0" если очередь графика переполнена?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Работа в индикаторе с графическим объектом OBJ_REGRESSION.
Терминал:
Настройки графиков в терминале:
Индикатор в OnCalculate при prev_calculated==0 создаёт графический объект OBJ_REGRESSION.
Далее перемещает обе точки графического объекта.
После перемещения делается попытка получить цены графического объекта (точка привязки "0" и точка привязки "1"). В тестере работает, а на графике получаю цены для обоих точек привязки равные "0.0" - при этом ObjectGetDouble и GetLastError ошибок не возвращают.
Код OnCalculate: