量化交易软件:实时更新即时报价序列,市场深度做准备

文章介绍了如何在程序中创建即时报价数据集合,以管理和存储多个品种的实时数据。通过函数库和计时器机制,实现实时监控、内存控制和新报价的自动处理。同时,还涉及了市场深度操控(DOM)的准备工作和消息订阅功能。
摘要由CSDN通过智能技术生成

我已为程序中用到的所有品种创建了即时报价数据集合。 该函数库能够为程序用到的每个品种获取所需数量的即时报价数据,并将所有这些品种存储在即时报价数据集合当中。 即时报价数据集合能够搜索任何所需即时报价对象,并接收其数据。 我们能够整理这些列表,以便进行统计研究。 不过,当某个品种的新即时报价到达时,并不会将新即时报价存到即时报价数据库当中。 在本文中,我将实现此功能。

每个新即时报价均会增加集合中所存储对象的数量。 为了限制它们的数量,以及占用的内存量,我们引入一个常数,我们可用其设置一种金融产品在数据库中的最大即时报价存储量。 这将保护我们免受内存不足的困扰。 如果程序中用到了许多品种,并且数据库中已经包含足够数量的即时报价,则函数库会自动删除所需数量的旧即时报价。 因此,我们将始终拥有指定数量的金融产品即时报价。 默认数量为 200000。 这个数量应该足以满足大约两天的统计研究。 在任何情况下,如有必要,总可以修改单一金融产品在集合中存储的最大即时报价数量。

另外,我将开始准备操控市场深度(DOM)。 我将介绍在品种对象类中订阅 DOM 广播的功能。 在下一篇文章中,我将开始实现操控 DOM 的功能。

改进库类

与往常一样,我们开始添加新的函数库文本消息。 在 \MQL5\Include\DoEasy\Data.mqh 里,加入新消息的索引:

 
 

MSG_SYM_EVENT_SYMBOL_ADD, // Added symbol to Market Watch window MSG_SYM_EVENT_SYMBOL_DEL, // Symbol removed from Market Watch window MSG_SYM_EVENT_SYMBOL_SORT, // Changed location of symbols in Market Watch window MSG_SYM_SYMBOLS_MODE_CURRENT, // Work with current symbol only MSG_SYM_SYMBOLS_MODE_DEFINES, // Work with predefined symbol list MSG_SYM_SYMBOLS_MODE_MARKET_WATCH, // Work with Market Watch window symbols MSG_SYM_SYMBOLS_MODE_ALL, // Work with full list of all available symbols MSG_SYM_SYMBOLS_BOOK_ADD, // Subscribed to Depth of Market MSG_SYM_SYMBOLS_BOOK_DEL, // Unsubscribed from Depth of Market MSG_SYM_SYMBOLS_MODE_BOOK, // Subscription to Depth of Market //--- CAccount

以及与新添加的索引相对应的文本消息:

 
 

{"В окно \"Обзор рынка\" добавлен символ","Added symbol to \"Market Watch\" window"}, {"Из окна \"Обзор рынка\" удалён символ","Removed from \"Market Watch\" window"}, {"Изменено расположение символов в окне \"Обзор рынка\"","Changed arrangement of symbols in \"Market Watch\" window"}, {"Работа только с текущим символом","Work only with the current symbol"}, {"Работа с предопределённым списком символов","Work with predefined list of symbols"}, {"Работа с символами из окна \"Обзор рынка\"","Working with symbols from \"Market Watch\" window"}, {"Работа с полным списком всех доступных символов","Work with full list of all available symbols"}, {"Осуществлена подписка на стакан цен ","Subscribed to Depth of Market"}, {"Осуществлена отписка от стакан цен ","Unsubscribed from Depth of Market"}, {"Подписка на стакан цен","Subscription to Depth of Market"}, //--- CAccount

在当前品种新即时报价到达时,我们需要将其添加到 MqlTick 结构之中。 基于该结构创建一个新的即时报价对象,并将其与其他品种列表一起添加到集合中存储的即时报价序列列表当中。 然而,我们无法在程序的 OnTick() 处理程序中获取其他品种的即时报价,因为当前品种的新即时报价到达时,才会激活处理程序。 因此,为了得到其他用到的品种新即时价格变动,我们需要在函数库计时器中调用先前创建的 “New tick” 类对象对其进行控制。 为此,我们需要另一个函数库计时器,在其中跟踪除当前金融产品之外的所有产品的即时报价,以便更新这些产品的即时报价数据列表。

在 \MQL5\Include\DoEasy\Defines.mqh 里,加入即时报价数据集合定时器的参数,和一个定义单一品种即时报价最大可能数量的常数:

 
 

//--- Parameters of the timer of indicator data timeseries collection #define COLLECTION_IND_TS_PAUSE (64) // Pause of the timer of indicator data timeseries collection in milliseconds #define COLLECTION_IND_TS_COUNTER_STEP (16) // Increment of indicator data timeseries timer counter #define COLLECTION_IND_TS_COUNTER_ID (7) // ID of indicator data timeseries timer counter //--- Parameters of the tick series collection timer #define COLLECTION_TICKS_PAUSE (64) // Tick series collection timer pause in milliseconds #define COLLECTION_TICKS_COUNTER_STEP (16) // Tick series timer counter increment step #define COLLECTION_TICKS_COUNTER_ID (8) // Tick series timer counter ID //--- Collection list IDs #define COLLECTION_HISTORY_ID (0x777A) // Historical collection list ID #define COLLECTION_MARKET_ID (0x777B) // Market collection list ID #define COLLECTION_EVENTS_ID (0x777C) // Event collection list ID #define COLLECTION_ACCOUNT_ID (0x777D) // Account collection list ID #define COLLECTION_SYMBOLS_ID (0x777E) // Symbol collection list ID #define COLLECTION_SERIES_ID (0x777F) // Timeseries collection list ID #define COLLECTION_BUFFERS_ID (0x7780) // Indicator buffer collection list ID #define COLLECTION_INDICATORS_ID (0x7781) // Indicator collection list ID #define COLLECTION_INDICATORS_DATA_ID (0x7782) // Indicator data collection list ID #define COLLECTION_TICKSERIES_ID (0x7783) // Tick series collection list ID //--- Data parameters for file operations #define DIRECTORY ("DoEasy\\") // Library directory for storing object folders #define RESOURCE_DIR ("DoEasy\\Resource\\") // Library directory for storing resource folders //--- Symbol parameters #define CLR_DEFAULT (0xFF000000) // Default symbol background color in the navigator #ifdef __MQL5__ #define SYMBOLS_COMMON_TOTAL (TerminalInfoInteger(TERMINAL_BUILD)<2430 ? 1000 : 5000) // Total number of MQL5 working symbols #else #define SYMBOLS_COMMON_TOTAL (1000) // Total number of MQL4 working symbols #endif //--- Pending request type IDs #define PENDING_REQUEST_ID_TYPE_ERR (1) // Type of a pending request created based on the server return code #define PENDING_REQUEST_ID_TYPE_REQ (2) // Type of a pending request created by request //--- Timeseries parameters #define SERIES_DEFAULT_BARS_COUNT (1000) // Required default amount of timeseries data #define PAUSE_FOR_SYNC_ATTEMPTS (16) // Amount of pause milliseconds between synchronization attempts #define ATTEMPTS_FOR_SYNC (5) // Number of attempts to receive synchronization with the server //--- Tick series parameters #define TICKSERIES_DEFAULT_DAYS_COUNT (1) // Required number of days for tick data in default series #define TICKSERIES_MAX_DATA_TOTAL (200000) // Maximum number of stored tick data of a single symbol //+------------------------------------------------------------------+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值