量化交易軟件:跨平臺(tái)智能交易系統(tǒng)時(shí)間過濾器
概述
時(shí)間過濾僅在定義了特定時(shí)間段時(shí)方可使用, 智能交易系統(tǒng)必須檢查給定時(shí)間是否在所述時(shí)間段內(nèi)。當(dāng)條件滿足或不滿足時(shí), 可以啟用或禁用某些功能。若智能交易系統(tǒng)的給定功能設(shè)置為非全時(shí)運(yùn)作 (周期性地, 或在少數(shù)例外發(fā)生后全時(shí)運(yùn)作) 這一功能是非常有用的。以下是可以應(yīng)用時(shí)間過濾的一些示例:
規(guī)避某些時(shí)間段 (如, 橫盤走勢(shì)或高波動(dòng)的時(shí)間段)
為市場(chǎng)訂單或持倉(cāng)設(shè)置 "到期" 時(shí)間 (在 "到期" 時(shí)離場(chǎng))
交易周結(jié)束時(shí)平倉(cāng)。
這些是交易者最常使用的功能, 當(dāng)然還有其它變體。

目標(biāo)
理解并應(yīng)用最常用的時(shí)間過濾方法
允許智能交易系統(tǒng)輕松使用多個(gè)時(shí)間過濾器
與 MQL4 和 MQL5 兼容
基類
名為 CTime 的類將作為我們的智能交易系統(tǒng)中其它所要討論的時(shí)間過濾器對(duì)象的基類。類 CTimeBase (其基于 CTime) 的定義顯示在以下代碼片段中:
class CTimeBase : public CObject ?{ protected: ? bool ? ? ? ? ? ? ?m_active; ? bool ? ? ? ? ? ? ?m_reverse; ? CSymbolManager ? *m_symbol_man; ? CEventAggregator *m_event_man; ? CObject ? ? ? ? ?*m_container; public: ? ? ? ? ? ? ? ? ? ? CTimeBase(void); ? ? ? ? ? ? ? ? ? ?~CTimeBase(void); ? virtual int ? ? ? Type(void) const {return CLASS_TYPE_TIME;} ? //--- 初始化 ? virtual bool ? ? ?Init(CSymbolManager*,CEventAggregator*); ? virtual CObject *GetContainer(void); ? virtual void ? ? ?SetContainer(CObject*); ? virtual bool ? ? ?Validate(void); ? //--- 賦值與取值 ? bool ? ? ? ? ? ? ?Active(void) const; ? void ? ? ? ? ? ? ?Active(const bool); ? bool ? ? ? ? ? ? ?Reverse(void); ? void ? ? ? ? ? ? ?Reverse(const bool); ? //--- 檢查 ? virtual bool ? ? ?Evaluate(datetime)=0; ?};
基類有 3 個(gè)基元數(shù)據(jù)類型的成員。m_active 用于啟用或禁用類對(duì)象。m_reverse 用于反轉(zhuǎn)類對(duì)象的輸出 (如果原本輸出為 false 則返回 true, 如果原本輸出為 true, 則返回 false)。m_time_start 用于引用創(chuàng)建的類實(shí)例, 無論是在 OnInit 中創(chuàng)建還是在執(zhí)行智能交易系統(tǒng)之后創(chuàng)建。
時(shí)間過濾器類和類型
按特定日期范圍進(jìn)行時(shí)間過濾
這是最簡(jiǎn)單的時(shí)間過濾方法。要使用此方法檢查時(shí)間, 只需要開始和結(jié)束日期, 如果時(shí)間設(shè)置處于這些日期之間, 則輸出為 true。否則, 輸出為 false。
此方法已實(shí)現(xiàn)為 CTimeRange。以下代碼顯示了 CTimeRangeBase 的定義, 而 CTimeRange 正是有基于此:
class CTimeRangeBase : public CTime ?{ protected: ? datetime ? ? ? ? ?m_begin; ? datetime ? ? ? ? ?m_end; public: ? ? ? ? ? ? ? ? ? ? CTimeRangeBase(void); ? ? ? ? ? ? ? ? ? ? CTimeRangeBase(datetime,datetime); ? ? ? ? ? ? ? ? ? ?~CTimeRangeBase(void); ? //--- 初始化 ? ? ? ? ? ? ? ? ? ?datetime,datetime ? virtual bool ? ? ?Set(datetime,datetime); ? virtual bool ? ? ?Validate(void); ? //--- 賦值與取值 ? datetime ? ? ? ? ?Begin(void) const; ? void ? ? ? ? ? ? ?Begin(const datetime); ? datetime ? ? ? ? ?End(void) const; ? void ? ? ? ? ? ? ?End(const datetime); ? //--- 處理 ? virtual bool ? ? ?Evaluate(datetime); ?};
在類構(gòu)造函數(shù)中, 應(yīng)指定開始和結(jié)束時(shí)間。在調(diào)用類方法 Evaluate 時(shí)設(shè)置的實(shí)際時(shí)間將會(huì)與這兩個(gè)值進(jìn)行比較。如果時(shí)間未設(shè)置或?yàn)榱? 則該方法會(huì)使用調(diào)用時(shí)的當(dāng)前時(shí)間:
bool CTimeRangeBase::Evaluate(datetime current=0) ?{ ? if(!Active()) ? ? ?return true; ? if(current==0) ? ? ?current=TimeCurrent(); ? bool result=current>=m_begin && current<m_end; ? return Reverse()?!result:result; ?}
按周內(nèi)所在日進(jìn)行時(shí)間過濾
按周內(nèi)所在日進(jìn)行過濾是最簡(jiǎn)單且最常用的時(shí)間過濾方法之一。通常使用此時(shí)間過濾器針對(duì)智能交易系統(tǒng)的某些功能在周內(nèi)的某些日子里進(jìn)行限制或允許。
現(xiàn)在, 這個(gè)特定的類可按多種方式實(shí)現(xiàn)。一種方法是提供自定義的函數(shù) TimeDayOfWeek, 該函數(shù)在 MQL4 中可用, 但不能用在 MQL5 中。另一種方法將所檢查的時(shí)間轉(zhuǎn)換為結(jié)構(gòu) MqlDateTime, 然后檢查其 day_of_week 參數(shù)是否匹配預(yù)設(shè)值的標(biāo)志。推薦選擇后一種方法, 因?yàn)樗闪詈掌澚炕瘜⑺锌捎玫念惙椒ǚ旁诨愔小?/p>
此方法在赫茲量化的智能交易系統(tǒng)中體現(xiàn)為 CTimeDays。以下代碼顯示 CTimeDaysBase 的定義, 而 CTimeDays 正是有基于此:
class CTimeDaysBase : public CTime ?{ protected: ? long ? ? ? ? ? ? ?m_day_flags; public: ? ? ? ? ? ? ? ? ? ? CTimeDaysBase(void); ? ? ? ? ? ? ? ? ? ? CTimeDaysBase(const bool sun=false,const bool mon=true,const bool tue=true,const bool wed=true, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? const bool thu=true,const bool fri=true,const bool sat=false); ? ? ? ? ? ? ? ? ? ?~CTimeDaysBase(void); ? //--- 初始化 ? ? ? ? ? ? ? ? ? ? ? virtual bool ? ? ?Validate(void); ? virtual bool ? ? ?Evaluate(datetime); ? virtual void ? ? ?Set(const bool,const bool,const bool,const bool,const bool,const bool,const bool); ? //--- 賦值與取值 ? bool ? ? ? ? ? ? ?Sunday(void) const; ? void ? ? ? ? ? ? ?Sunday(const bool); ? bool ? ? ? ? ? ? ?Monday(void) const; ? void ? ? ? ? ? ? ?Monday(const bool); ? bool ? ? ? ? ? ? ?Tuesday(void) const; ? void ? ? ? ? ? ? ?Tuesday(const bool); ? bool ? ? ? ? ? ? ?Wednesday(void) const; ? void ? ? ? ? ? ? ?Wednesday(const bool); ? bool ? ? ? ? ? ? ?Thursday(void) const; ? void ? ? ? ? ? ? ?Thursday(const bool); ? bool ? ? ? ? ? ? ?Friday(void) const; ? void ? ? ? ? ? ? ?Friday(const bool); ? bool ? ? ? ? ? ? ?Saturday(void) const; ? void ? ? ? ? ? ? ?Saturday(const bool); ?};
如定義所示, 該類只有一個(gè)類型為 long 的類成員。這一類成員是設(shè)置所在日標(biāo)志時(shí)使用的, 其值為評(píng)估時(shí)應(yīng)返回 true 的所在日 (周內(nèi)的 7 天)。這意味著我們將使用按位操作, 所以赫茲量化還必須聲明一個(gè)自定義枚舉, 其成員將代表 7 天中的每一天:
enum ENUM_TIME_DAY_FLAGS ?{ ? TIME_DAY_FLAG_SUN=1<<0, ? TIME_DAY_FLAG_MON=1<<1, ? TIME_DAY_FLAG_TUE=1<<2, ? TIME_DAY_FLAG_WED=1<<3, ? TIME_DAY_FLAG_THU=1<<4, ? TIME_DAY_FLAG_FRI=1<<5, ? TIME_DAY_FLAG_SAT=1<<6 ?};
使用 Set 方法設(shè)置 (或清除) 周內(nèi)所在日標(biāo)志。為防止尚未設(shè)置標(biāo)志的情況下意外調(diào)用類實(shí)例進(jìn)行評(píng)估, 出于便利起見, 采用的措施是該方法在其類構(gòu)造函數(shù)之一中被調(diào)用。