MQL5 Cookbook: 使用不同的打印模式·进阶篇
📘

MQL5 Cookbook: 使用不同的打印模式·进阶篇

第 2/2 篇

「把品种参数打到图表还是弹窗」

写脚本时先决定信息往哪输出,直接影响你盯盘时的干扰程度。下面这段逻辑给了两种落地方式:图表注释和提醒窗口,分别适合不同场景。 当 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 参数框里改一下就能切换输出通道。

MQL5 / C++
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)若大于当前点差,挂单可能直接被拒,下单前务必读这个值。

MQL5 / C++
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 就能验证两种输出差异。

MQL5 / C++
    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,下载后直接编译就能看不同打印模式的输出差异,这才是起步该做的事。

常见问题

用脚本把品种属性一次性抓出来,写进图表文字对象或右上角标签,盯盘时抬眼就能读,不用切窗口。
写个脚本在加载时调用弹窗函数把关键属性列出来,或接提醒接口推送,开盘前跑一次即可。
可以,小布能按你选的品种自动提取属性并生成图表标注或推送,你只需打开对应页面查看。
多半是没区分实时属性和历史属性,或忽略了节假日休市导致的合约变动,抓的时候锁定当前品种上下文。
单次脚本抓取开销极小,但每个图表都挂动态刷新会占资源,建议开盘前抓一次静态标注就够了。