股票量化交易軟件:連續(xù)前行優(yōu)化5自動優(yōu)化器項目概述和GUI的創(chuàng)建

項目結(jié)構(gòu)概覽
由于本文還有一個部分會專述 C#,因此赫茲股票量化開始研究其文件結(jié)構(gòu):

編輯
下面附帶的解決方案包含兩個項目。 在第一篇文章中研究了它們當(dāng)中之一,在后面的文章中分析了之二。這個項目是自動優(yōu)化器。

編輯
鑒于項目擁有 GUI,因此這回再次用到 MVVM(模式l視圖視圖模型)方式。 項目模板已被劃分為相應(yīng)的板塊。 由于項目邏輯應(yīng)在模型部分中實現(xiàn),因此與項目圖形部分無關(guān)的類回位于 Model 子目錄中,以后會進(jìn)一步切分目錄。
負(fù)責(zé)管理目錄和終端目錄取向的類位于Model/DirectoryManagers 文件夾中。
文件管理類則位于 Model/FileReaders 之下。
含有優(yōu)化邏輯的對象,和相應(yīng)的實例化類則位于 Model/OptimizationManagers 之下
管理終端及其配置文件的對象則位于 Model/Terminal 之下
取自前一篇文章中的對象已被修改,赫茲股票量化就從它開始。 對于所有不太熟悉前一部分的人來說,該講述也將很有用。
創(chuàng)建應(yīng)用程序的圖形部分
赫茲股票量化進(jìn)入到圖形界面。 早前,赫茲股票量化曾研究過一種利用 C# 語言為 MetaTrader 5 創(chuàng)建附加組件的方法,以及利用 DLL 和 OnTimer 回調(diào)與智能交易系統(tǒng)的功能相結(jié)合的方法。 在當(dāng)前的實現(xiàn)中,自動優(yōu)化器將在終端外部實現(xiàn)。 現(xiàn)在,它作為外部優(yōu)化管理器運行,并模仿交易員的操作,啟動優(yōu)化并處理結(jié)果。 甚而,由于避免了在同一臺計算機上運行的多個終端同時進(jìn)行優(yōu)化,且將自動優(yōu)化器實現(xiàn)為單例應(yīng)用程序,赫茲股票量化可以絕對掌控計算機上安裝的所有終端,包括正運行優(yōu)化器的計算機。 在之前的項目中,這臺計算機無法受控。
這就是為什么當(dāng)前項目沒有完全作為 DLL 來實現(xiàn),但現(xiàn)在自動優(yōu)化器項目被切分為一個 DLL 和一個可執(zhí)行文件。
編輯切換為居中
從上面的屏幕截圖可以看出,項目窗口由 Header, Footer 和h含有兩個選項卡的 TabControl 組成:Settings 和 Reports。 無論在中央部分中選擇了哪個選項卡,都不會更改窗口的頁眉部分和頁腳,從而可輕易訪問位于這些部分的所有控制元素。
窗口的頁眉部分是經(jīng)由以下 XAML 標(biāo)記創(chuàng)建的:
<Grid> ? ? ? ?<Grid.ColumnDefinitions> ? ? ? ? ? ? ? ?<ColumnDefinition/> ? ? ? ? ? ? ? ?<ColumnDefinition/> ? ? ? ?</Grid.ColumnDefinitions> ? ? ? ?<WrapPanel Margin="2"> ? ? ? ? ? ?<Label Content="Optimisation:"/> ? ? ? ? ? ?<ComboBox Width="200" ? ? ? ? ? ? ? ? ? ? ?ItemsSource="{Binding SelectedOptimisationNames,UpdateSourceTrigger=PropertyChanged}" ? ? ? ? ? ? ? ? ? ? ?SelectedItem="{Binding SelectedOptimisation}" ? ? ? ? ? ? ? ? ? ? ?SelectedIndex="0" ? ? ? ? ? ? ? ? ? ? ?IsEnabled="{Binding EnableMainTogles, UpdateSourceTrigger=PropertyChanged}"/> ? ? ? ? ? ?<Button Content="Load" ? ? ? ? ? ? ? ? ? ?Margin="2,0,0,0" ? ? ? ? ? ? ? ? ? ?Width="34" ? ? ? ? ? ? ? ? ? ?Command="{Binding LoadResults}" ? ? ? ? ? ? ? ? ? ?IsEnabled="{Binding EnableMainTogles, UpdateSourceTrigger=PropertyChanged}"/> ? ? ? ?</WrapPanel> ? ? ? ?<WrapPanel HorizontalAlignment="Right" ? ? ? ? ? ? ? ? ? Margin="2" ? ? ? ? ? ? ? ? ? Grid.Column="1"> ? ? ? ? ? ?<Label Content="Terminal:"/> ? ? ? ? ? ?<ComboBox Width="200" ? ? ? ? ? ? ? ? ? ? ?SelectedIndex="{Binding SelectedTerminalIndex}" ? ? ? ? ? ? ? ? ? ? ?ItemsSource="{Binding Terminals,UpdateSourceTrigger=LostFocus}" ? ? ? ? ? ? ? ? ? ? ?IsEnabled="{Binding EnableMainTogles, UpdateSourceTrigger=PropertyChanged}"/> ? ? ? ?</WrapPanel> </Grid>
Grid 容器包含所考慮區(qū)域中所有可用的控制元素,它被劃分為 2 列。 以下元素倍添加到第一列:參數(shù)名稱(Optimisation),包含可用優(yōu)化列表的組合框,以及優(yōu)化加載按鈕。 第二列包含參數(shù)名稱,和含有可用終端 ID 的下拉列表。
表示圖形窗口頁腳(帶有 ProgressBar)的 Grid 容器擁有類似的結(jié)構(gòu):
<Grid Grid.Row="2"> ? ? ? ?<Grid.ColumnDefinitions> ? ? ? ? ? ? ? ?<ColumnDefinition Width="150"/> ? ? ? ? ? ? ? ?<ColumnDefinition/> ? ? ? ?</Grid.ColumnDefinitions> ? ? ? ?<Label Content="{Binding Status, UpdateSourceTrigger=PropertyChanged}"/> ? ? ? ?<ProgressBar Grid.Column="1" ? ? ? ? ? ? ? ? ? ? Value="{Binding Progress, UpdateSourceTrigger=PropertyChanged}" ? ? ? ? ? ? ? ? ? ? Minimum="0" ? ? ? ? ? ? ? ? ? ? Maximum="100"/> </Grid>
它將該區(qū)域劃分為 2 部分,并限制了第一部分的大小。 結(jié)果就是,ProgressBar 占用了最大的容器部分。 進(jìn)而,整體窗口寬度有變化的情況下 ProgressBar 的寬度會與之相適。 根據(jù) XAML 標(biāo)記規(guī)則,所有這三個組件都放置在 <Window/> 容器中。
<Window x:Class="Metatrader_Auto_Optimiser.AutoOptimiser" ? ? ? ?xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ? ? ? ?xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ? ? ? ?xmlns:d="http://schemas.microsoft.com/expression/blend/2008" ? ? ? ?xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" ? ? ? ?xmlns:vm="clr-namespace:Metatrader_Auto_Optimiser.View_Model" ? ? ? ?xmlns:v="clr-namespace:Metatrader_Auto_Optimiser.View" ? ? ? ?mc:Ignorable="d" ? ? ? ?Title="Auto Optimiser" Height="500" Width="1200" ? ? ? ?MinHeight="500" MinWidth="1200"> ? ?<Window.DataContext> ? ? ? ?<vm:AutoOptimiserVM/> ? ?</Window.DataContext> ? ?... </Window>
此容器定義名稱空間引用:
Metatrader_Auto_Optimiser.View_Model,當(dāng)用戶有動作(ViewModel),其內(nèi)存儲的回調(diào)會指示程序如何響應(yīng)。
Metatrader_Auto_Optimiser.View,當(dāng)雙擊 ListView 對象,其內(nèi)存儲的類會把事件轉(zhuǎn)換為命令。 這是將事件與 ViewModel 的 ICommand 接口結(jié)合操作所要求的。
此外,設(shè)置以下窗口大?。鹤钚〕叽?,和程序啟動時窗口的初始打開尺寸。 然后,利用上述包含 ViewModel 名稱空間的別名,為圖形界面安裝 DataContext。
面板的中央部分由一個包含 2 個選項卡的 TabControl 元素組成。 它作為主要部分,是赫茲股票量化的圖形元素的“實體”。 “Settings” 選項卡的結(jié)構(gòu)如下:

編輯切換為居中
此選項卡也劃分為三個部分。 該選項卡的上層部分含有一個面板,允許您設(shè)置自動優(yōu)化器要保存的報告參數(shù)。 它還包括資產(chǎn)名稱的選擇,和更新 *set 文件的按鈕。 “Settings” 選卡的中層部分包含優(yōu)化器設(shè)置,和自動優(yōu)化器處理時期望的過濾和排序參數(shù)的選項。 最后一部分允許設(shè)置智能交易系統(tǒng)參數(shù),并選擇優(yōu)化和前向驗證日期。 為了更加便捷,GridSplitter 元素位于前兩個部分之間。 通過拖動它,可以調(diào)整這些選項卡的大小。 當(dāng)您需要為機器人填寫一長列優(yōu)化參數(shù)時,這特別方便。
赫茲股票量化查看一下 “Settings” 選卡第一部分的標(biāo)記代碼:
<Grid> ? ? ? ?<Grid.ColumnDefinitions> ? ? ? ? ? ? ? ?<ColumnDefinition/> ? ? ? ? ? ? ? ?<ColumnDefinition Width="100"/> ? ? ? ?</Grid.ColumnDefinitions> ? ? ? ?<WrapPanel HorizontalAlignment="Left" ? ? ? ? ? ? ? ?VerticalAlignment="Bottom"> ? ? ? ?<Label Content="Select Optimiser:"/> ? ? ? ?<ComboBox Width="150" ? ? ? ? ? ? ? ?IsEnabled="{Binding EnableMainTogles, UpdateSourceTrigger=PropertyChanged}" ? ? ? ? ? ? ? ?ItemsSource="{Binding Optimisers}" ? ? ? ? ? ? ? ?SelectedIndex="{Binding SelectedOptimiserIndex}"/> ? ? ? ?<Button Content="GUI" ? ? ? ? ? ? ? ?Command="{Binding ShowOptimiserGUI}" ? ? ? ? ? ? ? ?IsEnabled="{Binding EnableMainTogles, UpdateSourceTrigger=PropertyChanged}"/> ? ? ? ?<Label Content="Directory prefix:"/> ? ? ? ?<TextBox Width="150" ? ? ? ? ? ? ? ?IsEnabled="{Binding EnableMainTogles, UpdateSourceTrigger=PropertyChanged}" ? ? ? ? ? ? ? ?Text="{Binding DirPrefix}"/> ? ? ? ?<ComboBox Width="100" ? ? ? ? ? ? ? ?Margin="2,0,0,0" ? ? ? ? ? ? ? ?SelectedIndex="0" ? ? ? ? ? ? ? ?ItemsSource="{Binding FileFillingType}" ? ? ? ? ? ? ? ?IsEnabled="{Binding EnableMainTogles, UpdateSourceTrigger=PropertyChanged}" ? ? ? ? ? ? ? ?SelectedItem="{Binding FileWritingMode}"/> ? ? ? ?<Label Content="Asset name:"/> ? ? ? ?<TextBox Width="100" ? ? ? ? ? ? ? ?IsEnabled="{Binding EnableMainTogles, UpdateSourceTrigger=PropertyChanged}" ? ? ? ? ? ? ? ?Text="{Binding AssetName}"/> ? ? ? ?<Button Content="Update (*.set) file" ? ? ? ? ? ? ? ?Margin="2,0,0,0" ? ? ? ? ? ? ? ?IsEnabled="{Binding EnableMainTogles}" ? ? ? ? ? ? ? ?Command="{Binding UpdateSetFile}"/> ? ? ? ?</WrapPanel> ? ? ? ?<Button Content="Start/Stop" ? ? ? ? ? ? ? ?Grid.Column="2" ? ? ? ? ? ? ? ?Margin="2" ? ? ? ? ? ? ? ?Command="{Binding StartStopOptimisation}"/> </Grid>
所描述的部分包括被切分開的兩列。 第一列的寬度可以動態(tài)更改; 第二列的寬度則是固定的,等于 100 個像素。 第一列包括面板中的所有控件。 所有這些元素都在 WrapPanel 中提供,允許一個接一個地排列元素。 首先到達(dá)的是負(fù)責(zé)自動優(yōu)化器選擇和設(shè)置的控件。 這之后是與優(yōu)化報告的文件夾命名相關(guān)的參數(shù),以及報告的生成方式(覆蓋寫入,追價)。 最后一部分是所優(yōu)化資產(chǎn)名稱的規(guī)范,以及刷新機器人參數(shù) *set 文件的按鈕。 “Start/Stop” 按鈕占據(jù)固定寬度的列,該按鈕可啟動和停止優(yōu)化的起點。
“Settings” 選項卡的第二部分亦切分為兩部分。

編輯切換為居中
第一部分包含優(yōu)化器設(shè)置參數(shù)列表的 ListView。 在此,參數(shù)的名稱和數(shù)值,與終端中的優(yōu)化程序設(shè)置字段相對應(yīng)。 第二部分包含數(shù)據(jù)排序和過濾系數(shù)的規(guī)范。 這些列還含有 GridSplitter 元素,該元素分隔了所描述的區(qū)域。 創(chuàng)建元素的代碼很簡單,故在此勿需贅述。 完整的代碼附帶于下。 該選項卡的下層與上層完全相似,唯一的例外是包含優(yōu)化日期的右側(cè)被切分為兩部分。 第一部分所含控件用于將數(shù)據(jù)添加到列表。 第二部分用于顯示創(chuàng)建的列表。