Babi Ngepet - 一款适用于MetaTrader 5的交易专家顾问

Mike 2025.10.05 04:45 89 0 0
附件

专家顾问参数设置

这款EA提供了多个可调节的外部参数,用户可以根据需要修改这些参数以控制其行为:

通用参数

参数 类型 描述
MagicNumber整型 EA交易的唯一标识符。
InitialLot双精度 一系列交易中第一笔交易的起始手数。
AllowBuy布尔型 允许EA开启买入交易的标志(初始交易和马丁格尔交易)。
AllowSell布尔型 允许EA开启卖出交易的标志(初始交易和马丁格尔交易)。
TakeProfit整型 用于下挂限单的固定止盈点数(市场执行时不适用)。
FindHighLowBackBars整型 用于确定初始挂单时查找最高点和最低点的回溯条数。
ResetAfterBars整型 在没有持仓的情况下,经过多少根K线后删除初始挂单并重新评估。

马丁格尔策略

参数 类型 描述
ReverseMartingale布尔型 如果为真,后续马丁格尔交易将与系列中最后一笔交易的方向相反(这通常是反马丁格尔或对冲策略,但如果为假,代码将以相同方向开仓)。
LotMultiplier双精度 在亏损系列中的下一笔交易中,手数乘以的因子(例如,2.0表示翻倍手数)。
SecureProfitMartingaleTarget双精度 在该总浮动盈利(以账户货币计)下,关闭所有开放交易的目标。
DistanceMartingalePips整型 在最后一笔交易开仓价相反移动多少点(点数)后,才会开启新的马丁格尔交易。
MaxTradesInSeries整型 单个马丁格尔系列中允许的最大交易数量。

时间策略

参数 类型 描述
AllowMonday... AllowFriday布尔型 启用或禁用特定星期几交易的标志。
ForbiddenDates字符串 禁止交易的日期(格式YYYY.MM.DD)的逗号分隔列表。

核心功能概述

OnInit()(初始化)

设置EA的MagicNumber、保证金模式和偏差。它重置马丁格尔状态变量(s_currentLot、s_totalTradesInSeries等)为初始值,为新的开始做准备。

OnDeinit()(去初始化)

一个简单的清理函数,当EA停止或移除时打印消息。

IsTradingDateAllowed()和IsTradingDayAllowed()(交易过滤器)

这些函数检查当前日期和时间是否符合用户定义的输入(AllowMonday至AllowFriday和ForbiddenDates),以决定是否允许交易。

OpenTradeLogic(ENUM_ORDER_TYPE type, string tradeComment)(市场执行)

此函数处理新市场仓位的开仓(买入或卖出)。

  1. 验证并标准化手数,以符合经纪商的最小、最大和步进要求。

  2. 使用CheckMargin()检查是否有足够的可用保证金

  3. 没有固定的止盈或止损的情况下执行交易(tp_calculated为0)。

  4. 更新全局马丁格尔状态变量:s_currentLot、s_lastOpenPrice、s_seriesType和s_totalTradesInSeries。

CloseAllPositions()

遍历所有当前开放的仓位,关闭由该EA(匹配MagicNumber)开设的所有仓位。

PendingOrders(ENUM_ORDER_TYPE type, double price, double lotSize, string comment)(挂单设置)

此函数放置买入限价单卖出限价单

  1. 验证手数并检查保证金是否足够。

  2. 确认入场价格与经纪商的最小距离(SYMBOL_TRADE_STOPS_LEVEL)是否符合。

  3. 基于TakeProfit输入计算固定的止盈(tp)。

  4. 发送交易请求。注意:UpdateHighLowAndOrders函数调用此函数放置初始的买入限价单和卖出限价单。

UpdateHighLowAndOrders()(初始入场逻辑)

当没有持仓时,这是初始入场机制

  1. 回溯FindHighLowBackBars,查找最高点最低点

  2. 计算priceSellLimit(最高点 + 1 tick)和priceBuyLimit(最低点 - 1 tick)。

  3. 检查是否已经存在带有EA的MagicNumber的买入限价单和卖出限价单。

  4. 在最近最高点之上放置初始的卖出限价单,在最近最低点之下放置初始的买入限价单, 每个单子使用InitialLot。

OnTick()(主逻辑)

EA执行逻辑的核心:

  1. 时间检查:防止在同一tick上进行重复计算。

  2. 过滤检查:如果不允许某天/日期交易,则删除所有挂单。

  3. 盈利目标检查(系列退出):如果eaHasOpenPositions为真且totalFloatingProfit大于等于SecureProfitMartingaleTarget,则调用CloseAllPositions()并重置所有马丁格尔状态变量以开始新的系列。

  4. 初始订单放置:如果!eaHasOpenPositions且允许交易,则重置马丁格尔状态并检查是否形成了新K线。

    • 如果形成了新K线,检查barsCount是否大于等于ResetAfterBars。如果是,则删除挂单并调用UpdateHighLowAndOrders()放置新的初始订单。如果不是,则仅调用UpdateHighLowAndOrders()。

  5. 马丁格尔步骤逻辑:如果eaHasOpenPositions为真且s_totalTradesInSeries小于MaxTradesInSeries:

    • 检查totalFloatingProfit是否为负数且价格是否相对于最后一笔开仓交易移动了至少DistanceMartingalePips。

    • 如果两个条件都满足,则计算下一笔手数,通过s_currentLot乘以LotMultiplier。

    • 确定orderToOpen的方向(根据ReverseMartingale决定与系列相同或相反的方向)。

    • 调用OpenTradeLogic()以开设新的、乘以手数的仓位,继续马丁格尔系列。


策略总结

"Babi Ngepet" EA实施了一种高风险但潜在高回报的马丁格尔策略,结合了突破/区间反转的初始入场:

  1. 初始入场:EA在最近低点下方放置初始的买入限价单,在最近高点上方放置初始的卖出限价单。这暗示着初始假设为区间行为——当价格下跌到低点时买入,价格上涨到高点时卖出。

  2. 交易管理:如果初始交易之一被触发,且持仓出现整体亏损(负浮动盈利),并且价格继续朝着开放仓位的方向移动到定义的距离,EA将在相同方向上以更大的手数(马丁格尔)开设新仓位

  3. 退出策略:交易系列将继续增加手数,直到所有交易的整体浮动盈利达到SecureProfitMartingaleTarget,此时所有持仓将被关闭,EA将重置以准备新的系列。

警告:马丁格尔策略以其高回撤和高资本损失风险而闻名,因为每次亏损后手数都会增加。


列表
评论 0