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

 

新文章 MetaTrader 5 中的订单、持仓和成交已发布:

不理解 MetaTrader 5 交易系统的机制,就不能创建一个强大的交易机器人。客户端从交易服务器接收有关持仓、订单和成交的信息。要使用 MQL5 正确处理这些数据,必须充分理解 MQL5程序和客户端之间的相互作用。

作者:MetaQuotes Software Corp.

 

经过阅读,我还没有找到这个问题的最佳答案

例如,如何在缓存中只加载历史上的最后一个订单(为了使任务复杂化,让最后一个订单用符号表示)。

例如,顾问有不同的下单频率。它可以每天下 30 个订单,也可以几天或几周 "保持沉默"。

在向服务器发送订单后,可以在某处记住订单的票据,然后通过票据检索订单--这没有问题。可以在全局变量 和 EA 逻辑中进行记忆。但问题就在这里,例如,如果智能交易系统从另一个终端连接到账户,却没有最后一个订单的票据。

我必须通过HistorySelect 来加载历史记录。结束日期或多或少比较清楚,但如何计算初始日期呢?

因为即使在很小的范围内也会有几个订单--这不是问题,但在加载不必要的数据方面并不理想。或者其中没有一个不在这个范围内。

您可以使用更小的日期范围并循环(将范围转移到历史记录中)来填充缓存 - 从工作逻辑上来说这不是最佳选择 - 额外的循环、对历史数据库的查询。

建议--按订单/交易按工具组织加载必要的数量。

还有:如果文章的目的是展示访问订单/交易/头寸的最佳算法。我认为:如果我们在优化方面更进一步,最好能有一种按字段将历史数据加载到缓存中的模式,例如,只需要票据和向服务器发送订单的时间,为什么还要将此范围内的所有其他数据加载到这些订单中(魔力、评论等)。

select * from HistiryOrder where a_date_send>@datestart and a_date_send<@dateend

对于那些开发 DBMS 应用程序的人来说,我认为这样的查询不会被批准用于生产。诚然,在某些情况下,所有数据都会进一步参与某些操作,但这只是例外情况,而不是规则。


 
olyakish:

经过阅读,我还没有找到这个问题的最佳答案

例如,如何在缓存中只加载历史上的最后一个订单(为了使任务复杂化,让最后一个订单用符号表示)。

例如,顾问有不同的下单频率。它可以每天下 30 个订单,也可以几天或几周 "保持沉默"。

在向服务器发送订单后,可以在某处记住订单的票据,然后通过票据检索订单--这没有问题。可以在全局变量 和 EA 逻辑中进行记忆。但问题就在这里,例如,如果智能交易系统从另一个终端连接到账户,却没有最后一个订单的票据。

我必须通过HistorySelect 来加载历史记录。结束日期或多或少比较清楚,但如何计算初始日期呢?

因为即使在很小的范围内也会有几个订单--这不是问题,但在加载不必要的数据方面并不理想。或者其中没有一个不在这个范围内。

您可以使用更小的日期范围并循环(将范围转移到历史记录中)来填充缓存 - 从工作逻辑的角度来看这并不是最佳选择 - 额外的循环、对历史数据库的查询。

建议--按订单/交易按工具组织加载必要的数量。

还有:如果文章的目的是展示访问订单/交易/头寸的最佳算法。我认为:如果我们在优化方面更进一步,最好能有一种按字段将历史数据加载到缓存中的模式,例如,只需要票据和向服务器发送订单的时间,为什么还要将此范围内的所有其他数据加载到这些订单中(魔力、评论等)。

select * from HistiryOrder where a_date_send>@datestart and a_date_send<@dateend

对于那些开发 DBMS 应用程序的人来说,我认为这样的查询不会被批准用于生产。诚然,在某些情况下,所有数据都会进一步参与某些操作,但这只是例外情况,而不是规则。


即使是非常庞大的历史数据,加载和处理也不会花费太多时间。另外,如果每次运行都要进行这种加载,就已经很麻烦了。

即使是非常大的历史记录,也会在几秒钟内处理完毕。因此,第一个结论是减少完全加载的次数。

在 OnInit() 中开始完全加载历史记录。记住必要的日期。然后就可以在 OnTicket() 中 "像吉普赛人与太阳 "一样编故事了。

[删除]  
Urain:

即使加载和处理非常大的历史记录也不会花费太多时间。另一个问题是,如果每次运行都要加载历史记录,那就很麻烦了。

即使是非常大的历史记录,也会在几秒钟内处理完毕。因此,第一个结论就是减少完全加载的次数。

在 OnInit() 中开始完全加载历史记录。记住必要的日期。之后,就可以在 OnTicket() 中 "像吉普赛人一样 "编织故事了。

更具体地说,只有在初始化模块和周末才应完全加载历史记录(周末还应优化参数)。

 

让我感到困惑的是,文本中包含了大量关于需要谨慎(深思熟虑)地将历史记录加载到缓存中的警告,但却没有真正的示例来说明如何执行这项任务。坦率地说,这让我感到不安:

//--- 将初始边界设置为 3 天前
   datetime start=end-3*PeriodSeconds(PERIOD_D1);

这种代码(方法)真的会用于任何普通的智能交易系统吗?除非我们谈论的是一项特定的简单任务(例如,查找几天内的订单),然后--有保留地(在本例中,周末未考虑在内,因此代码不适合处理几个交易日 )--该方法经不起任何批评。

尽管有各种工具来实现经济装载。而且,就我而言,文章中应该有这种实现的例子。

例如,使用此模板:

  1. OnInit() - 将整个历史记录加载到缓存中,搜索对智能交易系统有意义的最后一个订单(例如,按 meijik 或仅按工具),将其时间保存到变量中。
  2. OnTrade() - 更新加载到缓存中的历史记录(从记忆的时间开始),更新最后一个订单的时间(如果出现了新的重要订单)。
  3. OnTick() - 使用当前加载的缓存,或在必要时从记忆时间开始加载缓存。

这种方法具有稳定性和通用性。此外,就资源利用率 而言,它可能比 "选择最近 3 天 "更经济。


无论如何,再次感谢你的文章。这种 "开发人员的规范 "是必要的,否则就不会有正常的代码。

 

文章给出了一个加载一天交易历史记录的例子(有一个代码给出了加载 3 天历史记录的例子)。是的,这是一个局限性,这个例子并不具有普遍性。但如果读者在阅读文章时理解了这一特殊性,他/她就能自己决定问题--他/她需要在什么时间 间隔内、从什么时候 开始将交易历史记录 加载 到缓存中。

读者已经获得了最简单的示例和算法,现在可以独立地将它们应用到必要的事件处理功能 中。他可以独立创建自己的交易历史库,并完成初始化和同步等工作。

如果要为所有情况下的交易历史最佳工作提供具体方法和功能,至少还需要一篇文章。更确切地说,不是例子本身,而是解决某些任务的方法。这篇文章的目的是了解交易函数是如何工作的,以及应该注意哪些细微差别,从而避免浪费自己的研究时间。

我相信,读完这篇文章,一切都会变得简单。

 

您能告诉我是否有关于 OfLine 模式下终端操作的说明吗?问题是,由于图表数据没有更新,我无法加载终端。我想在工作时测试(那里没有互联网),但我做不到:图表正在等待更新,测试器中没有一个符号。文章说,启动终端后,会与服务器进行数据同步。但如果没有连接(实际上不应该有连接),会发生什么情况呢?也许应该明确告诉终端,它应该在 OfLine 中工作,而不是转动这个不幸的轮子。也许这样就能减少测试人员的工作失败。公平地说,我已经很久没有遇到过这个问题了,但论坛上却有人抱怨。也许有一些小窍门(嗯,有一些文件可以删除)可以解决这种情况(我试过--在我与家里的服务器建立连接之前没有任何帮助)。

Документация по MQL5: Получение рыночной информации / SymbolIsSynchronized
Документация по MQL5: Получение рыночной информации / SymbolIsSynchronized
  • www.mql5.com
Получение рыночной информации / SymbolIsSynchronized - Документация по MQL5
 

将终端目录转移到新设备后,部分配置数据库(符号、账户设置、交易历史记录 等)会被特别删除,因为它们是通过硬连接密钥加密的。图表历史记录不受影响。

这意味着迁移后,您需要至少连接一次任何交易账户,让终端调整市场环境。之后,您可以删除密码,断开网络连接,离线使用测试仪。

 
Renat:

将终端目录转移到新设备后,部分配置数据库(符号、账户设置、交易历史记录等)会被特别删除,因为它们是通过硬连接密钥加密的。图表历史记录不受影响。

这意味着迁移后,您需要至少连接一次任何交易账户,让终端调整市场环境。之后,您可以删除密码,断开网络连接,离线使用测试仪。


我没有移动或更改任何东西。我只是带着笔记本电脑来上班,想测试一下智能交易系统。我只有一个账户,自然也尝试过登录,但日志显示与服务器没有连接。也许只是随机故障,但我什么也做不了。

 
Erm955:

我没有移动或更改任何东西。我只是带着笔记本电脑来上班,想测试一下 EA。我有一个账户,自然也尝试过登录,但日志显示与服务器没有连接。也许只是随机故障,但我什么也做不了。

请提供整个终端窗口的完整截图,包括所有 Market Watch、图表和测试区。

尝试连接到家里的账户,完全抽出数据并至少运行一次测试。然后断开网络连接,重启终端,再试一次。

 
Renat:

请提供整个终端窗口的完整截图,包括所有 Market Watch、图表和测试区。

尝试在家中连接账户,完全下载数据并至少运行一次测试。然后断开网络连接,重启终端,再试一次。

这不需要做任何事情,因为一切正常。显然,这是一次意外故障。之前终端要求授权,现在不需要授权就能启动。在重启和不重启电脑的情况下检查了大约 10 次。一切正常,谢谢。