Обработчик OnTester и графики

 

Хочу обсудить следующий момент. Нужно, чтобы в конце тестирования обработчик OnTester() создавал научный график с некоторой статистикой в отдельном окне терминала, а не в окне Визуализатора. Интересно, вообще такое возможно? :-)

Пока получается только в окне Визуализатора. Если выключить визуализацию, то ничего не будет отрисовано.

Шаблон советника такой:

//+------------------------------------------------------------------+
//|                                                   OnTesterEA.mq5 |
//|                                           Copyright 2017, denkir |
//|                             https://www.mql5.com/ru/users/denkir |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, denkir"
#property link      "https://www.mql5.com/ru/users/denkir"
#property version   "1.00"
//---
#include <Charts\Chart.mqh>
#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input string InpSymbolName="AUDCAD";  // Пользовательский символ 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
//---
   double ret=0.0;
//---
   CChart chart;
//--- открыть новое окно и вывести чарт
   long  ch_id=chart.Open(
                          InpSymbolName,// инструмент 
                          PERIOD_H2  // период 
                          );
   if(ch_id>0)
     {
      double vals[]=
        {
         116,-48,47,-124,48,92,96,-70,
         36,8,251,-17,173,-67,146,-124,
         0,-66,-61,-24,28,-162,-16,178
        };
      //--- график
      CGraphic vals_graph;
      int X1,X2,Y1,Y2,height;
      height=300;
      X1=0;
      X2=500;
      Y1=height/2;
      Y2=height;
      if(!vals_graph.Create(0,"Values",0,X1,Y1,X2,Y2))     // работает
   // if(!vals_graph.Create(ch_id,"Values",0,X1,Y1,X2,Y2)) // не работает
         Print("Не удалось создать научный график!");
      else
        {
         CCurve *curve=vals_graph.CurveAdd(vals,CURVE_LINES,"Values name");
         string name=curve.Name();
         vals_graph.CalculateMaxMinValues();
         vals_graph.CurvePlot(0);
         vals_graph.Update();
        }
      //---
      Print("Обработчик: "+__FUNCSIG__);
     }
//---
   return(ret);
  }
//+------------------------------------------------------------------+


Пока получается только в визуальном режиме, на том же инструменте, имя которого задаётся в настройках Тестера.


Так, у меня в Тестере был указан инструмент "EURUSD". Пытался открыть новое окно на символе "AUDCAD". 

Вот что получилось.



Удивительно, но при тестировании строчка ниже возвращает ненулевое значение id:

long  ch_id=chart.Open(
                       InpSymbolName,// инструмент 
                       PERIOD_H2  // период 
                       );   


Но потом этот метод не может создать научный график на пользовательском инструменте (у меня это "AUDCAD"):

if(!vals_graph.Create(ch_id,"Values",0,X1,Y1,X2,Y2)) 
   Print("Не удалось создать научный график!");
 
Почему решили что  OnTester работает вне тестера? Само название как бы говорит что предназначено для тестера.
Почему через ДеИнит не делаете? 
Возвращает 0 функция потому что график становится текущим.
 
Galina Bobro:
Почему решили что  OnTester работает вне тестера? Само название как бы говорит что предназначено для тестера.
Почему через ДеИнит не делаете? 

Galina, спасибо за мнение. Вроде нигде не писал, что OnTester() работает вне тестера. Попробовал через OnDeinit(). Тот же результат.

Galina Bobro:

Возвращает 0 функция потому что график становится текущим.

Это не так. Попробуйте в скрипте запустить блок кода со строчкой:

if(!vals_graph.Create(ch_id,"Values",0,X1,Y1,X2,Y2)) 

Увидите, что откроется второе окно, и именно на нём произойдёт отрисовка научного графика.

 
Dennis Kirichenko:

Galina, спасибо за мнение. Вроде нигде не писал, что OnTester() работает вне тестера. Попробовал через OnDeinit(). Тот же результат.

Извиняюсь, почему-то подумала что в реальной торговли необходимо..

long idd=ChartOpen(symb, PERIOD_H1); 

Alert("chart"+symb+": "+idd);

Возвращает не 0, что-то похожее не ИД, но график не создается. 

График появился только при запросе данных - функции CopyXXXX, но при перечислении графиков также показывает что как будто открыт один...

   long id=ChartFirst(); 

   while(id>=0){

      string id_symbol = ChartSymbol(id); 

      Alert(IntegerToString(id)+" - "+id_symbol); 

      id=ChartNext(id);}

В общем, кажется что в тестере нет работы с другими графиками, но может то что я пробовала натолкнет вас на какие-то мысли
 
Dennis Kirichenko:

Хочу обсудить следующий момент. Нужно, чтобы в конце тестирования обработчик OnTester() создавал научный график с некоторой статистикой в отдельном окне терминала, а не в окне Визуализатора. Интересно, вообще такое возможно? :-)

В режиме Оптимизации такое возможно.

 
Почему при запуске советника в тестере с визуализацией функция ChartOpen() не открывает дополнительный график и возвращает ноль?
 
rel18 #:
Почему при запуске советника в тестере с визуализацией функция ChartOpen() не открывает дополнительный график и возвращает ноль?

такой же вопрос, проблема до сих пор существует, осуществляю добавление при инициализации(везде кроме тестера работает)

подскажите как решить.

спасибо.