伟大而可怕的MT4永远(或如何制定过渡策略) - 页 27

 

关于交易、自动交易系统和测试交易策略的论坛

MQL5中的OrderModify()?

Edward Munroe, 2021.05.27 00:51

问一个简单的问题,得到一个简单的答案!?为什么mql5中几乎所有的东西都变得如此混乱?

好问题。

 

传统上是周末前的一项简单任务。

一个未结头寸 是1手。在运行脚本后,我们需要使仓位变成0.9手。

很明显,该脚本可以在任何时候启动。这就是为什么有许多情况可能发生。


像通常一样,我试图用经典的方式来解决问题。

// Частичное закрытие позиции.

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  if (Trade.Buy(1)) // Пытаемся открыть позицию на 1 лот.
  {
    const ulong Ticket = Trade.ResultOrder();
    
    // Ждем, пока не появится.
    while (!IsStopped() && !PositionSelectByTicket(Ticket))
      Sleep(0);
      
    // А теперь просто закрываем 0.1 лота в случае, если объем позиции равен 1.
    // Цикл - для эмуляции запуска скрипта в любой момент.
    while (!IsStopped() && PositionSelectByTicket(Ticket) && (PositionGetDouble(POSITION_VOLUME) == 1))
      Trade.PositionClosePartial(Ticket, 0.1);
  }
}


这个脚本显示的仓位是0.8手。我们需要0.9。

 
fxsaber:

运行这个脚本可以得到0.8手的仓位。我需要0.9。

在2个服务器上测试了几次,我只得到了0.9。


测试的逻辑很清楚--我们试图摆脱在一个tick上的异步执行,这个过程的一般方案(如何在一个tick上进行同步)是很重要的,要知道

 
fxsaber:

传统上是周末前的一项简单任务。


我的妈呀!而我有0.8(在MQDemo-0.9)。还会有多少这样的耙子?

 
Igor Makanu:

在2个服务器上检查了几次,我只有0.9。

 
 
fxsaber:
解决了。

这可能是目前这个主题中所有容易制定的任务中最困难的任务

对MQL5交易部分的掌握程度是一个非常有力的考验。

 

开立一个买入订单,SL和TP为零,然后设置30点的SL和TP(如果我没记错的话,这叫做市场执行账户类型 - SL和TP不能同时设置)。

对于MT4来说,这个代码是有效的。

void OnStart()
{
   int ticket;
   if((ticket = OrderSend(_Symbol, OP_BUY, 0.1, Ask, 30, 0.0, 0.0)) < 0 ||
         !OrderSelect(ticket, SELECT_BY_TICKET) ||
         !OrderModify(ticket, OrderOpenPrice(), NormalizeDouble(OrderOpenPrice() - 300 * _Point, _Digits), NormalizeDouble(OrderOpenPrice() + 300 * _Point, _Digits), OrderExpiration()))
   {
      Print("Error Open order # ", GetLastError());
   }
}
 
Igor Makanu:

开立一个买入订单,SL和TP为零,然后设置30点的SL和TP(如果我没记错的话,这叫做市场执行账户类型 - SL和TP不能同时设置)。

对于MT4来说,这个代码是有效的。

大约两三年前,在终端层面引入了对执行类型的识别。现在即使是市场执行,你也可以设置SL和TP,终端本身会将订单分成两个交易订单。

 
Igor Makanu:

开立一个零 SL和TP的买入订单,然后放置一个30点的SL和TP(如果我没记错的话,这叫做市场执行账户类型--SL和TP不能同时放置)。

一项共同的任务。