0

我正在尝试编写此逻辑:

if no open orders and buy logic ( DayOpen - 10 * Point )
then buy

if bought
Sell when the one(也是唯一的一个)bought order reaches Take Profit price.


这是我到目前为止所拥有的:

double DayOpen = iOpen( NULL, PERIOD_D1, 0 );
double TP      = 10.0;
int    ticket;

if ( OrdersTotal() == 0 && Bid == DayOpen - 10 * Point );
{    OrderSend( Symbol(),
                OP_BUY,
                1.0,
                Ask,
                0,
                0,
                Ask + TP * 10 * Point,
                NULL,
                12321,
                0,
                Blue
                );
}
4

2 回答 2

1

序言
(最好遵循 StackOverflow 强调发布完整 M.C.V.E.的内容)

代码至少应该在语法上正确阅读:

{                                                     // outer context missing
// .                                                  // outer context missing
// ..                                                 // outer context missing
// ...                                                // outer context missing
   RefreshRates();     // a life-saving jacket while  // outer context missing

   if (  OrdersTotal() == 0
      && Bid           <= iOpen( _Symbol, PERIOD_D1, 0 )
                        - ( 10 * _Point )
      )
   {  OrderSend( _Symbol,                            // <symbol>
                 OP_BUY,                             // <op> 
                 1.0,                                // <volume>
                 Ask,                                // <XTO_price>
                 0,                                  // <slippage_allowed>
                 0,                                  // <autoXTO_SL>
                 NormalizeDouble( Ask + 10 * _Point, // **ALWAYS**
                                  _Digits            // NORMALIZE XTO levels
                                  ),                 // <autoXTO_TP>
                 NULL,                               // <commentSTRING>
                 12321,                              // <MagNUM>
                 0,                                  // <expireSECONDs>
                 clrBlue                             // <arrowCOLOR>
                 );
   }

// ...
// ..
// .

}

结语

无需为给定的逻辑添加任何额外的构造。MetaTrader Terminal 4会将OrderSend()详细信息发送到遥控器MetaTrader 4 Server,如果您的价值确实符合经纪人方条款和条件,您将获得此类交易头寸(面临市场风险,同时由您的股票提供充分支持和保障)。

同时,将确保在外汇市场达到预定义的终止水平的那一刻,MetaTrader 4 Server该头寸本身不需要其他代码来终止。<autoXTO_TP>TP

虽然上述情况属实,但公平地说,专业级算法交易系统还有许多其他实用服务,附加到核心交易逻辑。只是想知道一下,大约 80.000 ~ 100.000 SLOCs 的设计在生产级系统中很常见。


然后去哪儿?

重新阅读MQL4文档 可能会有所帮助(让我更清楚一点 -本地安装和更新的实际版本--MQL4语言的版本......而不是静态和“旧”文本web,因为语法规则和特定于上下文的限制越来越多......仍然如此,参考下面)

不是
再次陷入“旧”的另一个问题 -MQL4语法代码片段。

MQL4在过去的几年里,该语言发展了很多,并且由于范式的许多变化,发生在“语言内部”或代码执行平台的变化,许多网络发布的代码片段已经失去了它们的解释价值。

苦的?是的。
痛吗?是的。

这就是生活,然而……

于 2016-03-28T19:14:52.730 回答
0

所以,我假设你的逻辑的第一部分(开仓交易)是正确的。现在您希望所有订单在其中一个达到 TP 时关闭。这是您如何做到这一点的方法。

将此添加到start()函数中:

int total = OrdersHistoryTotal();
for (int i = total - 1; i >= 0; i--)
{
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false)
    {
        Print("Error selecting order from history: ", GetLastError());
        break;
    }
    if ((OrderSymbol() != Symbol()) || (OrderType() != OP_BUY) || (OrderClosePrice() < OrderTakeProfit())) continue;
    CloseAll();
    break;
}

这在start()函数之外:

void CloseAll()
{
   int total = OrdersTotal();
   for (int i = total - 1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS) == false) continue;
      if ((OrderSymbol() != Symbol()) || (OrderType() != OP_BUY)) continue;
      RefreshRates();
      OrderClose(OrderTicket(), OrderLots(), Bid, Slippage);
   }
}
于 2016-03-28T19:04:01.013 回答