让新闻交易轻松上手(第3部分):执行交易·进阶篇
📡

让新闻交易轻松上手(第3部分):执行交易·进阶篇

(2/3)· 当新闻事件还在刷新,你的图表却一片空白?这篇把数据库视图和筛选参数接进EA

含代码示例实战向 第 2/3 篇
很多交易者把经济日历当网页书签,事件来了才手忙脚乱切回图表。其实EA可以在1分钟K线刷新时自动把下一个新闻的时间、货币、重要性直接画在盘面,你只差一层视图和几个输入参数。

「点差评级的颜色与文字映射」

这段逻辑把一个交易品种的点差分成五档,并用颜色和数字分别反馈给面板。评级从 Excellent 到 Terrible,分别对应程序里定义的 SpreadRating_Excellent 至 SpreadRating_Terrible 枚举值。 在取色函数里,Bad 档返回 clrOrange、Terrible 档返回 clrRed,识别失败时按浅色模式回 clrBlack、深色模式回 clrWheat。SpreadDesc 则把同一套评级翻成英文短词,失败时给 Unknown。 Description 函数先尝试 SetSymbolName 设定品种,成功就转调 CSymbol.Description(),失败则打印提示并返回空串。外汇与贵金属点差受流动性影响大,实盘里 Bad 以上档位可能频繁出现,属高风险特征,开 MT5 把这段挂到 EA 里能看到实时着色。

MQL5 / C++
      class="kw">break;
      case SpreadRating_Bad:class=class="str">"cmt">//Bad Spread
         class="kw">return clrOrange;
         class="kw">break;
      case SpreadRating_Terrible:class=class="str">"cmt">//Terrible Spread
         class="kw">return clrRed;
         class="kw">break;
      class="kw">default:class=class="str">"cmt">//failed to be identified
         class="kw">return (isLightMode)?clrBlack:clrWheat;class=class="str">"cmt">//Retrieve class="kw">default class="type">class="kw">color when failed.
         class="kw">break;
   }
}
class="type">class="kw">string                SpreadDesc(class="type">class="kw">string SYMBOL=NULL);class=class="str">"cmt">//Retrieve Spread Description
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|Retrieve Spread Description                                      |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">class="kw">string CSymbolProperties::SpreadDesc(class="type">class="kw">string SYMBOL=NULL)
  {
   class="kw">switch(SpreadValue(SYMBOL))class=class="str">"cmt">//Get Spread Rating value
     {
      case SpreadRating_Excellent:class=class="str">"cmt">//Excellent Spread
         class="kw">return "Excellent";
         class="kw">break;
      case SpreadRating_Good:class=class="str">"cmt">//Good Spread
         class="kw">return "Good";
         class="kw">break;
      case SpreadRating_Normal:class=class="str">"cmt">//Normal Spread
         class="kw">return "Normal";
         class="kw">break;
      case SpreadRating_Bad:class=class="str">"cmt">//Bad Spread
         class="kw">return "Bad";
         class="kw">break;
      case SpreadRating_Terrible:class=class="str">"cmt">//Terrible Spread
         class="kw">return "Terrible";
         class="kw">break;
      class="kw">default:class=class="str">"cmt">//failed to be identified
         class="kw">return "Unknown";class=class="str">"cmt">//Retrieve class="kw">default value when failed.
         class="kw">break;
     }
  }
class="type">class="kw">string                Description(class="type">class="kw">string SYMBOL=NULL);class=class="str">"cmt">//Retrieve Symbol&class="macro">#x27;s Description
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|Retrieve Symbol&class="macro">#x27;s Description                                     |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">class="kw">string CSymbolProperties::Description(class="type">class="kw">string SYMBOL=NULL)
  {
   if(SetSymbolName(SYMBOL))class=class="str">"cmt">//Set Symbol
     {
      class="kw">return CSymbol.Description();
     }
   Print("Unable to retrieve Symbol&class="macro">#x27;s Description");
   class="kw">return "";class=class="str">"cmt">//Retrieve an empty class="type">class="kw">string when failed.
  }

◍ 图表属性类的继承重构与状态还原

这一版把图表属性类做了重构,直接继承自 MQL5 标准库里的 CChart,而不是像之前那样自己重写底层。核心思路是用一个 ChartProp 结构把要改的图表属性全收进去,先抓原状态、再套自定义、最后能一键还原。 构造函数里把 m_chart_id 绑成当前图表 ID(CHART_CURRENT),保证后面所有 Get/Set 都作用在用户正盯着的窗口上。ChartGet 会填两份结构:DefaultChart 存改动前的原生属性,MyChart 存你脚本想强加的视觉参数;ChartSet 拿 MyChart 去刷属性;析构时再用 DefaultChart 把图表恢复原貌,避免 EA 退出后界面一团乱。 周期名获取走 switch 映射 ENUM_TIMEFRAMES,比字符串拼装稳。外汇与贵金属图表多周期切换频繁,这类封装能降低手动改属性导致的视觉误差,但任何自动改图表行为都伴随误操作高风险,建议先在策略测试器里空跑验证。 下面这段结构定义就是 ChartProp 的全字段,涵盖了从背景色、买卖线色到成交量显示模式共 24 个成员,复制进 mqh 即可用。

MQL5 / C++
class="macro">#include "SymbolProperties.mqh"
class="macro">#include <Charts/Chart.mqh>
CSymbolProperties CSymbol;class=class="str">"cmt">//Symbol Properties object
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|ChartProperties class                                              |
class=class="str">"cmt">//+------------------------------------------------------------------+
class CChartProperties : class="kw">public CChart
  {
class="kw">private:
class=class="str">"cmt">//Structure for chart properties
  class="kw">struct ChartProp
    {
      ENUM_CHART_MODE mode;class=class="str">"cmt">//Chart Mode
      class="type">class="kw">color           clrBackground;class=class="str">"cmt">//Chart Background Color
      class="type">class="kw">color           clrForeground;class=class="str">"cmt">//Chart Foreground Color
      class="type">class="kw">color           clrLineLast;class=class="str">"cmt">//Chart Line Color
      class="type">class="kw">color           clrCandleBear;class=class="str">"cmt">//Chart Bear Candle Color
      class="type">class="kw">color           clrBarDown;class=class="str">"cmt">//Chart Down Candle Color
      class="type">class="kw">color           clrCandleBull;class=class="str">"cmt">//Chart Bull Candle Color
      class="type">class="kw">color           clrBarUp;class=class="str">"cmt">//Chart Up Candle Color
      class="type">class="kw">color           clrLineAsk;class=class="str">"cmt">//Chart Ask Color
      class="type">class="kw">color           clrLineBid;class=class="str">"cmt">//Chart Bid Color
      class="type">class="kw">color           clrChartLine;class=class="str">"cmt">//Chart Line Color
      class="type">class="kw">color           clrStopLevels;class=class="str">"cmt">//Chart Stop Level Color
      class="type">class="kw">color           clrVolumes;class=class="str">"cmt">//Chart Volumes Color
      class="type">bool            Foreground;class=class="str">"cmt">//Chart Foreground Visibility
      class="type">bool            ShowLineAsk;class=class="str">"cmt">//Chart Ask Line Visibility
      class="type">bool            ShowLineBid;class=class="str">"cmt">//Chart Bid Line Visibility
      class="type">bool            ShowPeriodSep;class=class="str">"cmt">//Chart Period Separator Visibility
      class="type">bool            ShowOHLC;class=class="str">"cmt">//Chart Open-High-Low-Close Visibility
      class="type">bool            ShowGrid;class=class="str">"cmt">//Chart Grid Visibility
      ENUM_CHART_VOLUME_MODE ShowVolumes;class=class="str">"cmt">//Chart Volumes Visibility
      class="type">bool            AutoScroll;class=class="str">"cmt">//Chart Auto Scroll Option
      class="type">bool            Shift;class=class="str">"cmt">//Chart Shift Option
      class="type">class="kw">double          ShiftSize;class=class="str">"cmt">//Chart Shift Size

把图表属性封装成可复用的结构体

在 MT5 自定义指标或 EA 里反复调图表样式,最忌硬编码。下面这段把背景色、蜡烛色、交易水平线开关等塞进一个 ChartProp 结构体,再用 DefaultChart 与 MyChart 两个实例分别存「系统原样」和「自定义样式」,后续一键切换就省事得多。 结构体里 ShowObjectDescr 控制图表对象描述显隐,CHART_SHOW_TRADE_LEVELS 管挂单/止损线的可见性,CHART_SHOW_ONE_CLICK 决定一键交易面板是否弹出——这几个 ulong 字段直接对应 ChartSetInteger() 的标识符,实盘前建议先把 SHOW_ONE_CLICK 关掉,避免误点。外汇与贵金属杠杆高,界面元素干扰可能放大操作风险。 构造函数 CChartProperties() 上来就抓 ChartID() 存进 m_chart_id,然后 ChartGet() 读现状、ChartSet(MyChart) 套自定义。注意 ChartGet() 里 MyChart.mode 被写死成 CHART_CANDLES,也就是说不管原图是线还是砖形,实例化后都强制变蜡烛图——想保留原模式得改这一行。 配色逻辑用了 isLightMode 三元判断:浅色模式背景给 clrWhite、前景 clrBlack;深色反之。熊烛颜色 MyChart.clrCandleBear 直接赋 clrBlack,但下跌柱 MyChart.clrBarDown 在深模式下用了 CSymbol.Background(),这种混用可能导致深色背景上阴线看不清,开 MT5 拖进 EURUSD 验证一下最直观。

MQL5 / C++
class="type">bool ShowObjectDescr; class=class="str">"cmt">//Chart Object Descriptions
class="type">class="kw">ulong CHART_SHOW_TRADE_LEVELS; class=class="str">"cmt">//Chart Trade Levels Visibility
class="type">class="kw">ulong CHART_SHOW_ONE_CLICK; class=class="str">"cmt">//Chart One Click Trading Visibility
class="type">class="kw">ulong CHART_SHOW_TICKER; class=class="str">"cmt">//Chart Ticker Visibility
class="type">class="kw">ulong CHART_DRAG_TRADE_LEVELS; class=class="str">"cmt">//Chart Drag Trade levels
ENUM_CHART_POSITION Navigate; class=class="str">"cmt">//Chart Navigate
};
ChartProp DefaultChart,MyChart; class=class="str">"cmt">//Used to store chart properties
class="type">void ChartSet(ChartProp &Prop); class=class="str">"cmt">//Apply Chart format
class="type">void ChartGet(); class=class="str">"cmt">//Assign Chart class="kw">property values
class="kw">public:
CChartProperties(); class=class="str">"cmt">//Constructor
~CChartProperties(class="type">void); class=class="str">"cmt">//Destructor
class=class="str">"cmt">//Configure the chart
class="type">void ChartRefresh() {ChartGet();ChartSet(MyChart);}
class="type">class="kw">string GetChartPeriodName(); class=class="str">"cmt">//Retrieve Period name
};
CChartProperties::CChartProperties()
  {
  m_chart_id=ChartID(); class=class="str">"cmt">//Set chart id
  ChartGet(); class=class="str">"cmt">//Get chart values
  ChartSet(MyChart); class=class="str">"cmt">//customize chart
  }
class="type">void CChartProperties::ChartGet()
  {
  DefaultChart.mode = Mode(); class=class="str">"cmt">//assign chart mode
  MyChart.mode = CHART_CANDLES; class=class="str">"cmt">//assign custom chart mode
  DefaultChart.clrBackground = ColorBackground(); class=class="str">"cmt">//assign Background class="type">class="kw">color
  MyChart.clrBackground = (isLightMode)?clrWhite:clrBlack; class=class="str">"cmt">//assign custom Background class="type">class="kw">color
  DefaultChart.clrForeground = ColorForeground(); class=class="str">"cmt">//assign foreground class="type">class="kw">color
  MyChart.clrForeground = (isLightMode)?clrBlack:clrWhite; class=class="str">"cmt">//assign custom foreground class="type">class="kw">color
  DefaultChart.clrLineLast = ColorLineLast(); class=class="str">"cmt">//assign Chart Line Color
  MyChart.clrLineLast = clrWhite; class=class="str">"cmt">//assign custom Chart Line Color
  DefaultChart.clrCandleBear = ColorCandleBear(); class=class="str">"cmt">//assign Chart Bear Candle Color
  MyChart.clrCandleBear = clrBlack; class=class="str">"cmt">//assign custom Chart Bear Candle Color
  DefaultChart.clrBarDown = ColorBarDown(); class=class="str">"cmt">//assign Chart Down Candle Color
  MyChart.clrBarDown = (isLightMode)?clrBlack:CSymbol.Background(); class=class="str">"cmt">//assign custom Chart Down Candle Color

「把默认图表属性搬进自定义模板」

在 MT5 里做多图表皮肤切换时,先把终端默认外观读进 DefaultChart 结构,再把你想覆盖的项写进 MyChart,是避免「改完发现背景和网格都没了的」稳妥做法。下面这段赋值直接对应 Chart 属性枚举,复制进 EA 的 OnInit 就能跑。 注意 MyChart.ShiftSize 被写死成 15,意味着自定义图表右侧预留 15 像素空白;若你的笔记本分辨率低于 1366 宽,这个偏移可能吃掉太多 K 线可视区,建议按屏宽动态算。 MyChart.ShowGrid 与 ShowOHLC 都设成 false,配合 Foreground=false,等于把原生图表「降噪」成纯价格画布;外汇与贵金属波动快、跳空多,这种极简视图有助于减少误读,但高风险依旧,杠杆品种请自行控仓。 自定义模板里把 CHART_SHOW_ONE_CLICK 转成 ulong(false),关掉一键交易面板——回测或观摩时防误触下单,比事后删单实在。

MQL5 / C++
  DefaultChart.clrCandleBull = ColorCandleBull();class=class="str">"cmt">//assign Chart Bull Candle Color
  MyChart.clrCandleBull = CSymbol.Background();class=class="str">"cmt">//assign custom Chart Bull Candle Color
  DefaultChart.clrBarUp = ColorBarUp();class=class="str">"cmt">//assign Chart Up Candle Color
  MyChart.clrBarUp = (isLightMode)?clrBlack:CSymbol.Background();class=class="str">"cmt">//assign custom Chart Up Candle Color
  DefaultChart.clrLineAsk = ColorLineAsk();class=class="str">"cmt">//assign Chart Ask Color 
  MyChart.clrLineAsk = (isLightMode)?clrBlack:clrWhite;class=class="str">"cmt">//assign custom Chart Ask Color
  DefaultChart.clrLineBid = ColorLineBid();class=class="str">"cmt">//assign Chart Bid Color
  MyChart.clrLineBid = (isLightMode)?clrBlack:CSymbol.Background();class=class="str">"cmt">//assign custom Chart Bid Color
  DefaultChart.clrChartLine = ColorChartLine();class=class="str">"cmt">//assign Chart Line Color
  MyChart.clrChartLine = (isLightMode)?clrBlack:clrWhite;class=class="str">"cmt">//assign custom Chart Line Color
  DefaultChart.clrStopLevels = ColorStopLevels();class=class="str">"cmt">//assign Chart Stop Level Color
  MyChart.clrStopLevels = clrRed;class=class="str">"cmt">//assign custom Chart Stop Level Color
  DefaultChart.clrVolumes = ColorVolumes();class=class="str">"cmt">//assign Chart Volumes Color
  MyChart.clrVolumes = clrGreen;class=class="str">"cmt">//assign custom Chart Volumes Color
  DefaultChart.Foreground = Foreground();class=class="str">"cmt">//assign Chart Foreground Visibility
  MyChart.Foreground = class="kw">false;class=class="str">"cmt">//assign custom Chart Foreground Visibility
  DefaultChart.ShowLineAsk = ShowLineAsk();class=class="str">"cmt">//assign Chart Ask Line Visibility
  MyChart.ShowLineAsk = true;class=class="str">"cmt">//assign custom Chart Ask Line Visibility
  DefaultChart.ShowLineBid = ShowLineBid();class=class="str">"cmt">//assign Chart Bid Line Visibility
  MyChart.ShowLineBid = true;class=class="str">"cmt">//assign custom Chart Bid Line Visibility
  DefaultChart.ShowPeriodSep = ShowPeriodSep();class=class="str">"cmt">//assign Chart Period Separator Visibility
  MyChart.ShowPeriodSep = true;class=class="str">"cmt">//assign custom Chart Period Separator Visibility
  DefaultChart.ShowOHLC = ShowOHLC();class=class="str">"cmt">//assign Chart Open-High-Low-Close Visibility
  MyChart.ShowOHLC = class="kw">false;class=class="str">"cmt">//assign custom Chart Open-High-Low-Close Visibility
  DefaultChart.ShowGrid = ShowGrid();class=class="str">"cmt">//assign Chart Grid Visibility
  MyChart.ShowGrid = class="kw">false;class=class="str">"cmt">//assign custom Chart Grid Visibility
  DefaultChart.ShowVolumes = ShowVolumes();class=class="str">"cmt">//assign Chart Volumes Visibility
  MyChart.ShowVolumes = CHART_VOLUME_HIDE;class=class="str">"cmt">//assign custom Chart Volumes Visibility
  DefaultChart.AutoScroll = AutoScroll();class=class="str">"cmt">//assign Chart Auto Scroll Option
  MyChart.AutoScroll = true;class=class="str">"cmt">//assign custom Chart Auto Scroll Option
  DefaultChart.Shift = Shift();class=class="str">"cmt">//assign Chart Shift Option
  MyChart.Shift = true;class=class="str">"cmt">//assign custom Chart Shift Option
  DefaultChart.ShiftSize = ShiftSize();class=class="str">"cmt">//assign Chart Shift Size
  MyChart.ShiftSize = class="num">15;class=class="str">"cmt">//assign custom Chart Shift Size
  DefaultChart.ShowObjectDescr = ShowObjectDescr();class=class="str">"cmt">//assign Chart Object Descriptions
  MyChart.ShowObjectDescr = class="kw">false;class=class="str">"cmt">//assign custom Chart Object Descriptions
  DefaultChart.Navigate = CHART_END;class=class="str">"cmt">//assign Chart Navigate
  MyChart.Navigate = CHART_END;class=class="str">"cmt">//assign custom Chart Navigate
  class=class="str">"cmt">//---assign Chart Trade Levels Visibility
  DefaultChart.CHART_SHOW_TRADE_LEVELS = ChartGetInteger(ChartId(),CHART_SHOW_TRADE_LEVELS);
  class=class="str">"cmt">//---assign custom Chart Trade Levels Visibility
  MyChart.CHART_SHOW_TRADE_LEVELS = class="type">class="kw">ulong(true);
  class=class="str">"cmt">//---assign Chart One Click Trading Visibility
  DefaultChart.CHART_SHOW_ONE_CLICK = ChartGetInteger(ChartId(),CHART_SHOW_ONE_CLICK);
  class=class="str">"cmt">//---assign custom Chart One Click Trading Visibility
  MyChart.CHART_SHOW_ONE_CLICK = class="type">class="kw">ulong(class="kw">false);
  class=class="str">"cmt">//---assign Chart Ticker Visibility

◍ 把图表属性一次性写回MT5

封装好的 ChartSet 方法,本质是把结构体里的字段逐个映射到 ChartSetInteger / 类内封装函数,省去在 EA 里反复手写属性赋值的麻烦。 下面这段是真实可用的写入逻辑,注意 CHART_SHOW_TRADE_LEVELS、CHART_SHOW_ONE_CLICK、CHART_SHOW_TICKER、CHART_DRAG_TRADE_LEVELS 四个只能走 ChartSetInteger,其余颜色与显隐大多由类方法代劳。

MQL5 / C++
class="type">void CChartProperties::ChartSet(ChartProp &Prop)
  {
  Mode(Prop.mode);class=class="str">"cmt">//Set Chart Candle Mode
  ColorBackground(Prop.clrBackground);class=class="str">"cmt">//Set Chart Background Color
  ColorForeground(Prop.clrForeground);class=class="str">"cmt">//Set Chart Foreground Color
  ColorLineLast(Prop.clrLineLast);class=class="str">"cmt">//Set Chart Line Color
  ColorCandleBear(Prop.clrCandleBear);class=class="str">"cmt">//Set Chart Bear Candle Color
  ColorBarDown(Prop.clrBarDown);class=class="str">"cmt">//Set Chart Down Candle Color
  ColorCandleBull(Prop.clrCandleBull);class=class="str">"cmt">//Set Chart Bull Candle Color
  ColorBarUp(Prop.clrBarUp);class=class="str">"cmt">//Set Chart Up Candle Color
  ColorLineAsk(Prop.clrLineAsk);class=class="str">"cmt">//Set Chart Ask Color
  ColorLineBid(Prop.clrLineBid);class=class="str">"cmt">//Set Chart Bid Color
  ColorChartLine(Prop.clrChartLine);class=class="str">"cmt">//Set Chart Line Color
  ColorStopLevels(Prop.clrStopLevels);class=class="str">"cmt">//Set Chart Stop Level Color
  ColorVolumes(Prop.clrVolumes);class=class="str">"cmt">//Set Chart Volumes Color
  Foreground(Prop.Foreground);class=class="str">"cmt">//Set if Chart is in Foreground Visibility
  ShowLineAsk(Prop.ShowLineAsk);class=class="str">"cmt">//Set Chart Ask Line Visibility
  ShowLineBid(Prop.ShowLineBid);class=class="str">"cmt">//Set Chart Bid Line Visibility
  ShowPeriodSep(Prop.ShowPeriodSep);class=class="str">"cmt">//Set Chart Period Separator Visibility
  ShowOHLC(Prop.ShowOHLC);class=class="str">"cmt">//Set Chart Open-High-Low-Close Visibility
  ShowGrid(Prop.ShowGrid);class=class="str">"cmt">//Set Chart Grid Visibility
  ShowVolumes(Prop.ShowVolumes);class=class="str">"cmt">//Set Chart Volumes Visibility
  AutoScroll(Prop.AutoScroll);class=class="str">"cmt">//Set Chart Auto Scroll Option
  Shift(Prop.Shift);class=class="str">"cmt">//Set Chart Shift Option
  ShiftSize(Prop.ShiftSize);class=class="str">"cmt">//Set Chart Shift Size Value
  ShowObjectDescr(Prop.ShowObjectDescr);class=class="str">"cmt">//Set Chart Show Object Descriptions
  ChartSetInteger(ChartId(),CHART_SHOW_TRADE_LEVELS,Prop.CHART_SHOW_TRADE_LEVELS);class=class="str">"cmt">//Set Chart Trade Levels Visibility
  ChartSetInteger(ChartId(),CHART_SHOW_ONE_CLICK,Prop.CHART_SHOW_ONE_CLICK);class=class="str">"cmt">//Set Chart One Click Trading Visibility
  ChartSetInteger(ChartId(),CHART_SHOW_TICKER,Prop.CHART_SHOW_TICKER);class=class="str">"cmt">//Set Chart Ticker Visibility
  ChartSetInteger(ChartId(),CHART_DRAG_TRADE_LEVELS,Prop.CHART_DRAG_TRADE_LEVELS);class=class="str">"cmt">//Set Chart Drag Trade levels
  Navigate(Prop.Navigate);class=class="str">"cmt">//Set Chart Navigate
  }
逐行拆解:Mode 到 ShowObjectDescr 都是类内部封装的 setter,背后仍调用 ChartSetInteger 或 ChartSetColor;后四个 ChartSetInteger 直接针对交易相关显隐,其中 CHART_DRAG_TRADE_LEVELS 设为 false 后,拖拽止损线在图上就不可见了,对防止误触有帮助。 GetChartPeriodName 则用一个 switch 把 ChartPeriod(ChartId()) 的枚举转成短字符串,PERIOD_M1 返回 "M1",便于在日志或面板标注当前周期。外汇与贵金属波动剧烈,改图表属性不会直接影响成交,但杂乱的 UI 可能让你漏看信号,建议用这类封装统一清屏。

MQL5 / C++
class="type">void CChartProperties::ChartSet(ChartProp &Prop)
  {
  Mode(Prop.mode);class=class="str">"cmt">//Set Chart Candle Mode
  ColorBackground(Prop.clrBackground);class=class="str">"cmt">//Set Chart Background Color
  ColorForeground(Prop.clrForeground);class=class="str">"cmt">//Set Chart Foreground Color
  ColorLineLast(Prop.clrLineLast);class=class="str">"cmt">//Set Chart Line Color
  ColorCandleBear(Prop.clrCandleBear);class=class="str">"cmt">//Set Chart Bear Candle Color
  ColorBarDown(Prop.clrBarDown);class=class="str">"cmt">//Set Chart Down Candle Color
  ColorCandleBull(Prop.clrCandleBull);class=class="str">"cmt">//Set Chart Bull Candle Color
  ColorBarUp(Prop.clrBarUp);class=class="str">"cmt">//Set Chart Up Candle Color
  ColorLineAsk(Prop.clrLineAsk);class=class="str">"cmt">//Set Chart Ask Color
  ColorLineBid(Prop.clrLineBid);class=class="str">"cmt">//Set Chart Bid Color
  ColorChartLine(Prop.clrChartLine);class=class="str">"cmt">//Set Chart Line Color
  ColorStopLevels(Prop.clrStopLevels);class=class="str">"cmt">//Set Chart Stop Level Color
  ColorVolumes(Prop.clrVolumes);class=class="str">"cmt">//Set Chart Volumes Color
  Foreground(Prop.Foreground);class=class="str">"cmt">//Set if Chart is in Foreground Visibility
  ShowLineAsk(Prop.ShowLineAsk);class=class="str">"cmt">//Set Chart Ask Line Visibility
  ShowLineBid(Prop.ShowLineBid);class=class="str">"cmt">//Set Chart Bid Line Visibility
  ShowPeriodSep(Prop.ShowPeriodSep);class=class="str">"cmt">//Set Chart Period Separator Visibility
  ShowOHLC(Prop.ShowOHLC);class=class="str">"cmt">//Set Chart Open-High-Low-Close Visibility
  ShowGrid(Prop.ShowGrid);class=class="str">"cmt">//Set Chart Grid Visibility
  ShowVolumes(Prop.ShowVolumes);class=class="str">"cmt">//Set Chart Volumes Visibility
  AutoScroll(Prop.AutoScroll);class=class="str">"cmt">//Set Chart Auto Scroll Option
  Shift(Prop.Shift);class=class="str">"cmt">//Set Chart Shift Option
  ShiftSize(Prop.ShiftSize);class=class="str">"cmt">//Set Chart Shift Size Value
  ShowObjectDescr(Prop.ShowObjectDescr);class=class="str">"cmt">//Set Chart Show Object Descriptions
  ChartSetInteger(ChartId(),CHART_SHOW_TRADE_LEVELS,Prop.CHART_SHOW_TRADE_LEVELS);class=class="str">"cmt">//Set Chart Trade Levels Visibility
  ChartSetInteger(ChartId(),CHART_SHOW_ONE_CLICK,Prop.CHART_SHOW_ONE_CLICK);class=class="str">"cmt">//Set Chart One Click Trading Visibility
  ChartSetInteger(ChartId(),CHART_SHOW_TICKER,Prop.CHART_SHOW_TICKER);class=class="str">"cmt">//Set Chart Ticker Visibility
  ChartSetInteger(ChartId(),CHART_DRAG_TRADE_LEVELS,Prop.CHART_DRAG_TRADE_LEVELS);class=class="str">"cmt">//Set Chart Drag Trade levels
  Navigate(Prop.Navigate);class=class="str">"cmt">//Set Chart Navigate
  }

周期枚举到字符串的收口与析构还原

上面这段 switch 的尾巴把 M2 到 MN1 全部映射成可读字符串,覆盖 MT5 里 21 个内置周期常量。PERIOD_M2 返回 "M2"、PERIOD_D1 返回 "Daily"、PERIOD_MN1 返回 "Monthly",未命中任何 case 时统一回落到 "unknown period",方便在日志里直接肉眼排查传参错误。 析构函数做两件事:先调 ChartSet(DefaultChart) 把图表属性还原成对象构造时记录的默认配置,再把 m_chart_id 置为 -1 断开句柄引用。外汇与贵金属图表多周期切换属于高风险操作,若忘了在析构还原,下一次 EA 附着可能继承了上一次的偏移视图。 开 MT5 新建脚本,把这段 switch 和析构直接贴进类实现,编译后挂不同周期观察返回的字符串,确认和上面枚举一一对应再接后续逻辑。

MQL5 / C++
      class="kw">return("M2");
      case PERIOD_M3:
         class="kw">return("M3");
      case PERIOD_M4:
         class="kw">return("M4");
      case PERIOD_M5:
         class="kw">return("M5");
      case PERIOD_M6:
         class="kw">return("M6");
      case PERIOD_M10:
         class="kw">return("M10");
      case PERIOD_M12:
         class="kw">return("M12");
      case PERIOD_M15:
         class="kw">return("M15");
      case PERIOD_M20:
         class="kw">return("M20");
      case PERIOD_M30:
         class="kw">return("M30");
      case PERIOD_H1:
         class="kw">return("H1");
      case PERIOD_H2:
         class="kw">return("H2");
      case PERIOD_H3:
         class="kw">return("H3");
      case PERIOD_H4:
         class="kw">return("H4");
      case PERIOD_H6:
         class="kw">return("H6");
      case PERIOD_H8:
         class="kw">return("H8");
      case PERIOD_H12:
         class="kw">return("H12");
      case PERIOD_D1:
         class="kw">return("Daily");
      case PERIOD_W1:
         class="kw">return("Weekly");
      case PERIOD_MN1:
         class="kw">return("Monthly");
      }
   class="kw">return("unknown period");
   }
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|Destructor                                                        |
class=class="str">"cmt">//+------------------------------------------------------------------+
CChartProperties::~CChartProperties()
   {
   ChartSet(DefaultChart);class=class="str">"cmt">//restore chart class="kw">default configuration
   m_chart_id=-class="num">1;class=class="str">"cmt">//reset chart id
   }
把盘面信息块交给小布盯盘
这些新闻信息块和点差评级的呈现逻辑,小布盯盘的AIGC已内置到对应品种页,打开即可看到实时事件与价差分级,你专注判断要不要动手。

常见问题

视图只负责把经济日历数据按事件维度展示和筛选,真正下单前的仓位与止损仍由前一篇的风险管理类接管,两者通过输入参数联动。
基于品种近两周1分钟K线价差,分为优秀、良好、正常、较差、糟糕五档,深浅色模式配色不同,仅作流动性参考,不预示方向。
可以,小布盯盘品种页已内置类似实时事件与价差评级模块,不用自己写EA也能在盘中看到同类信号,外汇贵金属波动大仍属高风险。
回测时逐tick刷新这些对象会拖慢速度,按K线边界更新既能跟住事件节奏也保住历史测试效率。
关掉只是不画对象,数据库里的当日事件时间仍在,EA筛选逻辑不受影响,只是图表上不显示那一条时间轴。