Библиотеки: Easy Canvas - страница 8

 
jaffer wilson:
Будет ли библиотека работать в Тестере стратегий? Хочу попробовать ручное тестирование в тестере стратегий.
Да, будет. Но нужно позаботится о паре вещей, так как события в тестере не работают должным образом и чтобы не перегружать тестер вычислениями canvas из-за более высокой плотности времени.
Чуть позже приведу пример.
Но пока можете посмотреть здесь.
https://www.mql5.com/en/forum/229521/page4#comment_15005864
Possibilities of Canvas.
Possibilities of Canvas.
  • 2020.01.18
  • www.mql5.com
Demonstration of the possibilities of Сanvas in dynamics. The picture never repeats. This script also works on MQL4, but much slower...
 
jaffer wilson:
Будет ли библиотека работать в Тестере стратегий? Хочу попробовать ручное тестирование в тестере стратегий.
#property indicator_chart_window
#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164
//+------------------------------------------------------------------+
int max=0,min=0;
double Max=0,Min=0;
int OnInit() {
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,     
                 const int prev_calculated,  
                 const datetime& time[],      
                 const double& open[],       
                 const double& high[],       
                 const double& low[],       
                 const double& close[],      
                 const long& tick_volume[],  
                 const long& volume[],        
                 const int& spread[]) {
   max= ArrayMaximum(high,rates_total-W.Left_bar,W.BarsInWind);
   min= ArrayMinimum(low,rates_total-W.Left_bar,W.BarsInWind);
   Max=high[max];
   Min=low[min];
   max=rates_total-1-max;
   min=rates_total-1-min;
   if (rates_total>0) Draw();
   return(rates_total);
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam) { // параметр события типа string
   if (id==CHARTEVENT_MOUSE_MOVE) Draw(); 
}
//+------------------------------------------------------------------+
void Draw () {
   static double pr=0;
   static uint clr=0;
   static uint lastCalc=0;
   uint cur=GetTickCount();
   if (cur-lastCalc<30) return;
   lastCalc=cur; 
   double Ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   if (Canvas.tester) ChartChanged();        // update chart parameters if in tester mode
   if (pr<Ask) clr=0x800000FF;               // red
   if (pr>Ask) clr=0x80FF0000;               // blue
   Canvas.Erase(clr);
   Canvas.FillCircle((int)Canvas.X(double(max)),(int)Canvas.Y(Max),20,0xAA50FF50);
   Canvas.FillCircle((int)Canvas.X(double(min)),(int)Canvas.Y(Min),20,0xAAFFFF50);
   Canvas.CurentFont("Tahoma",50,50,0xFF80FF80,0.4);
   Canvas.TextPosition(W.MouseX,W.MouseY);
   Canvas.Comm("Ask = " + DoubleToString(Ask,_Digits));
   Canvas.Comm("Bid = " + DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits));
   Canvas.Comm("Spread = " + DoubleToString((Ask-Bid)/_Point,0));
   Canvas.Update();
   pr=Ask;
}
//+------------------------------------------------------------------+

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

В данном индикаторе цвет экрана меняется в зависимости от направления изменения цены, выделяется минимум и максимум цены на экране и выводится текствовая информация о Bid и Ask в текущем положении указателя мышки.


Но, к сожалению, в Тестере событие движения мышки отрабатыватся только при нажатой левой клавиши мышки.
Это относится не только к моему классу iCanvas, но и любом графическом выводе в тестере.
Только у меня это проще реализовать.
И даже управление GUI вполне нормально  работает:


 
Большое спасибо за ответ и пример.
 
jaffer wilson:
Большое спасибо за ответ и пример.
No problem
 

Hello,

very nice work. Thank you. 

Can you please check the CanvasBar Sample? It won't work in tester even with your suggested modifications.


Regards, Mighty

 
Mighty7:

Hello,

very nice work. Thank you. 

Can you please check the CanvasBar Sample? It won't work in tester even with your suggested modifications.

Regards, Mighty

Try moving ChartChanged before CopyRates

 
Thank you for the fast reply, but it's still not working.
 
Mighty7:
Thank you for the fast reply, but it's still not working.

This is because the call comes from OnChartEvent, which is not working properly in the tester.

Try this.

int OnCalculate(const int rates_total,const int prev_calculated,const datetime &time[],const double &open[],const double &high[],const double &low[],
                const double &close[],const long &tick_volume[],const long &volume[],const int &spread[])
  {
   if(rates_total==prev_calculated)
     {
      Bar0.close=close[rates_total-1];Bar0.open=open[rates_total-1]; Bar0.high=high[rates_total-1];Bar0.low=low[rates_total-1];
      ShowBars(false);
     }
   else if (Canvas.tester) ShowBars();
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_CHART_CHANGE) ShowBars(true);
  }
In the future, please attach a code or link. After all, I don't remember the name of my code, which I wrote almost 2 years ago.
Файлы:
CanvasBar.mq5  7 kb
 

"In the future, please attach a code or link. After all, I don't remember the name of my code, which I wrote almost 2 years ago."

Ok, I'll do. Now it is working (I had to remove the GetTickCount lines to get it synced). Thank you.

 
Mighty7:

Ok, I'll do. Now it is working (I had to remove the GetTickCount lines to get it synced). Thank you.

What I have highlighted in yellow is important for the speed of the tester.  Otherwise, your tester will work very slowly, especially in the "every tick" mode.  You can put 16 instead of 30, but I do not recommend removing this.