Easy Canvas - MetaTrader 5程序库
- 显示:
- 1535
- 等级:
- 已发布:
- 2018.11.08 10:18
- 需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
本开发库以及 iCanvas 类简单使用了 Canvas 来开发程序。
这里是一个使用这个开发库的简单指标,
在这个例子中,指标体没有函数来处理 OnChartEvent 时间,但是它还可以显示。
#property indicator_chart_window #include <Canvas\iCanvas.mqh> int OnInit() { EventSetMillisecondTimer(33); ChartSetInteger(0,CHART_SHOW,true); ChartSetInteger(0,CHART_CROSSHAIR_TOOL,false); // turn off the crosshair return(INIT_SUCCEEDED); } void OnDeinit(const int reason) {if(reason<2) {ChartSetInteger(0,CHART_CROSSHAIR_TOOL,true); ChartRedraw();}} void OnTimer() { static int X=0; static int Y=0; if(X!=W.MouseX || Y!=W.MouseY) { Canvas.Erase(0); // 画一个模糊点 for(int ix=-20;ix<=20;ix++) for(int iy=-20;iy<=20;iy++) { double p=sqrt(ix*ix+iy*iy)/20.0; if(p>1) p=1; uchar P=(uchar)Round((1.0-p)*255.0); Canvas.PixelSet(W.MouseX+ix,W.MouseY+iy,ARGB(P,100,0,200)); } // 显示信息块 int Y1=(int)Canvas.Y(Canvas.Close(W.MouseX)); Canvas.FillRectangle(W.MouseX,Y1,W.MouseX+140,Y1+67,0xA0808080); Canvas.TextOut(W.MouseX+5,Y1+2,"Close = "+DoubleToString(Canvas.Close(W.MouseX),_Digits),0xFFFFFFFF); Canvas.TextOut(W.MouseX+5,Y1+18,"Bar = "+DoubleToString(W.MouseBar,2),0xFFFFFFFF); Canvas.TextOut(W.MouseX+5,Y1+34,TimeToString(W.MouseTime,TIME_DATE|TIME_SECONDS),0xFFFFFFFF); Canvas.TextOut(W.MouseX+5,Y1+50,"SubWindow = "+string(W.MouseSubWin),0xFFFFFFFF); // 十字线 Canvas.LineHorizontal(0,W.Width-1,W.MouseY,~W.Color); Canvas.LineVertical(W.MouseX,0,W.Height-1,~W.Color); int Ym=(W.MouseY>16)?(W.MouseY-16):(W.MouseY+2); int Xm=(W.MouseX<(W.Width-140))?(W.MouseX+4):(W.MouseX-125); Canvas.TextOut(W.Width-76,Ym,DoubleToString(W.MousePrice,_Digits),~W.Color); Canvas.TextOut(Xm,W.Height-16,TimeToString(W.MouseTime,TIME_DATE|TIME_SECONDS),~W.Color); Canvas.Update(); X=W.MouseX; Y=W.MouseY; } } int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { return(rates_total); }
开发库的特性:
- 当关联开发库时,会创建一个名为 Canvas 的派生于CCanvas 类 iCanvas 类的实例,
- 这个实例的大小与整个窗口匹配。进而,当窗口大小改变时,canvas (画布) 会自动调整大小 (除了脚本)。
- 使用 OnChartEvent 事件处理函数是可选的。
- 在库中,也有一个 Window 结构的实例,名称为 W,窗口参数就在其中并且会在这个结构中自动更新(除了脚本程序)。
Window 结构:
struct Window { uint Color; // 窗口背景色 int Width; // 窗口宽度 int Height; // 窗口高度 int Left_bar; // 窗口最左边的柱的编号 double Right_bar; // 窗口最右边柱的编号 double Total_bars; // 窗口中的最大柱数 int BarsInWind; // 窗口中的可见柱数 double Y_min; // 窗口中价格的最小值 double Y_max; // 窗口中价格的最大值 double dy_pix; // 每个像素对用的价格变化 int dx_pix; // 每个像素对应的柱数变化 int MouseX; // 鼠标指针当前位置的 X 坐标 int MouseY; // 鼠标指针当前位置的 Y 坐标 double MouseBar; // 鼠标指针当前柱的位置 double MousePrice; // 鼠标指针当前价格的位置 datetime MouseTime; // 鼠标指针对应的当前时间 int MouseSubWin; // 鼠标指针对应的子窗口编号 int WindowsTotal;// 子窗口总数,包括主窗口 int SubWin; // 当前子窗口 datetime time[]; // 窗口中所有可见柱的开启时间的数组 };
iCanvas class:
class iCanvas : public CCanvas { private: datetime T[1]; double Pr[1]; bool FullWinCanvW; // 使用窗口画布全部宽度 bool FullWinCanvH; // 使用窗口画布全部高度 public: iCanvas(int Xpos=0,int Ypos=0,string Name="iCanvas",int width=0,int height=0,ENUM_COLOR_FORMAT formatCF=COLOR_FORMAT_ARGB_NORMALIZE,int subwin=-1); ~iCanvas() { Destroy();}; double X(double bar); double X(datetime Time) {return X((double)Ceil(W.Right_bar)+iBarShift(NULL,0,Time));}; double Y(double Price) {return((W.Y_max-Price)/W.dy_pix); }; double Bar(int x) {return((double)W.Left_bar+1-(double)x/(double)W.dx_pix);}; datetime TimePos(int x) {double B=Bar(x); CopyTime(_Symbol,_Period,Floor(B),1,T); return T[0]+int((double)PeriodSeconds()*(1-B+(int)B));}; double Close(int x) {CopyClose(_Symbol,_Period,int(Bar(x)),1,Pr); return Pr[0];}; double Open(int x) {CopyOpen(_Symbol,_Period,int(Bar(x)),1,Pr); return Pr[0];}; double High(int x) {CopyHigh(_Symbol,_Period,int(Bar(x)),1,Pr); return Pr[0];}; double Low(int x) {CopyLow(_Symbol,_Period,int(Bar(x)),1,Pr); return Pr[0];}; bool FullWinCanvWidth() {return FullWinCanvW;}; // 使用窗口画布全部宽度 bool FullWinCanvHeight() {return FullWinCanvH;}; // 使用窗口画布全部高度 ENUM_PROGRAM_TYPE ProgType; };
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/22164