程序库: MT4Orders - 页 46

 
traveller00:

在这种情况下,没有办法通过限制器工作。还是有办法?

我平仓 时会在当前价位设置止盈止损。但止损并不总是以限价的形式出现(取决于经纪商的软件)。所以这种方法并不总是合适。

如果有必要使用限价器。我会设置一个限制器,在对冲的情况下,通过 OrderCloseBy 关闭相反的仓位。

 

我是否认为,选择取值是为了对冲时可以向服务器发送一个取值请求,而不是两个单独的 limit 和 CloseBy?对于净额交易来说,这没有区别。

顺便说一下,在我的记忆中,在证券交易所不可能直接在当前价格 上设置止盈或止损,应该有一个缩进。

 
traveller00:

我认为选择取值是为了对冲时可以向服务器发送 1 个取值请求,而不是 2 个单独的 limit 和 CloseBy?对于净额结算来说,这没有任何区别。

CloseBy操作不是交易,所以区别不大。

 
在 MT5 中很容易找到部分执行。
// true - 交易是部分执行的结果。
bool IsPartial( const ulong TicketDeal )
{
  const ulong TicketOrder = HistoryDealGetInteger(TicketDeal, DEAL_ORDER);
  
  return((HistoryDealGetInteger(TicketDeal, DEAL_TYPE) <= DEAL_TYPE_SELL) &&
         (!TicketOrder ||
          (HistoryDealGetDouble(TicketDeal, DEAL_VOLUME) != HistoryOrderGetDouble(TicketOrder, ORDER_VOLUME_INITIAL))));
}


我将以该函数为例,说明同时使用 MT5-style 和 MT4-style 的特殊性。

// 输出所有部分执行的事务。

#include <MT4Orders.mqh>

input datetime inFrom = D'2020.01.01';

void OnStart()
{
  if (HistorySelect(inFrom, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong TicketDeal = HistoryDealGetTicket(i);
      
      if (IsPartial(TicketDeal))
      {
        Print(TicketDeal);
        
        if (OrderSelect(TicketDeal, SELECT_BY_TICKET) && // 按票据选择订单后,更改历史记录表、
            HistorySelect(inFrom, INT_MAX))              // 因此,如有必要,应将其返回。
          OrderPrint();        
      }
    }
  }
}

使用HistorySelect+MT4Orders 时请注意这一点。

 

有几个地方会出现位置顺序选择。注释

// 在搜索过程中,订单数量可能会发生变化

检查订单数量是否会发生变化。但严格来说,可能会出现订单数量没有变化,但订单本身发生变化的情况,如 1 个平仓订单和 1 个新开仓订单。这样,案例中间的编号就可能发生变化。这种情况在整个使用过程中从未发生过吗?没有进行更严格的检查是一个错误,还是为了不使代码过于复杂而故意忽略了这种不太可能发生的情况?或者说,我是不是看穿了什么,这里并不存在错误?

 
traveller00:

位置顺序选择 有几个地方。注释

会检查订单数量是否发生变化。但严格来说,可能会出现订单数量没有变化,但订单本身发生变化的情况,如 1 个平仓订单和 1 个新开仓订单。这样,案例中间的编号就可能发生变化。这种情况在整个使用过程中从未发生过吗?没有进行更严格的检查是一个错误,还是为了不使代码过于复杂而故意忽略了这种不太可能发生的情况?或者说,我是不是看穿了什么,这里并不存在错误?

我不记得了。我只知道我做了很多压力测试来检查所有情况。

 

ORDER_TIME_SETUP(_MSC) 更改为第一笔(可能是倒数第二笔)交易的执行时间。也就是说,无法从历史记录中确定买入限价是何时下达的。


因此,套期保值头寸的开仓价格可能是小数,这在净额结算中经常可以看到。

在这种情况下,此类 MT4 仓位的 MT4Orders 订单开仓价格/订单开仓时间将等于第一笔 MT5 交易的相应值。

也就是说,不幸的是,开仓时没有零碎价格。这种情况很少见,但还是会发生。

 

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

库: MT4Orders

fxsaber, 2020.03.18 03:47

平局拒绝。

这种情况经常发生:

  1. 价格已达到未结头寸的止损点。
  2. MT5 生成市价订单。向流动性提供商发送了相应的限价订单。
  3. 限价订单被重新注册。然后删除与止损相对应的 MT5 订单。
  4. 切换到第 1 点。
执行得很好,因为在历史记录中可以看到提供商的拒绝。好的,强制内部实现作为限价订单的承购。

MT4Orders 不显示这些 MT5 订单,在这种情况下,Teejk 重新劫持,以及在部分执行后取消的 情况下。没错!

 

最新发布的 MT5 2361 使用 MT4Orders、真实、对冲。多个 EA,不同的魔法。其中一个智能交易系统的情况。

下达了买入订单,订单号为 216684。一段时间后,到了平仓 时间,下了一个卖出限价单平仓,另一个卖出限价单开立反向仓位,交易单 216975 和 216978。所有订单的手数相同。当 216978 限价单触发时,216684 和 216978 通过 CloseBy 终止,只剩下 216975。

日志中的部分日志

2020.04.15 07:33:24.203 : deal #107485  sell 0.15 XXXXXX at 1.05555 done (based on order #216978)
2020.04.15 07:33:24.203 : close position #216684  buy 0.15 XXXXXX by position #216978  sell 0.15 XXXXXX
2020.04.15 07:33:24.305 : accepted close position #216684  buy 0.15 XXXXXX by position #216978
2020.04.15 07:33:24.307 : deal #107487  sell 0.15 XXXXXX at 1.05555 done (based on order #216986)
2020.04.15 07:33:24.307 : close position #216684  buy 0.15 XXXXXX by position #216978  done in 103.841 ms
2020.04.15 07:33:24.309 : deal #107489  sell 0.15 XXXXXX at 1.05563 done (based on order #216975)

智能交易系统的部分日志

2020.04.15 07:33:24.180 OrdersTotal 216978 216975 216684
2020.04.15 07:33:24.305 OrdersTotal

也就是说,我们可以看到有 3 个订单。但在关闭其中 2 个订单并转到第 3 个订单的市场的过程中,订单列表是空的,尽管本应保留 1 个订单。这种情况可能导致重复开仓。

我通过以下代码获取订单

  int PrevTotal;
  ulong OrderTickets[];
  do
  {
    PrevTotal=OrdersTotal();
    for(int i=PrevTotal-1;i>=0;--i)
    {
      int Total=OrdersTotal();
      if(Total!=PrevTotal)
      {
        PrevTotal=Total;
        i=PrevTotal;
        ArrayFree(OrderTickets);
        continue;
      }
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES) || OrderMagicNumber()!=inTradeMagic)
        continue;

      ArrayResize(OrderTickets,ArraySize(OrderTickets)+1);
      OrderTickets[ArraySize(OrderTickets)-1]=OrderTicket();
    }
  }while(PrevTotal!=OrdersTotal());

因此我插入了一个检查,以防在枚举过程中数量发生变化。但似乎没有。这是一个错误,还是一个功能,或者我进入了一个未完成的领域?

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...