最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

股票量化交易軟件:連續(xù)前行優(yōu)化3將機器人適配為自動優(yōu)化器

2023-07-10 13:57 作者:bili_45793681098  | 我要投稿

本文是該系列的第三篇,該連續(xù)前行優(yōu)化系列致力于創(chuàng)建自動優(yōu)化器。 以下鏈接指向前兩篇文章:


  1. 連續(xù)前行優(yōu)化 (第二部分): 創(chuàng)建優(yōu)化報告機器人的機理

本系列的第一篇文章專門研討一種操控和形成交易報告文件的創(chuàng)建機制,這是自動優(yōu)化器運作時所必需的。 第二篇文章則研討交易歷史記錄下載、和基于下載數(shù)據(jù)創(chuàng)建交易報告的關鍵對象實現(xiàn)。 本文充當前兩部分之間的橋梁:它闡述的是第一篇文章中研究的 DLL,以及第二篇文章中論述的報告下載對象之間的交互機制。

赫茲股票量化將分析從 DLL 導入的包裝類的創(chuàng)建過程,該類可依據(jù)交易歷史記錄形成 XML 文件。 赫茲股票量化還將研究一種與此包裝器進行交互的方法。 本文還包含兩個函數(shù)的論述,這些函數(shù)下載詳細和常規(guī)交易歷史記錄,便于進一步分析。 在結論里,我將介紹一個可協(xié)同自動優(yōu)化器一起操作的現(xiàn)成模板。 我還將展示標準算法示例,它來自默認智能系統(tǒng)集,該示例演示如何修改現(xiàn)有算法,從而與自動優(yōu)化器進行交互。


下載積累的交易歷史

有時赫茲股票量化需要將交易歷史記錄加載至文件中,便于進一步的分析和其他目的。 不幸地是,在終端中尚未提供這樣的接口,但可利用上一篇文章中研討的類來實施此任務。 研討類的文件所在的目錄中還有另外兩個文件 “ShortReport.mqh” 和 “DealsHistory.mqh”,這些文件可下載常規(guī)和詳細數(shù)據(jù)。

赫茲股票量化從 ShortReport.mqh 文件開始。 該文件包含函數(shù)和宏定義,其中主要的一個是 SaveReportToFile 函數(shù)。 首先,我們探討將數(shù)據(jù)寫入文件的 'write' 函數(shù)。

//+------------------------------------------------------------------+ //| File writer ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| //+------------------------------------------------------------------+ void writer(string fileName,string headder,string row) ?{ ? bool isFile=FileIsExist(fileName,FILE_COMMON); // Flag of whether the file exists ? int file_handle=FileOpen(fileName,FILE_READ|FILE_WRITE|FILE_CSV|FILE_COMMON|FILE_SHARE_WRITE|FILE_SHARE_READ); // Open file ? if(file_handle) // If the file has opened ? ? { ? ? ?FileSeek(file_handle,0,SEEK_END); // Move cursor to the file end ? ? ?if(!isFile) // If it is a newly created file, write a header ? ? ? ? FileWrite(file_handle,headder); ? ? ?FileWrite(file_handle,row); // Write message ? ? ?FileClose(file_handle); // Close the file ? ? } ?}

數(shù)據(jù)會被寫入文件沙箱 Terminal/Common/Files。 該函數(shù)的思路是在文件里加一行,再把數(shù)據(jù)寫入文件中,這就是為什么赫茲股票量化打開文件,獲取其句柄并移至文件末尾的原因。 如果文件剛剛創(chuàng)建,則寫入所傳遞標題,否則忽略此參數(shù)。

至于宏定義,它僅用于將機器人參數(shù)輕松添加到文件之中。

#define WRITE_BOT_PARAM(fileName,param) writer(fileName,"",#param+";"+(string)param);

在此宏定義中,赫茲股票量化利用了宏定義的優(yōu)勢,并組成了包含宏定義名稱及其值的字符串。 參數(shù)變量會被輸入到函數(shù)當中。 在宏定義的用例中將展示更多詳細信息。

主要方法 SaveReportToFile 很冗長,這就是為什么我只提供了部分代碼。 該方法創(chuàng)建 CDealHistoryGetter 類的實例,并接收含有累積交易歷史記錄的數(shù)組,其中每一行表示一筆成交。

DealDetales history[]; CDealHistoryGetter dealGetter(_comission_manager); dealGetter.getDealsDetales(history,0,TimeCurrent());

然后,它驗證歷史記錄是否為空,創(chuàng)建 CReportCreator 類實例,并接收含有主要系數(shù)的結構:

if(ArraySize(history)==0) ? return; CReportCreator reportCreator(_comission_manager); reportCreator.Create(history,0); TotalResult totalResult; reportCreator.GetTotalResult(totalResult); PL_detales pl_detales; reportCreator.GetPL_detales(pl_detales);

然后,利用 “writer” 函數(shù)在循環(huán)里將歷史數(shù)據(jù)保存。 在循環(huán)結束時,會添加含有以下系數(shù)和數(shù)值的字段:

  • PL

  • Total trades

  • Consecutive wins

  • Consecutive Drawdowns

  • Recovery factor

  • Profit factor

  • Payoff

  • Drawdown by pl


writer(fileName,"","=========================================================================================================="); writer(fileName,"","PL;"+DoubleToString(totalResult.total.PL)+";"); int total_trades=pl_detales.total.profit.orders+pl_detales.total.drawdown.orders; writer(fileName,"","Total trdes;"+IntegerToString(total_trades)); writer(fileName,"","Consecutive wins;"+IntegerToString(pl_detales.total.profit.dealsInARow)); writer(fileName,"","Consecutive DD;"+IntegerToString(pl_detales.total.drawdown.dealsInARow)); writer(fileName,"","Recovery factor;"+DoubleToString(totalResult.total.recoveryFactor)+";"); writer(fileName,"","Profit factor;"+DoubleToString(totalResult.total.profitFactor)+";"); double payoff=MathAbs(totalResult.total.averageProfit/totalResult.total.averageDD); writer(fileName,"","Payoff;"+DoubleToString(payoff)+";"); writer(fileName,"","Drawdown by pl;"+DoubleToString(totalResult.total.maxDrawdown.byPL)+";");

方法操作至此完畢。 現(xiàn)在,赫茲股票量化研究一種下載歷史記錄的簡便方法:我們在標準發(fā)行包的智能交易系統(tǒng) Experts/Examples/Moving Average/Moving Average.mq5 里添加此功能。 首先,我們需要連接文件:

#include <History manager/ShortReport.mqh>

然后,將設置自定義傭金和滑點的變量添加到輸入中:

input double custom_comission = 0; // Custom commission; input int custom_shift = 0; // Custom shift;

如果赫茲股票量化希望有針對性地而非有條件地設置傭金和滑點(請參閱上一篇文章中的 CDealHistoryGetter 類說明),那么在連接文件之前,我們需要確定 ONLY_CUSTOM_COMISSION 參數(shù),如下所示:

#define ONLY_CUSTOM_COMISSION #include <History manager/ShortReport.mqh>

然后創(chuàng)建 CCCM 類樣本,在 OnInit 方法里向類實例中添加并保存?zhèn)蚪鸷突c。

CCCM _comission_manager_; ... int OnInit(void) ?{ ? _comission_manager_.add(_Symbol,custom_comission,custom_shift); ? ... ?}

然后在 OnDeinit 方法中添加以下代碼行:

//+------------------------------------------------------------------+ //| Expert deinitialization function ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------+ void OnDeinit(const int reason) ?{ ? if(MQLInfoInteger(MQL_TESTER)==1) ? ? { ? ? ?string file_name = __FILE__+" Report.csv"; ? ? ?SaveReportToFile(file_name,&_comission_manager_); ? ? ?WRITE_BOT_PARAM(file_name,MaximumRisk); ? ? ?// Maximum Risk in percentage ? ? ?WRITE_BOT_PARAM(file_name,DecreaseFactor); ? // Decrease factor ? ? ?WRITE_BOT_PARAM(file_name,MovingPeriod); ? ? // Moving Average period ? ? ?WRITE_BOT_PARAM(file_name,MovingShift); ? ? ?// Moving Average shift ? ? ?WRITE_BOT_PARAM(file_name,custom_comission); // Custom commission ? ? ?WRITE_BOT_PARAM(file_name,custom_shift); ? ? // Custom shift ? ? } ?}

該代碼在刪除機器人實例后執(zhí)行檢查:檢查是否運行于測試器的條件。 如果機器人運行在測試器當中,則會調用函數(shù)將機器人交易歷史保存到名為 “Compiled_file_name Report.csv” 的文件之中。 在將所有數(shù)據(jù)寫入文件之后,該文件的輸入?yún)?shù)還要再添加 6 行。 在策略測試器里每次以測試模式啟動智能交易系統(tǒng)后,我們都會得到一個文件,其中包含 EA 執(zhí)行的成交說明。 每當赫茲股票量化開始新的測試時,此文件將被覆蓋。 該文件將存儲在 Common/Files 目錄下的文件沙箱中。

下載按成交劃分的交易歷史記錄

現(xiàn)在赫茲股票量化查看如何下載詳細的交易報告,即,將所有成交按倉位分組報告。 為此目的,我們將利用 DealsHistory.mqh 文件,該文件已經(jīng)包含 ShortReport.mqh 文件連接。 這意味著僅需連接一個 DealsHistory.mqh 文件,我們就可同時使用兩個方法。

該文件包含兩個函數(shù)。 第一個是一個普通函數(shù),它能漂亮地完成求和:

void AddRow(string item, string &str) ?{ ? str += (item + ";"); ?}

第二個函數(shù)利用先前研討的 “writer” 函數(shù)將數(shù)據(jù)寫入文件。 其完整實現(xiàn)如下所示。

void WriteDetalesReport(string fileName,CCCM *_comission_manager) ?{ ? if(FileIsExist(fileName,FILE_COMMON)) ? ? { ? ? ?FileDelete(fileName,FILE_COMMON); ? ? } ? CDealHistoryGetter dealGetter(_comission_manager); ? DealKeeper deals[]; ? dealGetter.getHistory(deals,0,TimeCurrent()); ? int total= ArraySize(deals); ? string headder = "Asset;From;To;Deal DT (Unix seconds); Deal DT (Unix miliseconds);"+ ? ? ? ? ? ? ? ? ? ?"ENUM_DEAL_TYPE;ENUM_DEAL_ENTRY;ENUM_DEAL_REASON;Volume;Price;Comission;"+ ? ? ? ? ? ? ? ? ? ?"Profit;Symbol;Comment"; ? for(int i=0; i<total; i++) ? ? { ? ? ?DealKeeper selected = deals[i]; ? ? ?string asset = selected.symbol; ? ? ?datetime from = selected.DT_min; ? ? ?datetime to = selected.DT_max; ? ? ?for(int j=0; j<ArraySize(selected.deals); j++) ? ? ? ?{ ? ? ? ? string row; ? ? ? ? AddRow(asset,row); ? ? ? ? AddRow((string)from,row); ? ? ? ? AddRow((string)to,row); ? ? ? ? AddRow((string)selected.deals[j].DT,row); ? ? ? ? AddRow((string)selected.deals[j].DT_msc,row); ? ? ? ? AddRow(EnumToString(selected.deals[j].type),row); ? ? ? ? AddRow(EnumToString(selected.deals[j].entry),row); ? ? ? ? AddRow(EnumToString(selected.deals[j].reason),row); ? ? ? ? AddRow((string)selected.deals[j].volume,row); ? ? ? ? AddRow((string)selected.deals[j].price,row); ? ? ? ? AddRow((string)selected.deals[j].comission,row); ? ? ? ? AddRow((string)selected.deals[j].profit,row); ? ? ? ? AddRow(selected.deals[j].symbol,row); ? ? ? ? AddRow(selected.deals[j].comment,row); ? ? ? ? writer(fileName,headder,row); ? ? ? ?} ? ? ?writer(fileName,headder,""); ? ? } ?}

接收交易數(shù)據(jù)并創(chuàng)建標題后,繼續(xù)寫入詳細的交易報告。 為此目的,實現(xiàn)一個嵌套的循環(huán):主循環(huán)處理倉位,而嵌套的循環(huán)則遍歷這些倉位內含的成交。 寫入每筆新倉位(即構成倉位的一系列成交)之后,會用空格將之分隔。 這樣可以確保讀取生成的文件時更有效率。 赫茲股票量化無需進行重大修改即可將該功能添加到機器人之中,僅需在 OnDeinit 中執(zhí)行調用:

void OnDeinit(const int reason) ?{ ? if(MQLInfoInteger(MQL_TESTER)==1) ? ? { ? ? ?string file_name = __FILE__+" Report.csv"; ? ? ?SaveReportToFile(file_name,&_comission_manager_); ? ? ?WRITE_BOT_PARAM(file_name,MaximumRisk); ? ? ?// Maximum Risk in percentage ? ? ?WRITE_BOT_PARAM(file_name,DecreaseFactor); ? // Descrease factor ? ? ?WRITE_BOT_PARAM(file_name,MovingPeriod); ? ? // Moving Average period ? ? ?WRITE_BOT_PARAM(file_name,MovingShift); ? ? ?// Moving Average shift ? ? ?WRITE_BOT_PARAM(file_name,custom_comission); // Custom commission; ? ? ?WRITE_BOT_PARAM(file_name,custom_shift); ? ? // Custom shift; ? ? ?WriteDetalesReport(__FILE__+" Deals Report.csv", &_comission_manager_); ? ? } ?}

為了詳細演示如何執(zhí)行數(shù)據(jù)下載,此處是一個空的 EA 模板,其中包含所添加的下載報告的方法:


//+------------------------------------------------------------------+ //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Test.mq5 | //| ? ? ? ? ? ? ? ? ? ? ? ?Copyright 2019, MetaQuotes Software Corp. | //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link ? ? ?"https://www.mql5.com" #property version ? "1.00" #define ONLY_CUSTOM_COMISSION #include <History manager/DealsHistory.mqh> input double custom_comission ? = 0; ? ? ? // Custom commission; input int ? ?custom_shift ? ? ? = 0; ? ? ? // Custom shift; CCCM _comission_manager_; //+------------------------------------------------------------------+ //| Expert initialization function ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------+ int OnInit() ?{ //--- ? _comission_manager_.add(_Symbol,custom_comission,custom_shift); //--- ? return(INIT_SUCCEEDED); ?} //+------------------------------------------------------------------+ //| Expert deinitialization function ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------+ void OnDeinit(const int reason) ?{ //--- ? if(MQLInfoInteger(MQL_TESTER)==1) ? ? { ? ? ?string arr[]; ? ? ?StringSplit(__FILE__,'.',arr); ? ? ?string file_name = arr[0]+" Report.csv"; ? ? ?SaveReportToFile(file_name,&_comission_manager_); ? ? ?WRITE_BOT_PARAM(file_name,custom_comission); // Custom commission; ? ? ?WRITE_BOT_PARAM(file_name,custom_shift); ? ? // Custom shift; ? ? ?WriteDetalesReport(arr[0]+" Deals Report.csv", &_comission_manager_); ? ? } ?} //+------------------------------------------------------------------+ //| Expert tick function ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------+ void OnTick() ?{ //--- ?} //+------------------------------------------------------------------+

通過在上述模板中添加任何所需的邏輯,赫茲股票量化可在策略測試器中完成 EA 測試后,啟用生成交易報告。

創(chuàng)建累積交易歷史記錄的 DLL 包裝器

本系列的第一篇文章專門研討以 C# 語言創(chuàng)建處理優(yōu)化報告的 DLL。 鑒于連續(xù)前行優(yōu)化的最便捷格式為 XML,我們所創(chuàng)建的 DLL 可以讀取、寫入和排序結果報告。 在智能交易系統(tǒng)當中,赫茲股票量化僅需數(shù)據(jù)寫入功能。 不過,由于利用純函數(shù)進行的操作不如對象方便,故創(chuàng)建了下載數(shù)據(jù)的包裝器類。 該對象位于 XmlHistoryWriter.mqh 文件中,稱為 СXmlHistoryWriter。 除了對象之外,它還定義 EA 參數(shù)的結構。 將 EA 參數(shù)列表傳遞給對象時,會用到此結構。 我們來研究所有實現(xiàn)細節(jié)。

若要啟用創(chuàng)建優(yōu)化報告,連接 ReportCreator.mqh 文件。 為了調用類靜態(tài)方法里定義的來自第一篇文章中所述 DLL,我們需導入它(該函數(shù)庫必須在 MQL5/Libraries 目錄下可用)。


股票量化交易軟件:連續(xù)前行優(yōu)化3將機器人適配為自動優(yōu)化器的評論 (共 條)

分享到微博請遵守國家法律
泰宁县| 聂拉木县| 黔江区| 新余市| 巍山| 松潘县| 孟州市| 天水市| 宣恩县| 成安县| 郓城县| 余姚市| 崇左市| 长沙市| 漠河县| 宜州市| 微山县| 天水市| 合江县| 彭州市| 长海县| 六枝特区| 五家渠市| 古浪县| 镇康县| 云浮市| 东兰县| 齐齐哈尔市| 宁波市| 龙江县| 新晃| 台州市| 北流市| 济宁市| 格尔木市| 五原县| 唐河县| 新宁县| 武川县| 五河县| 禹州市|