文章 "MetaTrader 5 中的订单、持仓和成交" - 页 4

 

请告诉我,如果OrderSend 函数 返回 true,并且 result.order 有订单票据(result.order!=0),是否保证该订单已被经纪商接受并出现在交易标签中,还是在此阶段,请求仅被经纪商的服务器接受,而不被交易所接受?

第二个问题,会不会出现 OrderSend 返回 true 但 result.order==0 的情况?

 
Aleksey Gunin:

请问,如果OrderSend 函数 返回 true 且 result.order 有订单票据(result.order!=0),是否能保证经纪商接受该订单并将其显示在交易标签中,还是在此阶段,只有经纪商的服务器接受请求,交易所不接受请求?

保证。

第二个问题,会不会出现 OrderSend 返回 true 但 result.order==0 的情况?

不会。

 
fxsaber:

保证。

没有。

就在前几天,他们增加了对OrderSend 功能 的说明,请参见在线帮助。

 
Rashid Umarov:

就在前几天,他们增加了对OrderSend 功能 的说明,请查看在线帮助。

这是否适用于市场订单?

每个已接受的订单 都会存储在交易服务器上等待处理,直到其执行条件之一出现:

  • 到期、
  • 出现反向请求
  • 收到执行价格时触发订单、
  • 收到取消订单的请求
没有规定终端本身总是在 OrderSendAsync 之前调用 OrderCheck,而 OrderSend 是 OrderSendAsync 的附加功能。

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

在交易环境中工作时的典型错误和消除错误的方法

fxsaber, 2018.02.20 12:23 pm.

执行标准 OrderSend 的条件方案(无超时)
static MqlTradeResult LastResult = {0};

void OnTradeTransaction( const MqlTradeTransaction&, const MqlTradeRequest&, const MqlTradeResult &Result )
{ 
  LastResult = Result;
}

// 实现标准订单发送的条件算法
bool OrderSend( const MqlTradeRequest &Request, MqlTradeResult &Result )
{  
  bool Res = OrderSendAsync(Request, Result);
  
  if (Res)
  {
    while (LastResult.request_id != Result.request_id)
      OnTradeTransaction(); // 原理图调用
          
    Result = LastResult;    
    Res = (Result.retcode == TRADE_RETCODE_PLACED) ||
          (Result.retcode == TRADE_RETCODE_DONE) ||
          (Result.retcode == TRADE_RETCODE_DONE_PARTIAL);

    LastResult.request_id = 0;
  }
    
  return(Res);
}


从该方案中我们可以清楚地看到,当在同一个 MetaQuotes-Demo 上通过 OrderSendAsync 下达市场订单时,不可能保证捕捉到下达相应订单的事件,直到订单被执行或拒绝。也就是说,MT5 没有任何简单的机制来评估 OrderSendAsync 的中间结果。


OrderSend 一直执行到 Result.request_id 等于 OnTradeTransaction 中 OrderSendAsync 的相同值。或者超时终止。因此,OrderSend 的结果只取决于 OnTradeTransaction 中具有相应 request_id 的消息类型。

如果能了解 request_id 本身的形成过程,将非常有用。如果我理解正确的话,它是一个从启动/连接终端/账户时起发送到交易服务器的订单计数器。终端本身会分析从交易服务器发送的信息,并将所需的 request_id 分配给其中一个(这一点值得怀疑),或将 request_id 重置为某个信息(最有可能)。这种行为使得竞价历史记录与订单发送输出相匹配成为可能。但由于在 OnTradeTransaction 中只有一条消息可以看到正确的 request_id,因此出现了上面引文中令人不快的异步情况。

 

下午好,我发现 MqlTradeResult.deal 和 MqlTradeResult.order 有不一致的地方。

1) 说明(MQL5 参考手册)


2) 实时交易

我下市场订单 (TRADE_ACTION_DEAL)。我使用 Print 函数输出 MqlTradeResult 值:


交易出现在日志中:

我尝试使用 Sleep 函数 "沉睡 "几秒钟,然后再次输出数据(此时交易已经准确完成,头寸也未平仓),但交易数量没有出现。


3) 策略测试器

所有字段都在这里填写:



是什么导致了这种差异?

 
Konstantin Kulikov:

下午好,发现 MqlTradeResult.deal 和 MqlTradeResult.order 有不一致的地方。




https://www.mql5.com/zh/docs/trading/ordersend

发送市场订单(MqlTradeRequest.action=TRADE_ACTION_DEAL)时,OrderSend()函数的成功结果并不意味着订单已执行(相应的交易已执行):在这种情况下,true 仅表示订单已成功放入交易系统供进一步执行。交易服务器可在返回的 结果 结构 填写 交易订单 字段的值, 前提是在形成 OrderSend() 调用的响应时已知这些数据。 一般来说,订单对应的交易执行事件可能会在订单发送(OrderSend())调用响应发送后发生。因此,对于任何类型的交易请求,在接收订单发送(OrderSend())执行结果时,必须首先检查交易服务器返回代码 retcode 和外部交易系统响应代码 retcode_external (如有必要),这些代码可在返回的结果结构 中找到


Документация по MQL5: Торговые функции / OrderSend
Документация по MQL5: Торговые функции / OrderSend
  • www.mql5.com
Торговый запрос проходит несколько стадий проверок на торговом сервере. В первую очередь проверяется корректность заполнения всех необходимых полей параметра , и при отсутствии ошибок сервер принимает ордер для дальнейшей обработки. При успешном принятии ордера торговым сервером функция OrderSend() возвращает значение true. Рекомендуется...
 

感谢您提供如此翔实的文章。@MetaQuotes

询问:我怎样才能在一个 for() 循环中集体循环:未结订单和未结头寸(类似于我们在 MQL4 中循环所有订单,然后检查订单是否已执行或是否为挂单的方式)?

 
Rahul Dhangar :

感谢您提供如此翔实的文章。@MetaQuotes

询问:我怎样才能在一个 for() 循环中集体循环:未结订单和未结头寸(类似于我们在 MQL4 中循环所有订单,然后检查订单是否已执行或是否为挂单的方式)?

要计算 POSITIONS 和 PENDING ORDERS,必须使用两个独立的循环。一个循环枚举 POSITIONS,第二个循环枚举 PENDED ORDERS。示例:计算仓位和挂单

How to start with MQL5
How to start with MQL5
  • 2020.12.19
  • www.mql5.com
This thread discusses MQL5 code examples. There will be examples of how to get data from indicators, how to program advisors...
 

我知道你并不担心那些刚开始学习 mql5 语言的人,但考虑到你有一个强大的社区,尽管有很多批评意见,这里还是要多说一句:

翻译和文本措辞本身就妨碍了理解......我捏了一把汗,我不得不走很远的路才能找到谁应该排在前面,因为文档本身在文本中就自相矛盾:

  • 订单历史

    要从历史记录中获取订单信息,首先需要使用以下三个函数之一创建订单历史记录缓存:HistorySelect(start,end)、HistorySelectByPosition() 或 HistoryOrderSelect(ticket)。如果执行成功,缓存将存储HistoryOrdersTotal() 函数返回的订单数量。通过票据中的每个元素,使用相应函数访问这些订单的属性:

    1. HistoryOrderGetDouble(ticket_order, type_property)
    2. HistoryOrderGetInteger(ticket_order, type_property)
    3. HistoryOrderGetString(ticket_order, type_property)


与此相反:https://www.mql5.com/zh/docs/trading/historyorderstotal 转录如下。



历史订单总数

返回历史订单数。调用 HistoryOrdersTotal() 之前,必须先使用HistorySelect() 函数HistorySelectByPosition() 函数接收历史交易和订单。

int HistoryOrdersTotal();

返回值

值类型为

注意

不要将交易历史中的订单与工具栏 "交易 "选项卡中挂单 混淆。在客户端工具栏的 "历史 "选项卡中可以看到已取消或导致交易订单 列表。

另请参见


第一个段落自相矛盾,不需要任何帮助,但第二个段落的出现却让事情变得更加复杂....:毕竟,是 HistoryOrdersTotal 还是第二个段落中提到的 HistorySelect(start, end) HistorySelectByPosition() 或 HistoryOrderSelect(ticket) 甚至 HistorySelectByPosition( ) 这三个函数中的一个先出现呢?

这很难,本来可以更容易的......但我认为,首先想到的是第二个文本中提到的 HistorySelect(start, end) HistorySelectByPosition () 或 HistoryOrderSelect(ticket) 甚至 HistorySelectByPosition() 这三个函数中的一个...

Documentação sobre MQL5: Funções de Negociação / HistoryOrdersTotal
Documentação sobre MQL5: Funções de Negociação / HistoryOrdersTotal
  • www.mql5.com
HistoryOrdersTotal - Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 

下午好,
,请问开发人员:能否告诉我历史记录缓存大约需要多少内存?

我在有少量历史记录的终端上运行了脚本,得到了这样的结果:

void OnStart()
  {
   Print("TerminalInfoInteger(TERMINAL_MEMORY_USED) = ", TerminalInfoInteger(TERMINAL_MEMORY_USED));
   if(HistorySelect(0, INT_MAX))
     {
      Print("TerminalInfoInteger(TERMINAL_MEMORY_USED) = ", TerminalInfoInteger(TERMINAL_MEMORY_USED));
      Print("HistoryDealsTotal  = ", HistoryDealsTotal());
      Print("HistoryOrdersTotal = ", HistoryOrdersTotal());
     }
  }

2021.05.14 14:46:41.265	TestCashSize (Si-6.21,H1)	TerminalInfoInteger(TERMINAL_MEMORY_USED) = 488
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	TerminalInfoInteger(TERMINAL_MEMORY_USED) = 489
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	HistoryDealsTotal  = 1928
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	HistoryOrdersTotal = 1116

这意味着,如果历史记录有几百万笔交易和一百万个订单,缓存将占用大约一千兆字节?

每个 mql 程序也是如此吗?