请观看如何免费下载自动交易
请在Facebook上找到我们!
加入我们粉丝页
有趣的脚本?
因此发布一个链接 -
让其他人评价
喜欢这个脚本? 在MetaTrader 5客户端尝试它
程序库

针对控制台类型的图表文本输出进行了优化显示 - MetaTrader 5程序库

显示:
89
等级:
(17)
已发布:
2025.04.04 10:53
\MQL5\Experts\canvas-vs-labels\demo\cyberdev\ \MQL5\Experts\canvas-vs-labels\demo\
Demo.mq5 (9.48 KB) 预览
\MQL5\Experts\canvas-vs-labels\measurement\cyberdev\ \MQL5\Experts\canvas-vs-labels\measurement\
MQL5自由职业者 需要基于此代码的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 种不同的模式在图表中显示信息。

    1. 画布
    2. 标签
    3. 优化 文本输出的标签
    4. 画布 背景的标签
    5. 带背景、外加优化的标签

    在 outType: Labels 模式下使用背景与使用其他附加图表对象的负载大致相同。也就是说,它会略微增加向显示屏输出文本所需的时间。



    由MetaQuotes Ltd译自俄语
    原代码: https://www.mql5.com/ru/code/33898

    多功能测试仪 多功能测试仪

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

    Pan PrizMA 第 72 号杠杆 Pan PrizMA 第 72 号杠杆

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

    手动位置跟踪面板 手动位置跟踪面板

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

    iCHO 趋势 CCIDualOnMA 过滤器 iCHO 趋势 CCIDualOnMA 过滤器

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