引言
很多交易专家顾问(EA)在设置止盈时,通常是根据买入价与当前价格之间的点差来关闭订单。然而,EA Perceptron所使用的代码主要是基于当前的利润。这种方式使得我们能够更灵活地管理多个开仓的止盈,实时监控基于魔法数字的总利润,特别是在同时使用多个交易机器人或不同的EA时,管理起来更加方便。加我为好友,关注我的动态,获取最新消息!
使用这种代码还可以有效解决使用基于点差的止盈时可能出现的一些问题。例如,基于点差的止盈可能会因经纪商的滑点而变化,从而限制我们的利润。而通过使用基于当前利润的代码,我们可以避开这个问题,获得更好的交易控制。
如果你想了解更多关于如何设置基于当前利润的止盈,可以参考EA SwingBot的代码。
…
计算总订单数
首先,我们来看一下计算具有相同魔法数字的开放订单总数的代码。
魔法数字是由交易者或EA(专家顾问)为订单指定的唯一标识符。
代码将变量total_orders初始化为零。然后通过一个for循环遍历所有开放订单,并使用OrderSelect()函数选择每个订单。如果成功选择了一个订单,就将total_orders变量加一。
//----------------- int total_orders = 0; for(int i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderMagicNumber() == MagicNumber) { total_orders++; } } }
…
计算当前利润
代码初始化了两个变量:ProfittoMinimo和Profit。变量ProfittoMinimo用于在该水平激活止盈,其值以账户货币表示。变量Profit则用于累积所有具有相同魔法数字的开放仓位的当前利润。变量StopLoss用于止损。
代码使用一个for循环遍历所有开放仓位,利用OrdersTotal()函数。对于每个开放仓位,使用OrderSelect()函数选择相应的订单。如果成功选择了订单且其魔法数字相同,就将该订单的利润加到Profit变量中。
double ProfittoMinimo = 3; // 目标利润 double Profit = 0; // 当前利润 for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderMagicNumber() == MagicNumber) // 如果有多个EA,可以去掉魔法数字筛选,保持对所有订单的功能 { Profit += OrderProfit(); } }
最低利润可以设置为外部变量,并在EA选项中进行配置:

…
达到利润时关闭仓位
代码使用一个for循环遍历所有开放订单,利用OrdersTotal()函数。循环从最后一张订单开始,向前遍历到第一张订单。对于每个订单,使用OrderSelect()函数选择相应的交易。
如果所选交易与当前图表的交易品种相同,且类型为OP_BUY,并且其魔法数字与代码中指定的一致,则会检查该交易的Profit是否大于或等于ProfittoMinimo。如果是的话,就通过OrderClose()函数以买入价平仓,并打印出关闭买单的消息。
同样,如果所选交易与当前图表的交易品种相同,且类型为OP_SELL,并且其魔法数字与代码中指定的一致,则会检查该交易的Profit是否大于或等于ProfittoMinimo。如果是的话,就通过OrderClose()函数以卖出价平仓,并打印出关闭卖单的消息。
for(int e = OrdersTotal() - 1; e >= 0; e--) { if(OrderSelect(e, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == MagicNumber) // 只有当魔法数字与当前订单匹配时,订单才会被修改。 { if(Profit >= ProfittoMinimo) { OrderClose(OrderTicket(), OrderLots(), ND(OrderClosePrice()), 3); // 买入价 Print("买单已关闭", Profit, " - 最低止损: ",MarketInfo(Symbol(), MODE_STOPLEVEL)); } } if(OrderSymbol() == Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumber) { if(Profit >= ProfittoMinimo) { OrderClose(OrderTicket(), OrderLots(), ND(OrderClosePrice()), 3); // 卖出价 Print("卖单已关闭", Profit, " - 最低止损: ",MarketInfo(Symbol(), MODE_STOPLEVEL)); } } } }
…
总结
这段代码对于所有基于止盈的平仓策略都非常有用,但它也可以与基于当前利润增加的追踪止损结合使用。该系统在使用多个专家顾问的情况下也非常实用。如果你去掉魔法数字的if条件,就可以设置一般的止盈水平,以同时控制所有活跃EA的开放仓位。