Пару дней назад была обнова MT5 и возник глюк (то 3-й, то 4-й индекс, 7-й, в массиве проходит битым), записывается в цикле верно, а во втором цикле засада, или это только в MetaEditor, или сливы депозитов
Получаемые цены ВСЕГДА нужно проверять на "ноль". И только после этого использовать. Пример:
//+------------------------------------------------------------------+ //| Refreshes the symbol quotes data | //+------------------------------------------------------------------+ bool RefreshRates(void) { //--- refresh rates if(!m_symbol.RefreshRates()) { Print("RefreshRates error"); return(false); } //--- protection against the return value of "zero" if(m_symbol.Ask()==0 || m_symbol.Bid()==0) return(false); //--- return(true); }
Здесь функция "RefreshRates" отвечает за обновление цен в объекте m_symbol торгового класса CSymbolInfo. Если хоть одна цена равно "0" - данная функция вернёт false.
Получаемые цены ВСЕГДА нужно проверять на "ноль". И только после этого использовать. Пример:
Здесь функция "RefreshRates" отвечает за обновление цен в объекте m_symbol торгового класса CSymbolInfo. Если хоть одна цена равно "0" - данная функция вернёт false.
if(bid==0 || ask==0) return;Более того, я получаю цены через MqlTick и в случае ошибки пытаюсь продублировать получение цен через
double ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK); double bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);Я пытался и статические и динамические массивы записывать, все данные в массивах после обновы, которая перекрасила константы #property в ярко-красный цвет, битые. У кого есть исходный код, тот перепишет, а у кого покупные эксперты, те попали
Посмотрите внимательно верх скринаБолее того, я получаю цены через MqlTick и в случае ошибки пытаюсь продублировать получение цен через
Скрин смотреть вредно - его нельзя проверить в редакторе. Следовательно нужен полный код, который можно воспроизвести. В Вашем примере вообще не видно, КАК и ЧТО попадает в массив arr_bid[]. Также ОЧЕНЬ смущает использование для счётчика size_arr_bid СТАТИЧЕСКОЙ переменной.
Добавлено: цены ВСЕГДА нужно проверять на ноль - так как это рынок и может прилететь всё, что угодно.
В общем или полный код покажите и давайте с нуля по шагам напишем новый код.
В общем или полный код покажите и давайте с нуля по шагам напишем новый код.
MqlTick new_tick; if(SymbolInfoTick(my_symbol,new_tick)<=0) { PlaySound(play_sound);Alert("Ошибка SymbolInfoTick ",GetLastError()); if(SymbolInfoDouble(my_symbol,SYMBOL_BID,bid)<=0 || SymbolInfoDouble(my_symbol,SYMBOL_ASK,ask)<=0) { Alert("Получить bid и ask из SymbolInfoDouble также не удалось ",GetLastError()); return; } } else { bid=new_tick.bid; ask=new_tick.ask; } if(bid==0 || ask==0) return; //--- double arr_bid[10]; static int size_arr_bid; for(int i=size_arr_bid; i<10; i++) { arr_bid[i]=bid; break; } size_arr_bid++;
Копируйте, убедитесь. Вообще, терминал ужасно написан, любая прога при пуске все числа выдает изначально, как FALSE, т.е. 0 и только МТ втыкает рандомные числа, что-зачем-почему, непонятно и главное - неправильно
Копируйте, убедитесь. Вообще, терминал ужасно написан, любая прога при пуске все числа выдает изначально, как FALSE, т.е. 0 и только МТ втыкает рандомные числа, что-зачем-почему, непонятно и главное - неправильно
Любую переменную при объявлении (при создании) НУЖНО инициализировать САМОСТОЯТЕЛЬНО. Это правило, которое должен соблюдать любой программист.
Посмотрите внимательно верх скринаБолее того, я получаю цены через MqlTick и в случае ошибки пытаюсь продублировать получение цен черезЯ пытался и статические и динамические массивы записывать, все данные в массивах после обновы, которая перекрасила константы #property в ярко-красный цвет, битые. У кого есть исходный код, тот перепишет, а у кого покупные эксперты, те попали
Теперь о том как надо сделать...
В отличии от mql4 в mql5 переменные, равно как и массивы, при объявлении не обнуляются. Соответственно пока ячейка массива не заполнена каким-то значением в ней может находиться мусор. Именно его и видно в arr_bid[4]
Надо всего-лишь обнулить массив при его объявлении
double arr_bid[10] = {0.0};
Теперь о том как надо сделать...
В отличии от mql4 в mql5 переменные, равно как и массивы, при объявлении не обнуляются. Соответственно пока ячейка массива не заполнена каким-то значением в ней может находиться мусор. Именно его и видно в arr_bid[4]
Надо всего-лишь обнулить массив при его объявлении
Это уже детали, я ошибку заметил, быстро скриптик написал, начал перепроверять, он что творит, записывает данные, все нормально, допустим данные 3-го индекса записывает как положено, затем, при записи 5-го индекса, он вместо цены 3-го индекса втыкает рандомное число, я выходил через break, записывал не прерывая цикл, записывая одну и ту же цену и результат всегда один, прошлая запись через две-три-четыре перезаписывается на рандом
Любую переменную при объявлении (при создании) НУЖНО инициализировать САМОСТОЯТЕЛЬНО. Это правило, которое должен соблюдать любой программист.
Любой программист знает, что все данные изначально объявляются, как FALSE
Копируйте, убедитесь. Вообще, терминал ужасно написан, любая прога при пуске все числа выдает изначально, как FALSE, т.е. 0 и только МТ втыкает рандомные числа, что-зачем-почему, непонятно и главное - неправильно
Опять таки: вырванный кусок кода. Если это функция - то нужно прописать передачу в неё переменных my_symbol, bid и ask. Также не ясно, что храниться в переменных bid и ask ДО вызова Вашей функции.
В общем преобразовал код:
//+------------------------------------------------------------------+ //| Test.mq5 | //| Copyright 2017, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2017, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- double bid=0.0; double ask=0.0; TestFunction(Symbol(),bid,ask); if(bid==0 || ask==0) Print("Step #3: bid==0 или ask==0"); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool TestFunction(const string my_symbol,double &bid,double &ask) { //--- перед началом работы обнуляем переменные bid=0.0; ask=0.0; //--- MqlTick new_tick; ResetLastError(); if(!SymbolInfoTick(my_symbol,new_tick)) { Print("Step #1: Ошибка SymbolInfoTick ",GetLastError()); ResetLastError(); bool result_bid=SymbolInfoDouble(my_symbol,SYMBOL_BID,bid); // результат получения BID if(!result_bid) { Print("Step #2.1: Ошибка SymbolInfoDouble (BID) ",GetLastError()); return(false); } ResetLastError(); bool result_ask=SymbolInfoDouble(my_symbol,SYMBOL_ASK,ask); // результат получения ASK if(!result_bid) { Print("Step #2.2: Ошибка SymbolInfoDouble (ASK) ",GetLastError()); return(false); } } else { bid=new_tick.bid; ask=new_tick.ask; } //--- return(true); } //+------------------------------------------------------------------+
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Пару дней назад была обнова MT5 и возник глюк (то 3-й, то 4-й индекс, 7-й, в массиве проходит битым), записывается в цикле верно, а во втором цикле засада, или это только в MetaEditor, или сливы депозитов