量化交易软件:带有图形用户界面的通用震荡指标

简介

一个用于交易系统的合适指标通常是通过在图表上使用各种参数监视各种指标后选出来的,如果您通过导航窗口来拖拽测试每个指标,并且每次都通过指标的属性窗口来改变它的参数,这个过程将花费很多时间,有一种方法可以加速这个过程。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

它包含了创建一个图形界面来直接从图表上访问,使得用户快速修改指标参数并马上看到新的结果。可以通过在一个带有图形界面的通用指标中组合各种指标来实现指标的快速切换。

分析问题

创建一个通用指标的任务并不是很难,它需要一点面向对象的编程: 一个基类和一些相同类型的子类。 每个特定指标的参数将通过子类的构造函数来传递。在这种情况下,当创建一个对象时,MetaEditor 会有一个参数列表的提示,它将非常有助于开发过程(图1)

编辑

添加图片注释,不超过 140 字(可选)

图 1. 当创建一个对象时构造函数参数的提示

主要的困难将在实际使用这样的指标时出现,不同的震荡指标有不同的外部参数设置,如果我们为每个震荡指标独立出参数并且为它们使用不同的前缀, 我们将能够人工使用这些指标,但是它将不适合用在iCustom()或者IndicatorCreate()函数中,因为参数太多了。对于 IndicatorCreate(),传入参数的数量限制是256,而对于 iCustom() 是64。这个值还包含了通用的参数,例如交易品种和指标名称,所以实际可用的参数数量甚至比它还少。我们可以也使用少一些的通用参数集,但是指标在这种情况下使用将会不方便: 我们将需要检查引用来指导对于特定的指标来说使用哪些参数,

图形界面可以解决这个问题: 它的对话框可以使用特定的控件来用于选定的指标。我们也应该提供功能来使用 iCustom() 或者 IndicatorCreate() 来调用指标, 这样指标属性窗口将有少量的通用外部参数。

参数集

让我们定义所需的最小外部参数集合,在终端中查看震荡指标的列表: 主菜单 - 插入 - 指标 - 震荡指标, 把它们加到表格中。 表格 1. 终端中所有的震荡指标

函数

名称

缓冲区

参数

iATR

平均真实范围

1. 线形

1. int ma_period — 平均周期数

iBearsPower

空头力度

1. 柱形

1. int ma_period — 平均周期数

iBullsPower

多头力度

1. 线形

1. int ma_period — 平均周期数

iCCI

商品通道指数

1. 线形

1. int ma_period — 平均周期数2. ENUM_APPLIED_PRICE applied_price — 价格类型

iChaikin

蔡金(Chaikin)震荡指标

1. 线形

1. int fast_ma_period — 快速平均周期数 2. int slow_ma_period — 慢速平均周期数3. ENUM_MA_METHOD ma_method — 平滑类型4. ENUM_APPLIED_VOLUME applied_volume — 使用的交易量

iDeMarker

DeM指标

1. 线形

1. int ma_period — 平均周期数

iForce

强力指数

1. 线形

1. int ma_period — 平均周期数2. ENUM_MA_METHOD ma_method — 平滑类型 3. ENUM_APPLIED_VOLUME applied_volume — 用于计算的交易量类型

iMomentum

动量

1. 线形

1. int mom_period — 平均周期数2. ENUM_APPLIED_PRICE applied_price — 价格类型

iMACD

移动平均汇总/分离指标(MACD)

1. 柱形2. 线形

1. int fast_ema_period — 快速移动平均周期数2. int slow_ema_period — 慢速移动平均周期数3. int signal_period — 差别平均周期数4. ENUM_APPLIED_PRICE applied_price — 价格类型

iOsMA

移动平均震荡指标(OsMA, MACD 柱形图)

1. 柱形

1. int fast_ema_period — 快速移动平均周期数2. int slow_ema_period — 慢速移动平均周期数3. int signal_period — 差别平均周期数4. ENUM_APPLIED_PRICE applied_price — 价格类型

iRSI

相对强度指数

1. 线形

1. int ma_period — 平均周期数2. ENUM_APPLIED_PRICE applied_price — 价格类型

iRVI

相对动量指数

1. 线形2. 线形

1. int ma_period — 平均周期数

iStochastic

随机震荡指标

1. 线形2. 线形

1. int Kperiod — 用于计算的柱数2. int Dperiod — 首要平滑周期数3. int slowing — 最终平滑周期数4. ENUM_MA_METHOD ma_method — 平滑类型5. ENUM_STO_PRICE price_field — 随机震荡计算方法

iTriX

三重指数平均线(TRIX)

1. 线形

1. int ma_period — 平均周期数2. ENUM_APPLIED_PRICE applied_price — 价格类型

iWPR

威廉姆斯百分比范围

1. 线形

1. int calc_period — 平均周期数

根据参数列,我们创建一个含有所有参数类型的列表,然后确定它们的最大数量。 表格 2. 参数的类型和数量

类型

数量

int

3

ENUM_APPLIED_PRICE

1

ENUM_MA_METHOD

1

ENUM_APPLIED_VOLUME

1

ENUM_STO_PRICE

1

从缓冲区列,您可以看到可以使用两个指标缓冲区,并且不同的指标可以有不同的绘图方式。当然,我们可以把它们都画成线形,但是它们其中的一些通常显示为柱形图,并且终端也允许这样,所以我们会试着提供功能在更换指标时修改对应的绘图类型选项。另外,我们需要提供绘制水平线的功能,因为有些指标需要加上它们 (RSI, CCI, 等等.)计划 一个大的通用任务能够分成小的独立任务的数量越多,它的实现就会越简单方便,所以,我们的工作将包括三个阶段:

  1. 为通用震荡指标创建类,并创建不包含GUI(图形用户界面)的震荡指标。

  2. 创建用于GUI的类。

  3. 把通用震荡指标和图形界面整合到一起。

其中重要的一点是,您应当注意包括默认设置,我们应该提供功能来同时使用图形界面或者属性窗口来配置指标的参数(为了使得通用指标有最大的灵活性),当在属性窗口中配置参数时,它包含了一小组通用参数,我们需要保证,所有的默认设置的参数能够提供指标的自然外观。 考虑不同震荡指标的默认值。例如, 随机震荡指标的周期数为 5, 3, 3 (第一个参数比第二个大), 而 MACD 使用的是 12, 26, 9 (第一个参数比第二个小),MACD 的第一个参数意思是快速移动平均的周期数, 而第二个参数是慢速移动平均的周期数,所以第一个参数必须小于第二个。对于蔡金震荡指标,第一个参数和第二个的比例很重要 (也使用了快速和慢速移动平均的周期数),而对于随机震荡指标,这个比例就没有那么重要,并且它对应了价格变化,可以是任何数值。如果我们把MACD的第一个参数设置得大于第二个,指标的方向就会和价格变化相反 (在设置默认参数时我们应当记住这一点)。 当使用图形界面时,指标应该使用常用的默认参数集来开始运行: MACD 使用周期数为 12, 26, 9, 随机震荡使用的周期数为 5, 3, 3, 等等。另外,最好可以使新选择的指标可以选择从默认参数开始运行或者以与之前指标相同的参数开始运行。例如,我们分析 RSI 和 CCI, 并且我们想看到不同的指标在使用相同参数时线形的变化,所以我们在实现类的时候要提供这种功能。 创建指标的基类 让我们在 Include 文件夹下创建一个新的文件夹 'UniOsc' ,所有增加的指标文件都位于这个新文件夹之中。使用的震荡指标集合在表格1种已经定义过,让我们创建一个对应的枚举来选择震荡指标类型,除了指标文件,我们可能在其他地方也要使用这个枚举,所以我们把它加到独立的文件 UniOscDefines.mqh 中(在文件夹 'UniOsc'下): enum EOscUnyType{ OscUni_ATR, OscUni_BearsPower, OscUni_BullsPower, OscUni_CCI, OscUni_Chaikin, OscUni_DeMarker, OscUni_Force, OscUni_Momentum, OscUni_MACD, OscUni_OsMA, OscUni_RSI, OscUni_RVI, OscUni_Stochastic, OscUni_TriX, OscUni_WPR }; 这个文件将不再加入其他内容。 让我们为指标文件创建 "CUniOsc.mqh",并在其中写上 COscUni 类的模板: class COscUni{ protected: public: }; 'protected' 部分是由模板确定的,因为有些类成员需要被保护,但是还是应当可以在子类中访问 ( 'private' 部分的成员是被保护的,不能在子类中找到 )。 基类的主要方法是对应着指标的 OnCalculate() 函数的,让我们称它为 Calculate(),这个方法的前两个参数对应着 OnCalculate() 的相应参数: rates_total (柱的总数) 和 prew_calculate (已经计算过的柱数),不需要把数组传给 Calculate() 方法了, 因为使用了另外指标的数据。但是我们需要传入两个指标缓冲区,它们会填入数据。即使在使用只含一个缓冲区的指标时,我们将需要控制第二个缓冲区,所以在任何情况下都会给 Calculate() 方法传入两个缓冲区。Calculate() 的代码将依赖于使用的震荡指标类型: 它可以是含有一个或者两个缓冲区。所以,Calculate() 方法将会是虚函数: virtual int Calculate( const int rates_total, const int prev_calculated, double & buffer0[], double & buffer1[] ){ return(rates_total); } 当载入不同类型的指标时,我们将需要一个变量来保存指标的句柄。我们在 protected 部分声明它,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值