Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Да, в одной из версий добавил, из за отличий. Но потом откатил. Решил, что без них мне нужнее. Хотя можно сделать через переключатель. Добавлю сегодня-завтра.
Expiration тоже легко добавить.
И Slippage наверное тоже просто, еще не думал. Да и не знаю как должно быть. Это, если следующий тик < запрошенной цены покупки + Slippage, то разрешаем?
Добавил FreezeLevel/StopLevel.
Добавил Expiration - без проблем.
Добавил контроль числа открытых лимитных ордеров и сравнение с ACCOUNT_LIMIT_ORDERS. Работает хорошо, кроме варианта, если используется OrderDelete(). Если много ордеров, то из за OrderDelete () бывает сбой, причину не выяснил. Если OrderDelete() не используется, то совпадает с тестером МК.
Этот контроль можно отключать через //#define DISABLE_ACCOUNT_LIMIT_ORDERS
Добавил Slippagе. Терминал их использует в Request и Instant Execution. Но в тестере похоже, что Slippagе не закодировано. https://www.mql5.com/ru/forum/459334/page2#comment_51685246
Я закодировал, но т.к. сравнить не с чем, то можно считать это экспериментальной/непроверенной опцией.
Попытался добавить задержку исполнения. Самая сложная задачка оказалась. Нужно после каждой команды ждать например 100мс, а следующую на том же тике отпралять после нее, цены к тому времени могут измениться.
Если на одном тике отправлять только 1 команду, то совпадение с тестером МК есть. Если 2 или больше (например, чтобы выставить сетку), то не совпадает. К тому же тестером МК сетки лучше не выставлять. Там закодированы только синхронные OrderSend (), т.е. ожидая после каждого OrderSend () по 100 мс, сетка на 20 ордеров выставится через 2 секунды.
Асинхроный режим сделать просто: не делать пауз между ордерами. Но сравнивать не с чем, т.е. тоже будет экспериментальная опция.
Т.к. совпадения нету, код относящийся к DELAY закомментировал. Сделал только при OrderSend (), при модификации и удалении ордеров задержку не добавлял.
Новый код проверки всех опций: тестируйте за 1 день. Это стресс тест, очень много сделок, у меня 29-30мая 2023 на EURUSD на MQДемо около 14 тыс сделок за 2 часа.
При использовании Virtual и перед запросом времени
TimeCurrent()
Tick.time
Tick.time_msc
нужно переключаться на основной тестер командой VIRTUAL::SelectByIndex(0);.
Иначе ответ даст виртуальный тестер, а он заменит ответы этих функций на время последнего тика зашедшего в Virtual, а не только что пришедшего тика. Ниже распечатка
Print(TimeCurrent()," ",TimeTradeServer()," ",TimeLocal()," ",Tick.time," ",MscToString(Tick.time_msc));
PH 0 11:47:09.119 Core 1 2022.05.30 23:55:00 2022.05.30 23:54:57 2022.05.30 23:55:00 2022.05.30 23:55:00 2022.05.30 23:54:57 2022.05.30 23:54:57.596
LK 0 11:47:09.119 Core 1 2022.05.30 23:55:00 2022.05.30 23:55:00 2022.05.30 23:55:00 2022.05.30 23:55:00 2022.05.30 23:55:00 2022.05.30 23:55:00.140
NH 0 11:47:09.119 Core 1 2022.05.30 23:55:00 isSessionTrade check
FN 0 11:47:09.119 Core 1 2022.05.30 23:55:00 Market closed. OnTick return
PQ 0 11:47:09.119 Core 1 2022.05.30 23:55:00 2022.05.30 23:55:00 2022.05.30 23:55:00 2022.05.30 23:55:00 2022.05.30 23:55:00 2022.05.30 23:55:00.140
и так все дни до конца теста
HO 0 11:47:09.119 Core 1 2022.05.31 21:58:17 2022.05.30 23:55:00 2022.05.31 21:58:17 2022.05.31 21:58:17 2022.05.30 23:55:00 2022.05.30 23:55:00.140
...
DG 0 11:47:09.119 Core 1 2022.06.01 23:59:58 2022.05.30 23:55:00 2022.06.01 23:59:58 2022.06.01 23:59:58 2022.05.30 23:55:00 2022.05.30 23:55:00.140
Мне это нужно было для контроля торговой сессии, на сервере где она ограничена с 00:15 до 23:55. Первый день торгуется нормально, потом возвращается время последнего тика первого дня и все время тестер думает, что он вне торговой сессии.
TimeTradeServer() и TimeLocal() совпадают, т.к. не модифицируются в Virtual.
Если переключить на основной тестер ( VIRTUAL::SelectByIndex(0); ), то время получаем от реальных тиков и контроль торговой сессии проходит нормально.
Код использовался из примера в описании библиотеки. Вот модифицированный OnTick():
полный код теста приложил, если интересно проверить. Тестировал на ДЦ Ал-ри с торговой сессией с 00:15 до 23:55, но тики приходят и в закрытое время, поэтому их надо фильтровать.
Библиотека последней версии от 2023.12.17 - сделки/пипсы совпадают в обоих тестерах. Но эта версия не считает комиссии.
Мой вариант библиотеки с комиссиями из поста выше не совпадает по сделкам/пипсам, буду разбираться...
нужно переключаться на основной тестер командой VIRTUAL::SelectByIndex(0);.
Этот макрос переключит на нулевое окружение, в нем выполнит функцию и вернет значение. Затем вернется обратно в то окружение, которое было выбрано до макроса.
Этот макрос переключит на нулевое окружение, в нем выполнит функцию и вернет значение. Затем вернется обратно в то окружение, которое было выбрано до макроса.
В моей версии забыл отключить проверку Slippage для рыночного исполнения. Отключил. Теперь тоже точно совпадает по сделкам. И по свопам и по комиссиям.
GIF-ка:
Так же добавил вызов VIRTUAL::Stop(Tick); с передаваемым тиком. Чтобы в конце теста закрытие было по цене и времени последнего тика, который при включенной CONTROL_TRADE_SESSION был бы отклонен обычной VIRTUAL::Stop(); .
С этим вариантом закрытие будет как в тестере MQ в итоге будет точное совпадение по балансу, как на скриншоте выше.
Используется так:
VIRTUAL::SelectByIndex(0); // чтобы получить правильное время и тик, а не последний из Virtual
MqlTick Tick;
if (!SymbolInfoTick(_Symbol, Tick) ) {Print("no tick"); return; }
Print("OnDeinit ",Tick.time," ",Tick.bid," ",Tick.ask);
for (int v = 1 ; v <= VIRTUAL::Total(); v++){if (VIRTUAL::SelectByIndex(v)){ VIRTUAL::Stop(Tick); }} // закрыть незавершенные сделки по цене последнего тика, как в тестере
for (int v = 0 ; v <= VIRTUAL::Total(); v++){if (VIRTUAL::SelectByIndex(v)){QuickReport("report_"+(string)v, true, v);}}
}
Теперь тоже точно совпадает по сделкам. И по свопам и по комиссиям.
Используется так:
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: OnTickMulti
fxsaber, 2024.03.19 09:37
Проверил замедление Тестера при переходе от моносимвольного режима в мультисимвольный. Делал это не совсем идеально - советник пустышка.
Мультисимвольный советник.
Производительность слабо зависит от количества символов, но при этом ниже в три раза.
Сделал мультивалютный Тестер в Virtual и повторил для него замер производительности по той же методике, чтобы можно было сравнить MT5-Tester VS Virtual-Tester.
Подопытная ТС - пустышка, поэтому показатели максимальные из возможных и четкие выводы делать сложно.
Конечно, многократное ускорение налицо (правые столбцы таблиц): 17-83 миллионов пустых мультивалютных тиков в секунду.
ЗЫ Так замерял.
Сделал мультивалютный Тестер в Virtual