0

我希望我的 EA 自动修改订单,将止损设置一次处于盈利状态,但为什么总是出错?

我也已经达到了最低点,但这并没有给我带来任何运气。

这是变量

        double _stopLevelTimes = 1.5;
        int     StopLevel      = (int) ( miStopLevel + miSpread );

我想要的是使止损水平比最小止损点水平高 1.5 倍,我也已经添加了点差。

这些变量由经纪人自动填充。

        if (  OrderType()      == 0
           && OrderOpenPrice() >  OrderStopLoss()
              ){
              _stopLoss   = NormalizeDouble( OrderOpenPrice()
                                           + ( Point() * (  StopLevel
                                                         * _stopLevelTimes
                                                           )
                                               ),
                                             miDigits
                                             );
              _clr        = clrBlue;
              RefreshRates();
              modified    = OrderModify( OrderTicket(),
                                         OrderOpenPrice(),
                                         _stopLoss,
                                         OrderTakeProfit(), 0, _clr );
        }
        else
        if (  OrderType()      == 1
           && OrderOpenPrice() <  OrderStopLoss()
              ){  
              _stopLoss   = NormalizeDouble( OrderOpenPrice()
                                           - ( Point() * (  StopLevel
                                                         * _stopLevelTimes
                                                           )
                                               ),
                                             miDigits
                                             );
              _clr        = clrRed;
              RefreshRates();
              modified    = OrderModify( OrderTicket(),
                                         OrderOpenPrice(),
                                         _stopLoss,
                                         OrderTakeProfit(), 0, _clr );
        }
4

2 回答 2

0

甚至(Forex Falcon 的 IT 经理)也应该知道一些确凿的事实:

  • OrderSelect()每个 MQL4 代码都已将多项职责转移给代码设计人员,在任何 db.Pool 操作之前提交强制性的。不是因为 db.Pool-SELECT-free 中的操作模式OrderModify(),而是因为您的代码比较 db.Pool-record-values (并且此类记录必须首先显式 SELECT-ed )

  • 有更多的值需要监控,而不仅仅是 aSpread和 a StopLevel。可能还有第三个原因Error_130,一旦您的代码请求 MT4 服务器端修改订单,幸运的是,该订单保留在一个FreezeLevel区域内,由您的经纪人的[条款和条件]设置。请务必重新阅读它们,因为它们统治着您所有的 XTO/非 XTO。

  • 最后但并非最不重要的一点是,您的信念将被打破,因为 StopLevel、FreezeLevel 和 Spread 都不需要保持不变,而且 Brokers 和 MetaQuotes MQL4 文档都警告了一些情况,当返回值不应被理解为一个值,而是作为一个指示实际上没有可使用的值,而是标记浮动(未知)值

最好的下一步?

在所有情况下,将实际值和请求的新值记录到文件中并检查它们是否符合经纪人在 [条款和条件] 中发布的规则。

如果不是,请与经纪人代表和您当地的 FSA 当局协调任何此类记录的不符合项。

于 2017-10-03T11:53:50.810 回答
0

您只需检查在多头的情况下,您的止损低于OrderOpenPrice(),然后计算新的止损。但你不知道现在的价格离现在的价格是否足够远。可能是您当前的平仓价格(OrderClosePrice()长期Bid)低于新的止损,在这种情况下修改是不可能的。之后,确保您允许STOP_LEVEL * Point从当前价格到新止损的距离。

于 2017-10-03T19:09:14.980 回答