程序库: MT4Orders - 页 3

 
Alexey Volchanskiy:

wo,fxsaber 对只有我一个人注意到这个错误很不高兴,所以大家都不需要 lib ))。只是我们的人观察力很强。

生活中的一则轶事--我在主持网络研讨会时,重复了 10 次 "将有录音"。最后我又说,明天就会有录音,如果你们有问题,请提出来。现在猜第一个问题 ))))

然后读 A.加利奇"我是如何在捍卫和平的集会上发言的》。(希望我没记错标题)。
 
// 更改列表:
// 03.08.2016:
// 发布 - 仅在离线测试仪上编写和测试。
// 29.09.2016:
// 添加:在交易所(SYMBOL_TRADE_EXECUTION_EXCHANGE)上工作的可能性。请注意,交易所是 Netto(非对冲)模式。
// 添加:要求 "如果有 #include <Trade/Trade.mqh>,请在其后插入此行"。
// 替换为 "如果有 #include <Expert/Expert.mqh>,请在后面插入此行"。
// 修复:市场订单的订单发送会返回票据仓位,而不是交易。
 
库中未实现此行为

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

如何在 MT5 中正确使用订单发送功能

fxsaber, 2016.10.13 07:10

自行编写的非常简单的 OrderSend 重载:在 OnTrade 返回响应之前,所有后续 OrderSend 均返回 false。当收到回复时,强制 false 将被取消。

ZY 如果您希望功能齐全(不适合 SB),请在相应同步到达时独立调用 OnTrade OnTick 和 OnTimer。

在使用常用的 MT4 订单函数:OrderSend(发送订单)、OrderModify(修改订单)、OrderClose(关闭订单)、OrderDelete(删除订单)时,请考虑 MT5 的这种情况。

您可以使用报价中的算法,在 MT5 交易订单后添加有保证的历史同步(与 MT4 相同)。

[删除]  
这个想法很有趣。但是,在 MT5 上转换 MT4 Expert Advisor 运行缓慢
 
Aliaksandr Kryvanos:
这个想法很有趣。然而,在 MT5 上转换 MT4 Expert Advisor 运行缓慢

只有OrderSelect(index,SELECT_BY_POS, MODE_HISTORY) 的执行速度较慢。速度可以更快,但这样就无法对历史记录进行特定排序,而 MT4 中就有这种功能,有些人也在使用。如果不使用,该模式的运行速度也不会比 MT4 慢。其他一切肯定都不会慢。因此,如果您不使用上述订单选择模式,请在 MT4Orders 之外寻找制动器。

至于时间序列和其他东西,描述中强调了这一主题 - 并未触及。您很有可能在那里发现了制动器。

 
MT5 1455 版本中存在一个错误

ENUM_ORDER_TYPE_FILLING::ORDER_FILLING_RETURN

因此,如果在OrderModify中通过COrderInfo::TypeFilling()设置填充,那么在同一个RoboForexEU-MetaTrader 5上会出现逻辑错误[不支持填充模式]。然而,在 MetaQuotes-Demo 上却不会出现此错误 - 是否开发人员的服务器设置错误?


在某些交易服务器上,当尝试通过 "订单修改"(OrderModify)修改挂单时,这可能会导致[不支持填写模式]错误。

如果您遇到了这个问题,可以通过以下方法绕过此错误

  1. 找到 MT4Orders.mqh 中的一行
          Request.type_filling = (ENUM_ORDER_TYPE_FILLING)::OrderGetInteger(ORDER_TYPE_FILLING);

  2. 用以下行代替
          Request.symbol = ::OrderGetString(ORDER_SYMBOL);
          
          // https://www.mql5.com/ru/forum/1111/page1759#comment_2906850
          if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)      
            Request.type_filling = (ENUM_ORDER_TYPE_FILLING)::OrderGetInteger(ORDER_TYPE_FILLING);

 
标准 MT5 库 VS 跨平台 MT4-OSS

标准库 并编写了测试 EA

#define SLTP (10 * _Point)

#include <Trade\Trade.mqh>;
#include <Trade\OrderInfo.mqh>

// 通过 MT5 标准库 - 仅限 MT5
// 设置卖出限价,然后设置其 SL/TP
void MT5Order( const double Price )
{
  CTrade Trade;
  
  if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
    Trade.SetTypeFilling(ORDER_FILLING_RETURN);

  Trade.OrderOpen(_Symbol, ORDER_TYPE_SELL_LIMIT, 1, 0, Price, 0, 0, ORDER_TIME_GTC, 0, __FUNCTION__);

  const ulong Ticket = Trade.ResultOrder();
  
  if (Ticket > 0)
  {
    COrderInfo Order;
    
    if (Order.Select(Ticket))
      Trade.OrderModify(Order.Ticket(), Order.PriceOpen(), Order.PriceOpen() + SLTP, Order.PriceOpen() - SLTP, Order.TypeTime(), Order.TimeExpiration());
  }      
}

#include <MT4Orders.mqh> //https://www.mql5.com/zh/code/16006

// 通过 MT4-OSJS - 跨平台变体(MT4/5)
// 设置卖出限价,然后设置其 SL/TP
void MT4Order( const double Price )
{
  const int Ticket = OrderSend(_Symbol, OP_SELLLIMIT, 1, Price, 0, 0, 0, __FUNCTION__);
  
  if ((Ticket > 0) && OrderSelect(Ticket, SELECT_BY_TICKET))
    OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + SLTP, OrderOpenPrice() - SLTP, OrderExpiration(), clrNONE);
}

void OnTick()
{
  static bool FirstRun = true;
  
  if (FirstRun)
  {
    const double Price = SymbolInfoDouble(_Symbol, SYMBOL_BID) + 100 * _Point;
    
    MT5Order(Price); // 通过 MT5 标准库 - 仅限 MT5
    MT4Order(Price); // 通过 MT4-OSJS - 跨平台变体(MT4/5)
    
    FirstRun = false;
  }
}

您可以比较 MT4Order 和 MT5Order 函数的代码。


[删除]  
是的,您说得没错,性能缓慢是由于 OrdersHistoryTotal() 造成的。
 
Aliaksandr Kryvanos:
是的,你说得对,工作速度慢是由于 OrdersHistoryTotal() 函数造成的。

也许值得为这个函数制作一个更快的版本。运行速度不会太慢,但不是 100% 符合 MT4 标准。

现在看了一下代码。有几种方法可以加快速度。例如,在测试版中,您可以不考虑与 MT5 历史同步的问题,因为在测试版中一切都很简单。

但说实话,无论是在测试版还是在实际交易中,我都从未遇到过 TS 需要分析历史记录的任务。

因此,我怀疑自己是否会进行这样的加速。

 
fxsaber:

或许值得为该功能制作一个更快的版本。可以立即运行,但不是 100% 符合 MT4 标准。

我现在看了一下代码。有几种方法可以加快速度。例如,在测试版中,您可以不考虑与 MT5 历史记录同步的问题,因为在测试版中一切都很简单。

但老实说,无论是在测试版还是在实际交易中,我都从未遇到过 TS 需要分析历史记录的任务。

这就是为什么我怀疑自己是否会进行这样的加速。

我使用历史分析,我的 MM 意味着交易情况,在此期间会进行平仓和开仓,并使用情况开始时的财务结果来考虑风险。

在这种情况下,我们可以想象一个趋势的确定--其发展直到其完成的工作是不同的--开仓和平仓,但重要的是要知道你能冒什么风险,因为趋势运行的时间越长,其完成的可能性就越大--因此开仓订单和退出点的数量不同。