如何降低交易者的风险·进阶篇
(2/3)·把市场波动、阻力和挂单等十余类风险拆开看,再用一个简单EA模块压住最痛的几类
用斐波那契时段重排均线周期
传统均线周期往往是拍脑袋定的,换个思路:把图表时段和斐波那契数列就近配对,让周期数带上时间结构的逻辑。实测对应关系大致是 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 根本没反应。自动化里要么把财经日历转成技术参数,要么人工锁死方向,新手先手动机结合最稳。
<span class="comment">class=class="str">"cmt">//--- 入场交易算法 - 买入-----------------------------------------------------------------------------------------</span> <span class="keyword">if</span>( <span class="comment">class=class="str">"cmt">//----降低在入场交易时高波动性相关的风险 ----</span> <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 的入场判断里逐行核对。
(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] 表局部阻力已被越过。外汇与贵金属波动剧烈,上述条件仅提高上涨倾向概率,实盘须自担高风险。
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,复制前先按合约规格核对数值。
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 回测一周,看剧变退出次数是否落在可接受区间。
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 质量的硬标准。跨品种评估能摊薄单市场异动,也更符合投资者对总利润的目标预期。
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">//检查交易账户属性 {