FrameFilter в функции OnInit возвращает ошибку ERR_FUNCTION_NOT_ALLOWED

 

При тестировании сохраняю некоторые результаты оптимизации во фреймах, чтобы потом использовать их при последующих проходах, но не получается их прочитать. При этом файл с фреймами Exp1...mqd создается.

Вот в таком коде в OnInit

int OnInit(void)
{
   if(FrameFilter("Exp1" + Symbol(), 1000 * Min + Max))
   {
      while(FrameNext(FramePass, FrameName, FrameID, FrameValue, FrameArray))
      {
         if(FrameValue < SomeValue)
         {
            ...
         }
      }
   }
   ...
}

FrameFilter возвращает ошибку ERR_FUNCTION_NOT_ALLOWED.

Кто-нибудь сталкивался? Подскажите, пожалуйста, что не так.

(Кстати, OnTesterInit() не вызывается вообще, что тоже, мне кажется, странно)

 

Один и тот же советник может работать в двух режимах: фреймовый и обычный.

OnInit - функция обычного режима работы советника. Поэтому в нем Frame-функции не могут быть задействованы.


Почти все On-функции разделены по режимам. Но, например, OnChartEvent отновится к обоим. Поэтому при оптимизации нужно быть аккуратным

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

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2018.02.22 09:47

Потому что это боевой советник даже во фрейм-режиме. Именно по этой причине нужно в OnChartEvent проверять фрейм-флаг, иначе вот такая беда произойти может

sinput uint Range = 100;

#define SETRANGE(A, START, STEP, END) ParameterSetRange(#A, true, A, START, STEP, END)

void OnTesterInit() { SETRANGE(Range, 0, 1, Range); }

void OnTesterDeinit() {}

void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam)
{
  static const bool IsFrame = MQLInfoInteger(MQL_FRAME_MODE);
  
//  if (!IsFrame) // без этой проверки Терминал (не только Агент) начнет выставлять ордера на реальном счете во время запуска Оптимизации
    OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, 0);
}


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

 

Спасибо, что подсказали. Получается, я не могу использовать фреймы, чтобы как-то менять логику работы программы при очередном проходе при оптимизации (изменить ее логично было бы именно в OnInit)? 

Ведь OnTesterInit() вызывается только один раз в начале, так?

 
8vlma:

Спасибо, что подсказали. Получается, я не могу использовать фреймы, чтобы как-то менять логику работы программы при очередном проходе при оптимизации (изменить ее логично было бы именно в OnInit)? 

Ведь OnTesterInit() вызывается только один раз в начале, так?

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

На тему влияния есть статья.

Управляемая оптимизация: метод отжига
Управляемая оптимизация: метод отжига
  • www.mql5.com
В состав тестера стратегий торговой платформы 5 входят только два варианта оптимизации: полный перебор параметров и генетический алгоритм. В этой статье я предлагаю новый вариант оптимизации торговых стратегий — метод отжига. Здесь приводится алгоритм метода отжига, рассмотрена его реализация и способ подключения к любому советнику. Далее мы...