让新闻交易轻松上手(第3部分):执行交易·进阶篇
(2/3)· 当新闻事件还在刷新,你的图表却一片空白?这篇把数据库视图和筛选参数接进EA
「点差评级的颜色与文字映射」
这段逻辑把一个交易品种的点差分成五档,并用颜色和数字分别反馈给面板。评级从 Excellent 到 Terrible,分别对应程序里定义的 SpreadRating_Excellent 至 SpreadRating_Terrible 枚举值。 在取色函数里,Bad 档返回 clrOrange、Terrible 档返回 clrRed,识别失败时按浅色模式回 clrBlack、深色模式回 clrWheat。SpreadDesc 则把同一套评级翻成英文短词,失败时给 Unknown。 Description 函数先尝试 SetSymbolName 设定品种,成功就转调 CSymbol.Description(),失败则打印提示并返回空串。外汇与贵金属点差受流动性影响大,实盘里 Bad 以上档位可能频繁出现,属高风险特征,开 MT5 把这段挂到 EA 里能看到实时着色。
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 即可用。
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 验证一下最直观。
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),关掉一键交易面板——回测或观摩时防误触下单,比事后删单实在。
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,其余颜色与显隐大多由类方法代劳。
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 }
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 和析构直接贴进类实现,编译后挂不同周期观察返回的字符串,确认和上面枚举一一对应再接后续逻辑。
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 }