МТ4 или МТ5. Какие преимущества и недостатки? - страница 57

 
fxsaber:

Вы заставляете додумываться до Вашего торгового окружения, вместо того, чтобы сообщить мин. требуемой информации.

Речь про биржу?

Нет.

Речь про форекс. Начал переход с МТ4, поэтому вопрос может быть нубский...

 
Kirill Belousov:

Нет.

Речь про форекс. Начал переход с МТ4, поэтому вопрос может быть нубский...

С барами не работаю, поэтому точно знать не могу. Хорошо, если предоставите кусок лога или скрина.

И рекомендую всегда начинать обсуждении видящейся для Вас проблемы с данными для воспроизведения.

Идеально - код + результат запуска.

 
fxsaber:

Советники на Trade.mqh Оптимизируются на > 50% медленнее, чем написанные на чистом MQL5 (либо с помощью другой торговой библы).

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

Библиотеки: TesterBenchmark

fxsaber, 2017.12.29 13:29

Об этом было написано летом вместе с заявкой в СД. Удивительно, что все ровно! Или это логично? Как можно говорить о супер-скорости тестера, когда почти все советники (используют СБ) проваливаются в скорости, съедают деньги в Облаке и т.д.?! Видимо, это нормально.


Исходный код упростил, выкинув работу с Историей и MT4Orders. Оставил только чистый MQL5 и СБ

#include <TesterBenchmark.mqh>

#include <Trade\Trade.mqh> // Закомментировать, чтобы включить вариант на чистом MQL5

input int Interval = 60;

void OnTick()
{
#ifdef  ERR_USER_INVALID_HANDLE // Trade.mqh
  static CTrade Trade;
  static CDealInfo Deal;
  static CPositionInfo Position;

  if (!Position.SelectByIndex(0))
  {
    if (HistorySelect(0, LONG_MAX))
    {
      const int Total = HistoryDealsTotal() - 1;

      if ((Total >= 0) && Deal.SelectByIndex(Total) && (Deal.DealType() == DEAL_TYPE_SELL))
        Trade.Sell(1);
      else
        Trade.Buy(1);
    }
  }
  else if (TimeCurrent() - Position.Time() >= Interval)
    Trade.PositionClose(_Symbol);
#else  // ERR_USER_INVALID_HANDLE
  if (!PositionGetTicket(0))
  {
    if (HistorySelect(0, LONG_MAX))
    {
      const int Total = HistoryDealsTotal() - 1;
      MqlTradeRequest Request = {0};

      Request.action = TRADE_ACTION_DEAL;

      Request.symbol = _Symbol;
      Request.type = ((Total >= 0) && ((ENUM_DEAL_TYPE)HistoryDealGetInteger(HistoryDealGetTicket(Total), DEAL_TYPE) == DEAL_TYPE_SELL)) ?
                     ORDER_TYPE_SELL : ORDER_TYPE_BUY;;

      Request.volume = 1;
      Request.price = SymbolInfoDouble(Request.symbol, (Request.type == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID);

      MqlTradeCheckResult CheckResult;
      if (OrderCheck(Request, CheckResult))
      {
        MqlTradeResult Result;

        const bool AntiWarning = OrderSend(Request, Result);
      }
    }
  }
  else if (TimeCurrent() - PositionGetInteger(POSITION_TIME) >= Interval)
  {
    MqlTradeRequest Request = {0};
    MqlTradeResult Result;

    Request.action = TRADE_ACTION_DEAL;
    Request.position = PositionGetInteger(POSITION_TICKET);

    Request.symbol = PositionGetString(POSITION_SYMBOL);
    Request.type = (ENUM_ORDER_TYPE)(1 - PositionGetInteger(POSITION_TYPE));

    Request.volume = PositionGetDouble(POSITION_VOLUME);
    Request.price = PositionGetDouble(POSITION_PRICE_CURRENT);

    const bool AntiWarning = OrderSend(Request, Result);
  }
#endif // ERR_USER_INVALID_HANDLE
}


Результат СБ

------
OnTesterInit
i = 0 Pass = 0 OnTester = 1.898 s.: Count = 2007057, 1057458.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1730
i = 1 Pass = 1 OnTester = 1.900 s.: Count = 2007057, 1056345.8 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1730
iMin = 0 Results[iMin] = 1.898s.
iMax = 1 Results[iMax] = 1.900s.
Amount = 2 Mean = 1.899 s. - 81.75%
OnTesterDeinit
------
Interval = 4.646 s., Count = 0, 0.0 unit/sec


Результат чистого MQL5

------
OnTesterInit
i = 0 Pass = 0 OnTester = 1.239 s.: Count = 2007057, 1619900.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1730
i = 1 Pass = 1 OnTester = 1.243 s.: Count = 2007057, 1614687.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1730
iMin = 0 Results[iMin] = 1.239s.
iMax = 1 Results[iMax] = 1.243s.
Amount = 2 Mean = 1.241 s. - 75.10%
OnTesterDeinit
------
Interval = 3.305 s., Count = 0, 0.0 unit/sec

Все в те же 1.5 раза! Но лохамвсем пофиг, продолжаем использовать супер-СБ.

 
fxsaber:

С барами не работаю, поэтому точно знать не могу. Хорошо, если предоставите кусок лога или скрина.

И рекомендую всегда начинать обсуждении видящейся для Вас проблемы с данными для воспроизведения.

Идеально - код + результат запуска.


Вынесенный вопрос не относится к конкретному коду, т.к. это всплывает в логе до начала собственно теста кода.

Тестирование по реальным тикам. Но в коде используются запросы из функций, использующих бары. Если это важно - Интервал в тестере стоит М1. Советник мультивалютный. 

Вот фрагмент лога на этапе подготовки к тесту:

2017.12.29 15:07:18.147 AUDCAD : 2017.06.05 00:02 - 2017.06.05 23:59  1 minute bars absent within a day while real ticks present
2017.12.29 15:07:18.147 AUDCAD : 2017.06.06 00:00 - 2017.06.06 23:59  20 minute bars absent within a day while real ticks present
2017.12.29 15:07:18.147 AUDCAD : 2017.06.07 00:00 - 2017.06.07 23:59  11 minute bars absent within a day while real ticks present
2017.12.29 15:07:18.147 AUDCAD : 2017.06.08 00:00 - 2017.06.08 23:59  4 minute bars absent within a day while real ticks present
2017.12.29 15:07:24.252 AUDCAD : real ticks begin from 2017.01.02 00:00:00
2017.12.29 15:07:24.252 AUDCAD : 2017.01.01 00:00 - 2017.12.27 00:00  36 minute bars absent in total while real ticks present
2017.12.29 15:07:24.252 AUDCAD : 2017.01.01 00:00 - 2017.12.27 00:00  last prices absent for 1069 minute bars, bid prices used
2017.12.29 15:07:30.359 AUDCHF : 2017.06.02 22:41 - 2017.06.02 23:59  1 minute bars absent within a day while real ticks present
2017.12.29 15:07:30.359 AUDCHF : 2017.06.05 00:01 - 2017.06.05 23:59  11 minute bars absent within a day while real ticks present
2017.12.29 15:07:30.359 AUDCHF : 2017.06.06 00:00 - 2017.06.06 23:59  17 minute bars absent within a day while real ticks present
2017.12.29 15:07:30.359 AUDCHF : 2017.06.07 00:00 - 2017.06.07 23:59  16 minute bars absent within a day while real ticks present
2017.12.29 15:07:30.359 AUDCHF : 2017.06.08 00:00 - 2017.06.08 23:59  7 minute bars absent within a day while real ticks present
2017.12.29 15:07:36.462 AUDCHF : real ticks begin from 2017.01.02 00:00:00
2017.12.29 15:07:36.462 AUDCHF : 2017.01.01 00:00 - 2017.12.27 00:00  52 minute bars absent in total while real ticks present
2017.12.29 15:07:36.462 AUDCHF : 2017.01.01 00:00 - 2017.12.27 00:00  last prices absent for 1069 minute bars, bid prices used
2017.12.29 15:07:42.565 AUDJPY : 2017.06.05 00:02 - 2017.06.05 23:59  4 minute bars absent within a day while real ticks present
2017.12.29 15:07:42.565 AUDJPY : 2017.06.06 00:00 - 2017.06.06 23:59  11 minute bars absent within a day while real ticks present
2017.12.29 15:07:42.565 AUDJPY : 2017.06.07 00:00 - 2017.06.07 23:59  7 minute bars absent within a day while real ticks present
2017.12.29 15:07:42.565 AUDJPY : 2017.06.08 00:00 - 2017.06.08 23:59  4 minute bars absent within a day while real ticks present
2017.12.29 15:07:48.688 AUDJPY : real ticks begin from 2017.01.02 00:00:00
2017.12.29 15:07:48.688 AUDJPY : 2017.01.01 00:00 - 2017.12.27 00:00  26 minute bars absent in total while real ticks present
2017.12.29 15:07:48.688 AUDJPY : 2017.01.01 00:00 - 2017.12.27 00:00  last prices absent for 1069 minute bars, bid prices used
2017.12.29 15:07:54.796 AUDNZD : 2017.06.05 00:02 - 2017.06.05 23:59  3 minute bars absent within a day while real ticks present
2017.12.29 15:07:54.796 AUDNZD : 2017.06.06 00:00 - 2017.06.06 23:59  9 minute bars absent within a day while real ticks present
2017.12.29 15:07:54.796 AUDNZD : 2017.06.07 00:05 - 2017.06.07 23:59  3 minute bars absent within a day while real ticks present
2017.12.29 15:07:54.796 AUDNZD : real ticks begin from 2017.01.02 00:00:00
2017.12.29 15:07:54.796 AUDNZD : 2017.01.01 00:00 - 2017.12.27 00:00  15 minute bars absent in total while real ticks present
2017.12.29 15:07:54.796 AUDNZD : 2017.01.01 00:00 - 2017.12.27 00:00  last prices absent for 1075 minute bars, bid prices used
2017.12.29 15:08:00.904 AUDUSD : 2017.06.05 00:01 - 2017.06.05 23:59  2 minute bars absent within a day while real ticks present
2017.12.29 15:08:00.904 AUDUSD : 2017.06.06 00:00 - 2017.06.06 23:59  9 minute bars absent within a day while real ticks present
2017.12.29 15:08:00.904 AUDUSD : 2017.06.07 00:00 - 2017.06.07 23:59  4 minute bars absent within a day while real ticks present
2017.12.29 15:08:00.904 AUDUSD : 2017.06.08 00:00 - 2017.06.08 23:59  2 minute bars absent within a day while real ticks present
2017.12.29 15:08:07.011 AUDUSD : real ticks begin from 2017.01.02 00:00:00
2017.12.29 15:08:07.011 AUDUSD : 2017.01.01 00:00 - 2017.12.27 00:00  17 minute bars absent in total while real ticks present
2017.12.29 15:08:07.011 AUDUSD : 2017.01.01 00:00 - 2017.12.27 00:00  last prices absent for 1070 minute bars, bid prices used
2017.12.29 15:39:33.628 connection closed
2017.12.29 15:39:33.635 stopped by user
 
Kirill Belousov:

Вынесенный вопрос не относится к конкретному коду, т.к. это всплывает в логе до начала собственно теста кода.

Тестирование по реальным тикам. Но в коде используются запросы из функций, использующих бары. Если это важно - Интервал в тестере стоит М1. Советник мультивалютный. 

Вот фрагмент лога на этапе подготовки к тесту:

Мне не хочется в этом разбираться, потому что требуется, видимо, написать еще много постов с наводящими вопросами. А сразу на них ответить Вы не хотите.

Если правильно понял, то по НЕ основному символу был получен INFO-тик с ненулевыми Bid/Ask со временем, которое соответствует отсутствующему бару.

Увы, больше понять не смог. Наводящих задавать не буду.

 
Kirill Belousov:

...

Тестирование по реальным тикам. Но в коде используются запросы из функций, использующих бары. Если это важно - Интервал в тестере стоит М1. Советник мультивалютный. 

...

В случае, если реальных тиков за тот или иной период нет, то используются тики сгенерированные тестером. Эти сообщения, как раз об этом.

Более подробно читайте в справке торгового терминала.

Разделы:

  • Алгоритмический трейдинг - Реальные и сгенерированные тики
  • Алгоритмический трейдинг - Журнал тестирования

 
Anatoli Kazharski:

В случае, если реальных тиков за тот или иной период нет, то используются тики сгенерированные тестером. Эти сообщения, как раз об этом.

Более подробно читайте в справке торгового терминала.

Разделы:

  • Алгоритмический трейдинг - Реальные и сгенерированные тики
  • Алгоритмический трейдинг - Журнал тестирования

Спасибо за участие.

Режим тестера - Every tick based on real ticks.

Т.е. мы тестируем на реальных тиках.

Посмотрим на сообщение в логе:

2017.12.29 15:07:24.252 AUDCAD : 2017.01.01 00:00 - 2017.12.27 00:00  36 minute bars absent in total while real ticks present

Мне непонятно как может быть 36 minute bars absent ЕСЛИ real ticks present

По ссылкам в справке торгового терминала я не нашел описания этого.

У брокера что - бары и тики из разных источников данных что ли?

 
Kirill Belousov:

...

У брокера что - бары и тики из разных источников данных что ли?

Выглядит, как битая история. Баров нет, но реальные тики за этот же период есть.

P.S. Написал в сервисдеск по уже ранее открытой заявке (#1910320). Нужно дополнить справку.

В справке только вот это написано:

...

Если в истории символа есть минутный бар, но тиковых данных за эту минуту нет, тестер сгенерирует тики в режиме "Все тики". Это позволяет протестировать советника на запланированном периоде в случае неполных тиковых данных у брокера. Если в истории символа нет минутного бара, но тиковые данные за эту минуту есть, то эти тики игнорируются. Минутные данные считаются более достоверными.

...

 

Свежее:

Провожу оптимизацию. Решил остановить на половине (сутки тестирования). Имею полторы тысячи сетов.

Ставлю одиночный прогон. По логу вижу, что тест дошел до определенной даты и дальше сделки не открываются.

Нажимаю кнопку Stop. Вот в логе:

2017.12.29 17:05:08.071 connection closed
2017.12.29 17:05:08.072 stopped by user

А кнопка начала тестирования не перешла из состояния теста в ожидание старта. Настройки тестирования недоступны для редактирования.

Если ее нажать (кнопку Stop, которая должна быть Start), то тест начнется снова и так до бесконечности.

Билд 1730

Это баг или есть выход?

 
Kirill Belousov:

Это баг или есть выход?

У меня тестер запускается через раз в 1730. Началось все со следующего после 1653 билда. Тогда же началась беседа с разработчиками на эту тему.

По итогу в 1730 все значительно усугубилось. И иногда по несколько минут не могу запустить тестер. Пишу не для тестера по итогу.

Так же у меня 154 открытые заявки в СД, некоторые, наверное, отпразднуют свой очередной НГ. Но зато есть и 105 закрытых. Так что все хорошо!

Причина обращения: