mql5语言的特点、微妙之处以及技巧

 
本主题将讨论使用mql5语言 的无记录工作方式,解决某些问题的例子。我希望这个分支更接近于FAQ的内容,而不是讨论。我邀请所有有经验的程序员来分享他们的解决方案和编程技巧。对帮助中没有描述的功能的覆盖,尤其值得欢迎。
 
fxsaber:

当市场订单成功开仓后,每次都会得到一个零的Result.deal?

来自BOD的消息
不保证结果交易票会被填满。是否填充取决于仪器的执行模式和特定服务器的设置。
谁预订了非零结果。交易 - 采取行动。
 
一旦OrderSend 被执行,处理相关订单、头寸或交易并不总是成功。在有些情况下,需要等待几十毫秒才能使历史或当前交易信息变得正确。
 
fxsaber:
一旦OrderSend被执行,处理相关订单、头寸或交易并不总是成功。有些情况下,你需要等待几十毫秒的历史或当前交易信息变得正确。
在MT4中也是如此,这取决于具体的服务器。
 
并不总是能够知道产生交易的订单的价格。
 
并不总是能够知道平仓 的SL/TP水平。

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

平仓头寸的获利(和止损)。

fxsaber, 2016.07.17 20:19

在引入套期保值TakeProfit之前,未结头寸不是以限价单的形式存储在交易所,而是存储在MT5交易服务器上。在接受的那一刻,它们不是作为限价订单被送到交易所,而是作为市场订单被送到交易所的价格。

当TP被触发时,这个功能在测试器中是非常明显的:适当的市场订单(而不是限价)出现。由于takeprofit是一种不存在的交易所类型的订单(只有市场和限价订单),这种状态完全是在 "市场性 "范围内。

随着套期保值的出现,情况并没有改变--实收利润仍然是虚拟的。MT4的情况则不同:在多年的MT4桥梁中,在MT4的止盈上下限价单已经成为标准。

正是由于这种虚拟性,MT5的一些功能像小路一样拖着走。不仅止盈最好不要放在MT5中,而且如果你想要一个限价的对应产品,通过MQL5,你没有办法在平仓 后知道其止盈和止损值。

这不是不分青红皂白的指责,而是经过几个小时的努力,找出(没有HistorySelectByPosition和其他东西的帮助)一切工作的结果。如果我错了,我也很乐意道歉。不是没有根据的,我在RoboForexEU-MetaTrader 5服务器上展示了一个测试者的专家顾问(它更容易理解),它打开一个位置,然后把SL和TP水平。

void OnTick()
{
  static bool Flag = true;

  if (Flag)
  {
    // Открываем SELL-позицию
    MqlTradeRequest Request = {0};

    Request.action = TRADE_ACTION_DEAL;

    Request.symbol = Symbol();
    Request.volume = 1;
    Request.price = SymbolInfoDouble(Symbol(), SYMBOL_BID);

    Request.type = ORDER_TYPE_SELL;

    MqlTradeResult Result;

    if (OrderSend(Request, Result))
    {
      // Устанавливаем SL и TP
      Request.position = Result.deal;

      Request.action = TRADE_ACTION_SLTP;

      Request.tp = Result.ask - 10 * _Point;
      Request.sl = Result.ask + 10 * _Point;

      if (OrderSend(Request, Result))
        Print("Сделка в тестере закроется либо по SL, TP, либо по окончании бэктеста")    ;

      Flag = false;
    }
  }
}

在这个EA中,不能定义单个平仓的SL和TP(在OnDeinit中)。它应该这样做吗?


从报价中也可以看出,MT5中头寸的TP总是一个市场订单。不要给极限对应的书签--见上文。
 
 

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

虫子,虫子,问题

Slawa, 2017.02.14 13:46

为什么?一个行动就足够了。

只要在市场审查中选择了该符号,并且该符号的历史记录被专家顾问持有,它就会保持同步。由专家顾问持有意味着你将至少每2分钟访问一次该历史记录,例如通过复制一个柱子。如果历史是同步的,就不会在复制一个条形图上花费时间--只需要几个处理器周期。或者,就像刚才在这里说的,要求提供条数,也是几个时钟周期

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

虫子,虫子,问题

Alexey Kozitsyn, 2017.02.14 13:47

指标是否包括2分钟的间隔?

是的,通过检查同步化的事实,也会保持同步化吗?

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

虫子,虫子,问题

Slawa, 2017.02.14 13:50

这也适用于指标。创建一个1分钟的定时器,并要求提供所有感兴趣的时间序列的条数

检查定时的事实并不能保持定时。

 
fxsaber:
一旦OrderSend被执行,参考适当的订单、头寸或交易并不总是成功的。有些情况下,你需要等待几十毫秒才能使历史或当前交易信息变得正确。

你不需要等待几毫秒的时间。

该信息将在OnTradeTransaction 中出现

见代码

附加的文件:
 
娼者。

你不需要等待几毫秒的时间。

该信息将在OnTradeTransaction 中出现

见代码。

脚本中没有这个内容。使用EA+ExpertRemove而不是脚本的做法是愚蠢的。

此外,如果180秒内没有来自服务器的响应,OrderSend就会超时崩溃。这表明,OnTradeTransaction可能会永远积累等待票。在你的脚本中,OnTradeTransaction只有一个order_ticket的选项是不好的。在异步发送后,有一项工作是处理订单清单。这就是为什么它是异步的--与批次一起工作。而如果没有批处理的工作,那么就永远不需要async。

 
MT4-OrderClosePrice的技巧 在MT5中也适用 -PositionGetDouble(POSITION_PRICE_CURRENT)
原因: