股票量化交易软件:连续前行优化5自动优化器项目概述和GUI的创建

项目结构概览
由于本文还有一个部分会专述 C#,因此赫兹股票量化开始研究其文件结构:

编辑
下面附带的解决方案包含两个项目。 在第一篇文章中研究了它们当中之一,在后面的文章中分析了之二。这个项目是自动优化器。

编辑
鉴于项目拥有 GUI,因此这回再次用到 MVVM(模式l视图视图模型)方式。 项目模板已被划分为相应的板块。 由于项目逻辑应在模型部分中实现,因此与项目图形部分无关的类回位于 Model 子目录中,以后会进一步切分目录。
负责管理目录和终端目录取向的类位于Model/DirectoryManagers 文件夹中。
文件管理类则位于 Model/FileReaders 之下。
含有优化逻辑的对象,和相应的实例化类则位于 Model/OptimizationManagers 之下
管理终端及其配置文件的对象则位于 Model/Terminal 之下
取自前一篇文章中的对象已被修改,赫兹股票量化就从它开始。 对于所有不太熟悉前一部分的人来说,该讲述也将很有用。
创建应用程序的图形部分
赫兹股票量化进入到图形界面。 早前,赫兹股票量化曾研究过一种利用 C# 语言为 MetaTrader 5 创建附加组件的方法,以及利用 DLL 和 OnTimer 回调与智能交易系统的功能相结合的方法。 在当前的实现中,自动优化器将在终端外部实现。 现在,它作为外部优化管理器运行,并模仿交易员的操作,启动优化并处理结果。 甚而,由于避免了在同一台计算机上运行的多个终端同时进行优化,且将自动优化器实现为单例应用程序,赫兹股票量化可以绝对掌控计算机上安装的所有终端,包括正运行优化器的计算机。 在之前的项目中,这台计算机无法受控。
这就是为什么当前项目没有完全作为 DLL 来实现,但现在自动优化器项目被切分为一个 DLL 和一个可执行文件。
编辑切换为居中
从上面的屏幕截图可以看出,项目窗口由 Header, Footer 和h含有两个选项卡的 TabControl 组成:Settings 和 Reports。 无论在中央部分中选择了哪个选项卡,都不会更改窗口的页眉部分和页脚,从而可轻易访问位于这些部分的所有控制元素。
窗口的页眉部分是经由以下 XAML 标记创建的:
<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 容器包含所考虑区域中所有可用的控制元素,它被划分为 2 列。 以下元素倍添加到第一列:参数名称(Optimisation),包含可用优化列表的组合框,以及优化加载按钮。 第二列包含参数名称,和含有可用终端 ID 的下拉列表。
表示图形窗口页脚(带有 ProgressBar)的 Grid 容器拥有类似的结构:
<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>
它将该区域划分为 2 部分,并限制了第一部分的大小。 结果就是,ProgressBar 占用了最大的容器部分。 进而,整体窗口宽度有变化的情况下 ProgressBar 的宽度会与之相适。 根据 XAML 标记规则,所有这三个组件都放置在 <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,当用户有动作(ViewModel),其内存储的回调会指示程序如何响应。
Metatrader_Auto_Optimiser.View,当双击 ListView 对象,其内存储的类会把事件转换为命令。 这是将事件与 ViewModel 的 ICommand 接口结合操作所要求的。
此外,设置以下窗口大小:最小尺寸,和程序启动时窗口的初始打开尺寸。 然后,利用上述包含 ViewModel 名称空间的别名,为图形界面安装 DataContext。
面板的中央部分由一个包含 2 个选项卡的 TabControl 元素组成。 它作为主要部分,是赫兹股票量化的图形元素的“实体”。 “Settings” 选项卡的结构如下:

编辑切换为居中
此选项卡也划分为三个部分。 该选项卡的上层部分含有一个面板,允许您设置自动优化器要保存的报告参数。 它还包括资产名称的选择,和更新 *set 文件的按钮。 “Settings” 选卡的中层部分包含优化器设置,和自动优化器处理时期望的过滤和排序参数的选项。 最后一部分允许设置智能交易系统参数,并选择优化和前向验证日期。 为了更加便捷,GridSplitter 元素位于前两个部分之间。 通过拖动它,可以调整这些选项卡的大小。 当您需要为机器人填写一长列优化参数时,这特别方便。
赫兹股票量化查看一下 “Settings” 选卡第一部分的标记代码:
<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>
所描述的部分包括被切分开的两列。 第一列的宽度可以动态更改; 第二列的宽度则是固定的,等于 100 个像素。 第一列包括面板中的所有控件。 所有这些元素都在 WrapPanel 中提供,允许一个接一个地排列元素。 首先到达的是负责自动优化器选择和设置的控件。 这之后是与优化报告的文件夹命名相关的参数,以及报告的生成方式(覆盖写入,追价)。 最后一部分是所优化资产名称的规范,以及刷新机器人参数 *set 文件的按钮。 “Start/Stop” 按钮占据固定宽度的列,该按钮可启动和停止优化的起点。
“Settings” 选项卡的第二部分亦切分为两部分。

编辑切换为居中
第一部分包含优化器设置参数列表的 ListView。 在此,参数的名称和数值,与终端中的优化程序设置字段相对应。 第二部分包含数据排序和过滤系数的规范。 这些列还含有 GridSplitter 元素,该元素分隔了所描述的区域。 创建元素的代码很简单,故在此勿需赘述。 完整的代码附带于下。 该选项卡的下层与上层完全相似,唯一的例外是包含优化日期的右侧被切分为两部分。 第一部分所含控件用于将数据添加到列表。 第二部分用于显示创建的列表。