// Скрипт позволяет увидеть, как формируется таблица истории ордеров// при создании/удалении новых ордеров и без этого.#property script_show_inputsinputbool inFlag = true; // Проверка истории с открытием ордеровinputdatetime inFrom = 0; // Не ноль приведет к ошибке и с новыми ордерами#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006voidOnTick()
{
MqlTick Tick;
if (SymbolInfoTick(_Symbol, Tick) && Tick.ask)
{
Print("------------\n" + (string)inFlag); // Отделили строки разных запусков скрипта.if (inFlag) // Проверка на новых ордерах.
{
// Попытка сформировать кеш на случай, если начальная дата будет всегда постоянной, но ненулевой.HistorySelect(inFrom, INT_MAX);
Print("Create/Delete orders.");
// Создали первый ордер.const TICKET_TYPE Ticket1 = OrderSend(_Symbol, OP_BUYLIMIT, 0.1, Tick.ask - 1000 * _Point, 0, 0, 0);
Sleep(2000); // Подождали и создали второй ордер.const TICKET_TYPE Ticket2 = OrderSend(_Symbol, OP_BUYLIMIT, 0.1, Tick.ask - 1000 * _Point, 0, 0, 0);
Print(Ticket1); // Тикет первого.Print(Ticket2); // Тикет второго.
OrderDelete(Ticket2); // Удалили второй - попал в историю.Sleep(2000); // Подождали и удалили первый - попал в историю.
OrderDelete(Ticket1);
// Проверка последовательности ордеров в истории - последних двух.if (HistorySelect(inFrom, INT_MAX))
{
Print("Check the History. inFrom = " + (string)inFrom);
constint Total = HistoryOrdersTotal();
for (int i = Total - 2; i < Total; i++)
Print(HistoryOrderGetTicket(i)); // Распечатываем тикеты в конце таблицы.
}
ExpertRemove();
}
}
}
Результат Тестера.
2021.06.1915:30:46.582 Core 1 EURUSD,M1: testing of Experts\Test9.ex5 from 2021.06.1800:00 to 2021.06.1900:00 started with inputs:
2021.06.1915:30:46.582 Core 1 inFlag=true2021.06.1915:30:46.582 Core 1 inFrom=02021.06.1915:30:46.582 Core 1 EURUSD : real ticks begin from 2021.03.1500:00:002021.06.1915:30:46.582 Core 12021.06.1800:00:00 ------------
2021.06.1915:30:46.582 Core 12021.06.1800:00:00true2021.06.1915:30:46.582 Core 12021.06.1800:00:00 Create/Delete orders.
2021.06.1915:30:46.582 Core 12021.06.1800:00:00 buy limit 0.1 EURUSD at 1.18097 (1.19057 / 1.19097)
2021.06.1915:30:46.582 Core 12021.06.1800:00:02 buy limit 0.1 EURUSD at 1.18097 (1.19057 / 1.19069)
2021.06.1915:30:46.582 Core 12021.06.1800:00:0222021.06.1915:30:46.582 Core 12021.06.1800:00:0232021.06.1915:30:46.582 Core 12021.06.1800:00:02 order canceled [#3buy limit 0.1 EURUSD at 1.18097]
2021.06.1915:30:46.582 Core 12021.06.1800:00:04 order canceled [#2buy limit 0.1 EURUSD at 1.18097]
2021.06.1915:30:46.582 Core 12021.06.1800:00:04 Check the History. inFrom = 1970.01.0100:00:002021.06.1915:30:46.582 Core 12021.06.1800:00:0432021.06.1915:30:46.582 Core 12021.06.1800:00:0422021.06.1915:30:46.582 Core 12021.06.1800:00:04ExpertRemove() function called
Все четко и правильно в Тестере! Это не повод ломать Тестер. Это повод вернуть хотя бы поведение Терминала к тому, что было еще в b2958. Там работало только для inFrom = 0, но работало. В Тестере работает для любого inFrom правильно. Это абсолютно логично.
Что имеем на данный момент. HistorySelect в Терминале и в Тестере работают разными алгоритмами. При этом в Тестере этот алгоритм удобный и логичный, да еще и супер-быстрый - дозапись всего, что приходит в историю, в конец таблицы. В Терминале же - нет.
Заметьте, не упоминаю сортировку по какому-либо признаку во время работы советника. Просто говорю о дозаписи в конец (а не в середину) новых элементов истории.
Если же говорить о сортировке, то она нужна только один раз - при запуске советника. И сортировка должна быть по ORDER_TIME_DONE_MSC (при совпадающих значениях - по тикету). Тогда будет полная однозначность HistorySelect-таблицы во время работы и сразу после запуска.
что-то непонятное с ENUM_INIT_RETCODE в OnDeinit индикатора.
Код для воспроизведения:
в результате некорректно отрабатывает ожидаемая выгрузка индикатора.
т.е. явный возврат INIT_FAILED дошел до OnDeinit как 8, а не 1.
Индикатор не выгрузился и остался на чарте!
что-то непонятное с ENUM_INIT_RETCODE в OnDeinit индикатора.
Код для воспроизведения:
в результате некорректно отрабатывает ожидаемая выгрузка индикатора.
т.е. явный возврат INIT_FAILED дошел до OnDeinit как 8, а не 1.
Индикатор не выгрузился и остался на чарте!
Что-то вы запутались https://www.mql5.com/ru/docs/constants/namedconstants/uninit
Причины деинициализации
Коды причины деинициализации эксперта, возвращаемые функцией UninitializeReason(). Могут иметь любые из следующих значений:
Константа
Значение
Описание
REASON_PROGRAM
0
Эксперт прекратил свою работу, вызвав функцию ExpertRemove()
REASON_REMOVE
1
Программа удалена с графика
REASON_RECOMPILE
2
Программа перекомпилирована
REASON_CHARTCHANGE
3
Символ или период графика был изменен
REASON_CHARTCLOSE
4
График закрыт
REASON_PARAMETERS
5
Входные параметры были изменены пользователем
REASON_ACCOUNT
6
Активирован другой счет либо произошло переподключение к торговому серверу вследствие изменения настроек счета
REASON_TEMPLATE
7
Применен другой шаблон графика
REASON_INITFAILED
8
Признак того, что обработчик OnInit() вернул ненулевое значение
REASON_CLOSE
9
Терминал был закрыт
Код причины деинициализации передается также в качестве параметра предопределенной функции OnDeinit(const int reason).
Да, согласен (иное, чем в ОnInit, перечисление используется в OnDeinit) - код возврата не нулевой и передача 8-ки в OnDeinit это корректно.
Однако, я, по наивности, ожидал поведения - индикатор будет выгружен.
Этого не происходит. Я опять что-то упустил. Как в таком случае выгружать индикатор?
Читайте наконец справку https://www.mql5.com/ru/docs/runtime/running
Ваш ответ следует интерпретировать - "Выгрузка индикатора с кодом возврата в его OnInit - INIT_FAILED не предусмотрена."
Или все же, следует ожидать, что такой индикатор будет выгружен? Это логично.
В последнем релизе (2981) это не происходит.
Обнаружил, что на всех 5 компьютерах стоит Win10 x64 и MT5 x32. Переустановил на одном x64.
Как бы побыстрее на остальных? Скопировать *.exe будет достаточно?
Обнаружил, что на всех 5 компьютерах стоит Win10 x64 и MT5 x32. Переустановил на одном x64.
Как бы побыстрее на остальных? Скопировать *.exe будет достаточно?
Вполне достаточно. Я обновляю только так. Да и устанавливаю в новые папки так-же.
b2981, просьба исправить поведение на прежнее (b2958).
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Новая версия платформы MetaTrader 5 build 2940: Перенос витрин MQL5-сервисов в рабочую область и обновление дизайна
fxsaber, 2021.06.19 14:39
Веский довод, почему сейчас в Терминале неправильно. Переделал скрипт в советник.Результат Тестера.
Все четко и правильно в Тестере! Это не повод ломать Тестер. Это повод вернуть хотя бы поведение Терминала к тому, что было еще в b2958. Там работало только для inFrom = 0, но работало. В Тестере работает для любого inFrom правильно. Это абсолютно логично.
Что имеем на данный момент. HistorySelect в Терминале и в Тестере работают разными алгоритмами. При этом в Тестере этот алгоритм удобный и логичный, да еще и супер-быстрый - дозапись всего, что приходит в историю, в конец таблицы. В Терминале же - нет.
Заметьте, не упоминаю сортировку по какому-либо признаку во время работы советника. Просто говорю о дозаписи в конец (а не в середину) новых элементов истории.
Если же говорить о сортировке, то она нужна только один раз - при запуске советника. И сортировка должна быть по ORDER_TIME_DONE_MSC (при совпадающих значениях - по тикету). Тогда будет полная однозначность HistorySelect-таблицы во время работы и сразу после запуска.
Не понимаю, почему все время нарываюсь на подобный бред.
Это сделано специально, чтобы косвенно повысить цены для пользователей MT5? Тогда вы должны четко написать это на странице VPS и не маскировать это!
Is this intentional to indirectly increase prices for MT5 users? But then you have to write this clearly on the VPS page and not try to hide it!