文章 "跨平台智能交易程序: 订单"

 

新文章 跨平台智能交易程序: 订单已发布:

MetaTrader 4 和 MetaTrader 5 在处理交易请求时使用不同的约定。本文讨论使用类对象来表达由服务器处理的交易的可能性, 目的是让跨平台智能交易程序可以无视交易平台版本和使用模式均可工作。

以下显示平台上执行的 EA 屏幕截图。注意, 由于 EA 调用 ExpertRemove 函数, 它会在执行其代码之后立即从图表上移除 (仅执行一次 OnTick 处理器)。

作者:Enrico Lambino

 

Enrico 能否检查 订单(或头寸)是否被部分平仓。

在 MT4 中,如果部分平仓,我有一个新的单子。事实上,这不是新的入场,而是之前的入场。因此,我需要单独的此类订单。表示真正入市的订单和部分平仓后出现的订单(不是新订单)。使用你们的类可以吗?

 
mbjen:

Enrico 能否检查订单(或头寸)是否被部分平仓。

在 MT4 中,如果部分平仓,我有一个新的单子。事实上,这不是新的入场,而是之前的入场。因此,我需要单独的此类订单。表示真正入市的订单和部分平仓后出现的订单(不是新订单)。可以使用你们的类吗?


或者在订单完全关闭之前都是一个 COrder 对象?我是说部分平仓后没有新的 COrder 对象?

如果是这样,我如何获得订单总利润?

另外,如何获得初始订单票据 或初始订单类型?

 

假设我在 1.09246 价格卖出 5.00 #1。下一次部分平仓在 1.08896 价格买入 2.00 #2。最后平仓时在 1.09161 价格买入 3.00 #3(实际上是由于追踪止损)。

这是我的代码:

   COrders *orders=order_manager.OrdersHistory();
   for(int i=order_manager.OrdersHistoryTotal()-1;i>=0;i--)
     {
      COrder *order=orders.At(i);
      if(!CheckPointer(order))
         continue;
      order.OnTick();
      if(!order.IsClosed())
         continue;
      if(order.OrderType()!=0 && order.OrderType()!=1)   
         continue;

为简化起见,我们将这 3 个订单都称为头寸。

当头寸关闭时(最后一个订单 #3),IsClosed() 方法返回 true。但我如何获得头寸类型、头寸第一张订单、头寸开仓价。仓位初始交易量看起来可以用 InitVolume() 方法计算。那么其他部分呢?

 
mbjen:

假设我在 1.09246 价格卖出 5.00 #1。下一次部分平仓在 1.08896 价格买入 2.00 #2。最后平仓时在 1.09161 价格买入 3.00 #3(实际上是由于追踪止损)。

这是我的代码:

为简化起见,我们将这 3 个订单都称为头寸。

当头寸关闭时(最后一个订单 #3),IsClosed() 方法返回 true。但我如何获得头寸类型、头寸第一张订单、头寸开仓价。仓位初始交易量看起来可以用 InitVolume() 方法计算。那其他部分呢?

不完全确定您想做什么,但要在 MQL5 中获得 COrder 实例的未实现利润/亏损,一种方法是获得剩余交易量,然后将其与当前市场价格(买入价或卖出价)和 COrder 输入价格之间的差额相乘,再与 tick 值相乘。比较棘手的部分是当符号的点数不等于刻度线大小时(您需要将差值除以刻度线大小)。黄金曾经是这样,但据我所知现在不是了。最好还是找一家提供更大流动性的经纪商。同一个 COrder 实例一直使用到最后。在 MQL4 中,您只需选择订单票据并调用 OrderProfit() 函数。

 
2017/10/30 09:04:38 已完成 #169758 keltrem
 

When one sends a trade request, there are only two outcomes: processed or not processed. If the trade was not processed, it means that there was no deal, as the trade server was not able to process it for some reason (usually due to errors). Now, if the trade is processed, in MQL5, the client and the server have a deal. In this case, the order can be fully executed or partially executed.

这并不完全准确,还可能出现超时。这意味着您不知道订单是否已处理。当然,最终订单要么被处理,要么没有被处理,但在真实账户中了解和处理超时是很重要的。

MetaTrader 4 没有这个选项,因为订单只是完全执行或不执行(成交或取消)。

...

在 MQL4 中,交易量的计算非常简单。每当专家顾问发送交易请求时,该请求的交易量也包括在内,它要么被拒绝,要么被接受。

这并不精确。MT4 也会出现部分成交的订单。当然,在主要使用 MT4 进行交易的外汇市场上这种情况应该很少见,但在技术上可能会发生。


总的来说,我不认为您在本文中提供的类有什么用处,因为您仍然需要在主代码中使用特定的 MT4/MT5 和编译器指令。(也许在后续文章中会提到,但我还没有读过)。