Ошибки, баги, вопросы - страница 2935

 
Aliaksandr Hryshyn:

Критическая ошибка при отладке:

Результат:

Последняя бета-версия на текущий момент

Спасибо за сообщение, исправлено

 
2021.01.05 14:47:18.306 LiveUpdate      check for beta version
2021.01.05 14:47:18.455 LiveUpdate      new version build 2735 (IDE: 2735, Tester: 2735) is available
2021.01.05 14:47:19.689 Virtual Hosting failed to get list of virtual hosts [1003] (tls - read timeout for 120000 ms)

При закачке обновления возникла строка в логе.

 
int Arr[1];
Print(Arr[0]);

Результат:

-206731416

 Что за странное незаданное число? В Справке не нашёл и не гуглится. На EMPTY_VALUE не похоже.

 
x572intraday:

Результат:

 Что за странное незаданное число? В Справке не нашёл и не гуглится. На EMPTY_VALUE не похоже.

Какой-то мусор

Установите значение

int Arr[1]={0};
 
Vitaly Muzichenko:

Какой-то мусор

Установите значение

 Да мне не для практики, а чисто из теоретического любопытства. На мусор было скорее похоже другое число (9xxx — не запомнил точно) и появлялось оно только раз и к тому же больше воспроизвести не удалось, а вот вышеприведённое число было постоянным и повторялось из раза в раз. (Интересно, у Вас и у других оно такое же?) Мне на него параллельно, главное, чтобы другие программисты об него не споткнулись больно.

 
x572intraday:

 Да мне не для практики, а чисто из теоретического любопытства. На мусор было скорее похоже другое число (9xxx — не запомнил точно) и появлялось оно только раз и к тому же больше воспроизвести не удалось, а вот вышеприведённое число было постоянным и повторялось из раза в раз. (Интересно, у Вас и у других оно такое же?) Мне на него параллельно, главное, чтобы другие программисты об него не споткнулись больно.

У меня "0", проверял несколько раз

 
Vitaly Muzichenko:

У меня "0", проверял несколько раз

 Хм... Не знаю как одно обстоятельство связано с другим, но запускал в виде индикатора на разных валютных парах — числа лезут разные (на каждом инструменте повторяется с каждым тиком одно и то же число), был даже ноль. Странно. Но похоже на то, что без инициализации своим числом это действительно мусор.

 
x572intraday:

 Хм... Не знаю как одно обстоятельство связано с другим, но запускал в виде индикатора на разных валютных парах — числа лезут разные (на каждом инструменте повторяется с каждым тиком одно и то же число), был даже ноль. Странно. Но похоже на то, что без инициализации своим числом это действительно мусор.

Перепроверил снова, вставив код по тикам

в мт4 постоянно 0

в мт5 да, то 0-крайне редко, то число 511026368

 
x572intraday:

 Хм... Не знаю как одно обстоятельство связано с другим, но запускал в виде индикатора на разных валютных парах — числа лезут разные (на каждом инструменте повторяется с каждым тиком одно и то же число), был даже ноль. Странно. Но похоже на то, что без инициализации своим числом это действительно мусор.

Под массив (и все другие переменные) при его создании выделена память. Если массив не инициализирован, то в этой памяти то что там осталось с прошлых использований=мусор.

Если вы не меняете значения из программы, то ничего с этой памятью и не происходит, мусор сохраняет своё значение.

в МТ4 принудительно инициализируются нулём все переменные и массивы.

 

Не вызывается CExpert.TradeEventOrderTriggered()

При работе с рынком FORTS, сервер BCS-Demo, обнаружилась нестабильность вызова CExpert.TradeEventOrderTriggered() при срабатывании отложенных ордеров.
В код метода CExpert::CheckTradeState стандартной библиотеки MQL5 не учитывает возможную асинхронность получения информации о позициях, ордерах, сделках и истории.

1446://--- check triggering of a pending order
1447:   if(hist_ord_tot==m_hist_ord_tot+1 && ord_tot==m_ord_tot-1)
1448:     {
1449:      //--- triggering of a pending order
1450:      if(deal_tot==m_deal_tot+1)

В случае выполнения кода по историческим данным, условия отрабатывают корректно. При работе с реальными данными, возможны ситуации не одновременного получения информации об изменении позиций, сделках, ордерах и истории, причём, порядок получения информации произволен.

Лог вызовов метода bool CExpert::CheckTradeState(void). Одному вызову CheckTradeState() соответствуют 2 строчки " CheckTradeState: ....."

//Сработал отложенный ордер открытия позиции
CheckTradeState: hist_ord_tot = 613 ord_tot = 0 deal_tot = 544 pos_tot = 1
CheckTradeState: m_hist_ord_tot = 613 m_ord_tot = 1 m_deal_tot = 543 m_pos_tot = 0
CheckTradeState: hist_ord_tot = 614 ord_tot = 1 deal_tot = 544 pos_tot = 1
CheckTradeState: m_hist_ord_tot = 614 m_ord_tot = 1 m_deal_tot = 544 m_pos_tot = 1

//Сработал отложенный ордер открытия позиции 
CheckTradeState: hist_ord_tot = 615 ord_tot = 1 deal_tot = 546 pos_tot = 1
CheckTradeState: m_hist_ord_tot = 615 m_ord_tot = 1 m_deal_tot = 545 m_pos_tot = 0
CheckTradeState: hist_ord_tot = 615 ord_tot = 0 deal_tot = 546 pos_tot = 1
CheckTradeState: m_hist_ord_tot = 615 m_ord_tot = 1 m_deal_tot = 546 m_pos_tot = 1
CheckTradeState: hist_ord_tot = 616 ord_tot = 0 deal_tot = 546 pos_tot = 1
CheckTradeState: m_hist_ord_tot = 616 m_ord_tot = 0 m_deal_tot = 546 m_pos_tot = 1

Из лога видно:
1. После срабатывания отложенных ордеров, длина истории обновляется позднее чем информация о сделках, ордерах и позициях, что приводит к невозможности выполнения 1-го условия в коде.
2. Возможна рассинхронизация получения информации об изменении числа ордеров, сделок и позиций, что приводит к невозможности выполнения 2-го условия в коде (если каким-либо образом обойти первую проблему и выполнить первый if). Возможно, эта рассинхронизация возникла выполнения ордера в 2 этапа (по частям: 1лот+1лот), но в таком случае, почему число сделок +1, а не +2.

Закостылил, таким кодом:

//--- establishment of the checkpoint history of the trade
   bool isSyncMode = MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_VISUAL_MODE);
   if(!isSyncMode)
      HistorySelect(m_beg_date,TimeCurrent());
   else
      HistoryPoint(true);
//---
   return(res);

Смысл, блока: если в асинхронном режиме попали в конец процедуры, что возможно при не прогруженной истории, фетчим историю, но не запоминаем значения количеств ордеров и т.п.

P.S. Создаётся впечатление, что данная часть стандартной библиотеки недоработана. Особенно, смущает кусок кода, написанный 3 раза подряд.

1458: res=TradeEventOrderTriggered();
1459: //--- establishment of the checkpoint history of the trade
1460: HistoryPoint(true);
1461: return(res);

Пишу сюда с надеждой, что проблему заметят и что-нибудь где-нибудь поправят.

Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5