量化交易軟件:帶有圖形用戶界面的通用震蕩指標
簡介
一個用于交易系統(tǒng)的合適指標通常是通過在圖表上使用各種參數(shù)監(jiān)視各種指標后選出來的,如果您通過導航窗口來拖拽測試每個指標,并且每次都通過指標的屬性窗口來改變它的參數(shù),這個過程將花費很多時間,有一種方法可以加速這個過程。

編輯切換為居中
它包含了創(chuàng)建一個圖形界面來直接從圖表上訪問,使得用戶快速修改指標參數(shù)并馬上看到新的結果??梢酝ㄟ^在一個帶有圖形界面的通用指標中組合各種指標來實現(xiàn)指標的快速切換。
分析問題
創(chuàng)建一個通用指標的任務并不是很難,它需要一點面向對象的編程: 一個基類和一些相同類型的子類。 每個特定指標的參數(shù)將通過子類的構造函數(shù)來傳遞。在這種情況下,當創(chuàng)建一個對象時,MetaEditor 會有一個參數(shù)列表的提示,它將非常有助于開發(fā)過程(圖1)

編輯
圖 1. 當創(chuàng)建一個對象時構造函數(shù)參數(shù)的提示
主要的困難將在實際使用這樣的指標時出現(xiàn),不同的震蕩指標有不同的外部參數(shù)設置,如果我們?yōu)槊總€震蕩指標獨立出參數(shù)并且為它們使用不同的前綴, 我們將能夠人工使用這些指標,但是它將不適合用在iCustom()或者IndicatorCreate()函數(shù)中,因為參數(shù)太多了。對于 IndicatorCreate(),傳入?yún)?shù)的數(shù)量限制是256,而對于 iCustom() 是64。這個值還包含了通用的參數(shù),例如交易品種和指標名稱,所以實際可用的參數(shù)數(shù)量甚至比它還少。我們可以也使用少一些的通用參數(shù)集,但是指標在這種情況下使用將會不方便: 我們將需要檢查引用來指導對于特定的指標來說使用哪些參數(shù),
圖形界面可以解決這個問題: 它的對話框可以使用特定的控件來用于選定的指標。我們也應該提供功能來使用 iCustom() 或者 IndicatorCreate() 來調(diào)用指標, 這樣指標屬性窗口將有少量的通用外部參數(shù)。
參數(shù)集
讓我們定義所需的最小外部參數(shù)集合,在終端中查看震蕩指標的列表: 主菜單 - 插入 - 指標 - 震蕩指標, 把它們加到表格中。表格 1. 終端中所有的震蕩指標
函數(shù)
名稱
緩沖區(qū)
參數(shù)
iATR
平均真實范圍
1. 線形
1. int ma_period — 平均周期數(shù)
iBearsPower
空頭力度
1. 柱形
1. int ma_period — 平均周期數(shù)
iBullsPower
多頭力度
1. 線形
1. int ma_period — 平均周期數(shù)
iCCI
商品通道指數(shù)
1. 線形
1. int ma_period — 平均周期數(shù)2. ENUM_APPLIED_PRICE applied_price — 價格類型
iChaikin
蔡金(Chaikin)震蕩指標
1. 線形
1. int fast_ma_period — 快速平均周期數(shù) ?2. int slow_ma_period — 慢速平均周期數(shù)3. ENUM_MA_METHOD ma_method — 平滑類型4. ENUM_APPLIED_VOLUME applied_volume — 使用的交易量
iDeMarker
DeM指標
1. 線形
1. int ma_period — 平均周期數(shù)
iForce
強力指數(shù)
1. 線形
1. int ma_period — 平均周期數(shù)2. ENUM_MA_METHOD ma_method — 平滑類型 3. ENUM_APPLIED_VOLUME applied_volume — 用于計算的交易量類型
iMomentum
動量
1. 線形
1. int mom_period — 平均周期數(shù)2. ENUM_APPLIED_PRICE applied_price — 價格類型
iMACD
移動平均匯總/分離指標(MACD)
1. 柱形2. 線形
1. int fast_ema_period — 快速移動平均周期數(shù)2. int slow_ema_period — 慢速移動平均周期數(shù)3. int signal_period — 差別平均周期數(shù)4. ENUM_APPLIED_PRICE ?applied_price — 價格類型
iOsMA
移動平均震蕩指標(OsMA, MACD 柱形圖)
1. 柱形
1. int fast_ema_period — 快速移動平均周期數(shù)2. int slow_ema_period — 慢速移動平均周期數(shù)3. int signal_period — 差別平均周期數(shù)4. ENUM_APPLIED_PRICE ?applied_price — 價格類型
iRSI
相對強度指數(shù)
1. 線形
1. int ma_period — 平均周期數(shù)2. ENUM_APPLIED_PRICE applied_price — 價格類型
iRVI
相對動量指數(shù)
1. 線形2. 線形
1. int ma_period — 平均周期數(shù)
iStochastic
隨機震蕩指標
1. 線形2. 線形
1. int Kperiod — 用于計算的柱數(shù)2. int Dperiod — 首要平滑周期數(shù)3. int slowing — 最終平滑周期數(shù)4. ENUM_MA_METHOD ma_method — 平滑類型5. ENUM_STO_PRICE price_field — 隨機震蕩計算方法
iTriX
三重指數(shù)平均線(TRIX)
1. 線形
1. int ma_period — 平均周期數(shù)2. ENUM_APPLIED_PRICE applied_price — 價格類型
iWPR
威廉姆斯百分比范圍
1. 線形
1. int calc_period — 平均周期數(shù)
根據(jù)參數(shù)列,我們創(chuàng)建一個含有所有參數(shù)類型的列表,然后確定它們的最大數(shù)量。表格 2. 參數(shù)的類型和數(shù)量
類型
數(shù)量
int
3
ENUM_APPLIED_PRICE
1
ENUM_MA_METHOD
1
ENUM_APPLIED_VOLUME
1
ENUM_STO_PRICE
1
從緩沖區(qū)列,您可以看到可以使用兩個指標緩沖區(qū),并且不同的指標可以有不同的繪圖方式。當然,我們可以把它們都畫成線形,但是它們其中的一些通常顯示為柱形圖,并且終端也允許這樣,所以我們會試著提供功能在更換指標時修改對應的繪圖類型選項。另外,我們需要提供繪制水平線的功能,因為有些指標需要加上它們 (RSI, CCI, 等等.)計劃 一個大的通用任務能夠分成小的獨立任務的數(shù)量越多,它的實現(xiàn)就會越簡單方便,所以,我們的工作將包括三個階段:
為通用震蕩指標創(chuàng)建類,并創(chuàng)建不包含GUI(圖形用戶界面)的震蕩指標。
創(chuàng)建用于GUI的類。
把通用震蕩指標和圖形界面整合到一起。
其中重要的一點是,您應當注意包括默認設置,我們應該提供功能來同時使用圖形界面或者屬性窗口來配置指標的參數(shù)(為了使得通用指標有最大的靈活性),當在屬性窗口中配置參數(shù)時,它包含了一小組通用參數(shù),我們需要保證,所有的默認設置的參數(shù)能夠提供指標的自然外觀。 考慮不同震蕩指標的默認值。例如, 隨機震蕩指標的周期數(shù)為 5, 3, 3 (第一個參數(shù)比第二個大), 而 MACD 使用的是 12, 26, 9 (第一個參數(shù)比第二個小),MACD 的第一個參數(shù)意思是快速移動平均的周期數(shù), 而第二個參數(shù)是慢速移動平均的周期數(shù),所以第一個參數(shù)必須小于第二個。對于蔡金震蕩指標,第一個參數(shù)和第二個的比例很重要 (也使用了快速和慢速移動平均的周期數(shù)),而對于隨機震蕩指標,這個比例就沒有那么重要,并且它對應了價格變化,可以是任何數(shù)值。如果我們把MACD的第一個參數(shù)設置得大于第二個,指標的方向就會和價格變化相反 (在設置默認參數(shù)時我們應當記住這一點)。 當使用圖形界面時,指標應該使用常用的默認參數(shù)集來開始運行: MACD 使用周期數(shù)為 12, 26, 9, 隨機震蕩使用的周期數(shù)為 5, 3, 3, 等等。另外,最好可以使新選擇的指標可以選擇從默認參數(shù)開始運行或者以與之前指標相同的參數(shù)開始運行。例如,我們分析 RSI 和 CCI, 并且我們想看到不同的指標在使用相同參數(shù)時線形的變化,所以我們在實現(xiàn)類的時候要提供這種功能。 創(chuàng)建指標的基類 讓我們在 Include 文件夾下創(chuàng)建一個新的文件夾 'UniOsc' ,所有增加的指標文件都位于這個新文件夾之中。使用的震蕩指標集合在表格1種已經(jīng)定義過,讓我們創(chuàng)建一個對應的枚舉來選擇震蕩指標類型,除了指標文件,我們可能在其他地方也要使用這個枚舉,所以我們把它加到獨立的文件 UniOscDefines.mqh 中(在文件夾 'UniOsc'下): enum EOscUnyType{ ? OscUni_ATR, ? OscUni_BearsPower, ? OscUni_BullsPower, ? ? OscUni_CCI, ? OscUni_Chaikin, ? OscUni_DeMarker, ? OscUni_Force, ? OscUni_Momentum, ? OscUni_MACD, ? OscUni_OsMA, ? OscUni_RSI, ? OscUni_RVI, ? OscUni_Stochastic, ? OscUni_TriX, ? OscUni_WPR }; 這個文件將不再加入其他內(nèi)容。 讓我們?yōu)橹笜宋募?chuàng)建 "CUniOsc.mqh",并在其中寫上 COscUni 類的模板: class COscUni{ ?protected: ?public: }; 'protected' 部分是由模板確定的,因為有些類成員需要被保護,但是還是應當可以在子類中訪問 ( 'private' 部分的成員是被保護的,不能在子類中找到 )。 基類的主要方法是對應著指標的 OnCalculate() 函數(shù)的,讓我們稱它為 Calculate(),這個方法的前兩個參數(shù)對應著 OnCalculate() 的相應參數(shù): rates_total (柱的總數(shù)) 和 prew_calculate (已經(jīng)計算過的柱數(shù)),不需要把數(shù)組傳給 Calculate() 方法了, 因為使用了另外指標的數(shù)據(jù)。但是我們需要傳入兩個指標緩沖區(qū),它們會填入數(shù)據(jù)。即使在使用只含一個緩沖區(qū)的指標時,我們將需要控制第二個緩沖區(qū),所以在任何情況下都會給 Calculate() 方法傳入兩個緩沖區(qū)。Calculate() 的代碼將依賴于使用的震蕩指標類型: 它可以是含有一個或者兩個緩沖區(qū)。所以,Calculate() 方法將會是虛函數(shù): virtual int Calculate( const int rates_total, ?const int prev_calculated, ?double & buffer0[], ?double & buffer1[] ){ ?return(rates_total); } 當載入不同類型的指標時,我們將需要一個變量來保存指標的句柄。我們在 protected 部分聲明它,