股票量化交易軟件:連續前行優化第八部分程序改進和修復
添加日期自動完成
以前的程序版本分階段輸入日期,從而進行前行和歷史優化,這很不方便。 而這一回,我實現了所需時間范圍的自動輸入。 功能的細節可以描述如下。 所選時間間隔應自動分為前行優化和歷史優化。 兩種優化類型的步驟都是固定的,并在間隔拆分之前已設置完畢。 每個新的前行范圍必須在上一個范圍之后的第二天開始。 歷史間隔的偏移(重疊)等于前行窗口的步長。 與歷史優化不同,前行優化不會重疊,它們實現了連續的交易歷史。
(資料圖片僅供參考)
為了實現該任務,我決定將此功能轉移到一個單獨的圖形窗口之中,并令其獨立于主界面,彼此不直接相關。 結果就是,赫茲股票量化得到以下對象層次結構。
赫茲股票量化來研究一下此功能如何連接,并查看其實現示例。 赫茲股票量化從創建擴展的圖形界面開始,即,圖表上的所有內容來自 AutoFillInDateBorders 對象,該對象代表圖形窗口,及以下。 該圖片示意 GUI 元素,XAML 標記,以及由 AutoFillInDateBordersVM 類呈現的 ViewModel 部分中的字段。
如您所見,GUI 包括三個主要部分。 其中包括兩個日歷,用來輸入優化期開始和結束日期;指定前行和歷史間隔邊界的表格;以及 “Set” 按鈕,單擊該按鈕會將指定范圍劃分為相應的歷史和前行窗口。 屏幕截圖中的表格包含重復的三行,實際上只有兩行:第一行負責歷史日期范圍,第二行設置前行范圍。
表格中的 “Value” 是相應優化類型的步數,以天為單位的。 例如,如果歷史間隔的值是 360 天,而前行值是 90,則意味著日歷中指定的時間間隔將分為 360 天的歷史優化間隔,和 90 天的前行間隔。 每個下一個歷史優化窗口的開始將依據前行間隔步數平移。
class AutoFillInDateBordersM : IAutoFillInDateBordersM{ ? ?private AutoFillInDateBordersM() { } ? ?private static AutoFillInDateBordersM instance; ? ?public static AutoFillInDateBordersM Instance() ? ?{ ? ? ? ?if (instance == null) ? ? ? ? ? ?instance = new AutoFillInDateBordersM(); ? ? ? ?return instance; ? ?} ? ?public event Action<List<KeyValuePair<OptimisationType, DateTime[]>>> DateBorders; ? ?public void Calculate(DateTime From, DateTime Till, uint history, uint forward) ? ?{ ? ? ? ?if (From >= Till) ? ? ? ? ? ?throw new ArgumentException("Date From must be less then date Till"); ? ? ? ?List<KeyValuePair<OptimisationType, DateTime[]>> data = new List<KeyValuePair<OptimisationType, DateTime[]>>(); ? ? ? ?OptimisationType type = ; ? ? ? ?DateTime _history = From; ? ? ? ?DateTime _forward = (history + 1); ? ? ? ?DateTime CalcEndDate() ? ? ? ?{ ? ? ? ? ? ?return type == ? _(history) : _(forward); ? ? ? ?} ? ? ? ? ?while (CalcEndDate() <= Till) ? ? ? ?{ ? ? ? ? ? ?DateTime from = type == ? _history : _forward; ? ? ? ? ? ?(new KeyValuePair<OptimisationType, DateTime[]>(type, new DateTime[2] { from, CalcEndDate() })); ? ? ? ? ? ?if (type == ) ? ? ? ? ? ? ? ?_history = _(forward + 1); ? ? ? ? ? ?else ? ? ? ? ? ? ? ?_forward = _(forward + 1); ? ? ? ? ? ?type = type == ? : ; ? ? ? ?} ? ? ? ?if ( == 0) ? ? ? ? ? ?throw new ArgumentException("Can`t create any date borders with set In sample (History) step"); ? ? ? ?DateBorders?.Invoke(data); ? ?}}
窗口數據的模型類是運用單例范式(Singletone pattern)編寫的對象。 這樣可以繞開擴展的圖形窗口,令主窗口的 ViewModel 部分與數據模型進行交互。 在有趣的方法當中,對象僅包含“Calculate” ,用來計算日期范圍,并在完成上述過程后調用 事件。 事件接收一對數值集合作為參數,其中鍵值是所分析間隔的類型(前行或歷史優化),而其值是一個包含兩個 DateTime 值的數組。 第一個表示所選間隔的開始日期,而第二個表示結束日期。
該方法會在一個循環中計算日期范圍,備選是更改計算窗口的類型(前行或歷史)。 首先,歷史窗口類型設置為所有計算的起點。 在循環開始之前還設置了每種窗口類型的初始日期值。 在循環的每次迭代中,使用嵌套函數計算所選窗口類型的邊界極值,然后依據極值范圍日期驗證該值。 如果日期超界,那么此為循環退出條件。 優化窗口范圍是在循環里形成的。 然后,更新下一個窗口開始日期和窗口類型切換器。
所有操作之后,如果未發生任何錯誤,則利用所傳遞日期范圍調用事件。 所有進一步的動作均由類來執行。 按下 “Set” 按鈕回調可啟動上述方法的執行。
為赫茲股票量化的擴展而建立的數據模型工廠以最簡單的方式實現:
class AutoFillInDateBordersCreator{ ? ?public static IAutoFillInDateBordersM Model => ();}
基本上,當我們調用 “Model” 靜態屬性時,我們持續引用數據模型對象的同一實例,然后將其強制轉換為接口類型。 我們在主窗口的 ViewModel 部分中用到此事實。
public AutoOptimiserVM(){ ? ?... ? ? += Model_DateBorders; ? ?....}~AutoOptimiserVM(){ ? ?... ? ? -= Model_DateBorders; ? ?....}
在主窗口 ViewModel 對象的構造函數和析構函數之中,赫茲股票量化都可不用存儲指向該類實例的指針,但調用它則要通過靜態數據模型工廠。 請注意,主窗口的 ViewModel 部分實際上配合所研究的類一起操作,但無需知道該類是這樣操作的。 因為在類構造函數和析構函數中之外,其他任何地方都未提及引用了該對象。 訂閱所提到的事件后,在回調時,首先清空所有先前輸入的日期范圍,然后在循環中添加經事件傳遞來的新日期范圍,一次一個。 在集合中添加日期范圍的方法也已在主圖形界面的 ViewModel 端實現。 看起來像這樣:
void _AddDateBorder(DateTime From, DateTime Till, OptimisationType DateBorderType){ ? ? ? ?try ? ?{ ? ? ? ?DateBorders border = new DateBorders(From, Till); ? ? ? ?if (!(x => == DateBorderType).Any(y => == border)) ? ? ? ?{ ? ? ? ? ? ?(new DateBordersItem(border, _DeleteDateBorder, DateBorderType)); ? ? ? ?} ? ?} ? ?catch (Exception e) ? ?{ ? ? ? ?(); ? ?}}
DateBorder 對象的創建包裝在 “try-catch” 構造當中。 這樣做是因為對象構造函數里可能會發生異常,且必須以某種方式處理它。 我還添加了 ClearDateBorders 方法:
ClearDateBorders = new RelayCommand((object o) =>{ ? ?();});
它可以快速刪除所有輸入的日期范圍。 在以前的版本中,每個日期都需要分別刪除,這對于大量日期而言是不便的。 在之前存在的日期范圍控制的相同代碼行中添加了 GUI 主窗口按鈕調用所講述的新創內容。
單擊 “Autoset” 將觸發一次回調,它調用 SubFormKeeper 類實例之中的 Open 方法。 該類被編寫為包裝器,其中封裝嵌套的窗口創建過程。 這消除了主窗口 ViewModel 中不必要的屬性和字段,并防止赫茲股票量化直接訪問已創建的輔助窗口,因為本不該直接進行交互。
class SubFormKeeper{ ? ?public SubFormKeeper(Func<Window> createWindow, Action<Window> subscribe_events = null, Action<Window> unSubscribe_events = null); ? ?public void Open(); ? ?public void Close();}
如果您查看類代碼,則可從公開方法中看到它提供了確切的可能性集合。 進而,所有輔助自動優化器窗口都將包裝在此特定類當中。
函數庫中操控優化結果的新功能和錯誤修復
本文的此部分講述處理優化報告函數庫中的修改 - “”。 除了引入自定義系數外,新功能還可以更快地從終端卸載優化報告。 它還修復了數據排序中的錯誤。
引入一個自定義優化系數
前幾篇文章的評論中有一項改進建議,就是能夠采用自定義系數來過濾優化結果。 為了實現這個選項,我必須對現有對象進行一些修改。 無論如何,為了支持舊報表,讀取優化數據的類既可與含有自定義系數的報表一起操作,也可與程序的早期版本中生成的報表一起操作。 因此,報告格式保持不變。 它有一個附加參數 - 一個用于指定自定義系數的字段。
現在,“ SortBy” 枚舉含有新參數 “Custom”,并已將相應的字段添加到 “Coefficients” 結構之中。 這會將系數添加到負責存儲數據的對象當中,但不會將其添加到卸載和讀取數據的對象之中。 數據寫入是通過兩種方法執行的,和一個擁有靜態方法的類,它是為了從 MQL5 中保存報告。
public static void AppendMainCoef(double customCoef, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?double payoff, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?double profitFactor, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?double averageProfitFactor, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?double recoveryFactor, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?double averageRecoveryFactor, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int totalTrades, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?double pl, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?double dd, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?double altmanZScore){ ? ? = customCoef; ? ?...}
首先,將標識自定義系數的新參數添加到 AppendMainCoef 方法當中。 然后,像其他傳遞的系數一樣,將其添加到 結構之中。 現在,如果您嘗試利用新的 “” 函數庫編譯舊項目,則會出現異常,因為 AppendMainCoef 方法代碼已有變化。 可稍微編輯卸載數據的對象來解決此錯誤 - 赫茲股票量化稍后將繼續討論 MQL5 代碼。
為了能夠正確編譯當前的 dll 版本,請用本文下面附帶的新代碼替換 Include 目錄中的 “History Manager”,如此足以在編譯機器人時兼容新、舊方法。
另外,我還修改了 Write 方法的代碼,該方法現在不會引發異常,但會返回錯誤消息。 這樣做是因為該程序不再使用命名互斥體,該互斥體明顯減慢了數據卸載過程,但是在舊版本的卸載類中必需用其生成報告。 不過,我尚未刪除使用互斥體寫入數據的方法,以便保持與先前實現的數據導出格式的兼容性。
為了讓新記錄出現在報告文件中,我們需要創建一個新的 <Item/> 標記,其 Name 屬性等于 “Custom”。
WriteItem(xmlDoc, xpath, "Item", (), new Dictionary<string, string> { { "Name", "Custom" } });
另一種修改的方法是 :在此處添加了類似的代碼行,該代碼行加入了帶有自定義系數參數的 <Item/> 標簽。
現在,赫茲股票量化研究將自定義系數添加到數據和 MQL 機器人代碼當中。 首先,我們研究舊版本的數據下載功能,其中與 ReportWriter 類一起操作的代碼位于 文件的 CXmlHistoryWriter 類當中。 創建了以下代碼的引用,以便支持自定義系數:
typedef double(*TCustomFilter)();
上述類中的 “private” 字段存儲此函數。
class CXmlHistoryWriter ?{private: ? const string ? ? ?_path_to_file,_mutex_name; ? CReportCreator ? ?_report_manager; ? TCustomFilter ? ? custom_filter; ? void ? ? ? ? ? ? ?append_bot_params(const BotParams ?¶ms[]);// ? void ? ? ? ? ? ? ?append_main_coef(PL_detales &pl_detales, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?TotalResult &totalResult);// ? //double ? ? ? ? ? ?get_average_coef(CoefChartType type); ? void ? ? ? ? ? ? ?insert_day(PLDrawdown &day,ENUM_DAY_OF_WEEK day);// ? void ? ? ? ? ? ? ?append_days_pl();//public: ? ? ? ? ? ? ? ? ? ? CXmlHistoryWriter(string file_name,string mutex_name, ? ? ? ? ? ? ? ? ? ? CCCM *_comission_manager, TCustomFilter filter);// ? ? ? ? ? ? ? ? ? ? CXmlHistoryWriter(string mutex_name,CCCM *_comission_manager, TCustomFilter filter); ? ? ? ? ? ? ? ? ? ?~CXmlHistoryWriter(void) {_report_();} // ? void ? ? ? ? ? ? ?Write(const BotParams ¶ms[],datetime start_test,datetime end_test);// ?};
該“private” 字段的值是從類的構造函數中填充的。 進而,在 append_main_coef 方法中,當從 dll 庫調用 “ReportWriter::AppendMainCoef” 靜態方法時,通過其指針調用所傳遞的函數,并接收自定義系數值。
圖片
-
券商午后異動急拉,個股悉數
女子稱自己患精神疾病兒子被
奇點汽車被申請破產審查 燒
-
上半年中歐班列累計開行8641列
2023年云南日報報業集團公開
廣州“三舊”改造實施辦法征
黑芝麻智能疑似深度綁定一汽
2023年蘭州城區普通高中錄取
跨界光伏者的N種“作死”法
-
路景交融 綠美常在 曲靖市
《八角籠中》成中國影史點映
唐山市疾控提醒:腸道傳染病
本人生日怎么發朋友圈圖片_
衛生間應放什么植物好
我的世界發射器怎樣發射(我
-
“低門檻”副業好做嗎?哪些
“后亞運時代”頂級自辦賽事
熱熱熱!陽光的威力!廣東年
最新消息:【天天時快訊】當
工業互聯網創新發展專題論壇
吉林省吉林市2023-06-24 16
精彩推送
- 人均購買力平價gdp排名一覽 購買力平價計算公式是什么
- 股票量化交易軟件:連續前行優化第八部分程序改進和修復
- 券商午后異動急拉,個股悉數翻紅,券商ETF(512000)直線上攻漲逾1%!
- 購買力平價名詞解釋?購買力平價理論是誰提出來的?
- 教授稱有人花百萬留學回來月薪5000是真的嗎?國外留學回來工資多少?
- 銀行承兌匯票怎么承兌?為什么企業不愿意收承兌匯票?
- 私營企業破產清算賠償五大順序是什么?破產清算對法人的影響大嗎?
- 公司破產清算要多久才完成?破產清算原有物資怎么處理?
- 銀行承兌幾個月到期?建行承兌貼現一般幾個點?
- 破產清算組由哪些人組成?破產清算和破產重組的區別是什么?
- 破產清算員工怎么賠償?公司申請破產的條件有哪些?
- 北京經開區國家級專精特新企業達87家——“小巨人”扎堆凸顯科創實力 當前熱點
- 傳奇手游藍月無限刀福利版:藍月傳奇寶石獲取攻略
- 河南新鄉再添農業“芯片” 食用菌新品種授權數量全國第一_環球快報
- 當前熱訊:2023年鄂爾多斯市農村牧區供水工程已全部開工建設
- 已婚男同時交往5名女友,被發現后女友們聯合報警!長沙檢察官公開征集線索
- 當前最新:山西探索培養文物全科人才強化基層文保
- 雄安新區謀劃出海通道完善交通“微細血管”_每日時訊
- 車子放久了電瓶沒電了怎么啟動(車子放久了電瓶沒電怎么辦)
- 天地源:前6月合約銷售金額59.8億元
- 保利置業:前6月合約銷售金額374億元
- 平安不動產180億元公司債券發行計劃獲通過
- 綠城中國:前6月合約銷售金額1342億元_焦點日報
- 燦瑞科技:公司磁傳感器、智能電機驅動芯片等產品均可用于機器人上
- 女子稱自己患精神疾病兒子被游戲網友騙至緬北遭毆打,“再不去救,就要被賣到下家公司”,警方:已刑事立案
- 江蘇公布打擊整治網絡謠言10起典型案例
- 小米手機還原網絡設置
- 海通證券被北交所口頭警示 保薦代表人信息披露違規
- 午評:指數延續震蕩調整 種植業與林業板塊強勢
- 奇點汽車被申請破產審查 燒光170億后迎來“至暗時刻”
- 標的物履行條款是什么?標的和標的物可能是一個東西嗎?
- 提存期間標的物孳息歸誰所有?標的物意外滅失風險的承擔人是誰?
- 標的物的風險負擔規則是什么?標的物風險轉移的情況有哪兩種?
- 威海市商業銀行賦能“漁光互補”降減排 唱響“綠色興農”協奏曲
- 金融期貨標的物包括哪些工具?標的物提存的法定情形有哪些?
- 城市維護建設稅計稅基數是什么?個人需要交城市維護建設稅嗎?
- 全球堅果供應鏈巨頭與三只松鼠在安徽合資建廠
- 我省將迎來入夏以來最強高溫天氣
- 盛洋科技終止向關聯方買中交科技 財務顧問為中天國富
- 應交城市維護建設稅包括哪些?城市維護建設稅減半征收政策2023最新
- 城市維護建設稅屬于什么稅種?城市維護建設稅稅收優惠政策有哪些?
- 【調研快報】蘇州科達接待信達證券等多家機構調研
- 城市維護建設稅是什么意思?城市維護建設稅特征有哪些?城建費有什么用途?
- 上半年中歐班列累計開行8641列
- 法定盈余公積可以彌補虧損嗎?法定盈余公積怎么提取?
- 法定盈余公積提取會計分錄怎么寫?法定盈余公積可以分配股利嗎?
- 法定盈余公積可以轉增資本嗎?法定盈余公積意思解釋
- 法定盈余公積必須提取嗎?法定盈余公積怎么計算?
- 美國男籃官方公布世界杯12人大名單
- 蘋果更新TestFlight應用程序 支持visionOS和Apple Vision Pro
- 2023年云南日報報業集團公開招聘人員面試公告
- 鼎鎂科技IPO上會被否
- 鼎鎂科技IPO上會被否
- 合眾偉奇深交所上會被暫緩審議 保薦機構為光大證券
- 中信銀行西安分行被罰 違反金融消費權益保護管理規定
- 萬和科技終止北交所IPO 保薦機構為安信證券
- 華鈺礦業7月7日盤中跌幅達5%
- 甘肅金昌:全面打造千億級新能源產業集群-天天熱文
- 全球即時看!愛樂匯交響樂團《完全貝多芬》2023-2024 音樂季發布
- 信息:福州“小電驢”新規首日:從“報廢”到“上新”只需十幾分鐘
- 黑芝麻智能疑似深度綁定一汽,10輪融資后現金流僅夠維持24個月
- 廣州“三舊”改造實施辦法征求民意,突出保護樹木和歷史文化
- 可轉債新券再度暴漲 全部觸發盤中臨時停牌
- 齊齊哈爾市開展排水防澇應急搶險演練
- 大運河文化帶建設高端智庫成立:讓大運河“活”起來|環球觀熱點
- 四川啟動培育第二批500家“千戶重點外貿企業”
- 馬斯克稱全面自動駕駛將在今年年末到來
- 圓尾斗魚吃什么食物(圓尾斗魚壽命)
- 2023年蘭州城區普通高中錄取最低控制線確定
- 禾信儀器終止不超2.3億元可轉債 2021年上市募3.1億
- 廣合科技過會:今年IPO過關第175家 民生證券過11單
- 基金分紅:富國純債債券發起式基金7月12日分紅
- 蘭州銀行:副行長王毅任職資格獲批
- 人民幣兌美元中間價報7.2054 調升44個基點
- 今日上市:海科新源、致尚科技
- 避暑消費紅火 催熱“夏日經濟”
- 西藏自治區黨委巡視組原副廳級巡視專員羅紅嚴重違紀違法被“雙開”
- 畢業季來臨 貝殼租房將在13城開啟“新青年計劃”助力應屆生租好房 環球觀點
- 觀想科技(301213)7月6日主力資金凈買入91.86萬元
- 14部門部署暑期兒童關愛活動
- 當前訊息:6月份電商物流指數公布 連續六個月環比回升
- 6月份物流業景氣指數為51.7% 投資保持規模增長
- 6月份中國公路物流運價指數為102.4點 運力供給仍較為充足
- 跨界光伏者的N種“作死”法
- 保險營銷員銷售分紅保險、投資連結保險
- 大盤買盤不足,謹慎技術調整風險
- 路景交融 綠美常在 曲靖市推進綠美交通建設
- 今日申購:精智達
- “黑馬”東風納米為何橫空出世?
- 吉利6月新能源銷量、滲透率均創新高 銀河L7首月售近萬輛
- 數字人施展“超能力” 廠商角逐大模型金融應用
- 多項經濟指標回升 我國經濟向好發展態勢明顯
- 杭州人物志之韓世忠:弦斷有誰聽
- 美國制造業PMI連續八個月萎縮 天天快播
- 今夏用電負荷持續攀升 新能源火力全開助力電力供應有保障|當前訊息
- 耐看幽默的網文(幽默網文)
- 環球滾動:國家發改委等部門發布《工業重點領域能效標桿水平和基準水平(2023年版)》
- 多家銀行下調大額存單利率 錢還能放哪?_環球最新
- 上半年97%債基上漲 工銀天弘融通南方等產品領漲
- 《八角籠中》成中國影史點映總票房冠軍