Новая версия платформы MetaTrader 5 build 3180: Векторы и матрицы в MQL5 и повышение удобства работы - страница 9

 
Roman #:

А написав заведомо код с ошибкой, и требовать от него правильного выполнения, ну не знаю, как то удивительно от вас такое слышать.

Не думаю, что следили за обсуждением, где было доказано отсутствие ошибок выполнения.

Рад был бы аудиту кода со стороны форумчан, т.к. речь идет о важной теме MT5.

 
Roman #:

Наверно потому что вы упускаете из виду, что таблица индексируется как массив с нуля.
О чём и пытается вам объяснить Алексей.
А написав заведомо код с ошибкой, и требовать от него правильного выполнения, ну не знаю, как то удивительно от вас такое слышать.
Если раньше работало, а теперь нет, то возможно пофиксили ошибку в новых билдах, и сразу вылезла ваша ошибка.
Мне кажется Алексей верно нашёл ошибку.

Да нет, с кодом все в порядке. В смысле, что ошибки там нет.

Написан сложно, как всегда, поэтому и вызывает непонимание.

 
fxsaber #:

Не думаю, что следили за обсуждением, где было доказано отсутствие ошибок выполнения.

Рад был бы аудиту кода со стороны форумчан, т.к. речь идет о важной теме MT5.

А ещё чудней получается если из этой строки

  return(Step() && HistorySelect(0, INT_MAX) ? HistoryOrdersTotal() - 1 : 0);

удалить Step() &&

И вот такой результат

2022.01.26 15:06:11.767 00 (AUDUSD,H1)  Alert: Index = 1003 HistoryOrderGetTicket(Index) = 271896651 
2022.01.26 15:06:11.853 00 (AUDUSD,H1)  Alert: Index = 1003 HistoryOrderGetTicket(Index) = 271896651 
2022.01.26 15:06:11.929 00 (AUDUSD,H1)  Alert: Index = 1003 HistoryOrderGetTicket(Index) = 271896651 
2022.01.26 15:06:12.018 00 (AUDUSD,H1)  Alert: Index = 1003 HistoryOrderGetTicket(Index) = 271896651 
2022.01.26 15:06:12.102 00 (AUDUSD,H1)  Alert: Index = 1003 HistoryOrderGetTicket(Index) = 271896651 
2022.01.26 15:06:12.202 00 (AUDUSD,H1)  Alert: Index = 1003 HistoryOrderGetTicket(Index) = 271896651 
2022.01.26 15:06:12.289 00 (AUDUSD,H1)  Alert: Index = 1003 HistoryOrderGetTicket(Index) = 271896651 
2022.01.26 15:06:12.369 00 (AUDUSD,H1)  Alert: Index = 1003 HistoryOrderGetTicket(Index) = 271896651 
2022.01.26 15:06:12.455 00 (AUDUSD,H1)  Alert: Index = 1003 HistoryOrderGetTicket(Index) = 271896651 
2022.01.26 15:06:12.533 00 (AUDUSD,H1)  Alert: Index = 1003 HistoryOrderGetTicket(Index) = 271896651 
2022.01.26 15:06:12.617 00 (AUDUSD,H1)  Alert: Index = 1003 HistoryOrderGetTicket(Index) = 271896651 
 
fxsaber #:

Вы снова изменили смысл скрипта.

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

 
Alexey Viktorov #:

А ещё чудней получается если из этой строки

удалить Step() &&

Не знаю причин, почему пытаетесь менять рабочий код. Его алгоритм расписал полностью.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Бета-версия платформы MetaTrader 5 build 3160: Векторы и матрицы в MQL5 и повышение удобства работы

fxsaber, 2022.01.26 12:24

  1. Создается 10 ордеров.
  2. Берется const-индекс, равный количеству ордеров в истории ДО запуска скрипта.
  3. В цикле удаляется один ордер и распечатывается ордер, что находится на const-индексе в таблице истории.
  4. На каждом шаге цикла видим, что на const-индекс место в таблице ставится каждый раз новый ордер.
 
Alexey Viktorov #:

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

Код четко воспроизводит ситуацию, что на одно и то же место в таблице истории ордеров попадают разные ордера. Написал, почему это плохо.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Бета-версия платформы MetaTrader 5 build 3160: Векторы и матрицы в MQL5 и повышение удобства работы

fxsaber, 2022.01.25 12:46

Производительность рушится. На примитивных ТС этого не заметить. Если озвучить текущее поведение MT5 (а до b2958 работал правильно) конкурентам, найдут повод для издевок над MT5. И это будет по делу.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Бета-версия платформы MetaTrader 5 build 3160: Векторы и матрицы в MQL5 и повышение удобства работы

fxsaber, 2022.01.26 10:48

на одном и том же месте исторической таблицы могут быть разные ордера. Это архитектурная ошибка. Прошу разработчиков вернуть поведение b2958 - ордера при попадании в историческую таблицу помещаются в ее конец. Именно так происходит в Тестере.

На данный момент (b3160) один и тот же советник в Тестере и в Терминале показывает разное поведение.

 
Alexey Viktorov #:

А ещё чудней получается если из этой строки

удалить Step() &&

И вот такой результат

А если HistoryOrdersTotal()-1 вынести в переменную
то получим правильное значение с ошибкой.
т.е. 0-1 = -1 выход за пределы таблицы, получаем UB неопределённое поведение.

int GetIndex( const int Amount = 10 )
{
   MqlTradeRequest Request = {};
   MqlTradeResult Result;

   Request.action = TRADE_ACTION_PENDING;
   Request.symbol = _Symbol;
   Request.volume = 0.1;
   Request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK) - 1000 * _Point;
   Request.type = ORDER_TYPE_BUY_LIMIT;

   for(int i = 0; (i < Amount) && OrderSend(Request, Result); i++);
   
   int hot = HistoryOrdersTotal()-1;
   Print("HistoryOrdersTotal: "+(string)hot);
    
   return(Step() && HistorySelect(0, INT_MAX) ? hot : 0);
}
2022.01.26 15:26:04.014 fxS (EURUSD,M5) StartIndex: -1
2022.01.26 15:26:04.015 fxS (EURUSD,M5) Alert: Index = -1 HistoryOrderGetTicket(Index) = 0 
2022.01.26 15:26:05.026 fxS (EURUSD,M5) Alert: Index = -1 HistoryOrderGetTicket(Index) = 0 
2022.01.26 15:26:06.036 fxS (EURUSD,M5) Alert: Index = -1 HistoryOrderGetTicket(Index) = 0 
2022.01.26 15:26:07.047 fxS (EURUSD,M5) Alert: Index = -1 HistoryOrderGetTicket(Index) = 0 
2022.01.26 15:26:08.070 fxS (EURUSD,M5) Alert: Index = -1 HistoryOrderGetTicket(Index) = 0 
2022.01.26 15:26:09.069 fxS (EURUSD,M5) Alert: Index = -1 HistoryOrderGetTicket(Index) = 0 
2022.01.26 15:26:10.077 fxS (EURUSD,M5) Alert: Index = -1 HistoryOrderGetTicket(Index) = 0 
2022.01.26 15:26:11.086 fxS (EURUSD,M5) Alert: Index = -1 HistoryOrderGetTicket(Index) = 0 
2022.01.26 15:26:12.098 fxS (EURUSD,M5) Alert: Index = -1 HistoryOrderGetTicket(Index) = 0 
2022.01.26 15:26:13.119 fxS (EURUSD,M5) Alert: Index = -1 HistoryOrderGetTicket(Index) = 0 


UP

Сорян, упустил что надо HistorySelect прежде вызвать, код выше с моей ошибкой.
Но смотрите какая фишка, вынес эти функции в переменные, без изменения логики кода.
и код fxSabera заработал правильно.

Короче проблема кроется в тернарном операторе. Вроде сравниваются значения одного типа,
но правильно они сравниваются только из переменных.

int GetIndex( const int Amount = 10 )
{
   MqlTradeRequest Request = {};
   MqlTradeResult Result;

   Request.action = TRADE_ACTION_PENDING;
   Request.symbol = _Symbol;
   Request.volume = 0.1;
   Request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK) - 1000 * _Point;
   Request.type = ORDER_TYPE_BUY_LIMIT;

   for(int i=0; (i < Amount) && OrderSend(Request, Result); i++);
   
   bool hs = HistorySelect(0, INT_MAX);
   int hot = HistoryOrdersTotal()-1;
    
   return(Step() && hs ? hot : 0);
}
2022.01.26 16:37:06.239 fxS (EURUSD,M5) StartIndex: 446
2022.01.26 16:37:06.240 fxS (EURUSD,M5) Alert: Index = 446 HistoryOrderGetTicket(Index) = 1244890360 
2022.01.26 16:37:06.560 fxS (EURUSD,M5) Alert: Index = 446 HistoryOrderGetTicket(Index) = 1244890360 
2022.01.26 16:37:06.686 fxS (EURUSD,M5) Alert: Index = 446 HistoryOrderGetTicket(Index) = 1244890360 
2022.01.26 16:37:06.814 fxS (EURUSD,M5) Alert: Index = 446 HistoryOrderGetTicket(Index) = 1244890360 
2022.01.26 16:37:06.932 fxS (EURUSD,M5) Alert: Index = 446 HistoryOrderGetTicket(Index) = 1244890360 
2022.01.26 16:37:07.047 fxS (EURUSD,M5) Alert: Index = 446 HistoryOrderGetTicket(Index) = 1244890360 
2022.01.26 16:37:07.163 fxS (EURUSD,M5) Alert: Index = 446 HistoryOrderGetTicket(Index) = 1244890360 
2022.01.26 16:37:07.277 fxS (EURUSD,M5) Alert: Index = 446 HistoryOrderGetTicket(Index) = 1244890360 
2022.01.26 16:37:07.393 fxS (EURUSD,M5) Alert: Index = 446 HistoryOrderGetTicket(Index) = 1244890360 
2022.01.26 16:37:07.508 fxS (EURUSD,M5) Alert: Index = 446 HistoryOrderGetTicket(Index) = 1244890360 
 
Alexey Viktorov #:

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

Автоторговлю разрешили? Потому как без нее результат будет всегда одинаковый.

У меня так без автоторговли:

2022.01.26 14:32:05.364 Test (EURJPY,H1)        Alert: Index = 0 HistoryOrderGetTicket(Index) = 1104857041 
2022.01.26 14:32:33.304 Test (EURJPY,H1)        Alert: Index = 0 HistoryOrderGetTicket(Index) = 1104857041 
2022.01.26 14:32:37.436 Test (EURJPY,H1)        Alert: Index = 0 HistoryOrderGetTicket(Index) = 1104857041 
2022.01.26 14:32:40.489 Test (EURJPY,H1)        Alert: Index = 0 HistoryOrderGetTicket(Index) = 1104857041 
2022.01.26 14:33:34.429 Test (EURJPY,H1)        Alert: Index = 0 HistoryOrderGetTicket(Index) = 1104857041 

И вот так с автоторговлей:

2022.01.26 14:33:42.182 Test (EURJPY,H1)        Alert: Index = 2 HistoryOrderGetTicket(Index) = 1244829290 
2022.01.26 14:33:42.252 Test (EURJPY,H1)        Alert: Index = 2 HistoryOrderGetTicket(Index) = 1244829288 
2022.01.26 14:33:42.316 Test (EURJPY,H1)        Alert: Index = 2 HistoryOrderGetTicket(Index) = 1244829287 
2022.01.26 14:33:42.386 Test (EURJPY,H1)        Alert: Index = 2 HistoryOrderGetTicket(Index) = 1244829285 
2022.01.26 14:33:42.456 Test (EURJPY,H1)        Alert: Index = 2 HistoryOrderGetTicket(Index) = 1244829283 
2022.01.26 14:33:42.526 Test (EURJPY,H1)        Alert: Index = 2 HistoryOrderGetTicket(Index) = 1244829281 
2022.01.26 14:33:42.598 Test (EURJPY,H1)        Alert: Index = 2 HistoryOrderGetTicket(Index) = 1244829280 
2022.01.26 14:33:42.660 Test (EURJPY,H1)        Alert: Index = 2 HistoryOrderGetTicket(Index) = 1244829278 
2022.01.26 14:33:42.730 Test (EURJPY,H1)        Alert: Index = 2 HistoryOrderGetTicket(Index) = 1244829276 
2022.01.26 14:33:42.800 Test (EURJPY,H1)        Alert: Index = 2 HistoryOrderGetTicket(Index) = 1244829275 
 
Roman #:

смотрите какая фишка, вынес эти функции в переменные, без изменения логики кода.

Изменили логику.

 
fxsaber #:

Изменили логику.

Логика не нарушена, тернарное условие по прежней логике выполняется.
Отличие только в выносе в переменную, это не логика. 

Причина обращения: