量化交易軟件:交易員生存訣竅若干測試的比較報告

1. 輸入?yún)?shù)。選則一款智能交易系統(tǒng)進行測試
由于我的計算機有四個內(nèi)核, 我只能運行四個測試代理。因此, 并發(fā) (或有幾秒鐘的小延遲), 我只能運行四個終端, 即每個代理占用一個終端。這就是為什么在輸入?yún)?shù)中有四組可用設(shè)置的原因:

編輯切換為居中
參數(shù):
赫茲量化r#ххх 的安裝文件夾
終端 #xxx 的測試品種
終端 #xxx 的測試周期
正確的終端文件名
暫歇的毫秒數(shù) — 從屬終端之間的啟動暫停
開始測試日期 (僅年, 月和日)
結(jié)束測試日期 (僅年, 月和日)
初始本金
杠桿

編輯切換為居中
在基本算法開始之前, 赫茲量化需要鏈接從屬終端的安裝文件夾和 AppData 文件夾中的數(shù)據(jù)目錄。此處是一個簡單的腳本 Check_TerminalPaths.mq5:
//+------------------------------------------------------------------+ //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Check_TerminalPaths.mq5 | //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 版權(quán)所有 2009, MetaQuotes 軟件公司| //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "2009, MetaQuotes 軟件公司" #property link ? ? ?"https://www.mql5.com" #property version ? "1.00" //+------------------------------------------------------------------+ //| 腳本程序開始函數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| //+------------------------------------------------------------------+ void OnStart() ?{ //--- ? Print("TERMINAL_PATH = ",TerminalInfoString(TERMINAL_PATH)); ? Print("TERMINAL_DATA_PATH = ",TerminalInfoString(TERMINAL_DATA_PATH)); ? Print("TERMINAL_COMMONDATA_PATH = ",TerminalInfoString(TERMINAL_COMMONDATA_PATH)); ?} //+------------------------------------------------------------------+
腳本打印三個參數(shù):
TERMINAL_PATH — 終端運行所在的文件夾
TERMINAL_DATA_PATH — 終端數(shù)據(jù)存儲的文件夾
TERMINAL_COMMONDATA_PATH — 計算機上所有安裝終端的公共文件夾
三個終端的示例 (它們當中之一使用 /Portable 鍵運行):
// 終端啟動為主要模式 TERMINAL_PATH = C:\Program Files\MetaTrader 5 TERMINAL_DATA_PATH = C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075 TERMINAL_COMMONDATA_PATH = C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\Common // 終端啟動為主要模式 TERMINAL_PATH = D:\MetaTrader 5 3 TERMINAL_DATA_PATH = C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\0C46DDCEB43080B0EC647E0C66170465 TERMINAL_COMMONDATA_PATH = C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\Common // 終端啟動為可移動模式 TERMINAL_PATH = D:\MetaTrader 5 5 TERMINAL_DATA_PATH = D:\MetaTrader 5 5 TERMINAL_COMMONDATA_PATH = C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\Common
您可閱讀我以前的一篇文章的以下段落, 了解有關(guān)終端文件夾和 AppData 中文件夾的對應(yīng)關(guān)系的更多信息:
在 AppData 文件夾中綁定安裝文件夾和數(shù)據(jù)目錄
匹配從屬終端的安裝文件夾和 AppData 文件夾
秘密 #1
FindFirstFileW, FindNextFileW
使用 FindFirstFileW, FindNextFileW 的示例
終端目錄內(nèi)部
CopyFileW
操縱 "origin.txt" 文件
最后一程
使用系統(tǒng)的 "打開文件" 對話框 (GetOpenFileNameW 函數(shù)) 選擇一款智能交易系統(tǒng):

編輯切換為居中
有關(guān)調(diào)用打開文件對話框的細節(jié)已在我之前的文章 "交易員生存訣竅: 四遍回測優(yōu)于一遍: 4.2. 利用系統(tǒng) "打開文件" 對話框選擇一款 EA" 中討論。
當前版本 (文件 GetOpenFileNameW.mqh, 版本 1.003) 改變的功能在 OpenFileName 函數(shù):
//+------------------------------------------------------------------+ //| 創(chuàng)建打開文件對話框 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| //+------------------------------------------------------------------+ string OpenFileName(const string filter_description="可編輯代碼", ? ? ? ? ? ? ? ? ? ?const string filter="\0*.mq5\0", ? ? ? ? ? ? ? ? ? ?const string title="選擇源文件") ?{ ? string path=NULL; ? if(GetOpenFileName(path,filter_description+filter,TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL5\\Experts\\",title)) ? ? ?return(path); ? else ? ? { ? ? ?PrintFormat("引發(fā)失敗的錯誤: %x",kernel32::GetLastError()); ? ? ?return(NULL); ? ? } ?}
現(xiàn)在它設(shè)置文件搜索過濾器已變得更方便。還請注意, 現(xiàn)在過濾器搜索推薦 *.mq5 格式的文件 (在上一篇文章中是搜索編譯的 *.ex5 文件)。
2. 再次關(guān)注 common.ini
現(xiàn)在是時候來描述在 'Compare multiple tests.mq5' 中的 CopyCommonIni() 函數(shù)。
從屬終端通過 指定的配置文件 來啟動。赫茲量化有四個從屬終端, 所以我們需要創(chuàng)建四個 *.ini 文件: myconfiguration1.ini, myconfiguration2.ini, myconfiguration3.ini, myconfiguration4.ini。文件 myconfigurationХ.ini 是基于終端的 common.ini 文件創(chuàng)建, 來自我們已啟動的智能交易系統(tǒng)。文件 common.ini 的路徑:
TERMINAL_DATA_PATH\config\common.ini
創(chuàng)建和編輯 myconfiguration.ini 文件的算法如下所示:
拷貝 common.ini 至文件夾 TERMINAL_COMMONDATA_PATH\Files\original.ini (WinAPI CopyFileW)
在原始 original.ini 文件里, 查找段落 [Common] (MQL5 + 正則表達式)。 對于我的主終端此段落看起來像這樣 (終端尚未登錄 mql5 社區(qū)): [Common] Login=5116256 ProxyEnable=0 ProxyType=0 ProxyAddress= ProxyAuth= CertInstall=0 NewsEnable=0 NewsLanguages= ?
創(chuàng)建四個文件: myconfiguration1.ini, myconfiguration2.ini, myconfiguration3.ini 和 myconfiguration4.ini (MQL5)
編輯這四個文件 (拷貝 [Common] 和獨立的 [Tester] 段落) (MQL5)
2.1. common.ini -> original.ini這可能是最簡單的代碼: 保存路徑 "數(shù)據(jù)文件夾" 和 "公共數(shù)據(jù)文件夾" 至變量, 并使用 "original.ini" 的值初始化一個變量 string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH); ? ?// 數(shù)據(jù)文件夾的路徑 string common_data_path=TerminalInfoString(TERMINAL_COMMONDATA_PATH);// 公共數(shù)據(jù)文件夾的路徑 string original_ini="original.ini"; ? ?string arr_common[]; //--- string full_name_common_ini=terminal_data_path+"\\config\\common.ini"; ? ? // 文件 common.ini 的完整路徑 string full_name_original_ini=common_data_path+"\\Files\\"+original_ini; ? // 文件 original.ini 的完整路徑 //--- common.ini -> original.ini if(!CopyFileW(full_name_common_ini,full_name_original_ini,false)) ? ? ?{ ? ? ? PrintFormat("引發(fā)失敗的錯誤: %x",kernel32::GetLastError()); ? ? ? return(false); ? ? ?} ? 使用 Win API 的 CopyFileW 函數(shù)拷貝 "common.ini" 配置文件至 "original.ini"。