tested with error "wrong timeframe request in Open Prices mode" in 0:00:00.000

 

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

//+------------------------------------------------------------------+
//|                                                  Ordinary_EA.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>

CTrade         m_trade;
CPositionInfo  m_position;

input group "----------- Alligator -----------"
input int                  jaw_period = 13;        // период для линии Челюстей
input int                  jaw_shift = 8;          // смещение линии Челюстей
input int                  teeth_period = 8;       // период для линии Зубов
input int                  teeth_shift = 5;        // смещение линии Зубов
input int                  lips_period = 5;        // период для линии Губ
input int                  lips_shift = 3;         // смещение линии Губ
input ENUM_MA_METHOD       MA_method = MODE_SMMA;  // метод усреднения линий Аллигатора
input ENUM_APPLIED_PRICE   applied_price = PRICE_MEDIAN; // тип цены, от которой строится Аллигатор
input group "----------- All parameter -----------"
input ENUM_TIMEFRAMES      period         = PERIOD_CURRENT; // таймфрейм
enum close
  {
   Jaws,
   Teeth,
   Lips
  };
input close m_close = Lips;
input double               Lots           = 0.1;
input ulong                Magic          = 12345;

int handle;
//--- индикаторные буферы
double JawsBuffer[], TeethBuffer[], LipsBuffer[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   m_trade.SetTypeFillingBySymbol(_Symbol);
   m_trade.SetMarginMode();
   m_trade.SetExpertMagicNumber(Magic);

   handle = iAlligator(_Symbol, period, jaw_period, jaw_shift, teeth_period, teeth_shift, lips_period, lips_shift, MA_method, applied_price);
   if(handle == INVALID_HANDLE)
      return(INIT_FAILED);
      
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(handle != INVALID_HANDLE)
      IndicatorRelease(handle);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   static datetime lastTime = 0;
   datetime curTime = iTime(_Symbol, period, 0);

   if(lastTime != curTime)
     {
      lastTime = curTime;
      double priseClose = iClose(_Symbol, period, 1);
      if(CopyBuffer(handle, GATORJAW_LINE, 1, 1, JawsBuffer) < 0)
         return;
      if(CopyBuffer(handle, GATORTEETH_LINE, 1, 1, TeethBuffer) < 0)
         return;
      if(CopyBuffer(handle, GATORLIPS_LINE, 1, 1, LipsBuffer) < 0)
         return;

      if(PositionsTotal() < 1) // если нет открытых позиций
        {
         if(JawsBuffer[0] > TeethBuffer[0] && TeethBuffer[0] > LipsBuffer[0]) // если линии аллигатора расположены правильно для buy 
           {
            if(priseClose > JawsBuffer[0])  // если свеча закрылась выше линии аллигатора
               m_trade.Buy(Lots, _Symbol, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0, 0);
           }
         else
            if(JawsBuffer[0] < TeethBuffer[0] && TeethBuffer[0] < LipsBuffer[0]) // если линии аллигатора расположены правильно для sell
               if(priseClose < LipsBuffer[0])  // если свеча закрылась ниже линии аллигатора
                  m_trade.Sell(Lots, _Symbol, SymbolInfoDouble(_Symbol, SYMBOL_BID), 0, 0);
        }
      else  // если есть открытая позиция
        {
         double close_triger = 0;
         switch(m_close)
           {
            case  Jaws:
               close_triger = JawsBuffer[0];
               break;
            case  Teeth:
               close_triger = TeethBuffer[0];
               break;
            default:
               close_triger = LipsBuffer[0];
               break;
           }
         PositionSelect(_Symbol);
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
           {
            if(priseClose < close_triger) // если свеча закрылась ниже линии аллигатора
               m_trade.PositionClose(PositionGetInteger(POSITION_TICKET));
           }
         else
            if(priseClose > close_triger)  // если свеча закрылась выше линии аллигатора
               m_trade.PositionClose(PositionGetInteger(POSITION_TICKET));
        }
     }
  }


Как видно в коде таймфрейм аллигатора и проверка сигнала на открытие/закрытие сделки привязаны к параметру  

input ENUM_TIMEFRAMES      period         = PERIOD_CURRENT; // таймфрейм


Если я запускаю оптимизацию по ценам открытия и включаю оптимизацию этого параметра


Получаю кучу подобных записей в лог    2021.10.30 22:55:40.179 Core 24 pass 331780 tested with error "wrong timeframe request in Open Prices mode" in 0:00:00.000

Если оптимизацию запускать "каждый тик на основе реальных тиков"  таких записей нет.

Просто хотелось за одну оптимизацию получить результаты с разных таймфреймов.

При оптимизации  "каждый тик на основе реальных тиков" это довольно таки долгий процесс, а при оптимизации по "ценам открытия" вот такая ошибка.

Кто виноват и что делать? 

Почему так происходит и можно ли как то это исправить?

 
Aleksandr Slavskii:

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


Как видно в коде таймфрейм аллигатора и проверка сигнала на открытие/закрытие сделки привязаны к параметру  


Если я запускаю оптимизацию по ценам открытия и включаю оптимизацию этого параметра


Получаю кучу подобных записей в лог    2021.10.30 22:55:40.179 Core 24 pass 331780 tested with error "wrong timeframe request in Open Prices mode" in 0:00:00.000

Если оптимизацию запускать "каждый тик на основе реальных тиков"  таких записей нет.

Просто хотелось за одну оптимизацию получить результаты с разных таймфреймов.

При оптимизации  "каждый тик на основе реальных тиков" это довольно таки долгий процесс, а при оптимизации по "ценам открытия" вот такая ошибка.

Кто виноват и что делать? 

Почему так происходит и можно ли как то это исправить?

Попробуйте в OnInit() вставить Alert(таймфрейм);
 
Konstantin Erin #:
Попробуйте в OnInit() вставить Alert(таймфрейм);

Почитал справку там  написано.

Существует ряд ограничений применения режима "Только цены открытия":

  • Нельзя использовать режим торговли "Произвольная задержка";
  • В тестируемом эксперте невозможно обратиться к данным более низкого таймфрейма, чем тот, что используется для тестирования/оптимизации. Например, если тестирование/оптимизация осуществляется на периоде H1, то вы можете обращаться к данным H2, H3, H4 и т.д., но не к данным M30, M20, M10 и т.д. Помимо этого, более старшие таймфреймы, к которым идет обращение, должны быть кратными таймфрейму тестирования. Например, при тестировании на периоде M20 нельзя обратиться к таймфрейму M30, но можно к H1. Эти ограничения обусловлены невозможностью получить данные более низких и не кратных таймфреймов из баров, генерируемых при тестировании/оптимизации.
  • Ограничения по обращению к данным других таймфреймов распространяются и на другие символы, чьи данные используются советником. Однако в этом случае ограничением для каждого символа служит первый таймфрейм, к которому произошло обращение во время тестирования/оптимизации. Например, тестирование осуществляется на символе и периоде EURUSD H1, советник в первый раз обратился к символу GBPUSD M20. В этой ситуации советник в дальнейшем может использовать данные EURUSD H1, H2, и т.д., а также GBPUSD M20, H1, H2 и т.д.


Обратите внимание на вот этот "перл"  :   при тестировании на периоде M20 нельзя обратиться к таймфрейму M30, но можно к H1 

Но в настройках вы не можете выбрать М20 и Н1 не выбрав ещё и  М30 !!!

Понятно что ограничения чем то обусловлены, к этому вопросов нет. Вопрос почему не сделано, чтоб при тестировании на М20 в выпадающем списке таймфреймов просто не было М30 ???  

советник по часу молотит оптимизацию на таймфреймах которых нет, при этом записывает по 50 метров логов. 

По уму должно быть так:  если оптимизируем на М5 то в настройках таймфрейм можно выбрать только  М5-М10-М20-М30-Н1 и т.д.  , а  М6 и М12 просто должны отсутствовать в списке.


Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
  • www.metatrader5.com
Тестер стратегий позволяет тестировать и оптимизировать торговые стратегии ( советники ) перед началом использования их в реальной торговле. При...