专家顾问参数设置
这款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)(市场执行)
此函数处理新市场仓位的开仓(买入或卖出)。
-
验证并标准化手数,以符合经纪商的最小、最大和步进要求。
-
使用CheckMargin()检查是否有足够的可用保证金。
-
在没有固定的止盈或止损的情况下执行交易(tp_calculated为0)。
-
更新全局马丁格尔状态变量:s_currentLot、s_lastOpenPrice、s_seriesType和s_totalTradesInSeries。
CloseAllPositions()
遍历所有当前开放的仓位,关闭由该EA(匹配MagicNumber)开设的所有仓位。
PendingOrders(ENUM_ORDER_TYPE type, double price, double lotSize, string comment)(挂单设置)
此函数放置买入限价单或卖出限价单:
-
验证手数并检查保证金是否足够。
-
确认入场价格与经纪商的最小距离(SYMBOL_TRADE_STOPS_LEVEL)是否符合。
-
基于TakeProfit输入计算固定的止盈(tp)。
-
发送交易请求。注意:UpdateHighLowAndOrders函数调用此函数放置初始的买入限价单和卖出限价单。
UpdateHighLowAndOrders()(初始入场逻辑)
当没有持仓时,这是初始入场机制:
-
回溯FindHighLowBackBars,查找最高点和最低点。
-
计算priceSellLimit(最高点 + 1 tick)和priceBuyLimit(最低点 - 1 tick)。
-
检查是否已经存在带有EA的MagicNumber的买入限价单和卖出限价单。
-
在最近最高点之上放置初始的卖出限价单,在最近最低点之下放置初始的买入限价单, 每个单子使用InitialLot。
OnTick()(主逻辑)
EA执行逻辑的核心:
-
时间检查:防止在同一tick上进行重复计算。
-
过滤检查:如果不允许某天/日期交易,则删除所有挂单。
-
盈利目标检查(系列退出):如果eaHasOpenPositions为真且totalFloatingProfit大于等于SecureProfitMartingaleTarget,则调用CloseAllPositions()并重置所有马丁格尔状态变量以开始新的系列。
-
初始订单放置:如果!eaHasOpenPositions且允许交易,则重置马丁格尔状态并检查是否形成了新K线。
-
如果形成了新K线,检查barsCount是否大于等于ResetAfterBars。如果是,则删除挂单并调用UpdateHighLowAndOrders()放置新的初始订单。如果不是,则仅调用UpdateHighLowAndOrders()。
-
-
马丁格尔步骤逻辑:如果eaHasOpenPositions为真且s_totalTradesInSeries小于MaxTradesInSeries:
-
检查totalFloatingProfit是否为负数且价格是否相对于最后一笔开仓交易移动了至少DistanceMartingalePips。
-
如果两个条件都满足,则计算下一笔手数,通过s_currentLot乘以LotMultiplier。
-
确定orderToOpen的方向(根据ReverseMartingale决定与系列相同或相反的方向)。
-
调用OpenTradeLogic()以开设新的、乘以手数的仓位,继续马丁格尔系列。
-
策略总结
"Babi Ngepet" EA实施了一种高风险但潜在高回报的马丁格尔策略,结合了突破/区间反转的初始入场:
-
初始入场:EA在最近低点下方放置初始的买入限价单,在最近高点上方放置初始的卖出限价单。这暗示着初始假设为区间行为——当价格下跌到低点时买入,价格上涨到高点时卖出。
-
交易管理:如果初始交易之一被触发,且持仓出现整体亏损(负浮动盈利),并且价格继续朝着开放仓位的方向移动到定义的距离,EA将在相同方向上以更大的手数(马丁格尔)开设新仓位。
-
退出策略:交易系列将继续增加手数,直到所有交易的整体浮动盈利达到SecureProfitMartingaleTarget,此时所有持仓将被关闭,EA将重置以准备新的系列。
警告:马丁格尔策略以其高回撤和高资本损失风险而闻名,因为每次亏损后手数都会增加。