如何降低交易者的风险·进阶篇
⚖️

如何降低交易者的风险·进阶篇

(2/3)·把市场波动、阻力和挂单等十余类风险拆开看,再用一个简单EA模块压住最痛的几类

含代码示例实战向 第 2/3 篇
很多交易者把亏损简单归为'没扛住',却没意识到风险在入场前就已分层:波动、阻力、超买超卖各自带着不同的爆点。先把过程动态和概率想清楚,再去谈止损,才不至于用错药。

用斐波那契时段重排均线周期

传统均线周期往往是拍脑袋定的,换个思路:把图表时段和斐波那契数列就近配对,让周期数带上时间结构的逻辑。实测对应关系大致是 M1 对 1、M5 对 5、M15 对 13、H1 对 55、H4 对 233(分钟)、D1 对 21(小时)、周线对 89 与 144(小时)。 这样配对不是玄学,交易时段开关、统计窗口、股息日都有明确周期,均线周期跟着这些节奏走,能在概率上少踩一点点无序噪声的坑。外汇和贵金属本身是高风险品种,逻辑再顺也挡不住黑天鹅。 想压低均线延迟,就只取序列前几个数 1、3、5、8、13,按时段比例往小周期拆。例如 M1 可用 5/8/13/55/233,H1 可用 5/8/13/21/89/144,D1 用 5/8/13/21 即可。 挂单看似省心,实则是摸黑进场:价位一到就成交,哪怕当时动态已经走坏。更合理的做法是算法里虚拟挂水平,等价格穿过且动态确认再市价进,代价是执行慢一点、可能滑点。 价格幅度本就不确定,死磕固定止盈是多数人的亏损源。退出模块该用自适应振幅或相对入场价/极值偏移的“影子”止盈止损,再绑上存款比例限额。下面这段是买入平仓的风险控制代码骨架。 剧变风险最吃人。GBPUSD 在 2016-06-24 一分钟砸了 473 点、全天跌 560 点;道指 2010-05-06 六分钟泻 1000 点。单时段看趋势,切高周期可能只是修正,建议同时开 M1/M15/H1/D1 四屏。 技术面和基本面别二选一。USDCHF 2015 年 10 月因瑞央解绑欧元暴跌,纯技术 EA 根本没反应。自动化里要么把财经日历转成技术参数,要么人工锁死方向,新手先手动机结合最稳。

MQL5 / C++
<span class="comment">class=class="str">"cmt">//--- 入场交易算法 - 买入-----------------------------------------------------------------------------------------</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;<span class="keyword">if</span>(
&nbsp;&nbsp; <span class="comment">class=class="str">"cmt">//----降低在入场交易时高波动性相关的风险 ----</span>
&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">class=class="str">"cmt">//模拟在最近的历史中没有高的波动:</span>

◍ 用多周期振幅约束过滤噪音棒

做 M1 剥头皮时,最怕碰到假突破前的压缩棒突然放大。把前 3 根 M1 烛形的高低差都限制在 200*Point 以内,同时把 M15 前 3 根及它们构成的通道幅度压到 300*Point 以内,能砍掉大部分无序震荡段的信号。 具体约束里还卡了一道比例:当前 M1 棒幅度要 ≥1.1 倍、且 <3.0 倍的前一根棒幅度,这样既排除极度萎缩的十字星,也排除异常插针。外汇与贵金属杠杆高,这种过滤只降概率不保胜率,实盘前务必在 MT5 策略测试器跑一遍。 Bid 必须同时站上 M1 的 High[1] 与 M15 的 H_prev_m15,才认为价格越过局部支撑;再用 MA8 在 M1 前三棒之内、MA5 在 M15 前棒之内穿过棒体,来绑定波浪开端,压低买在超买区的几率。 趋势确认靠两层:M1 的 Close[2]、Close[1] 均大于各自 Open,且 M1 上 MA5、MA60 的当前值都大于两根前的值。下面这段条件可直接抄进 EA 的入场判断里逐行核对。

MQL5 / C++
  (High[class="num">1] - Low[class="num">1]) <= class="num">200*Point &&                 class=class="str">"cmt">//在较低时段的烛形中限制幅度(tfМ1)
  (High[class="num">2] - Low[class="num">2]) <= class="num">200*Point &&
  (High[class="num">3] - Low[class="num">3]) <= class="num">200*Point &&
  (H_prev_m15 - L_prev_m15) <= class="num">300*Point &&           class=class="str">"cmt">//在较高时段烛形中限制幅度 (tfМ15)
  (H_2p_m15 - L_2p_m15) <= class="num">300*Point &&
  (H_3p_m15 - L_3p_m15) <= class="num">300*Point &&
  (H_prev_m15 - L_3p_m15) <= class="num">300*Point &&             class=class="str">"cmt">//在较高时段烛形中限制通道的幅度 (tfМ15)
  (High[class="num">1] - Low[class="num">1]) >= (class="num">1.1*(High[class="num">2] - Low[class="num">2])) &&   class=class="str">"cmt">//限制在报价历史中相对于第二个柱之前的柱的活动
  (High[class="num">1] - Low[class="num">1]) < (class="num">3.0*(High[class="num">2] - Low[class="num">2])) &&    class=class="str">"cmt">//相同
class=class="str">"cmt">//----减少与入场交易时有阻力水平出现的风险-----
  class=class="str">"cmt">//模拟当前价格超过局部支撑水平的情况:
    Bid > High[class="num">1] &&                                  class=class="str">"cmt">//在 М1 (较低时段)
    Bid > H_prev_m15 &&                               class=class="str">"cmt">//在 М15 (较高时段)
class=class="str">"cmt">//---减少与在超买区域内入场有关的风险-----
  class=class="str">"cmt">//模拟绑定到波段的开端以减少进入超买区域的概率:
  ((MA8_prev > Low[class="num">1] && MA8_prev < High[class="num">1]) || (MA8_2p > Low[class="num">2] && MA8_2p < High[class="num">2]) || class=class="str">"cmt">//波浪的开始 - 在数据历史中不超过三个柱(M1)
  (MA8_3p > Low[class="num">3] && MA8_3p < High[class="num">3])) &&
    MA5_prev_m15 > L_prev_m15 && MA5_prev_m15 < H_prev_m15 && class=class="str">"cmt">//波浪的开始 - 在更高时段的前一个柱 (М15)
class=class="str">"cmt">//---减少与入场交易时缺乏明确趋势有关的风险-------
    class=class="str">"cmt">//在较低时段模拟烛形的方向:
    Close[class="num">2] > Open[class="num">2] &&                             class=class="str">"cmt">//在历史中第二个烛形方向向上 (М1)
    Close[class="num">1] > Open[class="num">1] &&                             class=class="str">"cmt">//前一个烛形方向向上 (М1)
    class=class="str">"cmt">//在较高时段模拟移动平均的方向:
    MA5_cur > MA5_2p &&  MA60_cur > MA60_2p &&        class=class="str">"cmt">//向上的移动平均: 使用周期数为5和60的移动平均 (М1)
    class=class="str">"cmt">//在较低时段中模拟移动平均的继承:

「多周期均线层次过滤上涨信号」

在 M1 图表上用斐波那契周期 5、8、13 搭建三层均线梯队(MA5>MA8>MA13),本身就是上涨动能的间接证据;再叠加 Bid 同时凌驾于 MA5、MA8、MA13、MA60 之上,说明现价不仅站在短中期成本上方,也脱离了小时级以下的长期均值压制。 往上看 M15:前一根烛形收阳(C_prev_m15>O_prev_m15),且 MA4 当前值大于两期前的值、MA4 前值大于 MA8 前值,构成更高周期的均线层次;同时 Bid 高于 M15 的 MA4 与 H1 的 MA24,跨周期成本线全部被踩在脚下。 微观进场点看 M1 当前烛形内部 Bid>Open[0],即本根 K 线已经出现上涨变化。更高周期活跃度要求前 M15 烛体占幅度超 50%、回撤小于 25%、高点突破前两根阻力、且开盘价落在前烛实体区间内。 较低周期也不能是一潭死水:前 M1 烛体超幅度 50%、波幅大于 70*Point(剔除平盘)、次根回撤小于 25%,且 High[1]>High[2] 表局部阻力已被越过。外汇与贵金属波动剧烈,上述条件仅提高上涨倾向概率,实盘须自担高风险。

MQL5 / C++
MA5_cur > MA8_cur && MA8_cur > MA13_cur &&      class=class="str">"cmt">//在M1上构建三个移动平均的 "层次" (斐波那契周期数:class="num">5,class="num">8,class="num">13), 这是上涨移动的间接迹象

   class=class="str">"cmt">//模拟当前价格相对于较低时段移动平均的位置:
   Bid > MA5_cur && Bid > MA8_cur && Bid > MA13_cur && Bid > MA60_cur && class=class="str">"cmt">//当前价格在M1上超过了 МА (class="num">5,class="num">8,class="num">13,class="num">60),这是一个上涨变化的间接迹象 

   class=class="str">"cmt">//在较高时段中模拟烛形方向:
   C_prev_m15 > O_prev_m15 &&      class=class="str">"cmt">//前面柱形向上方向 (М15)

   class=class="str">"cmt">//在较高时段模拟移动平均的方向: 
   MA4_cur_m15 > MA4_2p_m15 &&    class=class="str">"cmt">//周期数为4的 МА 向上 (М15)

   class=class="str">"cmt">//在较高时段中模拟移动平均的继承: 
   MA4_prev_m15 > MA8_prev_m15 && class=class="str">"cmt">//在M15上构造两个移动平均的“层次”(周期数为 class="num">4 和 class="num">8), 这是上涨变化的间接迹象

   class=class="str">"cmt">//模拟当前价格与较高时段移动平均的相对位置:
   Bid > MA4_cur_m15 &&           class=class="str">"cmt">//当前价格超过 МА4 (М15), 这是上涨变化的间接迹象 
   Bid > MA24_cur_h1 &&           class=class="str">"cmt">//当前价格超过 МА24 (Н1), 这是上涨变化的间接迹象 

   class=class="str">"cmt">//模拟在较低时段当前烛形内部的微趋势,以及进场点:
   Bid > Open[class="num">0] &&               class=class="str">"cmt">//在当前烛形中有上涨变化 (М1)

   class=class="str">"cmt">//模拟在较高时段之前的处理中有足够的活动:
   (C_prev_m15 - O_prev_m15) > (class="num">0.5*(H_prev_m15 - L_prev_m15)) && class=class="str">"cmt">//烛"体" 超过 class="num">50% 的烛形幅度 (前一个 М15 烛形)
   (H_prev_m15 - C_prev_m15) < (class="num">0.25*(H_prev_m15 - L_prev_m15)) && class=class="str">"cmt">//修正深度的限制是少于烛形幅度的 class="num">25% (前一个 М15 烛形)
   H_prev_m15 > H_2p_m15 &&                                            class=class="str">"cmt">//超过局部阻力水平而上涨(两个 М15 烛形) 
   O_prev_m15 < H_prev_m15 && O_prev_m15 > L_prev_m15 &&              class=class="str">"cmt">//具有相对于当前烛形开盘价的烛芯 (前一个 М15 烛形)

   class=class="str">"cmt">//模拟在较低时段之前的处理中有足够的活动: 
   (Close[class="num">1] - Open[class="num">1]) > (class="num">0.5*(High[class="num">1] - Low[class="num">1])) &&                class=class="str">"cmt">//烛"体"超过 class="num">50% 的烛形幅度 (前一个 М1 烛形)
   (High[class="num">1] - Low[class="num">1]) > class="num">70*Point &&                                  class=class="str">"cmt">//之前烛形的幅度超过阈值 (排除明显的平盘)
   (High[class="num">2] - Close[class="num">2]) < (class="num">0.25*(High[class="num">2] - Low[class="num">2])) &&               class=class="str">"cmt">//修正深度限制是少于 class="num">20% 的烛形幅度 ( М1 数据历史中的第二个柱)
   High[class="num">1] > High[class="num">2] &&                                              class=class="str">"cmt">//上涨趋势在局部阻力水平之上 (两个 М1 烛形)

用影子止盈止损框住 M1 烛形入场

在 M1 周期里做价格行为入场,最怕的是成交后价格摆动幅度不可控。上面这段逻辑不直接挂硬止损,而是用「影子止盈 / 影子止损」加「最大偏移回撤」三套条件并行判断离场,降低对单根烛形波动的暴露。 前一根 M1 烛形必须同时具备上影线和下影线:Open[1] 小于 High[1] 且大于 Low[1],说明该根不是光头光脚实体,多空在当根内发生过试探,这类形态作为触发前置更不容易被毛刺扫掉。 利润端设了 100 点影子止盈:当 Bid 大于 OrderOpenPrice() 且差值 ≥ 100*Point 时离场,外汇与贵金属杠杆高,100 点只是微观利润锁定,不等于趋势确认。

回撤端跟踪入场后的 Max_pos:要求距入场至少隔 1 根柱(shift_buy>=1),且当前 Bid 从最大值回落 ≥ 200*Point 才退出,给日内噪音留了缓冲。亏损端则是 Bid 低于开仓价 200*Point 直接影子止损。三者用并列,任一成立即平仓。

别把正态当圣经:Point 随品种小数位变化,XAUUSD 的 100*Point 是 0.1 美元,EURUSD 是 0.0010,复制前先按合约规格核对数值。

MQL5 / C++
Open[class="num">1] < High[class="num">1] && Open[class="num">1] > Low[class="num">1] class=class="str">"cmt">//相对当前烛形的开盘价,具有烛芯(前一个 М1 烛形)
class=class="str">"cmt">//减少与入场交易时价格变化幅度不确定相关的风险--
class=class="str">"cmt">//跟踪固定的利润值 (每个仓位):
(Bid > OrderOpenPrice() && (Bid - OrderOpenPrice()) >= class="num">100*Point) class=class="str">"cmt">//在利润区域内的退出条件(影子获利)
||
class=class="str">"cmt">//管理最大可用的价格偏移
class=class="str">"cmt">//和入场交易后当前最大值比较:
(shift_buy >= class="num">1 && class=class="str">"cmt">//与入场点相差不少于一个柱
Time_cur > OrderOpenTime() && Max_pos > class="num">0 && OrderOpenTime() > class="num">0 && OrderOpenPrice() > class="num">0 && class=class="str">"cmt">//这是入场后的当前最大值
Max_pos > OrderOpenPrice() && class=class="str">"cmt">//当前最大值在有利润区域
Bid < Max_pos && class=class="str">"cmt">//有反向的变化
(Max_pos - Bid) >= class="num">200*Point) class=class="str">"cmt">//距离退出市场的当前最大值的偏移
||
class=class="str">"cmt">//跟踪预先定义的风险限额 (每个仓位):
(Bid < OrderOpenPrice() && (OrderOpenPrice() - Bid) >= class="num">200*Point) class=class="str">"cmt">//入场条件在亏损区域 (影子止损)

◍ 用价格剧变条件卡住风险敞口

EA 里光设止损还不够,跳空和瞬时插针常在几根蜡烛内吞掉预设风险。这段逻辑把「账户余额跌破限额」与「价格相对参考点剧烈偏移」绑成退出触发,任一成立就倾向立刻离场。 具体看三个参考系:M1 当前柱开盘价若被 Bid 向下击穿超过 100 点且发生在 20 秒内,判为剧变;M15 当前柱开盘价被击穿超过 200 点且时间在 120 秒内,同样触发;若持仓已超 60 秒,且 M1 前一根为阴线、实体幅度 ≥200 点,也归为价格剧变区域。外汇与贵金属杠杆高,这类条件能压缩滑点扩大时的暴露,但是否生效仍取决于经纪商报价质量。 把 Percent_risk_depo 调小、或把 Point 倍数从 100/200 提到 150/300,可以更保守地拦住毛刺。开 MT5 把这段塞进 EA 的退场判断,用 EURUSD 的 M1 回测一周,看剧变退出次数是否落在可接受区间。

MQL5 / C++
class=class="str">"cmt">//跟踪预先定义的风险限额 (全部存款):
      (AccountBalance() <=   NormalizeDouble( (Depo_first*((class="num">100 - Percent_risk_depo)/class="num">100)), class="num">0)) )  class=class="str">"cmt">//如果用于全部存款的风险限额在当前的交易中被超过
if(
      class=class="str">"cmt">//减少入场交易时价格剧变相关的风险----------------------
      
          (Bid < Open[class="num">0] && (Open[class="num">0] - Bid) >= class="num">100*Point && (Time_cur - Time[class="num">0]) <= class="num">20)                 class=class="str">"cmt">//在价格剧变时的退出条件 (在任何区域) (参考点 - М1 当前柱的开盘价)
             ||
          (Bid < O_cur_m15 && (O_cur_m15 - Bid) >= class="num">200*Point && (Time_cur - Time_cur_m15) <= class="num">120) class=class="str">"cmt">//在价格剧变时的退出条件(在任何区域) (参考点 - М15 当前柱的开盘价)
             ||
          ((Time_cur - OrderOpenTime()) > class="num">60 && Close[class="num">1] < Open[class="num">1] &&
          (Open[class="num">1] - Close[class="num">1]) >= class="num">200*Point)                                                                  class=class="str">"cmt">//在价格剧变时的在任何区域的退出条件 (参考点 - М1 前一个柱的幅度)
             ||

「别让非行情风险掏空账户」

EA 跑不起来,未必是策略烂。报价断连、终端禁自动交易、保证金不够、法规突变——这些和价格动态无关的外部因素,往往在你盯 K 线时悄悄把存款磨穿。外汇与贵金属本身高杠杆、高波动,这类操作性、金融性、法律性风险必须写进交易系统结构里,而不是靠运气避。 结构上的核心矛盾是过滤器数量。每加一个防风险模块,本质就是多一道入场过滤;过滤越多,触发次数越少。传统优化总在「交易频次」和「投资成果」之间找平衡,但实测中,跨多个货币对同时跑、用稳定低回撤代替高频开仓,模拟质量反而更高——单品种测试时入场次数稀少并不影响系统评级。 存款亏损限额要双控:开仓前禁入、持仓中强平都得上代码。下面这段直接贴在入场算法之前,AccountBalance 跌破初始值减百分比就 return,保证金不足同样拦截。把 Depo_first 和 Percent_risk_depo 改成你的数值即可在 MT5 验证。 服务器掉线、EA 被终端或经纪商禁用,也得在入口卡死。IsConnected 为假、IsTradeAllowed 为假、AccountInfoInteger(ACCOUNT_TRADE_EXPERT) 不成立,全部禁止下单并打印报警。法规风险现阶段多靠跟踪立法,暂无程序化捷径。 仓位数量只是次要指标,相对稳定的毛利加可接受回撤才是 EA 质量的硬标准。跨品种评估能摊薄单市场异动,也更符合投资者对总利润的目标预期。

MQL5 / C++
class=class="str">"cmt">//管理与限制客户存款总体风险有关的金融参数-------------------------------

  if(kol < class="num">1) class=class="str">"cmt">//没有订单
  {
   if(AccountBalance() <=  NormalizeDouble( (Depo_first*((class="num">100 - Percent_risk_depo)/class="num">100)), class="num">0))class=class="str">"cmt">//如果之前已经达到了全部存款的风险限额
    {
     Print("入场被禁止-之前达到了风险限额=",Percent_risk_depo, " 全部存款 % =", Depo_first);
     Alert("入场被禁止-之前达到了风险限额=",Percent_risk_depo, " 全部存款 % =", Depo_first);
     class="kw">return;
     }


   if(AccountFreeMargin() < (class="num">1000*Lots)) class=class="str">"cmt">//在当前账户上建立仓位的保证金不够
    {
     Print("保证金不足. 账户可用保证金 = ",AccountFreeMargin());
     Alert("保证金不足. 账户可用保证金 = ",AccountFreeMargin());
     class="kw">return; class=class="str">"cmt">//...然后退出
     }
  }        

class=class="str">"cmt">//-------------- 
if(IsConnected() == false) class=class="str">"cmt">//检查客户终端和经纪商服务器的主连接
    {
     Print("入场被禁止-经纪商服务器离线");
     Alert("入场被禁止-经纪商服务器离线");
     class="kw">return;
    }
if(IsTradeAllowed() == false) class=class="str">"cmt">//检查是否能用EA来进行交易 (经纪商数据流,交易许可)
    {

     Print("禁止入场-经纪商数据流繁忙以及/或者不允许机器人的交易 :", IsTradeAllowed());
     Alert("禁止入场-经纪商交易数据流繁忙以及/或者不允许机器人进行交易 :", IsTradeAllowed());
     class="kw">return;
    }


    if( !AccountInfoInteger(ACCOUNT_TRADE_EXPERT) ) class=class="str">"cmt">//检查交易账户属性
    {
把重复劳动交给小布
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到波动率分区与阻力触碰提醒,你专注决策而非手动翻烛形。

常见问题

价格受多因素扰动无确定法则,整体偏随机;但波浪启动、窄幅盘整离开、规则化基本面反应等区域仍存在可识别倾向,概率上而非必然。
可用烛形相对均线带或振荡指标临界位判定区域,配合入场前状态过滤,原文给出了此类应用的思路与EA片段。
单一时间尺度会漏掉更高或更低频的结构噪声,容易把局部噪声当趋势,建议多尺度交叉验证再入场。
可以,小布的品种页把挂单触发、异常剧变做了实时标注,省去你盯盘时反复切周期的人工成本。
涵盖交易系统结构缺陷、超亏损限额、交易条件恶化、服务器连接质量、自动交易许可及法规变动等。