MQL5 Cookbook: 使用不同的打印模式·进阶篇
「把品种参数打到图表还是弹窗」
写脚本时先决定信息往哪输出,直接影响你盯盘时的干扰程度。下面这段逻辑给了两种落地方式:图表注释和提醒窗口,分别适合不同场景。 当 printMode 设为 COMMENT,代码会把交易品种、小数位数、点差、止损级别、买卖价一次性刷到图表左上角。symb_spread 和 symb_stoplevel 是整数,symb_ask / symb_bid 是双精度,注释里能直接看实时值。刷完还会弹一个 MessageBox 问你是否清掉注释,点 Yes 就调 Comment("") 清空,避免挡住 K 线。 若 printMode 设为 ALERT,则走 Alert() 把同样的内容弹到终端提醒窗口,整数要用 IntegerToString 转,双精度用 DoubleToString 配 _Digits 控制位数。这种方式不污染图表,但会打断操作,适合只跑一次的检查脚本。 顶部那个 ENUM_PRINT_MODE 枚举定义了三种模式:PRINT=0 走终端日志,COMMENT=1 走图表,ALERT=2 走弹窗。脚本头部用 input 暴露 printMode,默认 PRINT,你在 MT5 参数框里改一下就能切换输出通道。
if(printMode==COMMENT) { class="type">int mb_res=-class="num">1; class=class="str">"cmt">// 对话框中选择选项的变量 class=class="str">"cmt">//--- Comment("交易品种: ",symb_symbol,"\n", "小数位数: ",symb_digits,"\n", "点差: ",symb_spread,"\n", "止损级别: ",symb_stoplevel,"\n", "买价: ",symb_ask,"\n", "卖价: ",symb_bid ); class=class="str">"cmt">//--- class=class="str">"cmt">// 打开一个对话框 mb_res=MessageBox("您想要删除图表中的注释吗?",NULL,MB_YESNO|MB_ICONQUESTION); class=class="str">"cmt">//--- class=class="str">"cmt">// 如果点击了 "Yes", 删除图表中的注释 if(mb_res==IDYES) { Comment(""); } class=class="str">"cmt">//--- class="kw">return; } class=class="str">"cmt">//--- class=class="str">"cmt">// 如果打印到提醒窗口 if(printMode==ALERT) { Alert("交易品种: "+symb_symbol+"\n", "小数位数: "+IntegerToString(symb_digits)+"\n", "点差: "+IntegerToString(symb_spread)+"\n", "止损级别: "+IntegerToString(symb_stoplevel)+"\n", "买价: "+DoubleToString(symb_ask,_Digits)+"\n", "卖价: "+DoubleToString(symb_bid,_Digits) ); } class=class="str">"cmt">//--- class="macro">#class="kw">property copyright "Copyright class="num">2012, MetaQuotes Software Corp." class="macro">#class="kw">property link "http:class=class="str">"cmt">//tol64.blogspot.com" class="macro">#class="kw">property description "email: hello.tol64@gmail.com" class="macro">#class="kw">property version "class="num">1.00" class="macro">#class="kw">property script_show_inputs class=class="str">"cmt">//--- class=class="str">"cmt">//--- 枚举 enum ENUM_PRINT_MODE { PRINT = class="num">0, COMMENT = class="num">1, ALERT = class="num">2 }; class=class="str">"cmt">//--- class=class="str">"cmt">// 输入参数 input ENUM_PRINT_MODE printMode=PRINT; class=class="str">"cmt">// 打印模式 class=class="str">"cmt">//---
◍ 用脚本把品种属性一次性抓出来
想在 MT5 里快速看清当前品种的底细,写个一次性脚本比手动翻规格窗口快得多。下面这段逻辑把品种名、小数位、点差、止损级别、买卖价全部读出来,再按模式分流到日志或图表。
代码里 SYMBOL_DIGITS 返回的是报价小数位,EURUSD 通常是 5,XAUUSD 常见 2 或 3;SYMBOL_SPREAD 给的是以点计的点差,盘中可能从 10 点跳到 30 点以上,贵金属尤其敏感。
printMode 控制出口:等于 PRINT 就走 Print() 进专家日志,等于 COMMENT 就走 Comment() 直接贴在图表左上角。实盘前先用日志模式验证,确认数值合理再切图表常驻。
外汇和贵金属杠杆高、点差跳变频繁,止损级别(SYMBOL_TRADE_STOPS_LEVEL)若大于当前点差,挂单可能直接被拒,下单前务必读这个值。
class="type">void OnStart() { PrintSymbolProperties(); } class="type">void PrintSymbolProperties() { class="type">class="kw">string symb_symbol = ""; class=class="str">"cmt">// 交易品种 class="type">int symb_digits = class="num">0; class=class="str">"cmt">// 小数点位数 class="type">int symb_spread = class="num">0; class=class="str">"cmt">// 买价和卖价之间的差异 (点差) class="type">int symb_stoplevel = class="num">0; class=class="str">"cmt">// 止损级别 class="type">class="kw">double symb_ask = class="num">0.0; class=class="str">"cmt">// 买价 class="type">class="kw">double symb_bid = class="num">0.0; class=class="str">"cmt">// 卖价 class=class="str">"cmt">//--- symb_symbol =Symbol(); symb_digits =(class="type">int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS); symb_spread =(class="type">int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD); symb_stoplevel =(class="type">int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL); symb_ask =SymbolInfoDouble(_Symbol,SYMBOL_ASK); symb_bid =SymbolInfoDouble(_Symbol,SYMBOL_BID); class=class="str">"cmt">//--- class=class="str">"cmt">// 如果打印到日志中 if(printMode==PRINT) { Print("交易品种: ",symb_symbol,"\n", "小数位数: ",symb_digits,"\n", "点差: ",symb_spread,"\n", "止损级别: ",symb_stoplevel,"\n", "买价: ",symb_ask,"\n", "卖价: ",symb_bid ); } class=class="str">"cmt">//--- class=class="str">"cmt">// 如果打印到图表上 if(printMode==COMMENT) { class="type">int mb_res=-class="num">1; class=class="str">"cmt">// 对话框中选择选项的变量 class=class="str">"cmt">//--- Comment("交易品种: ",symb_symbol,"\n", "小数位数: ",symb_digits,"\n", "点差: ",symb_spread,"\n", "止损级别: ",symb_stoplevel,"\n", "买价: ",symb_ask,"\n", "卖价: ",symb_bid ); class=class="str">"cmt">//--- } }
用弹窗和提醒把品种参数亮出来
在脚本里把图表注释清掉之前,先弹一个确认框比较稳。下面这段逻辑用 MessageBox 带 MB_YESNO 和 MB_ICONQUESTION,用户点“是”才执行 Comment("") 清屏,避免误触把正在看的标注弄丢。 如果走的是提醒窗口路线,直接把交易品种的核心参数用 Alert 打出来:小数位数、点差、止损级别、买卖价。以 EURUSD 为例,digits 通常是 5,stoplevel 多为 0,spread 在流动性正常时可能落在 0~20 点之间,具体数值开 MT5 跑一下就能看到实时结果。 外汇和贵金属杠杆高,点差和止损级别会随时段跳动,参数打印出来后最好人工核对再下单。把这段代码贴进 MT5 脚本,切换 printMode 就能验证两种输出差异。
class=class="str">"cmt">// 打开一个对话框 mb_res=MessageBox("您想要删除图表中的注释吗?",NULL,MB_YESNO|MB_ICONQUESTION); class=class="str">"cmt">//--- class=class="str">"cmt">// 如果点击了"Yes", 删除图表上的注释 if(mb_res==IDYES) { Comment(""); } class=class="str">"cmt">//--- class="kw">return; } class=class="str">"cmt">//--- class=class="str">"cmt">// 如果打印到提醒窗口 if(printMode==ALERT) { Alert("交易品种: "+symb_symbol+"\n", "小数位数: "+IntegerToString(symb_digits)+"\n", "点差: "+IntegerToString(symb_spread)+"\n", "止损级别: "+IntegerToString(symb_stoplevel)+"\n", "买价: "+DoubleToString(symb_ask,_Digits)+"\n", "卖价: "+DoubleToString(symb_bid,_Digits) ); } }
「一点提醒」
把数据写进文件这条路先放一放。纯文本或带 CSS 的 HTML 报告对刚接触 MQL5 的人来说坑太多,前文提到的打印与属性读取方式已经够跑通第一批验证脚本。 外汇与贵金属市场杠杆高、滑点随机,任何脚本只负责把仓位和价格事实摆出来,不构成方向判断。开 MT5 把前文脚本拖进策略测试器,用分钟周期跑一遍,比读十篇概述更有用。 作者原附的 printmodes.mq5 约 6.35 KB,下载后直接编译就能看不同打印模式的输出差异,这才是起步该做的事。