量化交易軟件:實時更新即時報價序列,市場深度做準備
我已為程序中用到的所有品種創(chuàng)建了即時報價數(shù)據(jù)集合。 該函數(shù)庫能夠為程序用到的每個品種獲取所需數(shù)量的即時報價數(shù)據(jù),并將所有這些品種存儲在即時報價數(shù)據(jù)集合當中。 即時報價數(shù)據(jù)集合能夠搜索任何所需即時報價對象,并接收其數(shù)據(jù)。 我們能夠整理這些列表,以便進行統(tǒng)計研究。 不過,當某個品種的新即時報價到達時,并不會將新即時報價存到即時報價數(shù)據(jù)庫當中。 在本文中,我將實現(xiàn)此功能。
每個新即時報價均會增加集合中所存儲對象的數(shù)量。 為了限制它們的數(shù)量,以及占用的內(nèi)存量,我們引入一個常數(shù),我們可用其設(shè)置一種金融產(chǎn)品在數(shù)據(jù)庫中的最大即時報價存儲量。 這將保護我們免受內(nèi)存不足的困擾。 如果程序中用到了許多品種,并且數(shù)據(jù)庫中已經(jīng)包含足夠數(shù)量的即時報價,則函數(shù)庫會自動刪除所需數(shù)量的舊即時報價。 因此,我們將始終擁有指定數(shù)量的金融產(chǎn)品即時報價。 默認數(shù)量為 200000。 這個數(shù)量應(yīng)該足以滿足大約兩天的統(tǒng)計研究。 在任何情況下,如有必要,總可以修改單一金融產(chǎn)品在集合中存儲的最大即時報價數(shù)量。
另外,我將開始準備操控市場深度(DOM)。 我將介紹在品種對象類中訂閱 DOM 廣播的功能。 在下一篇文章中,我將開始實現(xiàn)操控 DOM 的功能。
改進庫類
與往常一樣,我們開始添加新的函數(shù)庫文本消息。 在 \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
以及與新添加的索引相對應(yīng)的文本消息:
? {"В окно \"Обзор рынка\" добавлен символ","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 結(jié)構(gòu)之中。 基于該結(jié)構(gòu)創(chuàng)建一個新的即時報價對象,并將其與其他品種列表一起添加到集合中存儲的即時報價序列列表當中。 然而,我們無法在程序的 OnTick() 處理程序中獲取其他品種的即時報價,因為當前品種的新即時報價到達時,才會激活處理程序。 因此,為了得到其他用到的品種新即時價格變動,我們需要在函數(shù)庫計時器中調(diào)用先前創(chuàng)建的 “New tick” 類對象對其進行控制。 為此,我們需要另一個函數(shù)庫計時器,在其中跟蹤除當前金融產(chǎn)品之外的所有產(chǎn)品的即時報價,以便更新這些產(chǎn)品的即時報價數(shù)據(jù)列表。
在 \MQL5\Include\DoEasy\Defines.mqh 里,加入即時報價數(shù)據(jù)集合定時器的參數(shù),和一個定義單一品種即時報價最大可能數(shù)量的常數(shù):
//--- 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 //+------------------------------------------------------------------+