Тестер стратегий MetaTrader 5: ошибки, баги, предложения по улучшению работы - страница 48

 

Чтобы в режиме по пипсам получить грааль, закрывайте убыточные позиции одним маркетом на весь объем позиции, а прибыльные - скопом по 0.01 лота.

Пример.

#include <MT4Orders.mqh>

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

const bool Init = EventSetTimer(100);

void OnTimer()
{
  while (OrdersTotal())
    if (OrderSelect(0, SELECT_BY_POS))
      OrderClose(OrderTicket(), (OrderProfit() > 0) ? 0.01 : OrderLots(), OrderClosePrice(), 0);
      
  OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);
}


Результат

 

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

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

fxsaber, 2020.01.12 23:20

В текущей версии tst-формата нет следующих данных

  • Время в миллисекундах.
  • PositionID.
  • MagicNumber.
Это накладывает ограничения в сценариях использования.
 

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

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

fxsaber, 2020.01.13 00:01

Воспроизведение нескольких багов. Запускаем советник в Тестере на хедж-счете.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define PAUSE 100000

void OnTick()
{
  static bool FirstRun = true;
  
  if (FirstRun)
  {
    OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);
    Sleep(PAUSE);
    
    OrderSend(_Symbol, OP_BUY, 2, Ask, 0, 0, 0);
    Sleep(PAUSE);

    if (OrderSelect(0, SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
    Sleep(PAUSE * 2);
    
    if (OrderSelect(0, SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
    Sleep(PAUSE * 2);

    TesterWithdrawal(100);    
    
    FirstRun = false;
  }
}

void OnDeinit( const int )
{
  const int Total = OrdersHistoryTotal();
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      OrderPrint();
      
      Print(OrderTicketID()); // MT5-PositionID
    }
}


Получаем такое

2020.01.08 23:59:58   #1 2020.01.01 00:00:00 balance 0.00 0.00000 0.00000 0.00000 2020.01.01 00:00:00 0.00000 0.00 0.00 100000.00 0
2020.01.08 23:59:58   0
2020.01.08 23:59:58   #4 2020.01.02 06:00:00 buy 1.00 EURUSD 1.12137 0.00000 0.00000 2020.01.02 06:03:20 1.12132 -3.56 0.00 -4.46 0
2020.01.08 23:59:58   2
2020.01.08 23:59:58   #5 2020.01.02 06:01:40 buy 2.00 EURUSD 1.12137 0.00000 0.00000 2020.01.02 06:06:40 1.12129 -7.14 0.00 -14.27 0
2020.01.08 23:59:58   3
2020.01.08 23:59:58   #6 2020.01.02 06:10:00 balance 0.00 0.00000 0.00000 0.00000 2020.01.02 06:10:00 0.00000 0.00 0.00 -100.00 withdrawal 0
2020.01.08 23:59:58   0


Далее считываем соответствующий tst-файл скриптом.

#include <fxsaber\SingleTesterCache\SingleTesterCache.mqh> // https://www.mql5.com/ru/code/27611
#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/ru/code/26132

void OnStart()
{  
  uchar Bytes2[];
  
  if (MTTESTER::GetLastTstCache(Bytes2) != -1) // Если получилось прочитать последнюю кеш-запись одиночного прогона
  {
    const SINGLETESTERCACHE SingleTesterCache(Bytes2); // Загоняем ее в соответствующий объект.

    for (int i = 0; i < ArraySize(SingleTesterCache.Positions); i++)
      Print(SingleTesterCache.Positions[i].ToString());
  }
}


Он выведет данные по позициям

id = 0
mfe = 0.0
mae = -8.029999999999999
profit = -4.46
lifetime = 00:03:20

id = 0
mfe = 0.0
mae = -21.4
profit = -14.27
lifetime = 00:05:00

id = 0
mfe = 0.0
mae = 0.0
profit = 0.0
lifetime = 00:00:00


Если сопоставить все в этом посте, то формулируются следующие баги.

  • Нулевые id, вместо правильных.
  • Комиссия и своп не учитываются при вычислении профита.
  • Withdrawal-сделка ошибочно попадает в число закрытых торговых позиций.

 

Отладчик не совсем функциональный. Чего не хватает по сравнению со стандартными отладчиками в порядке убывания нехватки.

1. Модификация памяти. Просмотреть переменные можно, а редактировать похоже что нет.

2. Условных точек останова. Типа остановиться, если переменная test=10.

3. Возможности подвинуть выполнение. Т.е. пропустить какой цикл, например. Другими словами, ткнуть на строчке и сказать, теперь выполняй отсюда.

4. Аттача к уже работающему скрипту/советнику/индикатору. Или хотя бы возможности аттача при краше, чтоб можно было удобно проанализировать.

 
traveller00:

Отладчик не совсем функциональный. Чего не хватает по сравнению со стандартными отладчиками в порядке убывания нехватки.

2. Условных точек останова. Типа остановиться, если переменная test=10.

if (smth) {

    int a;

}
 
Да, согласен, пересборкой можно добиться практически чего угодно. Разве что кроме п. 4. Но всё же хотелось бы это видеть в отладчике, ибо это стандартный для отладчика набор функций.
 

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

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

fxsaber, 2020.01.14 10:49

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

Жаль, что полноценно объединять в портфель разные ТС сейчас нельзя из-за отсутствия миллисекунд-данных в tst.


Надеюсь, разработчики существующие поля начнут использовать по полной

INT64             TradeDeal::time_create;             // время создания записи

INT64             TradeOrder::time_setup;             // время приёма ордера от клиента в систему
INT64             TradeOrder::time_done;              // время снятия завки

записывая туда значение времени не в секундах, а в миллисекундах.


Вообще, на практике продемонстрировать всю крутость использования tst не дают совсем не большие недоработки tst. Исправить бы.

 


В отчете есть данные по TesterWithdrawal, но отсутствуют - TesterDeposit.

 
Как понять такую картину. На графике оптимизации отображаются пиковые значения в районе 5000. А в таблице оптимизации максимальное значение 4670. Где параметры лучших проходов ?
Файлы:
8c97so2_7-1.jpg  184 kb
 
Grozir:
Как понять такую картину. На графике оптимизации отображаются пиковые значения в районе 5000. А в таблице оптимизации максимальное значение 4670. Где параметры лучших проходов ?

Отсортируйте столбец "Результат".