期貨量化軟件:在非標(biāo)準(zhǔn)時間范圍上測試 Expert Advisor

簡介
市場價格波動過于頻繁,不便于使用價格變動圖,即技術(shù)分析中所謂的價格變動圖。 為了便于觀察價格變動以及在分析時使用較長的時間范圍,赫茲期貨量化使用柱狀圖或蠟燭圖。 每個柱展示了在某個時間周期開始和結(jié)束處的價格值,以及該期間內(nèi)的最大和最小價格值。 通常使用以下期間或時間范圍: 1 分鐘、5 分鐘、15 分鐘、30 分鐘、1 小時、4 小時、日、周和月。 這些時間范圍可以在赫茲期貨量化 終端工具欄找到。

編輯切換為居中
盡管通常使用的時間范圍已經(jīng)成為標(biāo)準(zhǔn),但從技術(shù)上講沒有理由不能使用任何其他時間范圍來顯示價格變動。 從實踐的角度,終端提供了一個允許終端用戶創(chuàng)建非標(biāo)準(zhǔn)時間范圍圖表的腳本(period_converter),例如,2 分鐘、7 分鐘、45 分鐘、2 小時和幾乎任何其他時間范圍,并可以添加相應(yīng)的指標(biāo)。 但是,終端的“策略測試程序”只允許選擇標(biāo)準(zhǔn)周期進(jìn)行測試。
這可謂是近在眼前遠(yuǎn)在天邊——赫茲期貨量化可以創(chuàng)建非標(biāo)準(zhǔn)的時間范圍圖表,但卻無法用來測試 Expert Advisor 實際上,狀況比看起來要好得多。 在非標(biāo)準(zhǔn)時間范圍上測試 Expert Advisor 是可能的! 我們需要做的只是用非標(biāo)準(zhǔn)時間范圍數(shù)據(jù)替換標(biāo)準(zhǔn)時間范圍數(shù)據(jù)。 另外,我們甚至能使用來自多個非標(biāo)準(zhǔn)時間范圍的數(shù)據(jù)測試 Expert Advisor。

編輯切換為居中
要點
我們的行動計劃如下:
1. 準(zhǔn)備離線工作的額外終端,這樣新的標(biāo)準(zhǔn)時間范圍數(shù)據(jù)不會添加到非標(biāo)準(zhǔn)時間范圍圖表。
2. 利用終端的 period_converter 腳本準(zhǔn)備非標(biāo)準(zhǔn)時間范圍數(shù)據(jù)。終端具有足夠的可用分鐘數(shù)據(jù)檔案。
3. 將準(zhǔn)備的數(shù)據(jù)導(dǎo)入做好測試準(zhǔn)備的終端。
現(xiàn)在我們來仔細(xì)觀察一下:
1. 準(zhǔn)備用于測試非標(biāo)準(zhǔn)時間范圍的終端。
安裝額外的終端。 啟動終端,打開模擬賬戶并等待至“市場報價”窗口出現(xiàn)交易品種列表。

編輯切換為居中
禁用保存賬戶信息:在終端右下角的“連接狀態(tài)”圖標(biāo)上左鍵單擊并選擇“登錄”。 取消選擇“保存賬戶信息”選項,單擊“登錄”并等待終端連接賬戶。

編輯切換為居中
這樣做是必要的,以防止終端自動連接賬戶以及防止新數(shù)據(jù)添加到歷史檔案。 關(guān)閉終端。
在歷史文件夾內(nèi),打開跟模擬賬戶開戶的交易中心的名稱相對應(yīng)的文件夾,并從中刪除所有的 *.hst 文件。

編輯切換為居中
2. 準(zhǔn)備非標(biāo)準(zhǔn)時間范圍數(shù)據(jù)
利用 period_converter 腳本(可以在標(biāo)準(zhǔn)版本的 赫茲期貨量化 終端中找到),創(chuàng)建非標(biāo)準(zhǔn)時間范圍,例如,M2 和 M7,其他一些終端具有所需交易品種(例如,EURUSD)的足夠 M1 數(shù)據(jù)量。 為此,打開 EURUSD M1 圖表并在上面運行 period_converter 腳本。 運行腳本之前,在屬性窗口將 ExtPeriodMultiplier 設(shè)置為 2。 在腳本完成數(shù)據(jù)轉(zhuǎn)換后,在終端窗口的“Expert Advisors”選項卡上應(yīng)顯示一條關(guān)于向文件添加的條目數(shù)量的信息,例如:
"2009.03.19 18:28:09 period_converter EURUSD,M1: 25378 record(s) written"
隨后可以從圖表移除腳本(在運行腳本的圖表上右擊并選擇“移除腳本”)。 打開得到的圖表: 主菜單 - 文件- 打開離線歷史數(shù)據(jù)(在“歷史數(shù)據(jù)”欄查找 EURUSD,M2)。 類似的,創(chuàng)建 M7 時間范圍(在運行 period_converter 腳本之前將 ExtPeriodMultiplier 設(shè)置為 7)。
編寫一個將圖表數(shù)據(jù)保存到 *.csv 文件的腳本(s_ExportChartToCSV_v1.mq4作為附件):
int start(){ ? int h=FileOpen(Symbol()+Period()+".csv",FILE_WRITE|FILE_CSV,","); ? ? ?for(int i=Bars-1;i>=0;i--){ ? ? ? ? FileWrite(h,TimeToStr(Time[i],TIME_DATE),TimeToStr(Time[i],TIME_MINUTES),Open[i],High[i],Low[i],Close[i],Volume[i]); ? ? ?} ? FileClose(i); ? return(0); }
在非標(biāo)準(zhǔn)時間范圍圖表上執(zhí)行腳本。 于是我們在 experts/files 文件夾中得到具有非標(biāo)準(zhǔn)時間范圍數(shù)據(jù)的標(biāo)準(zhǔn) *.csv 文件。

編輯切換為居中
3. 導(dǎo)入數(shù)據(jù)。
打開上述步驟 1 中準(zhǔn)備的終端和“歷史數(shù)據(jù)中心”(主菜單 - 工具 - 歷史數(shù)據(jù)中心或 F2 鍵)。 在左手側(cè)交易品種列表內(nèi)為導(dǎo)入的交易品種擴(kuò)展時間范圍列表并選擇 M1(在上面雙擊,使相應(yīng)的文本顯示在窗口標(biāo)題欄):

編輯切換為居中
在以打開的“歷史數(shù)據(jù)中心”窗口單擊“導(dǎo)入”,選擇上面步驟 2 產(chǎn)生的 EURUSD2.csv 并單擊“確認(rèn)”。 類似的,將數(shù)據(jù)從 EURUSD7.csv 導(dǎo)入到 M5 并關(guān)閉“歷史數(shù)據(jù)中心”窗口。 就是這樣!
打開 EURUSD M1 圖表,你將會看到 M2 數(shù)據(jù):
編輯
EURUSD M5 與之類似——你會看到顯示的是 M7 而不是 M5。
為了在“策略測試程序”中測試 Expert Advisor,測試 M2 數(shù)據(jù)時需要選擇 M1,測試 M7 數(shù)據(jù)時需要選擇 M5。 為了從經(jīng)過測試的 Expert Advisor 調(diào)用的指標(biāo)中訪問 M7 數(shù)據(jù),你需要指定 M5 時間范圍。
4. 檢查。
赫茲期貨量化將使用一個簡單的 Expert Advisor,在兩條移動平均線交叉時打開和關(guān)閉訂單(2MA.mq4 作為附件)。 注意! 該 Expert Advisor 僅用于“策略測試程序”。
extern int TimeFrame=0; extern double Lots=0.1; extern int FastMAPeriod=13; extern int FastMAMethod=0; extern int FastMAPrice=0; extern int SlowMAPeriod=21; extern int SlowMAMethod=0; extern int SlowMAPrice=0; int start(){ ? ? ?double fast_ma_1=iMA(NULL,TimeFrame,FastMAPeriod,0,FastMAMethod,FastMAPrice,1); ? ? ?double slow_ma_1=iMA(NULL,TimeFrame,SlowMAPeriod,0,SlowMAMethod,SlowMAPrice,1); ? ? ?double fast_ma_2=iMA(NULL,TimeFrame,FastMAPeriod,0,FastMAMethod,FastMAPrice,2); ? ? ?double slow_ma_2=iMA(NULL,TimeFrame,SlowMAPeriod,0,SlowMAMethod,SlowMAPrice,2); ? ? ?static int bt=0; ? ? ?static int st=0; ? ? ? ? if(fast_ma_1>slow_ma_1){ ? ? ? ? ? ?if(fast_ma_2<=slow_ma_2){ ? ? ? ? ? ? ? if(st>0)OrderClose(st,Lots,Ask,0,CLR_NONE); ? ? ? ? ? ? ? st=0; ? ? ? ? ? ? ? if(OrdersTotal()==0)bt=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,0,"",0,0,CLR_NONE); ? ? ? ? ? ?} ? ? ? ? } ? ? ? ? if(fast_ma_1<slow_ma_1){ ? ? ? ? ? ?if(fast_ma_2>=slow_ma_2){ ? ? ? ? ? ? ? if(bt>0)OrderClose(bt,Lots,Bid,0,CLR_NONE); ? ? ? ? ? ? ? bt=0; ? ? ? ? ? ? ? ? ? ? ? ? ? if(OrdersTotal()==0)st=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,0,"",0,0,CLR_NONE); ? ? ? ? ? ?} ? ? ? ? } ? ? ? ? ? return(0); }