Пользовательский индикатор и оптимизатор стратегии. Проблема.

 

Добрый день.

Сразу, приношу извинения, если это оффтоп. Но гугл и поиск по сайту не дали результатов.


Проблема такая, есть свой индикатор, данные хранятся в буфере индикаторном (всё по фен-шуй). Есть советник, который использует данный индикатор и его данные, путем копирования буфера.
Все работает отлично. НО! Если я выбираю в тестере оптимизатор или выключаю визуализацию, соответственно данных по индикатору нет, результатов соответственно нет.

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

 
Николай:

Добрый день.

Сразу, приношу извинения, если это оффтоп. Но гугл и поиск по сайту не дали результатов.


Проблема такая, есть свой индикатор, данные хранятся в буфере индикаторном (всё по фен-шуй). Есть советник, который использует данный индикатор и его данные, путем копирования буфера.
Все работает отлично. НО! Если я выбираю в тестере оптимизатор или выключаю визуализацию, соответственно данных по индикатору нет, результатов соответственно нет.

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


Быть этого не может ибо такого не может быть :). Получение данных с индикатора уж никоим образом не зависит хоть режим моделирования тиков "каждый тик на основе реальных тиков", хоть "OHLC", так же никак не влияет на работоспособность включена визуализация в тестере MetaTrader 5 или выключена она.

В общем, как всегда:

Начинать нужно с начала: сначала код, потом вопросы.

 
Vladimir Karputov:


Быть этого не может ибо такого не может быть :). Получение данных с индикатора уж никоим образом не зависит хоть режим моделирования тиков "каждый тик на основе реальных тиков", хоть "OHLC", так же никак не влияет на работоспособность включена визуализация в тестере MetaTrader 5 или выключена она.

В общем, как всегда:

Начинать нужно с начала: сначала код, потом вопросы.


Был молодой горячий... ;-) Извиняюсь, сейчас код покажу ;-)

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() { 
   //--- количество окон на графике (всегда есть хотя бы одно главное окно) 
   
   int windows=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL); // без этого не работает получение handle ниже. Странно!
   min_max_handle = ChartIndicatorGet(0,0,"MinMax");
   
   if(min_max_handle==INVALID_HANDLE) {
      printf("Error creating MinMax handle indicator");
      return(INIT_FAILED);
   }

   adx_handle = iADX(_Symbol,_Period,14);

   ArraySetAsSeries(ADX_Buffer,true); 
   ArraySetAsSeries(Min_Buffer,true); 
   ArraySetAsSeries(Max_Buffer,true); 

   EventSetTimer( 30 );
   
   return(INIT_SUCCEEDED);
}


Соответственно вылетает по Error на INIT_FAILED. Если ошибку проигнорировать, то ошибка будет вот тут:

void OnTick() {

   // берем данные по индикатору, минимум за и максимум за
   if(CopyBuffer(min_max_handle,0,0,2,Max_Buffer)<0) { 
      PrintFormat("Не удалось скопировать данные из индикатора MinMax, код ошибки %d",GetLastError()); 
      return;
   }
   if(CopyBuffer(min_max_handle,1,0,2,Min_Buffer)<0) {
      PrintFormat("Не удалось скопировать данные из индикатора MinMax, код ошибки %d",GetLastError()); 
      return;
   }

   if(CopyBuffer(adx_handle,0,0,4,ADX_Buffer)<0) {
      PrintFormat("Не удалось скопировать данные из индикатора ADX, код ошибки %d",GetLastError()); 
      return;
   }  


C ADX таким проблем нету, т.к. это встроенный индикатор и мы берем данные функций iADX(_Symbol,_Period,14);

 

Вы ищите индикатор в главном окне:

   min_max_handle = ChartIndicatorGet(0,0,"MinMax");

- Ваш индикатор точно имеет параметр "indicator_chart_window"?


Если ответ "да" - тогда следующий вопрос: Вы в курсе, что тестер стратегий при запуске применяет к графику шаблон "tester.tpl"? А теперь вопрос: у Вас в шаблоне "tester.tpl" есть индикатор "MInMax"?

 
Vladimir Karputov:

Вы ищите индикатор в главном окне:

- Ваш индикатор точно имеет параметр "indicator_chart_window"?


Если ответ "да" - тогда следующий вопрос: Вы в курсе, что тестер стратегий при запуске применяет к графику шаблон "tester.tpl"? А теперь вопрос: у Вас в шаблоне "tester.tpl" есть индикатор "MInMax"?


Да. Индикатор имеет параметр "indicator_chart_window" и в шаблоне tester.tpl он тоже присутствует с нужными параметрами. И работает только если галочка "Визуализация" включена, если галку убрать, то тесте выдает ошибку, что нет такого handle
 

Проблема думаю в другом: при тестировании (без включения "Визуально") не создаются никакие графические объекты

Графические объекты при тестировании

Во время тестирования/оптимизации не осуществляется построение графических объектов. Таким образом, при обращении к свойствам созданного объекта во время тестирования/оптимизации эксперт получит нулевые значения.

Данное ограничение не распространяется на тестирование в визуальном режиме.


Вероятно сюда попадают и индикаторы, которые вшиты в шаблон (в данном случае в шаблон debug.tpl).

 
Alexander Laur:


Вставьте такой код в советник:

Вместо звездочек - название индикатора.


Это проблему не решило. Пойду почитаю про этот property
 

Сделайте так:

   min_max_handle=ChartIndicatorGet(0,1,"MinMax");

   if(min_max_handle==INVALID_HANDLE)
     {
      printf("Error creating MinMax handle indicator");
      //--- далее подразумевается, что индикатор "MinMax" в папке Indicators (в корне)
      min_max_handle=iCustom(Symbol(),Period(),"MinMax.ex5");
      if(min_max_handle==INVALID_HANDLE)
        {
         printf("Error creating MinMax handle indicator (iCustom)");
         return(INIT_FAILED);
        }
     }
 
Vladimir Karputov:

Проблема думаю в другом: при тестировании (без включения "Визуально") не создаются никакие графические объекты

Вероятно сюда попадают и индикаторы, которые вшиты в шаблон (в данном случае в шаблон debug.tpl).


Ну я об этом же... что если графически ничего не рисуется, то и данных взять не откуда.

Вот и спрашиваю, как народ делает? Рядом с индикатором делает класс, который на ходу считает данные индикатора? Получается двойная работа и это только для того, чтобы в оптимизаторе погонять скрипт.

 
Vladimir Karputov:

Сделайте так:


!!! Да. То, что нужно.... быстрее правда тестер работать особо не стал, но можно уже делать оптимизацию.

Огромное спасибо!!!


Ещё почему-то у меня индикатор MinMax открывается в тестере ещё отдельном окне индикаторов. Но это уже мелочи жизни.