程序库: MT4Orders - 页 7

 
Maxim Dmitrievsky:
总的来说,我想明白了--服务器并不总是返回正确的值,因此会出现混杂的情况,而且没有办法解决,只能手动更改填充类型。论坛上已经有人遇到过类似的问题。

感谢您发现错误!

要解决这个问题,只要代码中有这两行。

      if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
        Request.type_filling = ORDER_FILLING_RETURN;

添加两行,使其看起来像这样

      if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
        Request.type_filling = ORDER_FILLING_RETURN;
      else if ((::SymbolInfoInteger(Request.symbol,SYMBOL_FILLING_MODE) & SYMBOL_FILLING_IOC) == SYMBOL_FILLING_IOC)
        Request.type_filling = ORDER_FILLING_IOC;
 
fxsaber:

感谢您发现错误!

要解决这个问题,请在代码中这两行的位置

      if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
        Request.type_filling = ORDER_FILLING_RETURN;

再添加两行,使其看起来像这样

      if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Request.symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
        Request.type_filling = ORDER_FILLING_RETURN;
      else if ((::SymbolInfoInteger(Request.symbol,SYMBOL_FILLING_MODE) & SYMBOL_FILLING_IOC) == SYMBOL_FILLING_IOC)
        Request.type_filling = ORDER_FILLING_IOC;

那里的问题是不同的,在执行的侯爵填充 IOC:)和服务器返回 REQUEST 的请求,即在服务器问题的水平,它不是以任何方式跟踪,把只在设置的专家 独立更改的能力,如果它不工作

虽然......它的工作原理...谢谢,但执行写 MARKET 在日志中,而不是 EXCHANGE,似乎一切都混在那里......或在我的头上)。

 
fxsaber:
在实际交易中缓存的意义何在?您在 MT4 中缓存过历史记录吗?在性能很重要的情况下需要加速 - 测试人员。

现实生活中可能也需要性能。我们没有这样的专家,但这并不否认潜在的需求。

我不明白的是,为什么有人说测试人员可以做缓存,而现实生活中却不可能。怎么会不可能 呢?算法应该是一样的,而且在测试版和实际版中都应该有效。

 
Stanislav Korotky:

在现实世界中可能需要性能。虽然我们没有这样的专家,但这并不妨碍潜在的需求。

我再也不明白为什么有人说测试人员可以做缓存,而现实中却不可能。怎么会不可能 呢?算法应该是一样的,而且在测试版和真实版中都能运行。

因为现实中的缓存数据在某些时候可能不再与历史记录一致--经纪人会手动更正。但在测试器中,没有人会动自己的手。此外,即使没有经纪人的修正,真实市场中也会出现问题。因为你可以发送两个异步请求,并从第一个请求中得到响应--历史记录已被缓存,然后从第二个请求中得到响应,它将比前一个请求更早进入历史记录表--历史记录发生变化。这就是为什么缓存并不是真正的好东西。

对于测试人员来说,缓存的制作非常简单,只是手还没有到。不过,以下工作已经完成(未发布)

// 10.11.2016:
// 添加:订单发送与交易环境(实时和历史)完全同步--与 MT4 相同。
// 修复:正确设置填充标志。

这意味着 OrderSend 可以保证在最短时间内与交易环境同步。

论坛上有些人抱怨说,在 MT5-OrderSend BUY 之后,他们无法读取未结头寸的参数 - 交易环境滞后 ~1 毫秒。现在,如果您使用该库,就不会再有类似问题了。它可能是迄今为止唯一能做到这一点的公共库。

例如

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

如何在 MT5 中使用 OrderSend 正常工作

fxsaber, 2016.11.10 10:00 AM

如何在不开仓的情况下知道该工具的佣金大小?

fxsaber, 2016.11.08 20:30

#include <MT4Orders.mqh>

void OnStart()
{
  const int Ticket = OrderSend(_SymbolOP_BUY1SymbolInfoDouble(_SymbolSYMBOL_ASK), 000);
  
  OrderClose(Ticket, 0.3SymbolInfoDouble(_SymbolSYMBOL_BID), 0clrNONE);

  Sleep(1000); // 等待更新历史记录
  
  if (OrderSelect(Ticket, SELECT_BY_TICKET))
    Alert(OrderCommission());
}

可能,这样的例子只是说明性的。

如果不做 Sleep,经常会出现这样的情况:在 OrderClose 之后,历史记录还来不及更新,OrderCommission 返回的值就好像没有进行 OrderClose。

请注意,这是一个脚本,不可能有任何事件。唯一的出路就是愚蠢的 Sleep。

如果用 SB 重写这个脚本,什么都不会改变。

现在不会再有未定义延迟的愚蠢滑动了。同样的 SB 不知道如何做到这一点。

当我为测试人员加速历史记录时,我将把它提交发表。

 

一经版主核实,即可更新

// 13.11.2016:
// 添加:订单发送、订单修改、订单关闭、订单删除与交易环境(实时和历史)完全同步--与 MT4 相同。
// 最大同步时间可通过 MT4ORDERS::OrderSend_MaxPause 设置,单位为 µs。MT5 的平均同步时间为 ~1 ms。

// 默认情况下,最大同步时间等于一秒。MT4ORDERS::OrderSend_MaxPause = 0 - 不同步。
// 添加:由于 SlipPage 参数(OrderSend、OrderClose)仅在即时模式下影响市场订单的执行、
// 现在可以设置余额的执行类型 - ENUM_ORDER_TYPE_FILLING:
// ORDER_FILLING_FOK、ORDER_FILLING_IOC 或 ORDER_FILLING_RETURN。
// 如果赋值错误或符号不支持指定的执行类型,将自动选择运行模式。
// 示例:
// OrderSend(Symb, Type, Lots, Price, ORDER_FILLING_FOK, SL, TP) - 发送执行类型为 ORDER_FILLING_FOK 的相应订单
// OrderSend(Symb, Type, Lots, Price, ORDER_FILLING_IOC, SL, TP) - 发送执行类型为 ORDER_FILLING_IOC 的相应订单
// OrderClose(Ticket, Lots, Price, ORDER_FILLING_RETURN) - 发送执行类型为 ORDER_FILLING_RETURN 的相应市场订单
// 添加:OrdersHistoryTotal() 和 OrderSelect(Pos, SELECT_BY_POS, MODE_HISTORY) 被缓存--它们会尽可能快地运行。
//程序库中已经没有慢速实现了

只剩两步即可完全完成,并明确优于 SB。

// 没有实现的东西:
//CloseBy 时刻--我还没有时间这样做。也许将来需要的时候会有时间。
// 确定平仓头寸的 TP 和 SL - 目前(版本 1470),MQL5 不知道如何做到这一点。
//DEAL_ENTRY_INOUT 和 DEAL_ENTRY_OUT_BY 交易的会计处理。

目前,MT4Orders 允许您在净额结算账户(证券交易所)上做任何事情,除了读取DEAL_ENTRY_INOUT 交易的 历史记录。在对冲账户上,除了 closeBy 时刻,您还可以进行其他所有操作。

与 SB 相比的优势

  • MQL4 语法。读写交易逻辑最快。快速传输 MT4 交易和统计代码。
  • 部分平仓的可能性。
  • 所有订单功能与交易环境同步。
  • 方便的 ORDER_FILLING_* 分配,保证交易订单中 Request.filling 字段分配的正确性。
  • 缓存交易历史 - 加快操作速度。
不排除在相同的 MQL4 语法中添加异步订单函数(OrderSendAsync、OrderCloseAsync、OrderDeleteAsync 和 OrderModifyAsync)。
 
fxsaber:

一经版主核实,即可更新

你做得很好!期待更新!

而且,真的希望在不久的将来能实现 CloseBy!

 
fxsaber:

一经版主核实,即可更新

可用。

与 SB 相比的优势

  • 所有订单功能与交易环境同步。
为了理解这一点的重要性,以下是一个代码示例,其在 MT5 上的执行现在将与 MT4完全一致

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

如何在 MT5 中使用 OrderSend 正常工作

fxsaber, 2016.11.15 14:14

尝试在您的 EA 中编写以下函数

  1. i = 0.
  2. 在符号[i]上建仓。
  3. 如果 i++ >= 5 - 退出。
  4. 如果新仓位没有滑点,则返回第 2 步。 如果有滑点,则退出。
// MQL4&5 代码

#property strict

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

void Func( const string &Symbols[] )
{
  const int Total = ArraySize(Symbols);
  
  for (int i = 0; i < Total; i++)
  {
    const double Price = SymbolInfoDouble(Symbols[i], SYMBOL_ASK);
    const int digits = (int)SymbolInfoInteger(Symbols[i], SYMBOL_DIGITS);
    
    if (!OrderSelect(OrderSend(Symbols[i], OP_BUY, 1, Price, 100, 0, 0, DoubleToString(Price, digits)), SELECT_BY_TICKET) ||
        (NormalizeDouble(Price - OrderOpenPrice(), digits) != 0)) // 如果开仓失败或出现滑点 - 退出。
      break;
  }
}

void OnStart() // OnTick
{
  const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDCAD", "USDJPY"};
  
  Func(Symbols);
}

以 SB 或纯 MQL5 为例,在 MT5 上编写这样一个简单的交易逻辑是非常困难的。在 MT4 上总是能顺利完成的工作,在 MT5 上却很难顺利实现。该库允许您以与 MT4 相同的方式来实现。无需研究该库的语法及其功能 - 其行为与 MT4 相同,语法与 MQL4 相同。

熟悉一下将 MT4-advisors 移植到五种模式(通过 SB)下的结果可能会有所帮助,这样您就可以评估哪种模式更适合您实现相同的交易逻辑。

 
当然,还有因果报应!))
 
在新文件中,由于某种原因,换行符只有一个 CR 字符(显然来自 Mac),这与其他来源的文件不同。
 
Stanislav Korotky:
在新文件中,由于某种原因换行时会出现一个 CR 字符(显然来自 Mac),这与其他来源的文件不同。

我是个弱用户(而且只是 vinda 用户),所以我也不知道是怎么回事。我发现大多数字符串都 以两个字节 0x0D 结尾。还有 0x0D 0x0A。还有一个 - 0x0D。

所有编辑器都能正常显示源代码,所以我认为这不会造成干扰。