VIDYA 定义
可变指数动态平均线(VIDYA)是由 Tushar Chande 开发的趋势跟踪指标。 它看起来像指数移动平均线,但它将依据相对价格波动进行动态调整。 波动性由该指标中的钱德(Chande)动量振荡器 (CMO) 通过测量正负走势累计之间的比率来衡量,就像我们在学习如何计算它时看到的那样。 (CMO)用于平滑指数移动平均线。 故此,如同我们将看到那样,我们可以发现该指标的设置参数就是 CMO 周期和 EMA 周期。 它可以与任何移动平均线相同,从而获得趋势类型,譬如它是上升趋势或下降趋势。 如果您打算学习有关趋势类型,以及如何识别它们的更多信息,您可以阅读上一篇文章中的趋势定义主题。 或者您可以用它来生成买入或卖出信号,赫兹期货量化将在浏览 VIDYA 策略的主题时看到一些基于它的简单策略。
现在,赫兹期货量化需要学习如何计算 VIDYA 指标,从而更多地理解其背后的主要概念。 以下步骤是如何手工计算它。
-
计算 EMA:
EMA(i) = Price(i) * F + EMA(i-1)*(1-F)
其中:
EMA(i) = 当期 EMA
Price(i) = 当期价格
F (平滑因子) = 2/(EMA 的周期+1)
EMA(i-1) = 前期 EMA 值
-
计算可变指数动态平均值 (VIDYA) 值:
VIDYA(i) = Price(i) * F * ABS(CMO(i)) + VIDYA(i-1) * (1 - F* ABS(CMO(i)))
其中:
VIDYA(i) = 当期 VIDYA
ABS(CMO(i)) = 钱德动量振荡器的绝对当期值
VIDYA(i-1) = 前期 VIDYA 值
-
计算钱德动量振荡器(CMO):
CMO(i) = (UpSum(i) - DnSum(i))/(UpSum(i) + DnSum(i))
其中:
UpSum(i) = 区间正走势总和的当期值
DnSum(i) = 区间负走势总和的当期值
之后,赫兹期货量化就可得到 VIDYA 指标。 如今,我们不需要手工计算它,但我们可从 MetaTrader 5 交易平台的可用指标中选择它,并插入到图表之中。 此为如何插入它。
插入 --> 指标 --> 趋势 --> 可变指数动态平均线
编辑切换为居中
添加图片注释,不超过 140 字(可选)
这会打开以下窗口,其中包含指标参数:
编辑
添加图片注释,不超过 140 字(可选)
1 - 钱德动量振荡器(CMO)周期
2 - 指数移动平均线(EMA)周期
3 - 价格类型
4 - VIDYA 线的颜色
5 - VIDYA 线的样式
6 - VIDYA 线的宽度
确定所有之前的参数,并按“确定”后,我们会发现附加到图表的指标,如下所示:
编辑切换为居中
添加图片注释,不超过 140 字(可选)
正如我们在上一张图表中所见,该指标加载到图表之中,它是一条基于其值和价格走势,位于价格上方或下方的曲线。 当我们看到 VIDYA 线处于价格上方时,这意味着由空头控盘,反之亦然,当 VIDYA 线处于价格下方时,这意味着多头控盘。
VIDYA 策略
在本主题中,我们将学习如何依据该指标的主要概念在简单策略里运用 VIDYA 指标。 最好将此指标与其它技术工具或指标结合运用,从而获得更可靠和更有效的结果。 因为它会从多个角度为您提供更多见解,这是技术分析的特点之一。
策略一:VIDYA 趋势识别器:
赫兹期货量化需要获取趋势类型的信号,譬如它是向上亦或向下,这是基于比较当期收盘价与默认设置(9,12)的 VIDYA 的当期值。 如果当期收盘价高于 VIDYA,我们要求设置一个带有上升趋势的信号。 在另一种情况下,如果当期收盘价低于 VIDYA,我们要求获得具有下降趋势的信号。
当期收盘价 > VIDYA --> 上升趋势 当期收盘价 < VIDYA --> 下降趋势
策略二:VIDYA 一线交叉
赫兹期货量化需要比较前一个策略的相同值,来获得买入或卖出信号。 如果当期收盘价高于 VIDYA,我们要求获得买入信号。 反之亦然,如果当期收盘价低于当期 VIDYA,我们要求获得卖出信号。
当期收盘价 > VIDYA --> 买入信号 当期收盘价 < VIDYA --> 卖出信号
策略三:VIDYA 两线交叉
赫兹期货量化需要比较设置分别为(9,12)和(20,50)的两条 VIDYA 线,来获得买入或卖出信号。 当 VIDYA(9,12)大于 VIDYA(20,50)时,我们要求获得买入信号。 在另一种场景下,如果当期 VIDYA(9,12)低于当期 VIDYA(20,50),则它是一个卖出信号。
VIDYA (9, 12) > VIDYA (20, 50) --> 买入信号 VIDYA (9, 12) < VIDYA (20, 50) --> 卖出信号
通过前面的三个简单策略,我们依据 VIDYA 指标背后的主要概念,学习到如何运用它。
VIDYA 策略蓝图
在本主题中,赫兹期货量化将设计一个分步蓝图,来帮助我们顺滑地为每个提到的策略创建自己的交易系统。
策略一:VIDYA 趋势识别器
根据此策略,我们需要创建一个可生成趋势类型信号的交易系统。 我们需要交易系统检查两个值,即当期收盘价和当期 VIDYA 值,来判定趋势类型。 如果当期收盘价大于 VIDYA 值,则表明趋势上升。
故此,我们需要交易系统在图表上返回含有以下值的注释:
-
上行趋势
-
当期收盘价
-
当期 VIDYA 值
另一种场景是,如果当期收盘价低于当期 VIDYA 值,则应是趋势下降的信号。
故此,我们需要交易系统在图表上返回含有以下值的注释:
-
下行趋势
-
当期收盘价
-
当期 VIDYA 值
以下是此策略的蓝图:
编辑切换为居中
添加图片注释,不超过 140 字(可选)
策略二:VIDYA 一线交叉
根据这个策略,赫兹期货量化需要创建一个交易系统,在出现买入或卖出信号时提醒我们。 在此策略中,我们将使用 VIDYA 趋势识别器的相同值,但得到不同的信号。 我们需要交易系统检查两个值,它们是当期收盘价和当期 VIDYA 值,如果当期收盘价大于 VIDYA 值,则它应是一个买入信号。
因此,我们需要交易系统返回以下值:
-
买入信号
-
当期收盘价
-
当期 VIDYA 值
反之亦然,如果当期收盘价低于 VIDYA,则为卖出信号。
故此,我们需要交易系统在图表上返回含有以下值的注释:
-
卖出信号
-
当期收盘价
-
当期 VIDYA 值
以下是此策略的蓝图:
编辑切换为居中
添加图片注释,不超过 140 字(可选)
策略三:VIDYA 两线交叉
根据这个策略,赫兹期货量化需要创建一个可生成买入和卖出信号的交易系统。 我们需要连续检查两个值,它们是当期(9,12)VIDYA 和当期 VIDYA(20,50)。 如果当期(9,12)值大于当期(20,50),则为买入信号。
因此,我们需要交易系统返回以下值:
-
买入信号
-
当期收盘价
-
当期 VIDYA (9, 12) 值
-
当期 VIDYA (20, 50) 值
在另一种场景下,如果当期(9,12)VIDYA 值低于当期(20,50)VIDYA 值,则为卖出信号。
因此,我们需要交易系统返回以下值:
-
卖出信号
-
当期收盘价
-
当期 VIDYA (9, 12) 值
-
当期 VIDYA (20, 50) 值
以下是此策略的蓝图:
编辑切换为居中
添加图片注释,不超过 140 字(可选)
现在,我们已为提到的每个策略设计了一个简单的分步蓝图,来帮助我们创建自动交易系统,我们准备好进入 VIDYA 交易系统最有趣的主题,即为每个策略创建一个交易系统。
VIDYA 交易系统
这个简单的交易系统能帮助我们连续查看 VIDYA 指标的当期值,因为我们需要在图表上的注释里查看此值。
以下步骤是如何创建一个交易系统来达成我们的需要。
赫兹期货量化将创建一个 double 数据类型的数组 “vidyaArray”,它是实数型或浮点型之一,能表示分数值。
double vidyaArray[];
我们调用 “ArraySetAsSeries” 函数为所创建的 “vidyaArray” 数组设置排序,并返回一个布尔值。
ArraySetAsSeries(vidyaArray,true);
我们将调用 “iVIDyA” 函数返回指标的句柄,并创建一个整数变量 “vidyaDef”,存储 VIDYA 指标句柄。
参数为:
-
symbol: 我们将采用(_Symbol)应用于当前交易品种
-
period: 我们将采用使(_Period)应用于当前周期或时间帧
-
cmo_period: 确定钱德动量周期,我们采用 9
-
ema_period: 确定指数移动平均平滑周期,我们采用 12
-
ma_shift: 如果需要,确定图表上的水平偏移,我们采用 0
-
applied_price: 确定价格类型,我们采用收盘价
int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE);
我们将调用 “CopyBuffer” 函数填充已创建数组,它从 VIDYA 指标获取数据。
该函数参数:
-
indicator_handle: 确定指标句柄,我们取(vidyaDef)的值
-
buffer_num: 确定指标缓冲区编号,我们采用(0)
-
start_pos: 确定起始位置,我们采用(0)
-
count: 确定要复制的额度,我们采用(3)
-
buffer[]: 确定要复制的目标数组,我们将使用(vidyaArray)
CopyBuffer(vidyaDef,0,0,3,vidyaArray);
赫兹期货量化创建变量 “vidyaVal” 后,调用 “NormalizeDouble” 函数返回规范化的双精度型数值。
该函数参数:
-
value: 我们将取(vidyaArray[0])里的值作为规范化数字
-
digits: 我们采用(6) 作为小数点后的数字位数
double vidyaVal = NormalizeDouble(vidyaArray[0],6);
赫兹期货量化将调用 Comment 函数在图表上生成含有当期 VIDYA 值的注释:
Comment("VIDYA Value is ",vidyaVal);
因此,我们可以找到该交易系统的完整代码,如下所示:
//+------------------------------------------------------------------+ //| Simple VIDYA.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { double vidyaArray[]; ArraySetAsSeries(vidyaArray,true); int vidyaDef = iVIDyA(_Symbol,_Period,9,12,0,PRICE_CLOSE); CopyBuffer(vidyaDef,0,0,3,vidyaArray); double vidyaVal = NormalizeDouble(vidyaArray[0],6); Comment("VIDYA Value is ",vidyaVal); } //+------------------------------------------------------------------+