MT4-Tester VS MT5-Tester

 
Руки дошли реализовать давнюю идею

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

Обсуждение статьи "Готовые советники из Мастера 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 не тянуть за собой еще тики конвертационного символа.


Запускаем на обоих тестерах такой кроссплатформенный советник

// MQL4&5-code

#property strict

class FILE
{
private:
  const int handle;
  
  static string TickToString( const MqlTick &Tick, const string Delimeter = " " )
  {
    return(::DoubleToString(Tick.ask, _Digits) + Delimeter + ::DoubleToString(Tick.bid, _Digits));
  }
public:  
  FILE( const string FileName ) : handle(::FileOpen(FileName, FILE_WRITE | FILE_TXT | FILE_ANSI))
  {
  }
  
  ~FILE( void )
  {
    if (this.handle != INVALID_HANDLE)
      ::FileClose(handle);       
  }
  
  bool Write( const MqlTick &Tick ) const
  {
    return((this.handle != INVALID_HANDLE) && ::FileWriteString(this.handle, FILE::TickToString(Tick) + "\n"));
  }
};

const FILE File(::MQLInfoString(MQL_PROGRAM_NAME) + ".txt");

void OnTick()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
    File.Write(Tick);
}


Лог MT4-тестера

2017.05.07 23:25:36.155 EURUSD,M1: 1865415 tick events (7292 bars, 1865515 bar states) processed in 0:00:02.528 (total time 0:00:03.292)


Лог MT5-тестера

2017.05.07 23:26:01.016 Core 1  EURUSD,M1: 1865415 ticks, 7192 bars generated. Test passed in 0:00:01.918 (including ticks preprocessing 0:00:00.203).

Убеждаемся, что файлы, полученные из каждого тестера идентичны - тики тестеров совпадают.


На этом подготовка обоих тестеров к сабжу готова.

 

Советник

// 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-отчет

Strategy Tester Report
Lucky
MetaQuotes-Demo (Build 1072)

Символ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.50Z-Счет:-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


Результаты совпадают!


Производительность

MT4-лог
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 файл и терминал банально не может обратиться к нему.

 
Renat Fatkhullin:

сложность и качество тестера в МТ5 на порядок выше: синхронное моделирование множества инструментов с миллисекундной точностью, честные слипы/задержки во время прокрутки изменения мира и куча более мелких функций.

Это есть и в связке MT4+TDS. Плюс еще некоторые возможности, которых не хватает в MT5... Но, конечно, мультивалютности нет.

Про медленнее на порядки

Сначала подумал, что TDS специально тормозит MT5, поэтому почистил память от него. Заодно и Bases-папки (место на диске заканчивалось). После этого MT5 стал одиночный прогон выполнять на два порядка быстрее (до этого перезагрузки не помогали). Гипотезу про TDS-тормоза не смог подтвердить, как не пытался. Антивирусов на машине не было.

Сервер Alpari-MT5 - реал.


ЗЫ Запустил MT4-оптимизатор на полный перебор - 14 минут. MT5 (только один агент оставил) - похоже, будет много часов. Утром/днем выложу итог.

 

Откуда там слипы?

Вы что-то совсем другое имеете в виду. Поиграйтесть с полем Задержка в МТ5 тестере и увидите, что это совершенно другое. Даже обычный Sleep(2500) в коде MQL5 при исполнении в тестере даст задержку в коде, когда весь мир будет продолжать моделироваться. Поле задержки исполнения эффективно показывает, как будут исполняться сделки, если вы туда поставите свои 100 мс пинга до сервера.

Не может быть тормозов на порядки. И зачем к МТ5 какие-то дополнения, когда он сам отлично работает.

Про переборы - нет настроек и пределов.
 

Про отсутствие антивируса - давно уже во всех версиях с семерки стоит штатный и неприметный Windows Defender, который неслабо сканит все файлы.

Иногда хорошо заметные лаги в файловых операциях генерирует даже на SSD дисках.

 

Переборы (100 000 USD на старте)


Слипы в MT4 (милисекунды в тиковой истории отрабатывает, как надо) и другие полезности


 
Renat Fatkhullin:

Про отсутствие антивируса - давно уже во всех версиях с семерки стоит штатный и неприметный Windows Defender, который неслабо сканит все файлы.

Отключен. Уже сейчас есть все данные, чтобы увидеть сильные MT5-замедления на оптимизации. Сравнительные результаты оптимизации выложу по окончании работы MT5.
 
Не уловил затею с дублями

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

Ошибки, баги, вопросы

fxsaber, 2017.05.07 21:55

Торговый сервер Alpari-MT5

Зачем в тиковой истории FOREX-символов дубликаты тиков (bid и ask равны)?

Тестер гонит советники по дублям, а их половина. Разве нужно получать соответствующее падение производительности в два раза?

 

Вы так и не поняли, о каких слипах я говорю. В МТ4 это принципиально не работает.

Не в тиках, а в процессе работы мкл5 программы, когда она останавливается, а тики продолжают идти и мир крутится. Напишите Sleep(3000) и программа будет ждать 3 секунды, а в это время тики будут тикать, рынок будет моделироваться.

Если поставите поле Задержка исполнения в 200 мс в тестере, то будет моделироваться сетевое латенси в 200 при исполнении сделок, что даст или рыночное проскальзывание или реквот.

Это совершенно другой мощный уровень моделирования рыночных процессов, причем в рамках мультивалютной системы. И что еще важно, в удаленном отчуждаемом процессе. Например, агент в 10 000 км при исполнении задачи вдруг получает из кода динамический запрос на доступ к отсутствующим символам и умеет запросить эти данные от мастера, встроить в рыночный мир и продолжить его крутить.

 
Renat Fatkhullin:

Вы так и не поняли, о каких слипах я говорю. В МТ4 это принципиально не работает.

Не в тиках, а в процессе работы мкл5 программы, когда она останавливается, а тики продолжают идти и мир крутится. Напишите Sleep(3000) и программа будет ждать 3 секунды, а в это время тики будут тикать, рынок будет моделироваться.

Это не работает сейчас в MT4.

Если поставите поле Задержка исполнения в 200 мс в тестере, то будет моделироваться сетевое латенси в 200 при исполнении сделок, что даст или рыночное проскальзывание или реквот.

Это работает сейчас в MT4.

Это совершенно другой мощный уровень моделирования рыночных процессов, причем в рамках мультивалютной системы. И что еще важно, в удаленном отчуждаемом процессе. Например, агент в 10 000 км при исполнении задачи вдруг получает из кода динамический запрос на доступ к отсутствующим символам и умеет запросить эти данные от мастера, встроить в рыночный мир и продолжить его крутить.

У меня нет цели очернить MT5. Только воспроизводимо сравниваю. Безусловно, MT5-тестер недостижим по некоторым параметрам, но и тюнинговый MT4 сейчас в состоянии дать вещи, которых в MT5 нет, но которые реально востребованы. Мы увидели, что точный тест по реальным кастомным тикам на MT4 - правда на 100%. Ну и регулирование всевозможных настроек (комиссия, отступы, правила активации отложек и т.д.) тестера имеется. В общем, есть вещи, которые пока принципиально не реализовываются в MT5.
Причина обращения: