Торговый запрос проходит несколько стадий проверок на торговом сервере. В первую очередь проверяется корректность заполнения всех необходимых полей параметра , и при отсутствии ошибок сервер принимает ордер для дальнейшей обработки. При успешном принятии ордера торговым сервером функция OrderSend() возвращает значение true. Рекомендуется...
请告诉我,如果OrderSend 函数 返回 true,并且 result.order 有订单票据(result.order!=0),是否保证该订单已被经纪商接受并出现在交易标签中,还是在此阶段,请求仅被经纪商的服务器接受,而不被交易所接受?
第二个问题,会不会出现 OrderSend 返回 true 但 result.order==0 的情况?
请问,如果OrderSend 函数 返回 true 且 result.order 有订单票据(result.order!=0),是否能保证经纪商接受该订单并将其显示在交易标签中,还是在此阶段,只有经纪商的服务器接受请求,交易所不接受请求?
保证。
第二个问题,会不会出现 OrderSend 返回 true 但 result.order==0 的情况?
不会。
保证。
没有。
就在前几天,他们增加了对OrderSend 功能 的说明,请参见在线帮助。
就在前几天,他们增加了对OrderSend 功能 的说明,请查看在线帮助。
这是否适用于市场订单?
每个已接受的订单 都会存储在交易服务器上等待处理,直到其执行条件之一出现:
交易、自动交易系统和交易策略测试论坛
在交易环境中工作时的典型错误和消除错误的方法
fxsaber, 2018.02.20 12:23 pm.
执行标准 OrderSend 的条件方案(无超时)从该方案中我们可以清楚地看到,当在同一个 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) 策略测试器
所有字段都在这里填写:
是什么导致了这种差异?
下午好,发现 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 (如有必要),这些代码可在返回的结果结构 中找到。
感谢您提供如此翔实的文章。@MetaQuotes
询问:我怎样才能在一个 for() 循环中集体循环:未结订单和未结头寸(类似于我们在 MQL4 中循环所有订单,然后检查订单是否已执行或是否为挂单的方式)?
感谢您提供如此翔实的文章。@MetaQuotes
询问:我怎样才能在一个 for() 循环中集体循环:未结订单和未结头寸(类似于我们在 MQL4 中循环所有订单,然后检查订单是否已执行或是否为挂单的方式)?
要计算 POSITIONS 和 PENDING ORDERS,必须使用两个独立的循环。一个循环枚举 POSITIONS,第二个循环枚举 PENDED ORDERS。示例:计算仓位和挂单
我知道你并不担心那些刚开始学习 mql5 语言的人,但考虑到你有一个强大的社区,尽管有很多批评意见,这里还是要多说一句:
翻译和文本措辞本身就妨碍了理解......我捏了一把汗,我不得不走很远的路才能找到谁应该排在前面,因为文档本身在文本中就自相矛盾:
要从历史记录中获取订单信息,首先需要使用以下三个函数之一创建订单历史记录缓存:HistorySelect(start,end)、HistorySelectByPosition() 或 HistoryOrderSelect(ticket)。如果执行成功,缓存将存储HistoryOrdersTotal() 函数返回的订单数量。通过票据中的每个元素,使用相应函数访问这些订单的属性:
与此相反: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() 这三个函数中的一个...
下午好,
,请问开发人员:能否告诉我历史记录缓存大约需要多少内存?
我在有少量历史记录的终端上运行了脚本,得到了这样的结果:
这意味着,如果历史记录有几百万笔交易和一百万个订单,缓存将占用大约一千兆字节?
每个 mql 程序也是如此吗?