- 显示:
- 89
- 等级:
- 已发布:
- 2025.04.04 10:53
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
该库包含两种类型的显示。第一种是基于CChartObjectLabel 的LabelsDisplay 。第二种是 基于 CCanvas 的 CanvasDisplay。这些显示均针对渲染频率进行了优化。除了演示 Demo.mq5 显示器工作的主 Expert Advisor 之外,还有两个变体:CanvasVsLabelsTester.mq5,用于仅在测试器中对刻度进行测量。而通用CanvasVsLabels.mq5 则可在测试仪和图表中执行测量。有关比较显示速度的详细信息,请参阅Canvas vs Labels 链接。
//+------------------------------------------------------------------+ //|ChartDisplayDemo.mq5 //|版权所有 2021, © Cyberdev || //| https://www.mql5.com/en/users/cyberdev/seller | //+------------------------------------------------------------------+ #property copyright "版权 2021 年,© Cyberdev"。 #property link "https://www.mql5.com/en/users/cyberdev/seller" #property version "1.00" //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ #include "cyberdev\ChartDisplay.mqh" //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ enum OutType { otCanvas, // 帆布 otLabels // 标签 }; //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ input OutType outType = otLabels; // outType - 显示类型 input int nLines = 50; // nLines - 显示屏行数 input bool optimizeUpdate = false; // optimiseUpdate - 标签优化 input int bWidth = 406; // bWidth - 显示宽度 input int lY_Dist = 14; // lY_Dist - 线间距离 input bool back = false; // 背面 - 标签背景 //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ Strings * display; CChart Chart; //+------------------------------------------------------------------+ //| 专家初始化函数| //+------------------------------------------------------------------+ int OnInit() { Chart.Attach(ChartID()); Chart.ShowGrid(false); Chart.ColorBackground(C'194,231,197'); Chart.ColorBarUp(clrDodgerBlue); Chart.ColorBarDown(clrBlueViolet); Chart.ColorCandleBull(clrDodgerBlue); Chart.ColorCandleBear(clrBlueViolet); Chart.ColorForeground(clrBlack); switch (outType) { case otCanvas: display = new CanvasDisplay(); break; case otLabels: display = new LabelsDisplay(); break; default: return INIT_FAILED; } if ((outType == otLabels && back && !dynamic_cast<LabelsDisplay *>(display).createExt(nLines, 10, 10, bWidth, lY_Dist)) || !display.create(nLines, 10, 15, bWidth, lY_Dist)) return INIT_FAILED; return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 专家去初始化函数| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if (CheckPointer(display) == POINTER_DYNAMIC) delete display; Chart.Detach(); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ #define concatenate(_rate) \ ("Open: " + DoubleToString(rates[_rate].open, digits) + \ "; High: " + DoubleToString(rates[_rate].high, digits) + \ "; Low: " + DoubleToString(rates[_rate].low, digits) + \ "; Close: " + DoubleToString(rates[_rate].close, digits) + ".") //+------------------------------------------------------------------+ //| 专家勾选功能| //+------------------------------------------------------------------+ void OnTick() { MqlRates rates[]; int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS); static datetime time = 0; datetime cTime; static bool firstRun = true; bool triggered = false; if (CopyRates(NULL, PERIOD_CURRENT, 0, 2, rates) != 2) return; display.setText(concatenate(1)); cTime = rates[0].time; if (cTime != time) { if (!firstRun) { display.push(); display.setText(concatenate(0)); } time = cTime; firstRun = false; triggered = true; } if(outType == otLabels && optimizeUpdate) { if (triggered) display.update(); else dynamic_cast<LabelsDisplay *>(display).updateOne(); } else display.update(); } //+------------------------------------------------------------------+
要更新顶行,需要调用所用类的 setText 方法。要将文本移到下一行,需要调用所用类 的 push 方法。要在显示屏上显示添加/更新的文本,可使用任何一个类的 update 方法。除此方法外 , LabelDisplay 类还有一个 updateOne方法 ,可将显示速度提高 2 倍以上。只有在需要更新顶行时才会调用该方法。如果调用了 push 方法,那么在此之后应调用update 方法,而不是 updateOne。
输入参数
- outType - 显示类型
- nLines - 显示行数
- optimiseUpdate -优化 标签
- bWidth - 显示屏宽度
- lY_Dist - 行间距
- back - 标签的背景
通过outType ,您可以从Canvas 或Labels 值中选择显示类型。nLines(行 数)更改设置了通过推送方法滚动后保存的行数。如果推送方法未被调用,且其余行无需更新,则使用optimiseUpdate 参数可以只对一行进行经济性更新(见上文)。使用bWidth 可以设置显示宽度(适用于使用背景的画布和标签)。使用lY_Dist 参数可以获得所需的字体大小。字体大小取自lY_Dist ,从中减去由 fDec 系数设置的部分,这样就可以在不考虑行间距的情况下改变实际行高,而不是字体大小。背面 参数可在 标签 模式下启用背景 。
因此,可以用 5 种不同的模式在图表中显示信息。
- 画布
- 标签
- 优化 文本输出的标签
- 带画布 背景的标签
- 带背景、外加优化的标签
在 outType: Labels 模式下使用背景与使用其他附加图表对象的负载大致相同。也就是说,它会略微增加向显示屏输出文本所需的时间。
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/33898

在 Tester 中进行多次运行/优化。

用 4 度的多项式构造一条移动线。外推正弦及其轴线。所构建的线在每一小节上删除一个值,并构建一条外推值的滑动线,该滑动线不会重新绘制。

基于 CDialog 类的面板。对当前符号进行操作。删除、设置止盈、设置一组头寸的盈亏平衡点

基于标准指标 iCHO(柴金振荡器,CHO)和自定义指标 "CCIDualOnMA "的策略