Глюк в MetaEditorMT5 - страница 3

 
Petros Shatakhtsyan:

Сначала научитесь нормальную программу написать, а потом определите "терминал ужасно написан" или нет.

обуснуйте, что в скрипте написано не верно и почему MT переписывает данные массива задним числом?

 
ovak77:

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

А вот это что?

if(SymbolInfoDouble(my_symbol,SYMBOL_BID,bid)<=0 || SymbolInfoDouble(my_symbol,SYMBOL_ASK,ask)<=0)

Если (получили или не получили данные по Bid) или (получили или не получили данные по Ask), то сообщаем, что данные не получили ...


 
Artyom Trishkin:

А вот это что?

Если (получили или не получили данные по Bid) или (получили или не получили данные по Ask), то сообщаем, что данные не получили ...


На случай сбоя в MqlTick и return в случае ошибки
 
ovak77:
Я уже решил, для массивов написал проверки, просто людей предупредить, чтобы завтра депозиты не посливали. Хотя, есть подозрение, что брокер мог код подкорректировать, но опять же сомнительно, что у брокера есть доступ к исходному коду, тогда он мог бы поставить разрабов. В общем, ошибку заметил, проверки дописал


#s3gt_translate_tooltip_mini { display: none !important; }

Да нет никакой ошибки. ВСЕ уже давно знают о таком отличии mql4 и mql5 и не парятся над этим. Просто соблюдают последовательность и логичность при написании. Если уж и сливают, то абсолютно по другим причинам.

В мании преследования вы меня превзошли... Зачем брокеру пытаться залезть в ваш код??? Он и без этого поможет любому трейдеру обнулить счёт.

 
ovak77:

обуснуйте, что в скрипте написано не верно и почему MT переписывает данные массива задним числом?


А кто такие вещи пишет ???

   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++;
 
ovak77:
На случай сбоя в MqlTick и return в случае ошибки

Я вам привёл вашу ошибочную строку - вы не знаете как работает данный вызов функции, не знаете какие значения принимает bool-переменная, но утверждаете про ошибки терминала...

Ещё раз: ЧТО написано в этой строчке?

if(SymbolInfoDouble(my_symbol,SYMBOL_BID,bid)<=0 || SymbolInfoDouble(my_symbol,SYMBOL_ASK,ask)<=0)

Расскажите.

А что у вас написано вот в этой строке?

if(SymbolInfoTick(my_symbol,new_tick)<=0)

Расскажите.

А потом расскажите какое значение bool имеет число 0, и какое значение bool имеет число минус один.

А потом, с учётом новых знаний перепишите код.

И это всего лишь начало вашего кода - дальше не глядел.

 
Petros Shatakhtsyan:

А кто такие вещи пишет ???

Я так пишу и другие так же пишут, чтобы переменная была в блоке для быстрого доступа и до обновы проблем не было
 
ovak77:
Вы мне можете объяснить, зачем вы сюда функции воткнули? При каких они делах?

Я с самого начала попросил у Вас ВОСПРОИЗВОДИМЫЙ код - то есть код который я могу сразу запустить в редакторе. Вы предоставили код с ошибками, он не запускался. Пришлось запихнуть Ваш блок кода в функцию.

Но сейчас не об этом. Я обнаружил то, что Вы пытались донести.

Итак, данные терминала (это первые три строчки вкладки "Журнал" терминала):

Terminal        MetaTrader 5 x64 build 1730 started (MetaQuotes Software Corp.)
Terminal        Windows 10 (Build 16299), x64, IE 11.00, UAC, Intel Core i3-3120M  @ 2.50GHz, RAM: 4784 / 8077 Mb, HDD: 306099 / 475588 Mb, GMT+02:00
Terminal        C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

Найденная ошибка в работе со статическим массивом (пример статического массива: double arr_bid[10]). А именно: если статический массив объявлен в блоке кода (в функции), то при последующем заходе в эту функцию статический массив не пересоздается заново, а ведёт себя как массив static double arr_bid[10].

Проверочный код:

//+------------------------------------------------------------------+
//|                                                         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;
     }
//---
   double arr_bid[10];
   static int size_arr_bid=0;
   for(int i=size_arr_bid; i<10; i++)
     {
      arr_bid[i]=bid;
      break;
     }
   size_arr_bid++;
//---
   return(true);
  }
//+------------------------------------------------------------------+

В функции TestFunction в конце объявлен статический массив arr_bid[10]. По идеи этот массив, при каждом последующем входе в функцию TestFunction, должен заново создаваться, как и любая локальная переменная.

В нашем же случае, статический массив arr_bid[10]. ведёт себя как static arr_bid[10] - то есть в масиве остаются данные записанные в него в предыдущих заходах.

Итак заход №1:

заход №1

Заход №2:

Заход №2:

как видите в индексе #0 осталось значение с предыдущего захода. 

В третьем заходе у нас уже будет видно сохранившееся значение и в индексе #0 и в индексе #1:

Заход №3

 
Alexey Viktorov:

Да нет никакой ошибки. ВСЕ уже давно знают о таком отличии mql4 и mql5 и не парятся над этим. Просто соблюдают последовательность и логичность при написании. Если уж и сливают, то абсолютно по другим причинам.

В мании преследования вы меня превзошли... Зачем брокеру пытаться залезть в ваш код??? Он и без этого поможет любому трейдеру обнулить счёт.

Подозрение не является фактом, это лишь одна из предполагаемых причин, либо брокер, либо обнова

#s3gt_translate_tooltip_mini { display: none !important; }
 
Vladimir Karputov:

Я с самого начала попросил у Вас ВОСПРОИЗВОДИМЫЙ код - то есть код который я могу сразу запустить в редакторе. Вы предоставили код с ошибками, он не запускался. Пришлось запихнуть Ваш блок кода в функцию.

Но сейчас не об этом. Я обнаружил то, что Вы пытались донести.

Итак, данные терминала (это первые три строчки вкладки "Журнал" терминала):

Найденная ошибка в работе со статическим массивом (пример статического массива: double arr_bid[10]). А именно: если статический массив объявлен в блоке кода (в функции), то при последующем заходе в эту функцию статический массив не пересоздается заново, а ведёт себя как массив static double arr_bid[10].

Проверочный код:

В функции TestFunction в конце объявлен статический массив arr_bid[10]. По идеи этот массив, при каждом последующем входе в функцию TestFunction, должен заново создаваться, как и любая локальная переменная.

В нашем же случае, статический массив arr_bid[10]. ведёт себя как static arr_bid[10] - то есть в масиве остаются данные записанные в него в предыдущих заходах.

Итак заход №1:

Заход №2:

как видите в индексе #0 осталось значение с предыдущего захода. 

В третьем заходе у нас уже будет видно сохранившееся значение и в индексе #0 и в индексе #1:


А теперь прогоните цикл до 9 индекса. Что вы видите, данные перезаписались?