Наверно потому что вы упускаете из виду, что таблица индексируется как массив с нуля. О чём и пытается вам объяснить Алексей. А написав заведомо код с ошибкой, и требовать от него правильного выполнения, ну не знаю, как то удивительно от вас такое слышать. Если раньше работало, а теперь нет, то возможно пофиксили ошибку в новых билдах, и сразу вылезла ваша ошибка. Мне кажется Алексей верно нашёл ошибку.
Да нет, с кодом все в порядке. В смысле, что ошибки там нет.
Написан сложно, как всегда, поэтому и вызывает непонимание.
Производительность рушится. На примитивных ТС этого не заметить. Если озвучить текущее поведение MT5 (а до b2958 работал правильно) конкурентам, найдут повод для издевок над MT5. И это будет по делу.
на одном и том же месте исторической таблицы могут быть разные ордера. Это архитектурная ошибка. Прошу разработчиков вернуть поведение b2958 - ордера при попадании в историческую таблицу помещаются в ее конец. Именно так происходит в Тестере.
На данный момент (b3160) один и тот же советник в Тестере и в Терминале показывает разное поведение.
А если HistoryOrdersTotal()-1 вынести в переменную то получим правильное значение с ошибкой. т.е. 0-1 = -1 выход за пределы таблицы, получаем UB неопределённое поведение.
2022.01.2615:26:04.014 fxS (EURUSD,M5) StartIndex: -12022.01.2615:26:04.015 fxS (EURUSD,M5) Alert: Index = -1HistoryOrderGetTicket(Index) = 02022.01.2615:26:05.026 fxS (EURUSD,M5) Alert: Index = -1HistoryOrderGetTicket(Index) = 02022.01.2615:26:06.036 fxS (EURUSD,M5) Alert: Index = -1HistoryOrderGetTicket(Index) = 02022.01.2615:26:07.047 fxS (EURUSD,M5) Alert: Index = -1HistoryOrderGetTicket(Index) = 02022.01.2615:26:08.070 fxS (EURUSD,M5) Alert: Index = -1HistoryOrderGetTicket(Index) = 02022.01.2615:26:09.069 fxS (EURUSD,M5) Alert: Index = -1HistoryOrderGetTicket(Index) = 02022.01.2615:26:10.077 fxS (EURUSD,M5) Alert: Index = -1HistoryOrderGetTicket(Index) = 02022.01.2615:26:11.086 fxS (EURUSD,M5) Alert: Index = -1HistoryOrderGetTicket(Index) = 02022.01.2615:26:12.098 fxS (EURUSD,M5) Alert: Index = -1HistoryOrderGetTicket(Index) = 02022.01.2615:26:13.119 fxS (EURUSD,M5) Alert: Index = -1HistoryOrderGetTicket(Index) = 0
UP
Сорян, упустил что надо HistorySelect прежде вызвать, код выше с моей ошибкой. Но смотрите какая фишка, вынес эти функции в переменные, без изменения логики кода. и код fxSabera заработал правильно.
Короче проблема кроется в тернарном операторе. Вроде сравниваются значения одного типа, но правильно они сравниваются только из переменных.
Если ничего в коде не менять, то сколько ни бейся, результат будешь получать без изменений.
Автоторговлю разрешили? Потому как без нее результат будет всегда одинаковый.
У меня так без автоторговли:
2022.01.2614:32:05.364 Test (EURJPY,H1) Alert: Index = 0HistoryOrderGetTicket(Index) = 11048570412022.01.2614:32:33.304 Test (EURJPY,H1) Alert: Index = 0HistoryOrderGetTicket(Index) = 11048570412022.01.2614:32:37.436 Test (EURJPY,H1) Alert: Index = 0HistoryOrderGetTicket(Index) = 11048570412022.01.2614:32:40.489 Test (EURJPY,H1) Alert: Index = 0HistoryOrderGetTicket(Index) = 11048570412022.01.2614:33:34.429 Test (EURJPY,H1) Alert: Index = 0HistoryOrderGetTicket(Index) = 1104857041
И вот так с автоторговлей:
2022.01.2614:33:42.182 Test (EURJPY,H1) Alert: Index = 2HistoryOrderGetTicket(Index) = 12448292902022.01.2614:33:42.252 Test (EURJPY,H1) Alert: Index = 2HistoryOrderGetTicket(Index) = 12448292882022.01.2614:33:42.316 Test (EURJPY,H1) Alert: Index = 2HistoryOrderGetTicket(Index) = 12448292872022.01.2614:33:42.386 Test (EURJPY,H1) Alert: Index = 2HistoryOrderGetTicket(Index) = 12448292852022.01.2614:33:42.456 Test (EURJPY,H1) Alert: Index = 2HistoryOrderGetTicket(Index) = 12448292832022.01.2614:33:42.526 Test (EURJPY,H1) Alert: Index = 2HistoryOrderGetTicket(Index) = 12448292812022.01.2614:33:42.598 Test (EURJPY,H1) Alert: Index = 2HistoryOrderGetTicket(Index) = 12448292802022.01.2614:33:42.660 Test (EURJPY,H1) Alert: Index = 2HistoryOrderGetTicket(Index) = 12448292782022.01.2614:33:42.730 Test (EURJPY,H1) Alert: Index = 2HistoryOrderGetTicket(Index) = 12448292762022.01.2614:33:42.800 Test (EURJPY,H1) Alert: Index = 2HistoryOrderGetTicket(Index) = 1244829275
А написав заведомо код с ошибкой, и требовать от него правильного выполнения, ну не знаю, как то удивительно от вас такое слышать.
Не думаю, что следили за обсуждением, где было доказано отсутствие ошибок выполнения.
Рад был бы аудиту кода со стороны форумчан, т.к. речь идет о важной теме MT5.
Наверно потому что вы упускаете из виду, что таблица индексируется как массив с нуля.
О чём и пытается вам объяснить Алексей.
А написав заведомо код с ошибкой, и требовать от него правильного выполнения, ну не знаю, как то удивительно от вас такое слышать.
Если раньше работало, а теперь нет, то возможно пофиксили ошибку в новых билдах, и сразу вылезла ваша ошибка.
Мне кажется Алексей верно нашёл ошибку.
Да нет, с кодом все в порядке. В смысле, что ошибки там нет.
Написан сложно, как всегда, поэтому и вызывает непонимание.
Не думаю, что следили за обсуждением, где было доказано отсутствие ошибок выполнения.
Рад был бы аудиту кода со стороны форумчан, т.к. речь идет о важной теме MT5.
А ещё чудней получается если из этой строки
удалить Step() &&
И вот такой результат
Вы снова изменили смысл скрипта.
Если ничего в коде не менять, то сколько ни бейся, результат будешь получать без изменений.
А ещё чудней получается если из этой строки
удалить Step() &&
Не знаю причин, почему пытаетесь менять рабочий код. Его алгоритм расписал полностью.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Бета-версия платформы MetaTrader 5 build 3160: Векторы и матрицы в MQL5 и повышение удобства работы
fxsaber, 2022.01.26 12:24
Если ничего в коде не менять, то сколько ни бейся, результат будешь получать без изменений.
Код четко воспроизводит ситуацию, что на одно и то же место в таблице истории ордеров попадают разные ордера. Написал, почему это плохо.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Бета-версия платформы 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) один и тот же советник в Тестере и в Терминале показывает разное поведение.
А ещё чудней получается если из этой строки
удалить Step() &&
И вот такой результат
А если HistoryOrdersTotal()-1 вынести в переменную
то получим правильное значение с ошибкой.
т.е. 0-1 = -1 выход за пределы таблицы, получаем UB неопределённое поведение.
UP
Сорян, упустил что надо HistorySelect прежде вызвать, код выше с моей ошибкой.
Но смотрите какая фишка, вынес эти функции в переменные, без изменения логики кода.
и код fxSabera заработал правильно.
Короче проблема кроется в тернарном операторе. Вроде сравниваются значения одного типа,
но правильно они сравниваются только из переменных.
Если ничего в коде не менять, то сколько ни бейся, результат будешь получать без изменений.
Автоторговлю разрешили? Потому как без нее результат будет всегда одинаковый.
У меня так без автоторговли:
И вот так с автоторговлей:
смотрите какая фишка, вынес эти функции в переменные, без изменения логики кода.
Изменили логику.
Изменили логику.
Логика не нарушена, тернарное условие по прежней логике выполняется.
Отличие только в выносе в переменную, это не логика.