MetaTrader Terminal 4: отладка советника на исторических данных

У меня есть терминал MetaTrader 4, подключенный к демо-счету.

Я написал и скомпилировал свой первый советник.

Я могу отлаживать его на живом графике, поэтому работает нормально. Я хотел бы отладить его, хотя и на исторических данных. Однако в редакторе MetaEditor кнопка «Отладка › Запуск по данным истории» неактивна.

Кроме того, при запуске тестера стратегий мои точки останова никогда не срабатывают, я помещаю точку останова в первую строку в функции OnTick(), поэтому, как я понимаю, она должна срабатывать.

Это потому что у меня демо-счет? Если нет, как я могу отлаживать свой скрипт на исторических данных?

обновите код ниже

#property strict


//+------------------------------------------------------------------+
//| Includes and object initialization                               |
//+------------------------------------------------------------------+

#include <book_examples\Trade.mqh>
CTrade Trade;
CCount Count;

#include <book_examples\Timer.mqh>
CTimer Timer;                             
CNewBar NewBar;   // keeps track of timestamp of current bar & allows us to 
determine when a new bar has opened so prevents orders being opened intrabar

#include <book_examples\TrailingStop.mqh>
#include <book_examples\MoneyManagement.mqh>
#include <book_examples\Indicators.mqh>


//+------------------------------------------------------------------+
//| Input variables                                                  |
//+------------------------------------------------------------------+

// left out to keep the post short

//+------------------------------------------------------------------+
//| Enum                                                             |
//+------------------------------------------------------------------+

enum trade_action
{
    NO_ACTION = 0,
    LONG = 1,
    SHORT = 2,
    EXIT_TRADE = 3
 };

 //+------------------------------------------------------------------+
 //| Global variable and indicators                                   |
 //+------------------------------------------------------------------+

 int gBuyTicket, gSellTicket;

 //+------------------------------------------------------------------+
 //| Expert initialization function                                   |
 //+------------------------------------------------------------------+

 int OnInit()
 {
    // Set magic number
    Trade.SetMagicNumber(101);
    Trade.SetSlippage(10);

    return(INIT_SUCCEEDED);
  }


//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void OnTick()
{
     
   // Check for bar open 
   bool newBar = true;        // I put a breakpoint on this line
   int barShift = 0;

   if(TradeOnBarOpen == true)
   {
       newBar = NewBar.CheckNewBar(_Symbol,_Period);
       barShift = 1;               
   }

   // Trading
   if(newBar == true)
   {
       // Money management
       double lotSize = FixedLotSize;
      if(UseMoneyManagement == true)
      {
          lotSize = MoneyManagement(_Symbol,FixedLotSize,RiskPercent,StopLoss); 
      }
  
      trade_action action = calculate_signal();
  
      // Open buy order
      if(action == LONG)
      {
         // close sell orders
         Trade.CloseAllSellOrders();
     
         // check if we already have an open buy trade
         int open_buy = Count.Buy();
     
         if(open_buy == 0)
         {
            // no current existing buy position so enter
            gBuyTicket = Trade.OpenBuyOrder(_Symbol,lotSize);
            ModifyStopsByPoints(gBuyTicket,StopLoss,TakeProfit);
          }
                       
       }
  
       // Open sell order
      else if(action == SHORT)
      {
          Trade.CloseAllBuyOrders();
     
         // check if we already have an open sell trade
         int open_sell = Count.Sell();
     
         if(open_sell == 0)
         {
            // no current existing sell position so enter
            gSellTicket = Trade.OpenSellOrder(_Symbol,lotSize);
            ModifyStopsByPoints(gSellTicket,StopLoss,TakeProfit);
         }
     
       }
   } 

}


trade_action calculate_signal()
{
   trade_action action = NO_ACTION;   
  
    // now calculate trade logic
  
     if (some_value > some_threshold)
     {
        action = LONG;
     }
     else if (some_value < some_threshold)
     {
        // enter short position
        action = SHORT;
     }
  
     return action;
  }

person mHelpMe    schedule 19.06.2020    source источник
comment
А где мы видим MQL4-код, о котором вы говорите и просите помочь вам?   -  person user3666197    schedule 20.06.2020
comment
@user3666197 user3666197 Я обновил сообщение с большей частью кода. Извините, я думал, что для общего вопроса об отладке это не потребуется.   -  person mHelpMe    schedule 20.06.2020


Ответы (1)


В : Это потому, что у меня есть демо-счет?

No.

В : Если нет, то как я могу отлаживать свой скрипт на исторических данных?

В MT4 (as-is-2020/06) вы по-прежнему можете реализовать, если это необходимо, собственный инструмент отладки-инспектора/монитора-агента, который будет выполняться во время StrategyTester-режим запуска скомпилированного MQL4-EA.

StrategyTester в MT4 — это инструмент для обратного тестирования, а не (эмулированный) симулятор и отладчик реального рынка, он работает с советником только в синтетическом (ускоренном | замедленном) времени, используя контролируемое время. поток синтетических-QUOTE-сообщений, эмулируемых для данного торгового инструмента и таймфрейма.

person user3666197    schedule 20.06.2020
comment
Спасибо за ответ. Где я могу найти средство отладки — агент инспектора/монитора? - person mHelpMe; 20.06.2020
comment
:o) Обычно пользователи создают один такой и компилируют его сами. - person user3666197; 20.06.2020
comment
О, я вижу. Думаю, это может быть выше моего уровня мастерства, чтобы быть отточенным :-) - person mHelpMe; 20.06.2020