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

 
Andrey Khatimlianskii #:

Планируется ли убрать ограничение на кол-во входных параметра советника, чтобы его можно было тестировать (сейчас  1024)?

Речь об одиночном тесте, оно даже не стартует. Приходится собирать специальную версию на этот случай, не удобно.

Для МО моделей входных значительно больше. Решают конфигурационным файлом.

 
fxsaber #:

Для МО моделей входных значительно больше. Решают конфигурационным файлом.

Конфиг файл -- очевидное решение. Но накладывает дополнительные ограничения на использование.

Не понятна природа такого ограничения для одиночного теста (для оптимизации -- понятно). На чарт же советник нормально запускается, почему не пустить тест? Не помещается слепок параметров в кэш? Что еще?

 
Andrey Khatimlianskii #:

Не помещается слепок параметров в кэш?

Вроде, там нет таких ограничений.

 

Делаю кастомный символ с 1-го марта и запускаю проход. А он идет только с 24-го марта.

Разве искусственный отступ тестером для кастомных символов разумен?

 
fxsaber #:

Делаю кастомный символ с 1-го марта и запускаю проход. А он идет только с 24-го марта.

Разве искусственный отступ тестером для кастомных символов разумен?

Отступ разумен для большинства пользователей.

 
b4040, в Тестере при выставлении отложки ORDER_PRICE_CURRENT нулевой.
void OnTick()
{  
  MqlTick Tick;
  
  if (!OrdersTotal() && SymbolInfoTick(_Symbol, Tick) && Tick.bid && Tick.ask)
  {
    MqlTradeRequest Request = {};
          
    Request.action = TRADE_ACTION_PENDING;
    Request.symbol = _Symbol;
    Request.volume = 0.1;    
    Request.price = Tick.ask - 1000 * _Point;
    Request.type = ORDER_TYPE_BUY_LIMIT;
    
    MqlTradeResult Result;
    
    if (OrderSend(Request, Result) && OrderSelect(Result.order))
      Print(OrderGetDouble(ORDER_PRICE_CURRENT)); // 0
  }
}
Строка для поискаOshibka 080.
 

b4040, CloseBy-результат не отражается на колонке Balance тестера.

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

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnInit()
{
  for (int i = 0; i < 2; i++)
  {
    OrderClose(OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0), 0.1, Bid, 0);
      
    OrderCloseBy(OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0),
                 OrderSend(_Symbol, OP_SELL, 0.1, Bid, 0, 0, 0));
  }
}

Строка для поиска: Uluchshenie 076.

 

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

На скрине закрытие в конце субботы.

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

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

const bool Init = EventSetTimer(1) && OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);

void OnTimer() {}
Строка для поиска: Uluchshenie 077.
 

Не логичное поведение тестера.

Время  открытия и закрытия позиции зависит от того какой инструмент является основным.

Допустим если открыть позицию по GBPUSD, при этом запустить одиночный прогон на GBPUSD, то всё норм.

А если одиночный прогон запустить на EURUSD, а позицию открыть на GBPUSD, то время открытия и закрытия позиции может быть совсем другое.

Не всегда, но примерно на 10 позиций одна оказывается с не правильным временем.

#include <Trade\Trade.mqh>
CTrade         m_trade;
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   datetime time = iTime("GBPUSD", PERIOD_M1, 0);
   static ulong ticketOpen = 0, ticketClose = 0;
   static bool close = false;

   if(ticketOpen == 0)
      if(iTime(_Symbol, PERIOD_M1, 0) == D'2023.09.26 00:07:00')
         if(m_trade.Sell(1, "GBPUSD"))
            ticketOpen = m_trade.ResultOrder();

   if(iTime(_Symbol, PERIOD_M1, 0) == D'2023.09.26 00:24:00')
      if(m_trade.PositionClose(ticketOpen))
         ticketClose = m_trade.ResultOrder();

   if(ticketClose > 0)
     {
      datetime openTime = 0;
      datetime closeTime = 0;
      if(HistoryDealSelect(ticketOpen))
         openTime = (datetime)HistoryDealGetInteger(ticketOpen, DEAL_TIME);
      if(HistoryDealSelect(ticketClose))
         closeTime = (datetime)HistoryDealGetInteger(ticketClose, DEAL_TIME);

      ulong from_msc = (openTime - openTime % 60) * 1000;       // время беру с запасом
      ulong to_msc = (closeTime - closeTime % 60 + 60) * 1000;  

      MqlTick ticks[];
      int size = CopyTicksRange("GBPUSD", ticks, COPY_TICKS_INFO, from_msc, to_msc);

      Print("openTime = ", openTime, "; ticks[0].time = ", ticks[0].time);
      Print("closeTime = ", closeTime, "; ticks[size-1].time = ", ticks[size - 1].time);

      //(EURUSD,M1) 2023.09.26 00:24:32   openTime = 2023.09.26 00:07:00; ticks[0].time = 2023.09.26 00:07:30         не правильно
      //(EURUSD,M1) 2023.09.26 00:24:32   closeTime = 2023.09.26 00:24:32; ticks[size-1].time = 2023.09.26 00:24:28   не правильно

      //(GBPUSD,M1) 2023.09.26 00:24:00   openTime = 2023.09.26 00:07:30; ticks[0].time = 2023.09.26 00:07:30         правильно
      //(GBPUSD,M1) 2023.09.26 00:24:00   closeTime = 2023.09.26 00:24:00; ticks[size-1].time = 2023.09.26 00:24:00   правильно
      TesterStop();
     }
  }
//+------------------------------------------------------------------+

Мало того, что время не правильное, так оно ещё и очень сильно отличается от тиков которые могли открыть ту позицию.

Это не правильно, что время открытия/закрытия зависит от времени инструмента на котором совершается одиночный прогон.


Если это не баг, а фича, то подскажите как определить тик, который открыл/закрыл позицию ?

 
Aleksandr Slavskii #:

Время  открытия и закрытия позиции зависит от того какой инструмент является основным.

Используйте либо мультивалютный OnTick, либо OnTimer.