Глюк в MetaEditorMT5

 

Пару дней назад была обнова MT5 и возник глюк (то 3-й, то 4-й индекс, 7-й, в массиве проходит битым), записывается в цикле верно, а во втором цикле засада, или это только в MetaEditor, или сливы депозитов


 
ovak77:

Пару дней назад была обнова 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.

 
Vladimir Karputov:

Получаемые цены ВСЕГДА нужно проверять на "ноль". И только после этого использовать. Пример:

Здесь функция "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 в ярко-красный цвет, битые. У кого есть исходный код, тот перепишет, а у кого покупные эксперты, те попали
 
ovak77:
Посмотрите внимательно верх скринаБолее того, я получаю цены через MqlTick и в случае ошибки пытаюсь продублировать получение цен через

Скрин смотреть вредно - его нельзя проверить в редакторе. Следовательно нужен полный код, который можно воспроизвести. В Вашем примере вообще не видно, КАК и ЧТО попадает в массив arr_bid[]. Также ОЧЕНЬ смущает использование для счётчика size_arr_bid СТАТИЧЕСКОЙ переменной.


Добавлено: цены ВСЕГДА нужно проверять на ноль - так как это рынок и может прилететь всё, что угодно.

 

В общем или полный код покажите и давайте с нуля по шагам напишем новый код.

 
Vladimir Karputov:

В общем или полный код покажите и давайте с нуля по шагам напишем новый код.

   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 и только МТ втыкает рандомные числа, что-зачем-почему, непонятно и главное - неправильно

 
ovak77:

Копируйте, убедитесь. Вообще, терминал ужасно написан, любая прога при пуске все числа выдает изначально, как FALSE, т.е. 0 и только МТ втыкает рандомные числа, что-зачем-почему, непонятно и главное - неправильно


Любую переменную при объявлении (при создании) НУЖНО инициализировать САМОСТОЯТЕЛЬНО. Это правило, которое должен соблюдать любой программист. 

 
ovak77:
Посмотрите внимательно верх скринаБолее того, я получаю цены через MqlTick и в случае ошибки пытаюсь продублировать получение цен черезЯ пытался и статические и динамические массивы записывать, все данные в массивах после обновы, которая перекрасила константы #property в ярко-красный цвет, битые. У кого есть исходный код, тот перепишет, а у кого покупные эксперты, те попали

Теперь о том как надо сделать...

В отличии от mql4 в mql5 переменные, равно как и массивы, при объявлении не обнуляются. Соответственно пока ячейка массива не заполнена каким-то значением в ней может находиться мусор. Именно его и видно в arr_bid[4]

Надо всего-лишь обнулить массив при его объявлении

 double arr_bid[10] = {0.0};
 
Alexey Viktorov:

Теперь о том как надо сделать...

В отличии от mql4 в mql5 переменные, равно как и массивы, при объявлении не обнуляются. Соответственно пока ячейка массива не заполнена каким-то значением в ней может находиться мусор. Именно его и видно в arr_bid[4]

Надо всего-лишь обнулить массив при его объявлении

Это уже детали, я ошибку заметил, быстро скриптик написал, начал перепроверять, он что творит, записывает данные, все нормально, допустим данные 3-го индекса записывает как положено, затем, при записи 5-го индекса, он вместо цены 3-го индекса втыкает рандомное число, я выходил через break, записывал не прерывая цикл, записывая одну и ту же цену и результат всегда один, прошлая запись через две-три-четыре перезаписывается на рандом

 
Vladimir Karputov:

Любую переменную при объявлении (при создании) НУЖНО инициализировать САМОСТОЯТЕЛЬНО. Это правило, которое должен соблюдать любой программист. 

Любой программист знает, что все данные изначально объявляются, как FALSE

 
ovak77:

Копируйте, убедитесь. Вообще, терминал ужасно написан, любая прога при пуске все числа выдает изначально, как 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);
  }
//+------------------------------------------------------------------+
Файлы:
Test.mq5  6 kb
Причина обращения: