Советник
// MQL4&5-code #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006 #ifdef __MQL5__ #define Bid (SymbolInfoDouble(_Symbol, SYMBOL_BID)) #define Ask (SymbolInfoDouble(_Symbol, SYMBOL_ASK)) #endif // __MQL5__ // Idea - https://www.mql5.com/ru/code/7464 #property strict input int Shift = 3; input int Limit = 18; input double Lots = 0.1; int PriceToInteger( const double Price ) { return((int)(Price / _Point + 0.1)); } void OnTick() { static int PrevBid = PriceToInteger(Bid); static int PrevAsk = PriceToInteger(Ask); const int IntBid = PriceToInteger(Bid); const int IntAsk = PriceToInteger(Ask); const bool TradeTime = (TimeCurrent() % (24 * 60 * 60) < D'1970.01.01 23:50'); // exclude swaps if (TradeTime && (IntAsk - IntBid < Limit)) { if ((IntBid - PrevBid >= Shift)) OrderSend(_Symbol, OP_SELL, Lots, Bid, 0, 0, 0); if (PrevAsk - IntAsk >= Shift) OrderSend(_Symbol, OP_BUY, Lots, Ask, 0, 0, 0); } PrevBid = IntBid; PrevAsk = IntAsk; for (int i = OrdersTotal() - 1; i >= 0; i--) if (OrderSelect(i, SELECT_BY_POS) && ((!TradeTime) || (OrderProfit() > 0) || ((OrderType() == OP_BUY) && (PriceToInteger(OrderOpenPrice()) - IntBid >= Limit)) || ((OrderType() == OP_SELL) && (IntAsk - PriceToInteger(OrderOpenPrice()) >= Limit)))) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0); }
Результаты
MT4-отчет
Символ | EURUSD (Euro vs US Dollar) | ||||
Период | 1 Минута (M1) 2017.04.10 00:00 - 2017.04.14 20:58 (2017.04.10 - 2017.04.16) | ||||
Модель | Все тики (наиболее точный метод на основе всех наименьших доступных таймфреймов) | ||||
Параметры | Shift=3; Limit=18; Lots=0.1; | ||||
Баров в истории | 7292 | Смоделировано тиков | 1865515 | Качество моделирования | 99.00% |
Ошибки рассогласования графиков | 0 | ||||
Начальный депозит | 100000.00 | Спред | Variable | ||
Чистая прибыль | -10863.90 | Общая прибыль | 2528.70 | Общий убыток | -13392.60 |
Прибыльность | 0.19 | Матожидание выигрыша | -0.49 | ||
Абсолютная просадка | 10864.70 | Максимальная просадка | 10864.70 (10.86%) | Относительная просадка | 10.86% (10864.70) |
Всего сделок | 21954 | Короткие позиции (% выигравших) | 12016 (68.60%) | Длинные позиции (% выигравших) | 9938 (67.03%) |
Прибыльные сделки (% от всех) | 14904 (67.89%) | Убыточные сделки (% от всех) | 7050 (32.11%) | ||
Самая большая | прибыльная сделка | 3.00 | убыточная сделка | -4.40 | |
Средняя | прибыльная сделка | 0.17 | убыточная сделка | -1.90 | |
Максимальное количество | непрерывных выигрышей (прибыль) | 155 (46.60) | непрерывных проигрышей (убыток) | 115 (-210.10) | |
Макс. | непрерывная прибыль (число выигрышей) | 46.60 (155) | непрерывный убыток (число проигрышей) | -210.10 (115) | |
Средний | непрерывный выигрыш | 5 | непрерывный проигрыш | 2 |
MT5-отчет
Отчет Тестера стратегий | ||||||||||||
Alpari-MT5 (Build 1596) | ||||||||||||
Настройки | ||||||||||||
Советник: | Lucky | |||||||||||
Символ: | EURUSD | |||||||||||
Период: | M1 (2017.04.10 - 2017.04.16) | |||||||||||
Параметры: | Shift=3 | |||||||||||
Limit=18 | ||||||||||||
Lots=0.1 | ||||||||||||
Брокер: | Alpari International Limited | |||||||||||
Валюта: | USD | |||||||||||
Начальный депозит: | 100 000.00 | |||||||||||
Плечо: | 1:100 | |||||||||||
Бэктест | ||||||||||||
Качество истории: | n/a | |||||||||||
Бары: | 7192 | Тики: | 1865415 | Символы: | 1 | |||||||
Чистая прибыль: | -10 863.90 | Абсолютная просадка по балансу: | 10 863.90 | Абсолютная просадка по средствам: | 10 864.70 | |||||||
Общая прибыль: | 2 528.70 | Максимальная просадка по балансу: | 10 863.90 (10.86%) | Максимальная просадка по средствам: | 10 864.70 (10.86%) | |||||||
Общий убыток: | -13 392.60 | Относительная просадка по балансу: | 10.86% (10 863.90) | Относительная просадка по средствам: | 10.86% (10 864.70) | |||||||
Прибыльность: | 0.19 | Матожидание выигрыша: | -0.49 | Уровень маржи: | 863.58% | |||||||
Фактор восстановления: | -1.00 | Коэффициент Шарпа: | -0.50 | Z-Счет: | -52.22 (99.74%) | |||||||
AHPR: | 1.0000 (-0.00%) | LR Correlation: | -1.00 | Результат OnTester: | 0 | |||||||
GHPR: | 1.0000 (-0.00%) | LR Standard Error: | 149.82 | |||||||||
Всего трейдов: | 21954 | Короткие трейды (% выигравших): | 12016 (68.60%) | Длинные трейды (% выигравших): | 9938 (67.03%) | |||||||
Всего сделок: | 43908 | Прибыльные трейды (% от всех): | 14904 (67.89%) | Убыточные трейды (% от всех): | 7050 (32.11%) | |||||||
Самый большой прибыльный трейд: | 3.00 | Самый большой убыточный трейд: | -4.40 | |||||||||
Средний прибыльный трейд: | 0.17 | Средний убыточный трейд: | -1.90 | |||||||||
Максимальное количество непрерывных выигрышей (прибыль): | 155 (46.60) | Максимальное количество непрерывных проигрышей (убыток): | 115 (-210.10) | |||||||||
Макс. непрерывная прибыль (число выигрышей): | 46.60 (155) | Макс. непрерывный убыток (число проигрышей): | -210.10 (115) | |||||||||
Средний непрерывный выигрыш: | 5 | Средний непрерывный проигрыш: | 2 |
Результаты совпадают!
Производительность
2017.05.08 01:45:42.765 EURUSD,M1: 1865415 tick events (7292 bars, 1865515 bar states) processed in 0:00:03.682 (total time 0:00:04.400)
MT5-лог
2017.05.08 02:04:53.278 Core 1 EURUSD,M1: 1865415 ticks, 7192 bars generated. Test passed in 0:00:12.309 (including ticks preprocessing 0:00:00.203).
MT4-тестер справился в 3 раза быстрее MT5-тестера. Если есть сомнения, что MT5-замедление вызвано использованием сторонней библиотеки, желающие могут переписать простую MT4-логику данного советника на MQL5 на свой лад и проверить гипотезу.
ЗЫ MT5-тестер работал на порядки медленнее, пока руками не почистил все Bases-папки. Результаты приведены уже с учетом этого обстоятельства.
На сервере Alpari-MT5-Demo в новом билде(выпустим на неделе) с быстрым доступом к истории сделок у меня получилось:
EURUSD,M1: 1865417 ticks, 7192 bars generated. Test passed in 0:00:05.578.
У МТ5 есть системный оверхед на передачу данных и самой задачи во внешний процесс агента, что на мелких(секундных) задачах вносит большую погрешность в сравнения.
Ну и сложность и качество тестера в МТ5 на порядок выше: синхронное моделирование множества инструментов с миллисекундной точностью, честные слипы/задержки во время прокрутки изменения мира и куча более мелких функций. Там же не цикл for стоит.
Про медленнее на порядки - не путаете с первичной инициалиацией/синхронизацией и закачкой всех данных? Все в логах пишется. Файлы на диске трогать не надо ни в коем случае.
Рекомендую каталог %userdata%\MetaQuotes (типа C:\Users\%username%\AppData\Roaming\MetaQuotes) внести в пропуск антивирусов. Там лежат данные и добавление в пропуск антивируса резко улучшает скорость доступа к данным терминала и тестера.
Иначе они такую бурную деятельность по проверке развивают, когда видят запуски metatester[64].exe, открывающего сетевой порт и массу больших файлов данных, пишушихся терминалом и тестером. У некоторых трейдеров даже тестер успевает отвалиться, так как антивирус даже за несколько секунд не успевает проверить запускаемый metatester[64].exe файл и терминал банально не может обратиться к нему.
сложность и качество тестера в МТ5 на порядок выше: синхронное моделирование множества инструментов с миллисекундной точностью, честные слипы/задержки во время прокрутки изменения мира и куча более мелких функций.
Это есть и в связке MT4+TDS. Плюс еще некоторые возможности, которых не хватает в MT5... Но, конечно, мультивалютности нет.
Про медленнее на порядки
Сначала подумал, что TDS специально тормозит MT5, поэтому почистил память от него. Заодно и Bases-папки (место на диске заканчивалось). После этого MT5 стал одиночный прогон выполнять на два порядка быстрее (до этого перезагрузки не помогали). Гипотезу про TDS-тормоза не смог подтвердить, как не пытался. Антивирусов на машине не было.
Сервер Alpari-MT5 - реал.
ЗЫ Запустил MT4-оптимизатор на полный перебор - 14 минут. MT5 (только один агент оставил) - похоже, будет много часов. Утром/днем выложу итог.
Откуда там слипы?
Вы что-то совсем другое имеете в виду. Поиграйтесть с полем Задержка в МТ5 тестере и увидите, что это совершенно другое. Даже обычный Sleep(2500) в коде MQL5 при исполнении в тестере даст задержку в коде, когда весь мир будет продолжать моделироваться. Поле задержки исполнения эффективно показывает, как будут исполняться сделки, если вы туда поставите свои 100 мс пинга до сервера.
Не может быть тормозов на порядки. И зачем к МТ5 какие-то дополнения, когда он сам отлично работает.
Про переборы - нет настроек и пределов.Про отсутствие антивируса - давно уже во всех версиях с семерки стоит штатный и неприметный Windows Defender, который неслабо сканит все файлы.
Иногда хорошо заметные лаги в файловых операциях генерирует даже на SSD дисках.
Про отсутствие антивируса - давно уже во всех версиях с семерки стоит штатный и неприметный Windows Defender, который неслабо сканит все файлы.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
fxsaber, 2017.05.07 21:55
Торговый сервер Alpari-MT5
Зачем в тиковой истории FOREX-символов дубликаты тиков (bid и ask равны)?
Тестер гонит советники по дублям, а их половина. Разве нужно получать соответствующее падение производительности в два раза?
Вы так и не поняли, о каких слипах я говорю. В МТ4 это принципиально не работает.
Не в тиках, а в процессе работы мкл5 программы, когда она останавливается, а тики продолжают идти и мир крутится. Напишите Sleep(3000) и программа будет ждать 3 секунды, а в это время тики будут тикать, рынок будет моделироваться.
Если поставите поле Задержка исполнения в 200 мс в тестере, то будет моделироваться сетевое латенси в 200 при исполнении сделок, что даст или рыночное проскальзывание или реквот.
Это совершенно другой мощный уровень моделирования рыночных процессов, причем в рамках мультивалютной системы. И что еще важно, в удаленном отчуждаемом процессе. Например, агент в 10 000 км при исполнении задачи вдруг получает из кода динамический запрос на доступ к отсутствующим символам и умеет запросить эти данные от мастера, встроить в рыночный мир и продолжить его крутить.
Вы так и не поняли, о каких слипах я говорю. В МТ4 это принципиально не работает.
Не в тиках, а в процессе работы мкл5 программы, когда она останавливается, а тики продолжают идти и мир крутится. Напишите Sleep(3000) и программа будет ждать 3 секунды, а в это время тики будут тикать, рынок будет моделироваться.
Это не работает сейчас в MT4.
Если поставите поле Задержка исполнения в 200 мс в тестере, то будет моделироваться сетевое латенси в 200 при исполнении сделок, что даст или рыночное проскальзывание или реквот.
Это работает сейчас в MT4.
Это совершенно другой мощный уровень моделирования рыночных процессов, причем в рамках мультивалютной системы. И что еще важно, в удаленном отчуждаемом процессе. Например, агент в 10 000 км при исполнении задачи вдруг получает из кода динамический запрос на доступ к отсутствующим символам и умеет запросить эти данные от мастера, встроить в рыночный мир и продолжить его крутить.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Обсуждение статьи "Готовые советники из Мастера MQL5 работают в MetaTrader 4"
fxsaber, 2017.03.09 13:02
Для сравнения предлагаю взять триал Tick Data Suite (Compatible: MT4 build 940 – 1052).
В MT5-тестере выбрать режим "по реальным тикам". Сохранить их и через TDS скормить MT4-тестеру.
Тогда котиры в обоих тестерах будут совпадать на 100%, что позволит уже точно сравнить их не только по сделкам, но и по скорости.
Можно было бы тогда сравнить конвертацию/создание советников в обе стороны.
MT4 build 1072, MT5 build 1596 торговый сервер Alpari-MT5.
Настройки MT4-тестера на скрине
Валюта в обоих тестерах USD. Это позволяет в том же MT5 тестере на EURUSD не тянуть за собой еще тики конвертационного символа.
Запускаем на обоих тестерах такой кроссплатформенный советник
Лог MT4-тестера
Лог MT5-тестера
Убеждаемся, что файлы, полученные из каждого тестера идентичны - тики тестеров совпадают.
На этом подготовка обоих тестеров к сабжу готова.