“黄金分形突破”EA是一款MetaTrader 5专家顾问,它会搜索已确认的震荡高点和低点,然后尝试在这些水平附近下达买入止损和卖出止损订单。其结构检测采用可配置的相邻K线,而非内置的iFractals指标。订单和持仓通过当前交易品种和配置的魔术号进行识别。
该策略结合了价格结构、挂单入场和基于百分比的平仓管理。它不会在图表上绘制入场箭头、分形标记或交易面板。下图解释了下单概念;该图为模拟示意图,不代表历史交易、交易终端截图或经测算的业绩。

产品名称暗示了黄金,因此经纪商特有的黄金代码(如XAUUSD)是评估的预期起点。然而,该策略实际交易的是其关联图表中的标的,且不包含仅限黄金的限制。未提供的回测或前瞻测试证据均未确定最佳标的、时间周期或盈利参数集。
结构时间周期由内部常量 InpFractalTF 固定为 H1,该参数不可编辑。 即使图表或策略测试器的周期为 D1,CopyRates 仍读取 H1 K线。扫描在配置间隔(默认 15 分钟)后的首个可用 tick 时运行;仓位管理则在每个 tick 时执行。因此,H1 仅描述默认信号数据,而非经过验证的最佳交易时间周期。
IsSwingHigh 要求候选高点必须严格高于所有选定的较早和较晚的相邻高点;IsSwingLow 则要求对应的低点必须严格低于所有选定的较早和较晚的相邻低点。在默认设置下,每侧会检查五个K线。 FindSwing 从最新五根收盘K线之后开始搜索,将当前K线排除在确认窗口之外,并返回最近符合条件的价位。如果无法获取所需的历史数据,则不返回任何价位。
对于买入交易设置,卖价必须低于波段高点,且低出幅度需超过配置的最小间距。 对于卖出交易设置,卖价必须高于摆动低点,且超出幅度需大于该间距。随后,EA 将应用其入场偏移量,检查在重复距离范围内是否存在同方向的挂单,并验证该挂单是否距离当前报价超过经纪商规定的最小止损距离。
买入入场价 = 波段高点 + 波段高点 × 买入偏移量 / 100。卖出入场价 = 波段低点 − 波段低点 × 卖出偏移量 / 100。这两个默认偏移量均为 −0.10%,因此买入入场价位于高点下方,卖出入场价位于低点上方。 这些默认值是基于波段边界预判,而非要求价格必须完全突破该边界。只有当订单价格相对于当前市场而言符合止损单的有效条件时,该订单才会被提交。
以下摘录取自当前可从本 CodeBase 条目下载的 MQ5 文件。它们解释了实现中的部分内容,并非独立运行的程序。
const ENUM_TIMEFRAMES InpFractalTF = PERIOD_H1; // 固定 H1 数据时间范围,与图表或测试器的周期无关 double FindSwing(bool high) { //--- 加载用于波段搜索的价格K线图 MqlRates r[]; ArraySetAsSeries(r,true); int need=InpMaxSearchBars+InpFractalLeft+InpFractalRight+5; if(CopyRates(_Symbol,InpFractalTF,0,need,r)<need) return 0; //--- 跳过未确认的候选人,按从新到旧的顺序搜索 int first=InpFractalRight+1; int last=MathMin(InpMaxSearchBars,ArraySize(r)-InpFractalLeft-1); for(int i=first;i<=last;i++) if(high ? IsSwingHigh(r,i) : IsSwingLow(r,i)) return high?r[i].high:r[i].low; return 0; }
系列数组使用索引 0 表示当前K线。 从 InpFractalRight + 1 开始,可确保每个较新的确认K线均处于收盘状态。当默认右侧计数为5时,第一个候选K线位于索引6处,其较新的比较K线索引范围为5至1。CopyRates会明确请求H1数据,与关联图表的时间周期无关。
bool IsSwingHigh(const MqlRates &r[],int i) { //--- 将候选值与较早的柱状图进行比较 for(int k=1;k<=InpFractalLeft;k++) if(r[i].high<=r[i+k].high) return false; //--- 将候选结果与较新的柱状图进行比较 for(int k=1;k<=InpFractalRight;k++) if(r[i].high<=r[i-k].high) return false; return true; }
当任何选定的相邻高点等于或高于该候选点时,该候选点将被拒绝。IsSwingLow 对低点应用相应的反向比较。这些函数用于识别已确认的价格结构;它们不会调用内置的 iFractals 指标。
double entry=buy?swing+Pct(swing,InpBuyEntryOffsetPct):swing-Pct(swing,InpSellEntryOffsetPct); entry=N(entry); if(SimilarPending(type,entry)) return; //--- 计算初始止损和止盈 double sl=buy?entry-Pct(entry,InpStopLossPct):entry+Pct(entry,InpStopLossPct); double tp=buy?entry+Pct(entry,InpTakeProfitPct):entry-Pct(entry,InpTakeProfitPct); sl=N(sl); tp=N(tp);
此代码片段摘自 PlaceBreakout 函数;其中 buy、swing 和 type 已在该函数的前面部分定义。Pct 函数计算其第一个参数的百分比,N 函数将价格对齐到符号的 tick 网格。 在归一化处理之前,若摆动高点为3000且买入偏移量为-0.10%,则入场点为2997;若摆动低点为3000且卖出偏移量为-0.10%,则入场点为3003。 随后的经纪商距离、成交量、交易时段和保证金检查仍可能阻止订单提交。
固定手数模式会将 InpFixedLots 标准化为当前交易品种的最小、最大手数及成交量步长。风险百分比模式则根据当前账户净值、配置的风险百分比、入场至止损距离,以及初始化时缓存的交易品种点值和点值,估算订单成交量。 这两种模式都会将成交量限制在该交易品种的最小值和最大值之间,并使用由步长衍生的十进制精度向下取整至成交量步长。低于最小值的数值将提升至最小值,这可能会使风险敞口超过请求的规模或风险估计值。 若距离或缓存的点值属性无效,系统将回退至标准化固定手数。提交前,该交易品种内所有同向持仓和挂单(包括使用其他魔法编号的交易)均计入 SYMBOL_VOLUME_LIMIT;若剩余容量不足,则无法提交新订单。
初始止损和止盈按挂单入场价格的百分比计算。 在每个价格跳动点,买单以买入价(Bid)为基准、卖单以卖出价(Ask)为基准,从持仓开仓价开始测量有利价格变动。当达到盈亏平衡触发点时,止损位将向基于价格的小幅盈利锁定点移动。追踪更新仅在有利价格变动处于追踪触发点与最大追踪百分比之间时生效。
当达到止损补救阈值时,EA会将止盈位调整至相对于开仓价的较小亏损水平。此举旨在当价格随后回升至该目标位时实现平仓;但不会立即平仓,也无法保证价格会回升。 例如,在价格出现至少1.00%的不利波动后,买入操作的默认止损目标为入场价下方0.15%。当亏损条件结束时,更新后的目标不会自动恢复为原始止盈位。
以下列出了所有 25 个可配置输入参数及其源默认值。除 InpRiskPercent 外,百分比设置描述的是价格距离或价格变动,而非账户回报率。InpDuplicatePoints 使用符号点数而非通用点值。 追踪距离基于当前报价;此处描述的其他平仓百分比则基于入场价或开盘价。
| 参数 | 默认值 | 含义与解释 |
|---|---|---|
| InpMagic | 900009 | 与图表符号配合使用,用于选择该EA的订单和持仓。 |
| InpComment | “GoldX9 策略 9” | 附加在已提交订单上的文本;所有权筛选使用符号和魔术号。 |
| InpLotMode | LOT_FIXED | LOT_FIXED 使用固定手数;LOT_RISK_PERCENT 使用基于权益的风险比例来确定手数。 |
| InpFixedLots | 0.01 | 请求的固定模式交易量,已按符号的最小值/最大值/步长进行归一化;也是风险规模设置属性无效时的归一化备用值。 |
| InpRiskPercent | 0.50 | 每笔订单的估计权益风险;并非保证的已实现亏损限额。 |
| InpMaxPending | 3 | 同一符号和同一魔术编号的挂单,按交易方向分别计算。 |
| InpMaxPositions | 10 | 次要持仓数量阈值;若任何交易品种的持仓已达到该阈值,将阻止新开仓并触发已持有挂单的取消。 |
| 待执行订单到期小时数 | 15 | 根据此值计算的时间戳;提交指令仍使用GTC,因此未实现定时过期功能。 |
| InpDuplicatePoints | 100 | 若在此距离内存在同类型的待处理条目,则无法提交。 |
| InpRescanMinutes | 15 | 两次扫描之间的最短间隔时间;扫描需要有到价 tick。 |
| InpFractalLeft | 5 | 在严格震荡比较中,考虑的较早相邻K线数量。 |
| InpFractalRight | 5 | 确认一个波段所需的新近收盘相邻K线数量。 |
| InpMaxSearchBars | 200 | 要检查的候选序列索引的最大值;会加载额外的K线用于比较。 |
| InpMinFractalClearancePct | 0.02 | 卖出价与高点之间的距离,或买入价与低点之间的距离,以波动幅度的百分比表示。 |
| 买入入场偏移百分比 | -0.10 | 加到波动高点上;默认值为负数时,入场点位于高点下方。 |
| InpSellEntryOffsetPct | -0.10 | 从震荡低点中减去;默认值为负时,入场点位于低点上方。 |
| InpStopLossPct | 2.00 | 相对于挂单入场价的初始止损距离。 |
| InpTakeProfitPct | 1.00 | 相对于挂单入场价的初始止盈距离。 |
| InpTrailTriggerPct | 0.20 | 触发追踪更新时,价格相对于开盘价的最小有利波动幅度。 |
| 追踪距离百分比 | 0.20 | 止损距离按当前买价或卖价的百分比计算。 |
| InpMaxTrailPct | 1.00 | 追踪更新时价格有利变动的上限阈值;并非利润上限。 |
| InpSalvageTriggerPct | 1.00 | 相对于开盘价的逆势波动幅度,达到该值将触发止损目标。 |
| InpSalvageExitPct | 0.15 | 相对于开盘价的止损目标距离;不会立即平仓。 |
| InpBreakEvenTriggerPct | 0.10 | 相对于开盘价的有利波动幅度,达到该幅度将触发止盈锁定。 |
| InpBreakEvenLockPct | 0.025 | 相对于开盘价锁定的盈利幅度(扣除成本前)。 |
唯一的包含文件是 <Trade/Trade.mqh>,即 MetaTrader 5 标准库的交易接口。其中的 CTrade 对象(trade)用于提交挂单、分配专家顾问魔术号、请求仓位修改以及提供交易结果描述。该对象不用于波动检测或手数计算。 未引用任何自定义指标、外部 DLL、Web 服务或额外的自定义包含文件。
OnInit 函数缓存了符号的点值、小数位数、点差大小和点值,并检查四个正计数输入。OnTick 函数在存在符号持仓时取消剩余的挂单,审查挂单保证金,管理持仓,并且仅在没有符号持仓时才对入场扫描进行限流。OnTradeTransaction 函数在交易完成后也会触发挂单取消。 Pct 和 N 负责处理百分比距离和小数标准化;OurOrder 和 OurPosition 用于筛选持仓归属;CountPositions 和 CountPending 用于强制执行扫描时间限制;FindSwing 及其波段辅助函数用于识别市场结构;SimilarPending、LotsForRisk、PlaceBreakout 和 ManagePositions 则实现重复检查、仓位规模计算、下单及平仓功能。
内部全局变量包括:trade(交易接口)、g_last_scan(上次扫描时间)、g_point(符号点值)、g_digits(价格小数位数)、g_tick_size(点值增量)和 g_tick_value (报告的点值)。InpFractalTF 是一个内部常量,固定为 PERIOD_H1。这些内部变量和时间周期常量均非用户输入。该 EA 使用终端内置的 API 获取价格、历史数据、账户权益、订单和持仓信息。
InpPendingExpiryHours 用于计算到期时间戳,但下单调用中显式使用了 ORDER_TIME_GTC。因此,当前代码并未实现宣传中基于小时的到期模式。 当挂单的预估激活保证金超过缓冲的可用保证金额度时,保证金驱动的清理机制可能会删除该EA的挂单。这并非基于小时的到期机制。当在该交易品种上检测到持仓时,该EA持有的挂单将被取消。仅出现新的价格波动并不会取消现有挂单。
当前交易品种上的任何持仓现在都会阻止提交新的挂单,无论其魔术编号为何。在发生交易事件及随后的价格跳动时,EA 会尝试取消该交易品种上剩余的挂单。其他 EA 拥有的挂单不会被取消。 删除操作可能会因冻结区或交易时段关闭而延迟;客户端取消并非服务器端原子性的OCO保证。InpMaxPositions仍作为次要计数检查,但在存在持仓时不会授权额外下单。 风险百分比是针对每笔拟下单的计算,而非投资组合的总限额。经纪商的最小交易量要求、固定交易量的备用方案、成交价格和交易成本都可能导致实际风险敞口与估计值存在差异。 源代码中不包含点差或汇总止损风险过滤器。它在提交订单和修改持仓前会检查经纪商的交易时段,估算所有账户挂单的独立激活保证金,并保留当前可用保证金的 20% 作为缓冲。 如果请求的标准化交易量超出剩余缓冲保证金预算,则跳过整个订单并记录原因。交易量不会被缩减以适应保证金预算。反向订单不会获得假定的净额保证金减免。
价格将四舍五入至缓存的符号点值网格,然后标准化为符号位数。固定成交量和基于风险的成交量均按符号成交量规格进行标准化。平仓修改请求会检查现有的止损/止盈冻结区以及拟定的止损/冻结距离,并报告被服务器拒绝的结果。 修改尝试受限为每次管理循环中每五秒一次。EA 还会在提交前使用 OrderCheck 对待处理请求进行预检查。提交时会同时检查 CTrade 返回值和服务器结果代码。失败时会记录请求的标准化成交量以及该品种的最小、最大、步长和方向限制。初始化时也会记录这些规格。
在初始化时,源代码会检查分形邻居计数、挂单和持仓限额、正有限固定交易量,以及在选择风险测算时正有限的风险百分比。其他一些范围仍未进行检查。在对冲账户上,独立的相反持仓最易于解读;而在净额结算账户上,同一符号的订单会影响共享持仓。 更新后的源代码编译时未出现任何错误和警告。用户报告称,在添加这些最新保护机制之前,EURUSD H1对冲账户上进行了50笔交易,XAUUSD D1对冲账户上进行了40笔交易;XAUUSD的运行还报告了交易时段、保证金和修改冻结错误。 更新后的保护机制尚未在上述条件下重新测试。交易时段安排无法保证在特殊停盘期间的可用性,且跳空、权益的突然变化或挂单冻结仍可能导致无法及时清理保证金。本文不作任何业绩声明。
由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/78308
Prop Firm Equity Guard - Daily Loss Limit and Max Drawdown Protection
当达到每日亏损限额、最大亏损或盈利目标时,将平仓所有交易并阻止新交易。专为自营交易公司挑战而设计。支持手动交易及任何其他自动交易系统。
Session High Low - Asian, London and New York Range Boxes
将亚洲、伦敦和纽约交易时段的波动区间以彩色方框形式绘制出来,并标注其最高价和最低价,同时添加虚线延伸线以辅助突破交易。在所有时间周期(最高至H1)上均显示相同的波动区间。
London Breakout EA:简单且透明/London Breakout 自动交易程序:简单且透明
免费突破型EA:亚洲区间、伦敦时段突破、每日一单、始终设置止损、手数按风险百分比计算。 不采用网格交易,不采用马丁格尔策略。 / 免费自动交易程序:伦敦时段亚洲区间突破,每日一笔交易,始终设置止损,手数基于风险百分比。不采用网格交易和马丁格尔策略。
离散
离散技术指标由价格和交易量的变化决定。