Глюк в MetaEditorMT5

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
ovak77
214
ovak77  

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


Vladimir Karputov
Модератор
182113
Vladimir Karputov  
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.

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

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


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

Vladimir Karputov
Модератор
182113
Vladimir Karputov  

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

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

Vladimir Karputov
Модератор
182113
Vladimir Karputov  
ovak77:

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


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

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

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

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

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

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

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

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

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

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

ovak77
214
ovak77  
Vladimir Karputov:

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

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

Vladimir Karputov
Модератор
182113
Vladimir Karputov  
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
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий