26和9,然后最后的返回是MACD第三个数组是MACD的值,最新的索引是scope.bars.length - 1。这样打印出来可以获取到实时更新的MACD值。在熟悉优宽平台Js语言基础上,相对于使用原生的My语言计算确实很方便快捷。
第二部分我们来看多周期引用。在有些量化策略当中,比如多周期均线共振策略,我们不仅要利用当前设置的周期,有时候我们还需要当前周期以外的周期,进行一些指标的计算和判断。这个时候我们可以使用My语言的多周期引用。我们来看下怎样设置。
我们知道My语言的固定周期是在这里设置的,这里设置好以后,我们获取的周期都是固定设置的频率。在策略当中,我们想获取不同周期的时候。 在My语言中,可以这样设置。
#IMPORT [MIN,周期,公式名] AS 变量值
这里通过IMPORT引用公式。第一个参数是时间周期,这个命令中的中的MIN意思为分钟级别,还可以支持HOUR小时和DAY日级别的。这里需要注意的是,底层k线的设置需要比定义k线的周期要小,否则获取不到定义周期的k线。然后第二个参数是具体周期的数值,填写是数字的形式;第三个周期是公式名,使用获取到的周期进行一些公式的计算,这里的公式我们需要另外设置。这里的格式需要注意一下,使用井号开头,最后没有分号。例如这里设置底层周期是1分钟,当我们想要获取15分钟周期K线,可以这样设置。填写参数MIN,15,公式暂且命名为TEST,变量值定义为15。
在我们获取到不同周期的k线以后,当需要进行指标计算的时候,这里的计算公式就是要通过“#EXPORT TEST ”和“#END”进行定义。需要注意格式,在这函数体内,填写具体计算的公式。例如这里定义MEAN20函数,计算指定周期收盘价的EMA的均线值,这里的EMA周期设置为20。
#EXPORT TEST
MEAN20:EMA(C, 20);
#END // 结束
然后我们就可以获取到15分钟周期均线的EMA20的值了,通过这样编写,VAR15.MEAN20。这样呢,就是一个获取不同周期进行指标计算的例子。
结合以上这两个命令,下面我们举例示范一个多周期共振策略的例子。多周期共振是指两个或者两个以上不同周期的均线均发生多头排列,比如这里的红色线代表小周期,绿色系代表大周期,两个周期内短周期均线大于长周期均线,代表上涨的趋势强烈,这个时候可以进行入场做多;当发生空头排列,就是两个不同周期内,短周期均线都小于长周期周期,这个时候下跌的趋势强烈,进行入场做空。
所以在这个策略当中,我们需要获取不同周期的K线,在My语言代码中,这里使用IMPORT分别定义,一个5分钟周期,作为小周期,和30分钟周期,作为大周期,定义变量名为VARSHORT和VARLONG。另外,我们需要定义公式TEST,使用“#EXPORT”和“#END”定义两个公式,计算不同周期内的短线和长线均值,这里分别计算指定周期的EMA均值,设置周期数分别为5和10,定义为MEANSMALL和MEANBIG。
接下来我们就可以不同周期的不同均值计算公式进行指标的确定了,这里分别定义了小周期短线,小周期长线,大周期短线和大周期长线。
然后我们可以判断两个周期的多头排列和空头排列了。当大周期短线大于长线的时候,当发生小周期短线上穿小周期长线的时候,我们可以及时入场,定义为做多信号LONGSIG;相反情况下,大周期短线小于大周期的长线,并且小周期的短线下穿小周期长线的时候,定义为做空信号SHORTSIG。
然后我们定义平多和平空的信号,当多头排列结束,为了防止频繁的不稳定的信号,这里我们定义为比较稳重的的大周期的短线下穿长线的时候,进行平多;当空头排列结束,大周期短线上穿长线,进行平空。这样呢,就是一个多周期共振的策略模版。大家可以根据这个思路进行更多策略的完善。
// #EXPORT扩展语法,以#END结束标记为一个公式,可以声明多个
#EXPORT TEST
MEANSMALL:EMA(C, 5);
MEANBIG:EMA(C, 10);
#END // 结束
#IMPORT [MIN,5,TEST] AS VARSHORT // 引用公式,K线周期用5分钟
#IMPORT [MIN,30,TEST] AS VARLONG // 引用公式,K线周期用30分钟
SHORTSMALL ^^ VARSHORT.MEANSMALL, COLORRED; //小周期短线
SHORTBIG ^^ VARSHORT.MEANBIG, COLORRED, DOT; //小周期长线
LONGSMALL ^^ VARLONG.MEANSMALL, COLORGREEN; //大周期短线
LONGBIG ^^ VARLONG.MEANBIG, COLORGREEN, DOT; //大周期长线
LONGSIG := CROSSUP(SHORTSMALL, SHORTBIG) && LONGSMALL > LONGBIG; //多头均线共振
SHORTSIG := CROSSDOWN(SHORTSMALL, SHORTBIG) && LONGSMALL < LONGBIG; //空头均线共振
COVERLONGSIG := CROSSDOWN(LONGSMALL, LONGBIG); //小周期下跌突破,平多头
COVERSHORTSIG := CROSSUP(LONGSMALL, LONGBIG); //小周期上涨突破,平空头
LONGSIG, BK; //开多
SHORTSIG, SK; //开空
COVERLONGSIG, SP; //平多
COVERSHORTSIG, BP; //平空
AUTOFILTER;
以上呢,就是My语言中JavaScript语言混合编程和多周期引用的例子,希望带给大家更多的启发,帮助开发出更多有效的策略,如果哪里存在疑问,欢迎进行留言,我们也会热心的进行解答。
大家好,上节课我们学习了My语言中Js语言增强和多周期策略的设置,这都是在优宽平台进行复杂策略编写所要使用的一些方法和设置,今天我们讲解My语言复杂模型编写第二部分的课程。本节课首先我们讲解一下My语言中止盈止损的设置。
交易界有句老话:“会买是徒弟,会卖是师傅”。顾名思义怎么卖比怎么买更难,因为在买入的时候只需要判断行情是否开始就可以了;但是一旦买进之后,不但需要判断行情是否转向,还需要时刻控制风险。相信很多交易者都经历过过山车的行情,明明上车了最后还是以小赚甚至亏损的结果出局。或者本来可以以小亏出局,结果从小亏损积累成大亏损。所以从这点看,卖出比买入更为重要。
简单的说,卖出无非是两种情况:止盈和止损。如果运气很好,买入方向是正确的,这时就要考虑止盈的问题,否则可能账面上赚到了钱,没有在合适的位置获利了结,最后平亏出局。如果运气不好,买入和方向和市场的走势不一致,这时就要考虑止损了,或者在开仓买入之前就应该考虑好止损的位置,否则小亏损会积累成大亏损。
前面的一系列我们编写的策略大多数使用的是指标进行开仓和平仓的操作,但是在一定程度上,指标具有滞后性,并且也不能判断实时的盈亏,所以对于平仓的条件,我们可以进行止盈止损的设置。
本节课我们介绍两种止盈止损的设置,也是使用较多的,包括固定止盈止损和移动止盈止损。
固定止盈止损很好理解,就是在开仓以后,采用固定点数或者固定比例进行平仓的设置。我们来看下在策略中怎样设置。
// 固定点数
MA1 ^^ MA(C, 5);
MA2 ^^ MA(C, 10);
CROSSUP(MA1, MA2), BK;
CROSSDOWN(MA1, MA2), SK;
多头止盈价格 := BKPRICE + PROFITNUMBER * MINPRICE;
多头止损价格 := BKPRICE - LOSSNUMBER * MINPRICE;
空头止盈价格 := SKPRICE - PROFITNUMBER * MINPRICE;
空头止损价格 := SKPRICE + LOSSNUMBER * MINPRICE;
C > 多头止盈价格 || C < 多头止损价格, SP;
C < 空头止盈价格 || C > 空头止损价格, BP;
AUTOFILTER;
首先我们来看固定点数的止盈止损设置,这里需要两个策略参数,分别是PROFITNUMBER止盈系数,和LOSSNUMBER止损系数。在这个策略当中,开仓条件使用双均线进行判断,然后我们就可以根据多头开仓价格BKPRICE,和空头开仓价格SKPRICE,设置相应的多头和空头的止盈止损价格。逻辑这里是比较清晰的,对于多头止盈,使用多头开仓价格加上止盈点数乘以价格最小变动单位,我们有提到过,不同合约的MINPRICE是不同的;多头止损是多头开仓价格减去止损系数乘以MINPRICE。空头的止盈和止损就是使用空头开仓价格减去和加上止盈和止损的价格。
最后当判断收盘价达到止盈价格或者止损价格的时候,我们进行相应的平仓就可以。这就是固定点数的止盈止损方法。关于固定比例的止盈止损方法,相信大家也都可以理解了。通过设置止盈百分比和止损百分比,然后对应的设置止盈价格和止损价格,最后进行相应的条件平仓就可以。
MA1 ^^ MA(C, 5);
MA2 ^^ MA(C, 10);
CROSSUP(MA1, MA2), BK;
CROSSDOWN(MA1, MA2), SK;
多头止盈价格 := BKPRICE * (1 + PROFITPERCENT/1000);
多头止损价格 := BKPRICE * (1 - PROFITPERCENT/1000);
空头止盈价格 := SKPRICE * (1 - LOSSPERCENT/1000);
空头止损价格 := SKPRICE * (1 + LOSSPERCENT/1000);
C > 多头止盈价格 || C < 多头止损价格, SP;
C < 空头止盈价格 || C > 空头止损价格, BP;
AUTOFILTER;
固定的比例或者点位进行止盈止损有时候太过于死板。当我们主动止盈时,可能会遇到一大波行情,只赚到其中一小部分就错过了后续更大的利润。虽然这样的交易并不亏损,但心理上会有一种错失良机的遗憾感。为了解决这个问题,移动止盈止损策略采用了浮动止损的方法,就是在获得不同级别的浮动盈利之后,开启下一级主动止损模式。这样一方面可以持续享受较高的浮动盈利,同时也不断提高止损点位,用来实现更多盈利的目标。
我们来看下怎样实现。这里同样设置止盈系数和止损系数。开仓同样使用均线交叉,对于平仓,这里我们设置了两个条件。
对于多头,在最新的收盘价小于开仓价格的情况下,证明是亏损的状态,平仓条件是当最新的收盘价小于开仓价格减去止损的系数,这样可以保证止损的范围不会持续扩大;而当最新的收盘价大于开仓价格的时候,我们可以进行移动止盈价格的设置,这里我们参考的移动指标是开仓以来的最高价BKHIGH,我们当然期待它是不断上升的,但是当回撤到一定范围的时候,证明趋势的可能转换,我们需要进行止盈平仓;所以在判断收盘价大于开仓价的情况下,当收盘价回撤到开仓以来的最高价BKHIGH减去止盈系数的时候,我们进行平仓的操作。
对于空头的设置,大家也是同样可以理解了。
MA1 ^^ MA(C,5);
MA2 ^^ MA(C,10);
LONGSIG:=CROSSUP(MA1,MA2);
SHORTSIG:=CROSSUP(MA2,MA1);
COVERLONGSIG:=C<BKPRICE-LOSSNUMBER||(C>BKPRICE&&C<BKHIGH-PROFITNUMBER);
COVERSHORTSIG:=C>SKPRICE+LOSSNUMBER||(C<SKPRICE&&C>SKLOW+PROFITNUMBER);
LONGSIG,BK;
COVERLONGSIG,SK;
SHORTSIG,SP;
COVERSHORTSIG,BP;
AUTOFILTER;
以上呢,就是使用比较多的固定止盈止损和移动止盈止损的设置,当然大家还可以进行更多的止盈止损设置。比如使用实时的波动率动态的设置止盈上限和止损下限等,大家有好的想法都可以提出来,这边呢,会争取帮助大家进行实现。
第二部分呢,我们来讲解一个完整的My语言复杂策略的编写。我们将从策略的思路提出,逻辑的理顺,整体框架的构建,具体的逻辑编写,以及止盈止损等方面开始逐一的阐述,帮助大家从自己的交易理念出发,从0开始一个策略的编写。
前面的课程我们讲过,价格的走势基本分为两种:趋势行情和震荡行情,所以有相关的趋势策略和震荡策略。趋势策略有点像放长线钓大鱼,它关注的市场趋势的整体变化,从而获取长期的利润;而震荡策略更关注的从平稳的震荡行情中不断收获小额利润,从而积少成多。但是单纯的趋势策略可能在震荡的行情中频繁的开平仓造成利润的磨损;而单一的震荡策略也有可能在碰到一次强烈的趋势行情中损失掉所有的利润。那么有没有一种策略可以结合这两种行情的优势,并且避免不同行情的损失吗?恒温器择时策略考虑一下。恒温器择时交易策略,可以在趋势行情中采用趋势策略,在震荡行情中采用震荡策略。这有点像汽车换挡,而决定换挡时机的因素,则是以潮汐指数(CMI)为评判标准,对当前的行情进行一个较为合理的划分。我们来看下CMI的计算公式。CMI的原始公式是使用收盘价减去29日前的收盘价的绝对值,然后,除以30日内的最高价减去30日内的最低价。
CMI:=ABS(C-REF(C,29))/(HHV(H,30)-LLV(L,30))*100;
一般来说 CMI 的值在0~100区间,值越大,趋势越强。当 CMI 的值小于20时,策略认为市场处于震荡模式;当 CMI 的值大于等于20时,策略认为市场处于趋势模式。整个策略架构,可以简化的写成下面这样:如果 CMI < 20,执行震荡策略;如果 CMI ≥ 20,执行趋势策略。但是CMI里面的参数是属于比较经典的参数,在那些年代,市场趋势的转换还是比较平稳,但是在如今的年代市场的趋势转换的,比较快,所以我们可以将这里的CMI期间参数和CMI阈值参数设置成为策略参数的形式,在回测模式中进行调参,获取更好的结果,另外这个策略当中可能会有很多组参数,进行分组,我们可以这样添加,使用括号问号加上分组命名。
// 计算CMI指标用以区分震荡市与趋势市
CMI: ABS(C-REF(C,CMIPERIOD-1))/(HHV(H,CMIPERIOD)-LLV(L,CMIPERIOD))*100;
这就是策略的架构,剩下的就是把震荡策略的内容和趋势策略的内容,填充到这个框架里面。接下来我们来看震荡策略的设置。前面的课程我们使用了布林带均值回归的策略。今天我们来看另一种震荡策略设计。在震荡市场中,通常存在一种现象:如果今天价格上涨的话,那么明天的价格下跌的概率更大。而今天价格如果下跌的话,那么明天的价格上涨的概率更大,而这也正是震荡市场的特性。所以这里首先定义一个关键价格(最高价+最低价+收盘价的平均值)。如果当前价格大于关键价格,那么明天应该震荡看空。相反的,如果当前价格小于关键价格,那么明天应该震荡看多。于是震荡看多和震荡看空的阈值应该是不一致的,接下来我们进行设置。下跌和上涨的概率是不一致的,我们呢,直接做多或者做空是不合适的,但是我们可以调整做多和做空的阈值。当下跌概率更大,我们调小做空阈值,调大做多阈值;上涨概率更大,调大做空阈值,调小做多阈值。这样设置可以有更多的可能性进行对应方向的开仓,但是如果满足相反方向开仓的情况下,证明趋势的转换,我们也可以及时抓住。
这里阈值计算需要一个ATR指标。我们来计算一下。
TR:=MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
ATRVALUE:=MA(TR,ATRPERIOD);
ATR是TR的移动均值,TR是取当前交易日的最高价和最低价,前一交易日的收盘价和最高价,和前一日收盘价和最低价三者的差值中的最大值作为TR值。然后取TR的移动平均就是ATR值。
接下来我们来看做多和做空阈值的计算。做多的阈值LEP,在C>KOD,震荡看空,做多的阈值设置大一点,使用开盘价加上0.75乘以ATRVALUE,否则震荡看多,做多的阈值设置的小一点,使用开盘价加上0.5乘以ATRVALUE。
做空的阈值SEP,在C>KOD,震荡看空,做空的阈值设置小一点,开盘价减去0.5乘以ATRVALUE,否则震荡看多,做空的阈值设置的大一点,开盘价减去0.75乘以ATRVALUE。
// 定义关键价格
KOD:=(H+L+C)/3;
LEP:=IFELSE(C>KOD,O+ATR10*0.75,O+ATR10*0.5); //做多阈值
SEP:=IFELSE(C>KOD,O-ATR10*0.5,O-ATR10*0.75); //做空阈值
另外为了防止假突破,导致策略来回止损,因此加入了一个最高价与最低价3日均线滤网来避免这种情形。
// 定义最高价与最低价3日均线
AVG3HI:=MA(H,3);
AVG3LO:=MA(L,3);
LEP1:=MAX(LEP,AVG3LO);
SEP1:=MIN(SEP,AVG3HI);
这里的逻辑设置可能比较绕一点,大家可以暂停一下,慢慢思考一下。阈值设置完成,接下来我们就来设置震荡策略的逻辑了。首先设置开仓,这里都需要前置条件CMI小于CMI阈值,表明处于震荡行情当中,然后当最新收盘价大于做多阈值,进行多头开仓BK;反之小于做空阈值,进行空头开仓SK。对于平仓的设置,我们可以采用移动止盈止损的设置,等下面趋势部分开仓完成,我们一起进行设置。
// 震荡策略逻辑
CMI<CMITHRESHOLD&&C>=LEP1,BK;
CMI<CMITHRESHOLD&&C<=SEP1,SK;
接下来我们来看趋势部分的设置。这里的趋势部分为了节省大家的脑力,这里我们使用先前讲过的布林带策略。首先计算均线,然后是上下限。在满足CMI大于CMI阈值的情况下,如果最新收盘价大于布林带上限,证明趋势突破,我们进行多头开仓;否则小于下限,进行空头开仓。
// 计算均线
MAVALUE:=MA(C,MAPERIOD);
// 计算布林带上下限
UPBAND:=MAVALUE+STD(C,STDPERIOD)*STDMUL;
DNBAND:=MAVALUE-STD(C,STDPERIOD)*STDMUL;
// 趋势策略逻辑
CMI>=CMITHRESHOLD && C>=UPBAND,BK;
CMI>=CMITHRESHOLD&& C<=DNBAND,SK;
最后一部分我们进行课程前面一部分讲过的移动止盈止损的设置进行平仓的操作。这样呢,就是一个完整策略的编写过程,当然后续我们还可以进行很多工作,比如这里参数的调优,还有根据不同品种进行策略逻辑的优化。这些都是需要大家在实际的策略编写当中所要思考的事情。
// 止盈止损设置
C<BKPRICE-LOSSNUMBER||(C>BKPRICE && C<BKHIGH-PROFITNUMBER), SP;
C>SKPRICE+LOSSNUMBER||(C<SKPRICE && C>SKLOW+PROFITNUMBER), BP;
AUTOFILTER;
至此呢,My语言的课程已经全部讲述完毕,很感谢大家的倾听。大家后续可以在优宽平台进行更多的My语言策略的尝试,如果有遇到哪些问题,欢迎大家留言,我们将热心为大家提供更多的帮助,希望大家一起加油,共同进步。