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