程序库: Easy Canvas - 页 9

 
该库可以在策略测试器中 使用吗?我想在 Strategy Tester 中尝试手动测试。
 
jaffer wilson:
该库可以在策略测试器中 使用吗?我想在 Strategy Tester 中尝试手动测试。
可以。但您需要注意两点,一是测试器中的事件无法正常工作,二是由于时间密度较高,不要让测试器超负荷运行画布计算。
稍后我会举例说明。
不过现在你可以先看看这里。
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:
该库可以在策略测试器中 使用吗?我想尝试在 Strategy Tester 中进行手动测试。
#property indicator_chart_window
#include <Canvas\iCanvas.mqh> //https://www.mql5.com/zh/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,   // 长类型事件参数
                  const double& dparam, // 事件参数为双类型
                  const string& sparam) { // 字符串类型的事件参数
   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();        // 如果处于测试模式,更新图表参数
   if (pr<Ask) clr=0x800000FF;               // 红色
   if (pr>Ask) clr=0x80FF0000;               // 蓝色
   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;
}
//+------------------------------------------------------------------+

黄色突出显示的内容是减少测试器负载所必需的
绿色突出显示的内容是正确渲染坐标所必需的。试着删除这一行,看看在测试器中会发生什么。

在该指标中,屏幕的颜色会根据价格变化的方向而改变,屏幕上的最低价和最高价会突出显示,并显示鼠标指针当前位置的买入价和卖出价的文本信息。


但遗憾的是,在 Tester 中,只有按下鼠标左键时才会执行鼠标移动事件。
这不仅适用于我的 iCanvas 类,也适用于 Tester 中的任何图形输出。
只有我有更简单的方法来实现它。
甚至 GUI 控件也能很好地工作:


 
非常感谢你的答复和例子。
 
jaffer wilson:
非常感谢你的回答和示例。
没问题
 

你好、

非常好的作品。谢谢。

能否请您检查一下 CanvasBar 示例?即使按照您的建议进行了修改,它在测试器中也无法运行。


敬礼,Mighty

 
Mighty7:

你好

非常好的作品。谢谢。

能否请您检查一下 CanvasBar 示例?即使按照您的建议进行了修改,它在测试器中也无法运行。

敬礼,Mighty

尝试将 ChartChanged 移到CopyRates 之前

 
感谢您的快速回复,但它仍然不起作用。
 
Mighty7:
感谢您的快速回复,但它仍然不起作用。

这是因为调用来自OnChartEvent,而该调用在测试器中无法正常工作。

试试这个。

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);
  }
以后请附上代码或链接。毕竟,我不记得我的代码名称了,那是我差不多两年前写的。
附加的文件:
CanvasBar.mq5  7 kb
 

"今后,请附上代码或链接。毕竟,我不记得我的代码名称了,那是我差不多两年前写的"。

好的,我会的。现在它可以工作了(我不得不删除GetTickCount 行来实现同步)。谢谢。