【问题标题】:Needing some assistance with EA需要 EA 的帮助
【发布时间】:2016-03-27 23:50:01
【问题描述】:

我正在尝试编写这个逻辑:

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
                );
}

【问题讨论】:

  • 那么错误是什么?

标签: quantitative-finance algorithmic-trading mql4 metatrader4 forex


【解决方案1】:

序幕
(可以follow StackOverflow emphasis on posting a complete 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 将确保该职位本身不需要其他代码即可变为 @ 987654329@-在外汇市场达到预定义的TP-终止级别的那一刻终止。

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


从这里到哪里去?

重新阅读 MQL4 文档 可能会有所帮助(让我说得更清楚一点 - localhost-installed actual-release-of--MQL4 语言的更新版本...不是静态和“网络上的“旧”文本,因为语法规则和特定于上下文的限制越来越多……仍然如此,参考下面)
而不是

再次用“旧”-MQL4 语法代码-sn-ps 解决另一个问题。

MQL4 语言在过去几年中发展了很多,许多网络发布的代码-sn-ps 已经失去了它们的解释价值,原因是范式发生了许多变化,这些变化发生在“语言内部”或由于代码执行平台变化

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

这就是生命,不过……

【讨论】:

    【解决方案2】:

    所以,我假设您的逻辑的第一部分(开仓交易)是正确的。现在您希望所有订单在其中一个达到 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);
       }
    }
    

    【讨论】:

    • 您可能想要更新您的答案,@Enivid。代码在第一个关于开仓正确性的假设和第二部分中都是错误的,当有 { 0 | 1 } 交易仓位管理(0 有效,直到第一部分的语法最终得到纠正)。
    • 您可能下次还可以更好地查看自己的代码,以便避免将语法错误发布在以教育为动机的答案中并更好地反映 OP 上下文-使用(例如,您忘记在复制的 sn-p 代码逻辑中包含显式 OrderMagicNumber() 检查)。
    • 感谢您的回答。我仍然迷路了。我希望它一次只打开一个订单,并在达到买入订单的获利时关闭,并且当再次满足条件时,它会打开另一个订单。我承认该系统可能无法盈利,但我想对其进行测试。所以你能告诉我那会是什么样子,这样我就可以在策略测试器中测试它。再次感谢。
    • @Rob,您无需“添加”任何内容即可运行 MT4 回测器。仔细阅读其他答案,然后完善语法(在构造函数的 if(...){...} 条件部分中擦除冒号 ;inside/right after第一对括号)并运行OnTick(){...}中的代码。就这么简单。
    • @Rob 您可能已经知道,如果您将 MT4-code-IDE(又名 MetaEditor)配置为对于语言探索来说更方便一些。 Rob,您是否尝试过对其进行一些调整以适应您的偏好? 经过一些练习后,您会意识到,即使在 MQL4 参考/帮助中也存在一些错误,这些错误不能正常工作复制/粘贴,但无论如何不要犹豫,用 MetaEditor 中的代码进行大量试验。
    猜你喜欢
    • 1970-01-01
    • 2011-08-12
    • 2013-10-09
    • 1970-01-01
    • 2022-01-04
    • 2017-10-05
    • 2017-03-23
    • 2012-09-26
    • 1970-01-01
    相关资源
    最近更新 更多