Loading ...

My语言几种常见指标编写与跨指标模型的案例分析

Author: mindrainbow, Created: 2019-07-08 10:01:48, Updated: 2019-07-16 15:38:53

发明者量化平台的My语言是一种函数高度集成且功能强大的量化编程语言,专为量化初学者量身定做,虽然它受众多初学者的欢迎,在功能上却一点不比别的编程语言逊色。在深度定制某些复杂策略方面,由于已经定制好的函数库十分强大,加上发明者量化平台本身对于各大交易所的API接口的出色支持,使你不仅在时间上节省很多写代码的时间,可以把精力主要放在策略逻辑的设计上,而且超低的费用(每天低至3元人民币的价格),让你无后顾之忧。

My语言不止适用于国内商品期货,对于数字货币相关交易也是无功能差别的同样支持。

本文将介绍几种常见指标的编写以及几个跨指标模型的案例分析。

几个常用的指标分类与编写

  • 传统经典的K线形态包括:三足乌鸦,十字星,穿头破脚,一柱擎天,仙人指路,金针探底等等

  • 指标方面,其中趋势类指标又分为:MA(均线组合),BOLL,PUBU(瀑布线),SAR(止损点)等等

  • 摆动类指标:ATR(真实波幅)、KDJ(随机指标)、MACD、WR(威廉指标)等等

  • 量仓分析指标 CJL(成交量)、DUALVOL(多空量比)、OBV(量能潮)

接下来,让我们用My语言在发明者量化平台上逐个实现以上这些经典形态和指标,实现的目的不是为了让读者直接用这些指标(当然,在某些条件下直接使用可能也没有问题),而是让读者可以基于这些指标进行审时度势,根据行情和自己自身的资金管理状况来对这些经典进行改良。正所谓兵无常势,以万变应万变才是金融市场的生存法则。

大阳线:开盘价即为最低价,收盘价即为最高价,K线涨幅大于4%

AA:=OPEN=LOW; 
BB:=CLOSE=HIGH; 
CC :=CLOSE/OPEN>1.04; 

这里的逻辑综合判断条件为:AA&&BB&&CC

穿头破脚:两根K线组成,表示行情将要转向,当前K线的开收至少有4%的差值,如果是向上穿头破脚的类型,那么该K线应该收阳,同时当前K线的最高价和最低价要包住前一根K线。

A1:=REF(CLOSE,1); 
A2:=REF(OPEN,1); 
BB:C/O>1.04;
B1:=OPEN<A1; 
B2:=CLOSE>A2;

这里的逻辑判断条件为:BB&&B1&&B2

趋势类指标

  • 均线交叉:5日均线向上穿过10日均线(金叉);5日均线向下穿过10日均线(死叉)
MA5:=MA(CLOSE,5); 
MA10:=MA(CLOSE,10);
金叉 CROSSUP(MA5,MA10);
死叉 CROSSDOWN(MA5,MA10);

这里大家可以看到,My语言的功能函数高度集成,一个判断均线交叉的函数,用户需要做的只是调用就行了,不必从新再从底层逻辑去构建逐个函数,且对于以后的调参也更加方便

同样的,对于三条均线的策略逻辑,假设5日均线、10日均线、30日均线多头排列,且持续3天,我们可以这样写:

MA5:=MA(CLOSE,5); 
MA10:=MA(CLOSE,10); 
MA30:=MA(CLOSE,30); 
CC:=MA5>MA30 AND MA10>MA30;
  • BOLL通道: BOLL由下轨(BOTTOM)、上轨(TOP)、中线(MID)三者组成通道。通道变宽并向上时,价格在上轨之上,多头趋势来临。反之空头趋势来临。

用My语言的代码表示可以这样写:

MID:MA(CLOSE,26);//求N个周期的收盘价均线,称为布林通道中轨
TMP2:=STD(CLOSE,26);//求M个周期内的收盘价的标准差
TOP:MID+2*TMP2;//布林通道上轨
BOTTOM:MID-2*TMP2;//布林通道下轨
AA:=TOP>REF(TOP,1)&&BOTTOM<REF(BOTTOM,1)&&MID>REF(MID,1);
BB:=C>TOP;

这其中多头趋势的判断条件为:AA&&BB

  • SAR(止损点)指标:SAR向上穿过0,多头趋势;SAR向下穿过0,空头趋势。

首先我们在发明者量化策略代码编写界面下面的参数栏和回测页面的麦语言交易类库中定义以下参数:

img img

N 1 100 4 STEP 1 20 2 MVALUE 1 10 2

STEP1:=STEP/100;
MVALUE1:=MVALUE/10;
SARLINE:SAR(N,STEP1,MVALUE1),CIRCLEDOT;
//N个周期的抛物转向,步长为STEP1,极限值为MVALUE1.
CROSS(SARLINE,0),BPK;//抛物转向值上穿0,做多。
CROSS(0,SARLINE),SPK;//抛物转向值下穿0,作空。
AUTOFILTER;

摆动类指标

有过一定交易经验的人都知道,无论什么市场,其实百分之80的时间价格都是震荡状态,价格以趋势的方式运行只有很少的百分之20的时间。

因此,摆动类指标比趋势类指标更重要且对于交易的结果也影响更大,且在大部分震荡行情中,趋势类指标基本全部失效。而摆动指标却能跟随价格的波动而变化,摆动指标也可以称作随机指标。

摆动类指标特点:摆动指标值的变化有一个中间值,可将水平区域分为上半部和下半部,一般是反应价格变化的敏感程度的。

判断趋势来临用趋势类指标,判断趋势尾声用摆动类指标是一个不错的选择。

  • KDJ随机指标由K、D、J三条线组成,指标线介于0~100之间变化,J线低于20,进入超卖区,J线高于80,进入超买区。如果K线上穿D线可以做多,如果K线下穿D线可以做空。
RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;
//收盘价与N周期最低值做差,N周期最高值与N周期最低值做差,两差之间做比值。
K:SMA(RSV,M1,1);//RSV的移动平均值
D:SMA(K,M2,1);//K的移动平均值
J:3*K-2*D;
BACKGROUNDSTYLE(1);
CROSS(K,D),BPK;//KD金叉,做多。
CROSS(J,20),BP;//J值上穿20
CROSS(D,K),SPK;//KD死叉,做空。
CROSS(80,J),SP;// J值下穿80
AUTOFILTER;
  • MACD指数平滑异同平均线,是从双指数移动平均线发展而来的,由快的指数移动平均线(EMA)减去慢的指数移动平均线,MACD的意义和双移动平均线基本相同,当MACD从负数转向正数,是做多信号。当MACD从正数转向负数,是做空信号。
DIFF:EMA(CLOSE,12) - EMA(CLOSE,26);
//短周期与长周期的收盘价的指数平滑移动平均值做差。
DEA:EMA(DIFF,9);//DIFF的M个周期指数平滑移动平均
2*(DIFF-DEA),COLORSTICK;//DIFF减DEA的2倍画柱状线
CROSS(DIFF,DEA),BPK;//DIFF上穿DEA,做多。
CROSS(DEA,DIFF),SPK;//DIFF下穿DEA,做空。
AUTOFILTER;

跨指标模型案例

我们为什么要跨指标?

  • 第一个原因:模型中跨指标,是技术面内部要素共振的一种交易思想,将多个不同分类指标交易思想结合在一起进行看盘断势。

  • 第二个原因:趋势类指标在盘整行情中失效,单独使用摆动类指标无法判断当前行情状态,需要多个指标结合分析。

常用思路

  • 趋势判断与精细分析相结合。
  • 多条件同向判断。

震荡模型的例子

  • 潮汐指数
ABS(CLOSE-REF(CLOSE,29))/(HHV(HIGH,30)-LLV(LOW,30))*100

衡量一定周期内价格波动情况:指数连续在一个小的区间内波动说明正处于盘整行情,否则为趋势行情。

震荡模型交易思路:潮汐指数判断盘整,KDJ摆动指标找入场点和出场点

这个模型我们可以这样写:

RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;
K:SMA(RSV,M1,1);//RSV的移动平均值
D:SMA(K,M2,1);//K的移动平均值
J:3*K-2*D;
CMIVAL:ABS(CLOSE-REF(CLOSE,29))/(HHV(HIGH,30)-LLV(LOW,30))*100,NODRAW;
BACKGROUNDSTYLE(1);
K>D&&EVERY(CMIVAL<20,2),BPK;//盘整行情,KD金叉,做多。
CROSS(J,10)||CROSS(K,D),BP;// J值上穿10超卖或者KD金叉,平仓
D>K&&EVERY(CMIVAL<20,2),SPK;//盘整行情,KD死叉,做空。
CROSS(90,J)||CROSS(D,K),SP;// J值下穿90超买或者KD死叉,平仓
AUTOFILTER;

img

趋势模型的例子

趋势模型交易思路:EMA判断上涨趋势还是下跌趋势;ADX指数反映趋势的变动程度,趋势强入场,趋势弱观望。

EMA趋势判断交易系统:

UPPERMA:EMA(HIGH,30);//计算30根K线最高价的EMA
LOWERMA:EMA(LOW,30);//计算30根K线最低价的EMA
CROSSUP(C,UPPERMA),BPK;//收盘价上穿EMA,做多
CROSSDOWN(C,LOWERMA),SPK;//收盘价下穿EMA,做空
AUTOFILTER;

img

EMA只能判断做多趋势和做空趋势,但是无法判断趋势的强弱,所以EMA在行情盘整中失效,所以我们需要寻找可以体现趋势强弱的指标:ADX指数

代码如下:

TR:=SUM(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(LOW-REF(CLOSE,1))),14);
HD:=HIGH-REF(HIGH,1);//最高价与前一周期最高价做差
LD:=REF(LOW,1)-LOW;//前一周期最低价与最低价做差
DMP:=SUM(IFELSE(HD>0 && HD>LD,HD,0),14);
//如果HD>0并且HD>LD,取HD否则取0,对取值做N周期累加求和。
DMM:=SUM(IFELSE(LD>0 && LD>HD,LD,0),14);
//如果LD>0并且LD>HD,取LD否则取0,对取值做N周期累加求和。
PDI:=DMP*100/TR;
MDI:=DMM*100/TR;
ADX:=MA(ABS(MDI-PDI)/(MDI+PDI)*100,6);

ADX向上表示趋势强,ADX向下表示趋势弱。

img

接下来我们把这二者综合起来,就形成了基于ADX及EMA的交易系统

代码如下:

TR:=SUM(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(LOW-REF(CLOSE,1))),14);
HD:=HIGH-REF(HIGH,1);
LD:=REF(LOW,1)-LOW;
DMP:=SUM(IFELSE(HD>0 && HD>LD,HD,0),14);
DMM:=SUM(IFELSE(LD>0 && LD>HD,LD,0),14);
PDI:=DMP*100/TR;
MDI:=DMM*100/TR;
ADX:=MA(ABS(MDI-PDI)/(MDI+PDI)*100,6);
UPPERMA:=EMA(HIGH,30);
LOWERMA:=EMA(LOW,30);
CROSSUP(C,UPPERMA)&&EVERY(ADX>REF(ADX,1),2),BPK;
//当ADX连续两周期向上且当前价大于30根K线最高价的EMA满足买入条件
CROSSDOWN(C,LOWERMA)&&EVERY(ADX>REF(ADX,1),2),SPK;
//当ADX连续两周期向上且当前价下于30根K线最低价的EMA满足卖出条件
AUTOFILTER;

多个同类指标同向判断 以精确分析,提高胜率

寻找多个趋势指标:布林通道(BOLL)、唐奇安通道、均线动态突破系统就是基于自适应的布林通道与自适应的唐奇安通道的突破系统

唐奇安通道:是美国期货市场传奇人物理查德·丹尼斯(Richard Dennis)发明的,是海龟法则的前身。其构成是由一定周期(一般都是20,案例中设置为可以改变的)内的最高价和最低价形成上轨和下轨,当价格冲破上下轨道时,冲破上轨是就是可能的买的信号;反之,冲破下轨时就是可能的卖的信号。

多指标模型交易思路:

  • 昨日价格大于布林通道上轨,并且当日周期价格大于唐奇安通道上轨,开多单

  • 昨日价格小于布林通道下轨,并且当日周期价格小于唐奇安通道下轨,开空单

  • 持有多单时,价格小于自适应出场均线,平多单

  • 持有空单时,价格大于自适应出场均线,平空单

我们可以这样写:

//当日市场波动
TODAYVOLATILITY:=STD(CLOSE,30);
//昨日市场波动
YESTERDAYVOLATILITY:=REF(TODAYVOLATILITY,1);
//市场波动的变动率
DELTAVOLATILITY:(TODAYVOLATILITY-YESTERDAYVOLATILITY)/TODAYVOLATILITY;
//计算自适应参数
LOOKBACKDAYS1:=LOOP2(BARPOS=30,20,REF(LOOKBACKDAYS1,1)*(1+DELTAVOLATILITY));
LOOKBACKDAYS2:=ROUND(LOOKBACKDAYS1,0);
LOOKBACKDAYS3:=MIN(LOOKBACKDAYS2,60);//60自适应参数的上限
LOOKBACKDAYS:=MAX(LOOKBACKDAYS3,20);//20自适应参数的下限
//自适应布林通道中轨
MIDLINE:=MA(CLOSE,LOOKBACKDAYS);
BAND:=STD(CLOSE,LOOKBACKDAYS); 
//自适应布林通道上轨
UPBAND:=MIDLINE+2*BAND;
//自适应布林通道下轨
DNBAND:=MIDLINE-2*BAND; 
//自适应唐奇安通道上轨
BUYPOINT:=HHV(HIGH,LOOKBACKDAYS);
//自适应唐奇安通道下轨
SELLPOINT:=LLV(LOW,LOOKBACKDAYS);
//自适应出场均线
LIQPOINT:=MIDLINE;
//昨日价格大于布林通道上轨,并且当日价格大于唐奇安通道上轨,开多单
REF(C,1)>REF(UPBAND,1)&&HIGH>=REF(BUYPOINT,1),BK;
//持有多单时,昨日价格小于布林通道下轨,并且当日价格小于唐奇安通道下轨,平多单
REF(C,1)<REF(DNBAND,1)&&LOW<=REF(SELLPOINT,1),SP;
//持有多单时,价格小于自适应出场均线,平多单
BARSBK>=1&&LOW<=REF(LIQPOINT,1),SP;
//持有空单时,昨日价格大于布林通道上轨,并且当日价格大于唐奇安通道上轨,平空单
REF(C,1)>REF(UPBAND,1)&&H>=REF(BUYPOINT,1),BP;
//昨日价格小于布林通道下轨,并且当日价格小于唐奇安通道下轨,开空单
REF(CLOSE,1)<REF(DNBAND,1)&&LOW<=REF(SELLPOINT,1),SK;
//持有空单时,价格大于自适应出场均线,平空单
BARSSK>=1&&HIGH>=REF(LIQPOINT,1),BP;
AUTOFILTER;

在编写过程中,大家要注意的是,在My语言中,“CROSSUP”、“CROSSDOWN”与“>”,“<”的区别。以及并且“(AND &&)”、“或者(OR ||)”的灵活运用,多条件连接操作符注意优先级问题。还有“:”与“:=”的区别。最后是相同变量和参数的修改。

以上,就是几种常见的技术指标和他们的结合运用,可以看得出,My语言是一种十分强大的脚本语言,除了友好的初学者学习体验,即使一个量化高手,也可以灵活运用这些指标和语法的组合创造出强大的交易策略,配合发明者量化平台的API接口的出色支持,量化开发者终于可以真正做到把精力都放在策略的研究和编写上,而不用为那些与量化交易毫无相关的交易系统的底层架构上,特别是这些年对于高频交易的限制越来越严格,无论数字货币还是国内商品期货,对于底层的交易系统架构显得越来越与量化交易本身不相干,各位读者还是应该把主要精力放在策略的逻辑设计上和对代码的有效执行上才是每个宽客的光明大道。


More