Баг в функции SymbolInfoDouble() ???

 

Приветствую всех.

Вот столкнулся с проблемой. Перед работой робота вызывается штатная инициализация, то есть проблемный код работает под управлением OnInit()

Код следующий (прописан в отдельной функции, параметров у функции нет, вызывается в OnInit):

 int i;
 int st = SymbolsTotal(true);
 int digits;
 double tick_value;
 string symbol;

 for (i=0; i<st; i++)
     {
      symbol = SymbolName(i, true);
      digits = SymbolInfoInteger(symbol, SYMBOL_DIGITS);
      tick_value = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE);
      Print (symbol,": ",tick_value);
     }
// Результат
2014.12.20 19:07:04.186 Expert Advisor EURUSD,H1: USDJPY:-1.#IND
2014.12.20 19:07:04.186 Expert Advisor EURUSD,H1: GBPJPY:-1.#IND
2014.12.20 19:07:04.186 Expert Advisor EURUSD,H1: GBPUSD:-1.#IND
2014.12.20 19:07:04.186 Expert Advisor EURUSD,H1: EURGBP:0
2014.12.20 19:07:04.185 Expert Advisor EURUSD,H1: EURUSD:-1.#IND

 Что за ... интересная вещь?

До этого цикла вызывал специально (прямо из OnInit):

Print ("Init: EURUSD tick value ="+DoubleToStr(SymbolInfoDouble("EURUSD", SYMBOL_TRADE_TICK_VALUE), 5));

//Результат
2014.12.20 19:07:04.148 Expert Advisor EURUSD,H1: Init: EURUSD tick value =1.22853

Кто-нибудь встречался еще с таким хамством со стороны функции? )))

Причем, если код перекинуть в OnInit прямо, то выдает ожидаемый результат, а не такую чушь. Но мне-то нужно оформить как функцию. 

Цель подзадачи очень простая - получить размер 1 пипса в валюте депозита. Для каждой пары. 

Забыл добавить - терминал 4. На 5-м не проверял. 

 

Новая фишка, если в цикле:

Вместо:
      tick_value = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE);

Заменить:
      tick_value = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE); // неправильно -1.#IND
      tick_value = SymbolInfoDouble(symbol, SYMBOL_BID);              // Bid цена - правильно
      tick_value = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE); // теперь и Tick Value правильно

И так на каждой итерации. Причем второй раз показывает правильно только в режиме отладки. Если скомпилировать, то оба раза ошибки выдает.

В сервис-деск чтоли ? 

 

попробуй 2-й вариант функции:

bool  SymbolInfoDouble(
   string                   name,        // символ
   ENUM_SYMBOL_INFO_DOUBLE  prop_id,     // идентификатор свойства
   double&                  double_var   // сюда примем значение свойства
   );
 
denkir:

попробуй 2-й вариант функции:

С перегруженой функцией та же картина. Полный привет... это по два раза нужно функцию вызывать чтобы до терминала дошло чего хотят от него ))

Искусственный интеллект... 

Что самое парадоксальное. У меня 5 терминалов - версия и билд у всех одинаковый, на 3-х ошибок нет, на двух есть.

 

Дополню по второму варианту.

Возвращает TRUE, то есть успешно выполнена, GetLastError дает 0 - ошибок нет, но значение х.з. какое "-1.#IND"

 

tick_value = MarketInfo(symbol, MODE_TICKVALUE);

Дает то же самое. походу лажа какая-то внутри терминала при доступе к TICK_VALUE... 

 
elugovoy:

tick_value = MarketInfo(symbol, MODE_TICKVALUE);

Дает то же самое. походу лажа какая-то внутри терминала при доступе к TICK_VALUE... 

Да, где-то я уже это проходил, но вроде не в OnInit, хотя не припомню.

А где пробуете в тестере или на обычном чарте? Синхронизацию для каждого символа перед его использованием не пробовали?

 
elugovoy:

Приветствую всех.

Вот столкнулся с проблемой. Перед работой робота вызывается штатная инициализация, то есть проблемный код работает под управлением OnInit()

Код следующий (прописан в отдельной функции, параметров у функции нет, вызывается в OnInit):

 Что за ... интересная вещь?

До этого цикла вызывал специально (прямо из OnInit):

Кто-нибудь встречался еще с таким хамством со стороны функции? )))

Причем, если код перекинуть в OnInit прямо, то выдает ожидаемый результат, а не такую чушь. Но мне-то нужно оформить как функцию. 

Цель подзадачи очень простая - получить размер 1 пипса в валюте депозита. Для каждой пары. 

Забыл добавить - терминал 4. На 5-м не проверял. 

Проверил на двух терминалах MetaTrader 4 build 765 (MetaQuotes Software Corp.) - на двух системах: Windows 8.1 64-разрядная и Windows 8.1 32-разрядная. Вызов отдельной функции из OnInit(). Возвращаемые значения корректные.

P.S. Проверял на двух разных торговых серверах. Так-же результат корректный. 


 
svds75:

Да, где-то я уже это проходил, но вроде не в OnInit, хотя не припомню.

А где пробуете в тестере или на обычном чарте? Синхронизацию для каждого символа перед его использованием не пробовали?

Да RefreshRates давал, но без толку... 

 
barabashkakvn:

Проверил на двух терминалах MetaTrader 4 build 765 (MetaQuotes Software Corp.) - на двух системах: Windows 8.1 64-разрядная и Windows 8.1 32-разрядная. Вызов отдельной функции из OnInit(). Возвращаемые значения корректные.

P.S. Проверял на двух разных торговых серверах. Так-же результат корректный. 


Подготовлю пример и видео наверное... запускаю на 5-ти терминалах, на 3-х терминалах работает норм, на 2-х такие баги. Брокер один, билды терминалов одинаковые, операционка одна, все идентично.

 
Вообще функции типа SymbolInfoDouble() - это родные  MQL5-функции. Замечал, что в MQL4 они не всегда корректно работают...