• <strike id="800qq"></strike>
    <ul id="800qq"></ul>
    
    
    <ul id="800qq"><tbody id="800qq"></tbody></ul>
  • 您的位置:互聯網 > 正文

    股票量化交易軟件:連續前行優化第八部分程序改進和修復

    來源: 時間:2023-07-07 13:59:17

    添加日期自動完成

    以前的程序版本分階段輸入日期,從而進行前行和歷史優化,這很不方便。 而這一回,我實現了所需時間范圍的自動輸入。 功能的細節可以描述如下。 所選時間間隔應自動分為前行優化和歷史優化。 兩種優化類型的步驟都是固定的,并在間隔拆分之前已設置完畢。 每個新的前行范圍必須在上一個范圍之后的第二天開始。 歷史間隔的偏移(重疊)等于前行窗口的步長。 與歷史優化不同,前行優化不會重疊,它們實現了連續的交易歷史。


    (資料圖片僅供參考)

    為了實現該任務,我決定將此功能轉移到一個單獨的圖形窗口之中,并令其獨立于主界面,彼此不直接相關。 結果就是,赫茲股票量化得到以下對象層次結構。

    赫茲股票量化來研究一下此功能如何連接,并查看其實現示例。 赫茲股票量化從創建擴展的圖形界面開始,即,圖表上的所有內容來自 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 ?&params[]);// ? 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 &params[],datetime start_test,datetime end_test);// ?};

    該“private” 字段的值是從類的構造函數中填充的。 進而,在 append_main_coef 方法中,當從 dll 庫調用 “ReportWriter::AppendMainCoef” 靜態方法時,通過其指針調用所傳遞的函數,并接收自定義系數值。

    關鍵詞:

    精彩推送

    公司

    文物全科人才畢業后直接到縣(市、區)及以下文物保護事業單位定向就業

    詳細>>

    今年,鄂爾多斯立足于全市資源型缺水、水質型缺水、工程型缺水并存的實

    詳細>>

    7月5日,新鄉市農科院傳來喜訊,該院近日收到農業農村部頒發的21個植物

    詳細>>

    河北省交通運輸廳日前印發的《加快建設交通強省實施方案》提出,圍繞高

    詳細>>

    近日,記者從北京經開區了解到,截至目前,這里已擁有國家級專精特新“

    詳細>>

    4日,愛樂匯交響樂團《完全貝多芬》2023-2024音樂季媒體見面會在愛樂匯

    詳細>>
    色九月亚洲综合网| 亚洲人成无码网WWW| 亚洲国产精品一区二区久| 亚洲中文字幕无码中文字| 91麻豆精品国产自产在线观看亚洲 | 国产亚洲av片在线观看18女人| 中中文字幕亚洲无线码| 亚洲国产精品VA在线观看麻豆| 亚洲国产熟亚洲女视频| 久久精品国产亚洲| 亚洲国产精品一区二区九九| 亚洲一卡2卡4卡5卡6卡在线99 | 亚洲乱码卡一卡二卡三| 亚洲另类图片另类电影| 亚洲国产亚洲片在线观看播放| 91亚洲精品自在在线观看| 亚洲精品伊人久久久久| 亚洲色中文字幕在线播放| 夜夜亚洲天天久久| 国产亚洲一区区二区在线| 中文字幕精品亚洲无线码一区| 中文亚洲AV片不卡在线观看| 国产V亚洲V天堂无码久久久| 久久久亚洲精品视频| 亚洲高清美女一区二区三区| 亚洲一区二区三区在线观看精品中文 | 亚洲精品字幕在线观看| 亚洲成A人片在线观看中文| 国产精品高清视亚洲一区二区| 亚洲欧美国产国产综合一区| 久久精品国产亚洲AV电影网| 亚洲国产中文v高清在线观看| 久久影院亚洲一区| 久久久影院亚洲精品| 亚洲大尺码专区影院| 91亚洲国产成人久久精品网站| 91嫩草亚洲精品| 色偷偷尼玛图亚洲综合| 亚洲日韩国产一区二区三区在线| www亚洲精品久久久乳| 国产亚洲精品线观看动态图|