自动选择有
📡

自动选择有 "钱途" 的信号·综合运用

(3/3)·杠杆、增长、回撤等五指标如何加权成百分制,从信号海淘出适配保守风格的那几个

案例拆解 第 3/3 篇
很多人订阅信号只看近期曲线漂亮与否,杠杆开到1:500也照跟不误。回撤一来本金被洗掉大半才意识到所谓"高收益"只是高风险的外衣。用统一评分框架先过滤再决策,比凭感觉盲选更稳。

◍ 按风险偏好给信号分三档

短线内增长率异常高的信号往往活不长,这类信号多半靠重仓、高杠杆博利润,回撤风险显著。但高风险风格不该直接踢出清单——有人想慢慢复利长存,有人就图快进快出,目标不同,筛选标准也得留口子。 我们把评分映射成红、黄、绿三区:评分≤30 归红区,盈利潜力大但爆仓概率高;31–66 是黄区,收益和风险相对平衡;>66 进绿区,可靠性更强,只是绝对收益可能平平。 颜色直接写在信号名那一列,不用去翻最后一栏的评分数字就能一眼分辨类别。表格默认按评分排好序,同类自然聚堆。 订阅动作由 CreateButton() 接管,不过先确认三件事:MT5 已登录社区账户;启动程序时勾了“允许更改信号设置”,否则会报 4014 函数不允许调用;若信号表显示异常,删掉 C:\Users\用户名\AppData\Roaming\MetaQuotes\Terminal\..\bases\signals 下的 signals.dat 再重启终端,文件会自重建。终端“信号”页只推适合当前账户的,跟网页全量列表不一样。 外汇和贵金属信号自带高杠杆高风险,绿区不等于稳,只是概率上更耐扛。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| 初始化表格                                                         |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void CProgram::InitializingTable(class="type">void)
  {
class=class="str">"cmt">//---
   class="type">class="kw">string columns[class="num">10]=
     {
       "信号名称",
       "账户货币",
       "账户杠杆",
       "账户增长, %",
       "投资回报",
       "最大回撤",
       "信号 ID",
       "订阅者数量",
       "生存时间, 周",
       "评分"
     };
class=class="str">"cmt">//---
   for(class="type">int c=class="num">0;c<COLUMNS1_TOTAL; c++)
     {
      class=class="str">"cmt">//--- 设置表头标题
      m_table.SetHeaderText(c,columns[c]);
      class=class="str">"cmt">//---
      for(class="type">int r=class="num">0;r<m_signals_total; r++)
        {
         if(c==class="num">0)
           {
            m_table.SetValue(c,r,m_name[r]);
            if(m_rating[r]<=class="num">30)
               m_table.TextColor(c,r,clrCrimson);
            else if(m_rating[r]>class="num">30 && m_rating[r]<=class="num">66)
               m_table.TextColor(c,r,clrOrange);
            else if(m_rating[r]>class="num">66)
               m_table.TextColor(c,r,clrForestGreen);
           }
         else if(c==class="num">1)
            m_table.SetValue(c,r,m_curr[r]);
         else if(c==class="num">2)
            m_table.SetValue(c,r,IntegerToString(m_leverage[r]));
         else if(c==class="num">3)
            m_table.SetValue(c,r,DoubleToString(m_gain[r],class="num">2));
         else if(c==class="num">4)
            m_table.SetValue(c,r,DoubleToString(m_roi[r],class="num">2));
         else if(c==class="num">5)
            m_table.SetValue(c,r,DoubleToString(m_max_drawdown[r],class="num">2));

把表格列填进 GUI 并挂上启动按钮

上面这段逻辑负责把内存数组里的值按列号写进表格控件:第 6 列放 m_id(信号 ID),第 7 列放 m_subscr(订阅数),第 8 列放 m_weeks(持续周数),第 9 列放 m_rating(评级),全部用 IntegerToString 转成字符串再 SetValue。这样表格在 MT5 里刷新时,每一行 r 的 4 个业务字段就能直接显示,不用在外层再拼装。 CreateButton 则生成一个 120×22 像素的图像按钮,图标来自 \Images\EasyAndFastGUI\Icons\bmp16\start.bmp,文字居中、字号 10、图标内边距 3 像素。按钮被 IsLocked(true) 锁住不参与拖动,避免误碰;创建成功后通过 CWndContainer::AddToElementsArray(0,m_button) 注册进基类元素数组,索引 0 表示它属于主窗口的第一批控件。 在 MT5 里验证时,可把 XSize 从 120 改成 90 看按钮是否仍完整显示图标加文字;若图标路径报错,先确认 bmp16 目录已随资源编译进 ex5。外汇与贵金属行情波动剧烈,此类 GUI 只做信号展示,不构成任何方向建议。

MQL5 / C++
   else if(c==class="num">6)
      m_table.SetValue(c,r,IntegerToString(m_id[r]));
   else if(c==class="num">7)
      m_table.SetValue(c,r,IntegerToString(m_subscr[r]));
   else if(c==class="num">8)
      m_table.SetValue(c,r,IntegerToString(m_weeks[r]));
   else if(c==class="num">9)
      m_table.SetValue(c,r,IntegerToString(m_rating[r]));
      }
   }
}
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| 创建一个图像按钮                                                                       |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#resource "\\Images\\EasyAndFastGUI\\Icons\\bmp16\\start.bmp"
class=class="str">"cmt">//---
class="type">bool CProgram::CreateButton(const class="type">int x_gap,const class="type">int y_gap,const class="type">class="kw">string text)
  {
class=class="str">"cmt">//--- 将指针存储到主控件
   m_button.MainPointer(m_window);
class=class="str">"cmt">//--- 属性
   m_button.XSize(class="num">120);
   m_button.YSize(class="num">22);
   m_button.IconXGap(class="num">3);
   m_button.IconYGap(class="num">3);
   m_button.FontSize(class="num">10);
   m_button.IsCenterText(true);
   m_button.IconFile("Images\\EasyAndFastGUI\\Icons\\bmp16\\start.bmp");
   m_button.IsLocked(true);
class=class="str">"cmt">//--- 创建控件
   if(!m_button.CreateButton(text,x_gap,y_gap))
      class="kw">return(false);
class=class="str">"cmt">//--- 在基类中添加一个指向元素的指针
   CWndContainer::AddToElementsArray(class="num">0,m_button);
   class="kw">return(true);
   }

「把评分系统跑起来之前」

这套信号评分思路把可用信号按 100 分制拆成三类:交易风险、账户生存时间、增长百分比,各自对应不同的“钱景”筛选条件。工程文件打包在 MQL5.zip(约 1.6 MB),部署时只需把里面的 MQL5 文件夹丢进终端根目录,EA 会自动调用略改过的 EasyAndFastGUI 图形库。 评论区有人踩过坑:MenuItem.mqh 里回车前一行写法不对,Element.mqh 报“CWindow 类未定义”,说明库文件版本对齐很关键。MT4 用户目前拿不到等价版本,信号源也只覆盖 MT5 信号。外汇和贵金属信号复制本身杠杆高、滑点大,实盘前务必在策略测试器里先验证。 下面这段是菜单项类型校验的代码片段,类型不对直接退出,避免后续界面逻辑崩: //--- 如果集合类型不匹配,则离开 if(m_type_menu_item!=MI_SIMPLE && m_type_menu_item!=MI_HAS_CONTEXT_MENU) { ::Print(__FUNCTION__," > The type of the independent menu item can be only MI_SIMPLE or MI_HAS_CONTEXT_MENU, ", "that is only with a context menu.\n", __FUNCTION__," > The menu item type can be set using the CMenuItem::TypeMenuItem()") method; return(false); } 逐行看:先判断菜单项必须是 MI_SIMPLE 或 MI_HAS_CONTEXT_MENU,否则用 Print 打出函数名和限制说明,最后 return(false) 终止初始化。 开 MT5 把 zip 解压进去,先编译 AutoSearch.mq5,若报类未定义就检查 EasyAndFastGUI 的版本是否配套,比盲目调参数更省时间。

MQL5 / C++
class=class="str">"cmt">//--- 如果集合类型不匹配,则离开
      if(m_type_menu_item!=MI_SIMPLE && m_type_menu_item!=MI_HAS_CONTEXT_MENU)
        {
         ::Print(__FUNCTION__," > The type of the independent menu item can be only MI_SIMPLE or MI_HAS_CONTEXT_MENU, ",
                 "that is only with a context menu.\n",
                 __FUNCTION__," > The menu item type can be set using the CMenuItem::TypeMenuItem()") method;
         class="kw">return(false);
        }
把信号初筛交给小布
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到杠杆与回撤维度的评分,你只需复核是否契合自己的风险偏好。

常见问题

用穿过(1,20)和(500,0)两点的直线方程线性插值,高于1:500统一记0分,模型仅在0到20区间内有效。
可以,小布已内置类似评级视图,自动拉取信号杠杆、周增长、最大回撤等字段生成分数,省去手动套公式。
模型把负增长视为当前危险状态记0分,是保守风格过滤器;若看重修复能力需结合生存期与历史回撤另行判断。
回撤直接表征风险,分制随回撤绝对值增大而降低,具体阈值在原文第三节给出,逻辑同前两类线性依赖。