感谢@ Artyom Trishkin 精彩而有用的工作,我想问一个问题;
我认为有必要保存引擎的状态,并在下一次启动脚本/顾问时加载它,以便继续捕获事件并检测顾问关闭时间的变化。
但虚拟 CObject 保存/加载函数无需任何操作即可返回 true。
问:我们应该保存哪些内容,如何访问它们?
要利用虚拟函数的优势,需要在对象继承人处实现这些函数。请参阅 "创建账户集合 "一文中的说明。在这篇文章中,每个账户对象都被写入一个文件,然后从文件中读取。
我计划逐步将存储在不同库集合中的所有对象保存到文件中。但在忙于为库编写贸易类的同时。
我在使用 ResetLastTradeEvent 时遇到了一个问题,我想在这里报告一下、
我通过获取最新事件列表来读取最新事件,检查是否有新事件;因为保存最新事件状态并在下次检查时进行比较不是好的解决方案。如果两个挂单在 不同时间发生,中间没有任何其他事件,我们就会错过第二个挂单。
因此,我检查事件,做我该做的事情,然后重置最后交易事件,寻找新值 != _NO_EVENT 。那么,问题出在哪里?
调用 LastTradeEvent 时,它返回的是 m_last_trade_event
ENUM_TRADE_EVENT LastTradeEvent(void) const { return this.m_last_trade_event; }
所以:
void ResetLastTradeEvent(void) { this.m_events.ResetLastTradeEvent(); this.m_last_trade_event = TRADE_EVENT_NO_EVENT; }
此外,我还做了一些修改,以确保 Clear() 函数在列表和数组中发挥作用。
以下是我的用例
if(engine.LastTradeEvent()!=TRADE_EVENT_NO_EVENT) { CArrayObj* list=engine.GetListAllOrdersEvents(); if(list!=NULL) { int total=list.Total(); for(int i=0; i<total ; i++){ CheckThisEvent(list.At(i)); } } //-- engine.m_events.Clear(); engine.ResetLastTradeEvent(); }
我在使用 ResetLastTradeEvent 时遇到了一个问题,我想在这里报告一下、
我通过获取最新事件列表来读取最新事件,检查是否有新事件;因为保存最新事件状态并在下次检查时进行比较不是好的解决方案。如果两个挂单在 不同时间发生,中间没有任何其他事件,我们就会错过第二个挂单。
因此,我检查事件,做我该做的事情,然后重置最后交易事件,寻找新值 != _NO_EVENT 。那么,问题出在哪里?
调用 LastTradeEvent 时返回的是 m_last_trade_event。
所以:
此外,我还做了一些修改,以确保 Clear() 函数在列表和数组中发挥作用。
以下是我的用例
Это, к сожалению, неправильное решение.m_events в публичную секцию класса?Вы очищаете весть список событий?
engine.m_events.Clear();
Тем самым вы разрушаете структуру коллекции событий.Аведь не зря же список m_events находится в приватной секции класса CEngine - к этим спискам запрещён доступ извне.
В последней версии библиотеки (статья 23), которая уже готова к выходу, возвращается флаг произошедшего торгового события в управляющую программу.И последнее событие всегда можно получить.
Ав статье 24 будет доступен список всех событий, произошедших одновременно, например - удаление множества отложенных ордеров.在此,我们建议您使用 "Каждое событие будет отображено в программе.Ик каждому из этих событий можно будет получить доступ для работы с ними.
-----------------------------------------------------
不幸的是,这是一个错误的决定。您是否已将 m_events 列表移至类的公共部分?您是否清除了事件的新闻列表?
engine.m_events.Clear();
这样就破坏了事件集合的结构。但是,m_events 列表位于 CEngine 类的私有部分并不是徒劳的--外部是禁止访问这些列表的。
在已经准备发布的最新版库(第 23 条)中,已发生交易事件的标志将返回给控制程序。最后一个事件始终可用。
而在第 24 条中,将提供同时发生的所有事件的列表,例如删除许多挂单。每个事件都将显示在程序中。可以访问每个事件,对其进行处理。
我试图通过最后一个代码块中的 for 循环来获取所有事件,我在之前的评论中已经发送了该代码块。
我从每一个新事件中获取旧事件,因此我销毁了私有事件,并将所有事件公开;这不是正确的方法,但我还是这么做了,以确保列表正在清空(使用 v13)。
感谢您对下一篇文章的改进。我会尽快检查。
Так как в статьях описываются все этапы создания библиотеки, то я, к сожалению, не счёл необходимым дать сразу полный доступ к списку торговых событий, а дал лишь доступ к последнему событию.А последнее событие всегда возвращается то, которое произошло последним - не важно когда - прямо сейчас, или час назад.Оно всё равно является последним событием, и оно же и возвращается.Ия упустил из виду, что два одинаковых события по названию, но разные по свойствам, уже потребуется кому-то получать.在此基础上,我们将继续努力,在全球范围内,为人类的生存和发展做出更大的贡献。Вклассах коллекций аккаунтов и символов уже созданы и работают методы получения всех событий аккаунта или символов, их легко получить в своих программах.在此基础上,我们还将继续努力,以确保在全球范围内,使我们的用户能够享受到更多的服务。
Кслову - это ещё не всё, что будет реализовано.Далее будут созданы методы для поиска и получения любых данных и событий в своих программах.И сделано это будет весьма удобным и наглядным способом - не нужно будет получать списки, искать и фильтровать данные, а просто вводить префикс с точкой (set、get., find.) из выпадающего списка (после точки) выбирать нужный метод.Это планировалось ещё на этапе обдумывания концепции библиотеки, но делаться всё будет только тогда, когда будет готов весь базовый функционал библиотеки.
Также будет дана возможность работать с графикой - будет полноценная графическая оболочка, знающая о всех собранных библиотекой данных.Плюс - интерактивные пользовательские графические объекты...
---------------------------------
由于文章描述了创建图书馆的所有阶段,我认为没有必要一次性提供贸易活动列表的全部访问权限,而只提供了最新活动的访问权限。而最后一个事件总是返回最后发生的事件--不管是什么时候--现在还是一小时前。它仍然是最后一个事件,而且会返回。我忽略了一个事实,那就是两个名称相同但属性不同的事件已经需要有人来接收。因此,接收交易事件并不正常。在账户和符号集合的类中,已经创建了获取账户或符号所有事件的方法,而且这些方法很容易在程序中获取。接下来的两篇文章将以完全相同的方式提供接收交易事件的机会。
顺便说一句,这还不是将要实现的全部。接下来,还将创建一些方法来搜索和检索程序中的任何数据和事件。这将以非常方便和可视化的方式实现--您无需接收列表、搜索和过滤数据,只需输入带点的前缀(set.这是在考虑图书馆概念阶段就计划好的,但一切都要等到图书馆的所有基本功能 都准备就绪后才能进行。
此外,还将提供使用图形 的机会--将有一个成熟的图形外壳,可以了解图书馆收集的所有数据。另外--交互式自定义图形对象...
我正试图通过最后一个代码块中的 for 循环获取所有事件,我已在之前的评论中发送了该代码块。
我从每一个新事件中获取旧事件,因此我销毁了私有事件,并将所有事件公开;这不是正确的方法,但我还是这么做了,以确保列表正在清空(使用 v13)。
感谢您对下一篇文章的改进。我会尽快检查。
В русском сегменте ресурса вышла статья, в которой есть доступ к последнему событию из программы...
---------------------------------------
该资源的俄语部分刊登了一篇文章,其中可以访问节目中的最后一个事件:

- www.mql5.com
谢谢 Artyom,我之前就发现了、
我觉得有一个错误:当我们在同一秒钟内打开或关闭多个交易时,它会漏掉 其中一个或只检测到其中一个;有时还会检测到两次!
让我给你看看我的日志
2019.10.14 15:58:14.489 MT4EventsEA EURUSD,M1: uninit reason 4
2019.10.14 15:57:28.424 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:22.000: 帐户余额减少 -0.75 USD (5445.52 USD)
2019.10.14 15:57:28.423 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:22.000: 保证金水平减少 -16456.49% (0.00%)
2019.10.14 15:57:27.895 MT4EventsEA EURUSD,M1:CEventsCollection::CreateNewEvent, 第 767 行:This event already in the list.
2019.10.14 15:57:27.474 MT4EventsEA EURUSD,M1: - Position closed: 2019.10.14 15:27:13.000 - EURUSD Close Buy#542264335 at price 1.10304, profit -0.14 USD
2019.10.14 15:57:27.472 MT4EventsEA EURUSD,M1: - Position closed: 2019.10.14 15:27:12.000 - EURUSD Close Buy#542264333 at price 1.10304, profit -0.14 USD
2019.10.14 15:57:19.095 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:13.000: 保证金水平减少 -32915.87% (16456.49%)
2019.10.14 15:57:18.844 MT4EventsEA EURUSD,M1: - Position opened: 2019.10.14 15:27:13.000 - EURUSD Open 0.01 Buy#542264335[0.01 Market order Buy #542264335] at price 1.10304
2019.10.14 15:57:18.002 MT4EventsEA EURUSD,M1: - Position opened: 2019.10.14 15:27:12.000 - EURUSD Open 0.01 Buy#542264333[0.01 Market order Buy #542264333] at price 1.10304
2019.10.14 15:57:17.547 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:12.000: 保证金水平增加 49372.35% (49372.35%)
2019.10.14 15:57:17.175 MT4EventsEA EURUSD,M1: - Position opened: 2019.10.14 15:27:11.000 - EURUSD Open 0.01 Buy#542264331[0.01 Market order Buy #542264331] at price 1.10301
2019.10.14 15:56:17.144 MT4EventsEA EURUSD,M1: 2019.10.14 15:26:11.000: 保证金水平减少 -12343.32% (0.00%)
2019.10.14 15:56:16.800 MT4EventsEA EURUSD,M1: - Position closed: 2019.10.14 15:22:40.000 - EURUSD Close Buy#542263747 at price 1.10301, profit -0.07 USD
2019.10.14 15:56:16.798 MT4EventsEA EURUSD,M1: - Position closed: 2019.10.14 15:22:41.000 - EURUSD Close Buy#542263749 at price 1.10301, profit -0.07 USD
2019.10.14 15:56:16.347 MT4EventsEA EURUSD,M1: - Position closed: 2019.10.14 15:22:42.000 - EURUSD Close Buy#542263753 at price 1.10304, profit -0.14 USD
2019.10.14 15:56:15.926 MT4EventsEA EURUSD,M1: - Position closed: 2019.10.14 15:22:42.000 - EURUSD Close Buy#542263753 at price 1.10304, profit -0.14 USD
2019.10.14 15:56:09.140 MT4EventsEA EURUSD,M1: 初始化
这里是 MT4 账户的交易历史:
这是我的代码:
void OnTick() { DoChecks(); } void OnTimer() { DoChecks(); } //+------------------------------------------------------------------+ //| 我的检查功能| //+------------------------------------------------------------------+ void DoChecks() { engine.OnTimer(); //\//\ 贸易活动 if(engine.LastTradeEvent()!=TRADE_EVENT_NO_EVENT) { //engine.LastTradeEvent()!=last_trade_event CArrayObj* list=engine.GetListAllOrdersEvents(); if(list!=NULL) { int total=list.Total(); for(int i=0; i<total ; i++){ CheckTradeEvent(list.At(i)); } } //-- engine.ResetLastTradeEvent(); } //\//\ 账户事件 if(engine.LastAccountEvent()!=ACCOUNT_EVENT_NO_EVENT){ CArrayInt* list=engine.GetListAccountEvents(); if(list!=NULL){ int total=list.Total(); for(int i=0;i<total;i++){ ENUM_ACCOUNT_EVENT event=(ENUM_ACCOUNT_EVENT)list.At(i); if(event==NULL){ continue; } CheckAccountEvent(event); } } //-- engine.ResetLastAccountEvent(); } }
您对此有何看法,我的执行是否有问题?
谢谢你,阿尔乔姆,我之前就发现了、
我觉得有一个错误:当我们在同一秒钟内打开或关闭多个交易时,它会漏掉 其中一个或只检测到其中一个;有时还会检测到两次!
让我给你看看我的日志
2019.10.14 15:58:14.489 MT4EventsEA EURUSD,M1: uninit reason 4
2019.10.14 15:57:28.424 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:22.000: 帐户余额减少 -0.75 USD (5445.52 USD)
2019.10.14 15:57:28.423 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:22.000: 保证金水平减少 -16456.49% (0.00%)
2019.10.14 15:57:27.895 MT4EventsEA EURUSD,M1:CEventsCollection::CreateNewEvent, 第 767 行:This event already in the list.
2019.10.14 15:57:27.474 MT4EventsEA EURUSD,M1: - Position closed: 2019.10.14 15:27:13.000 - EURUSD Close Buy#542264335 at price 1.10304, profit -0.14 USD
2019.10.14 15:57:27.472 MT4EventsEA EURUSD,M1: - Position closed: 2019.10.14 15:27:12.000 - EURUSD Close Buy#542264333 at price 1.10304, profit -0.14 USD
2019.10.14 15:57:19.095 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:13.000: 保证金水平减少 -32915.87% (16456.49%)
2019.10.14 15:57:18.844 MT4EventsEA EURUSD,M1: - Position opened: 2019.10.14 15:27:13.000 - EURUSD Open 0.01 Buy#542264335[0.01 Market order Buy #542264335] at price 1.10304
2019.10.14 15:57:18.002 MT4EventsEA EURUSD,M1: - Position opened: 2019.10.14 15:27:12.000 - EURUSD Open 0.01 Buy#542264333[0.01 Market order Buy #542264333] at price 1.10304
2019.10.14 15:57:17.547 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:12.000: 保证金水平增加 49372.35% (49372.35%)
2019.10.14 15:57:17.175 MT4EventsEA EURUSD,M1: - Position opened: 2019.10.14 15:27:11.000 - EURUSD Open 0.01 Buy#542264331[0.01 Market order Buy #542264331] at price 1.10301
2019.10.14 15:56:17.144 MT4EventsEA EURUSD,M1: 2019.10.14 15:26:11.000: 保证金水平减少 -12343.32% (0.00%)
2019.10.14 15:56:16.800 MT4EventsEA EURUSD,M1: - Position closed: 2019.10.14 15:22:40.000 - EURUSD Close Buy#542263747 at price 1.10301, profit -0.07 USD
2019.10.14 15:56:16.798 MT4EventsEA EURUSD,M1: - Position closed: 2019.10.14 15:22:41.000 - EURUSD Close Buy#542263749 at price 1.10301, profit -0.07 USD
2019.10.14 15:56:16.347 MT4EventsEA EURUSD,M1: - Position closed: 2019.10.14 15:22:42.000 - EURUSD Close Buy#542263753 at price 1.10304, profit -0.14 USD
2019.10.14 15:56:15.926 MT4EventsEA EURUSD,M1: - Position closed: 2019.10.14 15:22:42.000 - EURUSD Close Buy#542263753 at price 1.10304, profit -0.14 USD
2019.10.14 15:56:09.140 MT4EventsEA EURUSD,M1: 已初始化
这是 MT4 账户的交易历史:
这是我的代码:
您对此有何看法,我的执行是否有问题?
在下一篇文章中,跟踪一个周期内同时发生的交易事件 已经准备就绪并开始工作。
它还提供了一个在顾问中跟踪交易事件的示例。
在下一篇文章中,跟踪在一个周期内同时发生的交易事件已经准备就绪并开始工作。
它还提供了一个跟踪顾问交易事件的示例。
感谢您的有用回复和文章。
新文章 轻松快捷开发 MetaTrader 程序的函数库(第十三部分):帐户对象事件已发布:
本文研究如何处理帐户事件,跟踪影响自动交易的重要帐户属性变化。 在开发帐户对象集合时,我们已在上一篇文章中实现了一些跟踪帐户事件的功能。
现在从测试器中启动 EA,并尽可能多地开仓,以便快速检测净值增加事件,然后将盈利最多的持仓平仓:
作者:Artyom Trishkin