趋势跟踪模型是基于K线图表计算的,可加载到K线图上查看具体的信号。趋势跟踪模型按照信号的执行顺序可以分为一开一平过滤模型和加减仓模型;从下单执行的时间间隔和信号计算精度上又可以分为收盘价模型和指令价模型两种。
模型加载到k线图后,展现出你从什么时间开始,投了多少钱做交易,交易盈亏曲线是什么样的,模型还包含交易的时间和资金的内容。
形象点说,技术指标是一根价格趋势的曲线,策略模型是一根资金权益的曲线。
模型,是给你管理一笔资金的"交易员",你只需要把资金交给它,其他的就不用管了,买卖信号、委托管理、持仓管理、止损、风控这些,模型都能自己完成。
怎样把指标转化为策略模型呢?
第一步:公式中加入交易指令
写法范例:COND,SIG,//满足COND条件时,立即发出Sig信号
Sig:BK、SP、SK、BP、BPK、SPK、STOP、CLOSEOUT
其中,如果交易过程中,并不是一直持仓,那么用BK、SP、SK、BP;如果交易过程中一直保持有持仓,非多即空,那么用BPK、SPK。
STOP、ClOSEOUT用于编写止损和风控。
例如:
STOP(0,-10);//多单,亏损10个最小变动价位止损
MONEYTOT<=INITMONEY*(1-10/100),CLOSEOUT; // 权益回撤10%止损
第二步:设置信号计算起始时间
调用方法:在主k线图界面,右键-》设置信号计算起止时间。
信号计算起始时间,和k线图数据起始时间,不是一回事的。
以沪铜2201合约为例,该合约的数据起始时间就是合约的挂牌时间是2021年1月18日,在挂牌初期交易不活跃,交易量很少,缺少流动性,你并不会去交易这个合约。随着时间的推移,到2021年11月份以后,距离交割日时间越来越短了,沪铜2101合约交易活跃起来,成交量逐渐增大,2021年11月1日你决定开始交易这个合约,那么信号计算起始时间就应该设置为2021年11月1日。模型自11月1日以后开始计算信号,此后如果满足信号条件,就会发出交易信号。
第三步:设置模型的资金参数
临时调整初始资金、开仓手数:在主k线图界面,右键->临时设置模型资金参数。
设置保证金和手续费参数:量化菜单->设置保证金/手续费的量化交易参数。
按照你的实际情况,设置初始资金、保证金比率、手续费比率等参数。
对于绝大多数交易者来说,量化交易都无需加减仓的,软件中提供了AUTOFILTER函数,只需加到模型最后一行,即可启用一开一平的信号过滤机制,无需在模型中写入其他判断语句,系统会自动过滤掉同方向的交易指令,简单方便。
案例:利用过滤模型实现一开一平交易
如下图所示,多头排列启动上涨行情之后,多头状态一直存在,如果每个多头信号位置都买入,便会加大持仓成本,削减利润。
如下图,通过一开一平信号过滤模型,可以将中间重复的多头信号过滤掉,只在首次出现多头排列的上涨起始点入场,在价格下破均线开始回落时再出场,有效避免了反复交易,节约交易成本,把握住一波完整的趋势行情。
案例2:一开一平过滤模型的下单手数
场景A:按固定手数下单
回测:一开一平过滤模型编写不指定具体的下单手数,回测时按照设置回测参数里的开仓手数计算,如下图。
运行:模组运行单元在交易参数里设置固定下单手数,如下图。
场景B:按资金使用率计算下单手数
一开一平过滤模型也可以实现资金管理,在模型中写入SETDEALPERCENT函数,可按资金使用率计算每次下单手数,合理控制开仓头寸。
例如:
SETDEALPERCENT(20); //每次按理论资金比例的20%下单
关键字:SETDEALPERCENT(fPercent,N)
每次按当前理论资金的fPercent比例下单,且最大为N手,当N<=fPercent比例可下单手数时,取N作为下单手数。
计算公式:fPercent比例可下单手数=(前期可用资金+平仓释放的保证金+平仓盈亏)*fPercent/(最新价*保证金比例*交易单位)。
注:
1、SETDEALPERCENT只作用于开仓指令,不作用于平仓指令。含有该函数的一开一平信号过滤模型,平仓信号默认全平。
2、加减仓模型中如果写了该函数,则开仓按照该函数设置的资金比例下单,默认下单手数及信号后写入的手数均无效;平仓信号按照信号后写入的手数进行下单
3、模组中用单元参数中设置的初始资金、保证金比例计算下单手数
4、历史回测用回测参数中设置的初始资金、保证金比例计算下单手数
一开一平信号过滤模型编写规则
(1)模型中需要写入AUTOFILTER函数;
(2)支持的指令:BK、BP、BPK、SK、SP、SPK、CLOSEOUT、STOP;支持指令分组,指令后不需要写手数。如下图所示:
(3)连续的同方向指令只有第一个有效,其他的将被过滤,如下图;
(4)交易指令必须先开仓后平仓,一开一平配对出现:
出现BK指令,下一个指令只允许出现SP\SPK\CLOSEOUT\STOP指令;
出现SK指令,下一个指令只允许出现BP\BPK\CLOSEOUT\STOP指令;
出现SP/BP/CLOSEOUT/STOP等平仓指令,下一个可以是BK/SK/SPK/BPK指令任一个;
反手指令SPK和BPK交叉出现。
一开一平信号过滤模型是开平对应的,开仓后下一个动作只能是平仓操作,当需要进行加减仓的时候,软件也是支持的,需要删掉AUTOFILTER函数,并使用诸如ISLASTBK(判断上一个信号是否是BK)、BKVOL(多头信号手数)等信号记录函数,自定义过滤机制,即可实现加减仓。
案例1:利用加减仓模型实现波段突破加仓策略
下图是基于长短周期波段突破思想编写的策略模型,在行情有效突破周期指定价格时开仓入场,入场后继续判断行情,若行情继续向有利方向做有效突破,策略执行加仓动作,若行情向不利方向发展并满足出场条件,清仓出场。
如上图,是该波段突破加仓模型的信号效果,图中的指标线形是我们的突破判断标准,当行情有效突破时,软件便会自动开仓和加仓。
案例2:加减仓模型的下单手数
加减仓模型可以通过控制仓位比例实现灵活的资金管理思路,控制交易的风险。
场景A:加减仓模型实现金字塔式加仓
例如:
BKVOL=0 && HIGH>HV(HIGH,3),BK(8);//首次开仓8手
BKVOL>0 && CLOSE>BKPRICE+20*MINPRICE,BK(6);//上涨20点加仓6手
BKVOL>0 && COUNTSIG(BK,ENTRYSIG_PLACE(1))=1 && CLOSE>BKPRICE+10*MINPRICE,BK(4);//再上涨10点加仓4手
MONEYTOT<=INITMONEY*(1-10/100),CLOSEOUT; // 权益回撤10%止损
场景B:按资金的百分比加仓,控制仓位
例如:
T30:MONEYTOT*0.3/(CLOSE*MARGIN*UNIT);//按理论资金的30%计算手数
T5:MONEYTOT*0.05/(CLOSE*MARGIN*UNIT);//按理论资金的5%计算手数
BKVOL+T5<T30 && HIGH>HV(HIGH,3),BK(T5);//按理论资金的5%开仓,仓位控制在30%以内
MONEYTOT<=INITMONEY*(1-10/100),CLOSEOUT; // 权益回撤10%止损
TRADE_AGAIN(100);
其中,TRADE_AGAIN(N) 同一指令行可以连续出N个信号,配合BKVOL+T5<T30将仓位控制在理论资金的30%范围之内。
加减仓模型编写规则
(1)源码中不能有AUTOFILTER函数;
(2)支持的指令:BK(N)、BP(N)、SK(N)、SP(N)、SPK(N)、BPK(N)、CLOSEOUT、STOP;支持指令分组;不支持不带手数的开平仓指令(如,BK);
(3)连续的同方向指令不被过滤,如下图所示;
(4)交易指令必须先开仓后平仓,无须一开一平配对出现:
出现BK\BPK指令,下一个指令允许出现BK\BPK\SP\SPK\CLOSEOUT\STOP指令;
出现SK\SPK指令,下一个指令允许出现SK\SPK\BP\BPK\CLOSEOUT\STOP指令;
出现SP\BP\CLOSEOUT\STOP等平仓指令,下一个可以是BK\SK\SPK\BPK指令任一个。
当一根K线走完,以K线最后一笔价格来确定信号并执行下单的模型即为收盘价模型,可以避免信号忽闪的问题。
收盘价模型是应用最广泛的模型,可以用于长线交易,也可以用于短线交易,可以在月份合约上回测,也可以在品种加权、品种主连上回测,用长期数据验证策略的有效性。
案例1:K线走完确定信号的收盘价模型
如下图,是一个10分钟周期收盘价模型的执行过程。在14:38:50时,K线上就满足了开仓信号,但此时K线没有走完信号还未固定,所以不进行委托;当K线走完时信号固定,则在新K线刚形成时执行委托。
案例2:如何让回测更接近模组实盘运行的准确性
方法A:回测默认是用k线的收盘价做为信号执行价来计算收益的,可以使用CLOSEKLINE函数控制模型在运行中k线走完前几秒内下单。
模组实际运行中,提前几秒下单后,k线走完时支持对下单信号是否发生改变进行校验,如果条件不再成立,开仓信号下一根k线开始时会自动平掉持仓(平仓信号会重新开仓)。这个买卖过程中会产生一点成本的。
例如:
CLOSEKLINE(1,5);//设置交易日收盘结束前5秒确认信号下单
关键字:CLOSEKLINE(TYPE,N)
设置K线走完前N秒,确认信号下单,K线走完进行复核,N的取值范围为1-30
用法:
TYPE=0,小节及交易日结束前N秒确认信号下单,其他时间K线走完确认信号下单
TYPE=1,夜盘结束及日盘结束前N秒确认信号下单,其他时间K线走完确认信号下单
TYPE=2,每一根K线提前N秒确认信号下单
方法B:用SETSIGPRICE函数来控制委托价格,让回测用下一根k线的开盘价作为信号执行价来计算收益,模组实际运行中也用下一根k线的开盘价发出信号委托,这样回测和实盘就完全一致了。
例如:
SETSIGPRICE(BK,NEXT_OPEN );//BK信号用下一根k线的开盘价下单。
关键字:SETSIGPRICE(SIG,PRICE)
不同的信号设置不同的价格方式
用法:
SETSIGPRICE(SIG,PRICE),设置SIG指令的委托方式,PRICE为委托价格
SIG位置为交易指令,包括BK\SK\BP\SP\BPK\SPK 所有指令。
PRICE位置为委托价格,包括以下五种:
(1)CUR_CLOSE 当根收盘价
(2)NEXT_OPEN 下根开盘价
(3)MAX_CLOSE_NEXT_OPEN 收盘价和开盘价二者较大值
(4)MIN_CLOSE_NEXT_OPEN 收盘价和开盘价二者较小值
(5)指定价 可以为具体的数值,也可以为表达式
案例3:收盘价模型及时止损怎么写?
方法A:固定亏损N个最小变动价位止损
用STOP指令写,STOP指令不需要等k线走完,只要满足止损条件就发出信号,回测和运行是完全一致的;
例如:
STOP(0,-10);//多单,亏损10个最小变动价位止损;
方法B:动态追踪止损
用CLOSEOUT指令,CLOSEOUT运算的基础数据为1分钟数据,满足条件的1分钟内就发出信号,不需要等k线走完,回测和运行是完全一致的;
例如:
BKVOL>0 && CLOSE<=BKHIGH*(1-10/100),CLOSEOUT;//多单,开多之后的高点为基准回撤10%止损;
方法C:用权益的回撤来控制止损
用CLOSEOUT指令,CLOSEOUT运算的基础数据为1分钟数据,满足条件的1分钟内就发出信号,不需要等k线走完,回测和运行是完全一致的;
例如:
MA1:=MA(CLOSE,10);//10周期均线
MA2:=MA(CLOSE,20);//20周期均线
MONEYTOT<=INITMONEY*(1-10/100),CLOSEOUT;//权益回撤10%止损
COUNTSIG(CLOSEOUT,BARPOS)=0 && CROSSUP(MA1,MA2),BPK;//未出现止损,均线金叉做多
COUNTSIG(CLOSEOUT,BARPOS)=0 && CROSSDOWN(MA1,MA2),SPK;//未出现止损,均线死叉做空
AUTOFILTER;
收盘价模型编写规则
(1)模型中不含有CHECKSIG、CHECKSIG_MIN、MULTSIG、MULTSIG_MIN等指定信号计算频率类函数的都是收盘价模型。
(2)收盘价模型和一开一平信号过滤模型、加减仓模型没有必然联系。支持一开一平的收盘价模型也支持加减仓的收盘价模型。
指令价模型是指写了CHECKSIG、MULTSIG等运行优化函数,在k线还没有走完的情况下就发出信号的模型,抓住更好的入场机会,应用于短线交易。
案例1:运行优化函数的典型应用场景
运行优化函数,在胜率高并且盈亏比低的策略中,对模型的优化效果更显著。
场景A:CHECKSIG(SIG,'A',N,'D',0,0);//出信号N秒确认信号下单,K线走完复核,每笔tick计算一次信号
k线走完的时候,如果条件仍然满足,多赚了“指令价-这根k线收盘价”这个价差;如果k线走完条件不再满足,牺牲了这个价差以及手续费成本。
关键字:CHECKSIG(SIG,MODE1,TIME1,MODE2,TIME2,INTERVAL);
设置信号确认与复核的指令价方式(TICK逐笔回测,可设置回测精度)
用法:
1、当INTERVAL不为0时,INTERVAL数据时间间隔,每隔INTERVAL秒计算一次信号,SIG为信号,MODE1为信号确认方式,TIME1信号确认时间乘数,MODE2信号复核方式,TIME2信号复核时间乘数。
2、当INTERVAL为0时,每笔TICK计算一次信号,SIG为信号,MODE1为信号确认方式,TIME1信号确认时间,MODE2信号复核方式,TIME2信号复核时间。
3、通过调整INTERVAL参数,模型可设置不同数据快照频率进行回测。
(例:INTERVAL为10,豆粕合约开盘第一根K线21:00:09为第一次计算模型,21:00:19为第二次计算模型...)
典型思路编写:
CHECKSIG(SIG,'A',0,'C',0,0);//出信号立即下单,不复核
CHECKSIG(SIG,'A',0,'D',0,0);//出信号立即下单,K线走完复核
CHECKSIG(SIG,'A',N,'D',0,0);//出信号N秒确认信号下单,K线走完复核,每笔tick计算一次信号
CHECKSIG(SIG,'A',N,'D',0,3);//出信号第3*N秒确认信号下单,K线走完复核,每3秒计算一次信号
CHECKSIG(SIG,'A',N,'C',0,0);//出信号N秒确认信号下单,不进行复核
CHECKSIG(SIG,'B',N,'D',0,0);//K线走完前N秒确认信号下单,K线走完复核
CHECKSIG(SIG,'B',N,'C',0,0);//K线走完前N秒确认信号下单,不复核
CHECKSIG(SIG,'B',0,'C',N,0);//K线走完确认信号下单,不进行复核
CHECKSIG(SIG,'B',0,'D',N,0);//K线走完确认信号下单,不进行复核
CHECKSIG(SIG,'B',0,'E',N,0);//K线走完确认信号下单,小节休息前N秒复核
CHECKSIG(SIG,'A',0,'F',10,0);//出信号立即下单,收盘前最后一根K线提前10秒进行复核
场景B:MULTSIG(0,0,2,0);//出信号立即下单不复核,一根K线最多2个信号,每笔tick计算一次信号
在行情走势出现急转弯的情况下,这一根k线还没有走完,就可以“平仓 +反向开新仓”,或者平掉刚刚开的方向不对的仓,不需要等下一根k线。
关键字:MULTSIG(Sec1,Sec2,N,INTERVAL);
设置一根k线多信号的指令价方式
1、当INTERVAL不为0时,INTERVAL为数据时间间隔,每隔INTERVAL秒计算一次信号,开仓信号在出信号后的第Sec1个数据时间间隔时下单不复核,平仓信号在出信号后的第Sec2个数据时间间隔下单不复核,一根K线上最大的信号个数为N。
例:INTERVAL为10,豆粕合约开盘第一根K线21:00:09为第一次计算模型,21:00:19为第二次计算模型...
2、当INTERVAL为0时,每笔TICK计算一次信号,开仓信号Sec1秒后下单不复核,平仓信号Sec2秒后下单不复核,一根K线上最大的信号个数为N。
例:Sec1为0,则为开仓信号出信号立即下单,不复核;如果Sec1为1,则为开仓信号出信号1秒后下单,不复核
3、通过调整INTERVAL参数,模型可设置不同数据快照频率进行回测。
典型思路编写:
MULTSIG(0,0,2,0);//出信号立即下单不复核,一根K线最多2个信号,每笔TICK计算一次信号
MULTSIG(0,0,2,3);//出信号立即下单不复核,一根K线最多2个信号,每隔3秒计算一次信号
MULTSIG(3,5,2,0);//开仓出信号3秒后下单,平仓出信号5秒下单不复核,一根K线最多2个信号
指令价模型怎么回测?
指令价模型只支持加载到月份合约回测的。
如果要用长期数据验证模型的有效性,可以使用主连链回测功能。首先把模型主图加载的品种主连的k线图上,点右键->模型回测报告,自动调出该功能,就可以对主连链里的多年的主力月份合约进行回测了,还可以合并回测报告。
指令价模型编写规则
1.模型中需要写入CHECKSIG、CHECKSIG_MIN、MULTSIG、MULTSIG_MIN函数来指定信号执行方式。
2.CHECKSIG、MULTSIG、MULTSIG_MIN、CHECKSIG_MIN函数不能同时出现在一个模型中。
3.指令价模型和一开一平过滤模型、加减仓模型没有必然联系,支持一开一平的指令价模型,也支持加减仓的指令价模型。
提醒:
运行优化函数本质上不属于策略本身的内容,如果模型研究过程中,严重依赖运行优化函数,可能干扰策略的研究。虽然运行优化函数对短线模型是必须的,但是对长线模型来说意义不大的。
相关常见问题解答
1、一开一平信号过滤模型在量化运行过程中的规则请参照下方链接
答:http://www.wenhua.com.cn/popwin/guolvmx2.htm
2、加减仓模型在量化运行过程中的规则请参照下方链接
答:http://www.wenhua.com.cn/popwin/feiguolvmx2.htm
3、交易指令如何选择?用单一指令(BK、SP、SK、BP)还是反手指令(BPK、SPK)?
答:在将指标改写成量化交易模型过程中,具体使用哪种交易指令,取决于你的交易思路。如果交易过程中,并不是一直持仓,那么适合选择单一指令;如果交易过程中一直保持有持仓,非多即空,那么可以使用反手指令。
例如:在一波上涨趋势中,空头盈利空间要远小于多头盈利空间,做空甚至有可能不断亏损,这时使用反手指令是不适合的,使用一些判断趋势方向的条件,配合单一方向的指令,规避逆势交易,往往能够获得更高的收益。
4、运行优化函数是什么?
答:运行优化函数是对模型执行过程的微调和运行优化,支持在K线还没有走完的情况下发出交易指令,力求以更好的价格建仓和平仓,从而降低交易成本,提高模型收益。
例如:基本的模型是K线走完发出交易指令的,可以使用CHECKSIG函数,在K线还没有走完但是买入开仓条件已经满足的情况下发出交易指令,不需要这根K线走完。这样操作,后续行情继续上涨的前提下,买入价格就比K线走完再买入的价格更好,成本更低。
5、加减仓模型编写时需要注意的问题有哪些?
答:A、加仓模型中,加仓语句需要判断是否是第一次开仓
方法:可利用判断当前是否有持仓或判断上一个信号是否是相同信号的方法确定是否是第一次开仓。如,加仓条件&&BKVOL>0,BK(N);或者加仓条件&&ISLASTBK=1,BK(N);
B、减仓模型中,减仓语句需要判断当前是否有可平持仓
方法:可利用BKVOL/SKVOL这类函数来判断持仓情况。如,平仓条件BKVOL>0,SP(BKVOL);
6、为什么加减仓模型编写时指令后面一定要有手数?
答:由于加减仓模型中可进行加仓,或者减仓,每笔交易的手数可能会不一样,所以需要具体指定。
7、为什么我的加减仓模型不加仓?
答:在加减仓模型运行时“一个指令行,在一次“开仓->平仓”交易过程中只发一次信号。 如果想让加减仓模型的开仓或平仓指令重复执行可在模型中加入TRADE_AGAIN函数。
例:CLOSE>OPEN,BK(1);
CLOSE<OPEN,SP(1);
MONEYTOT<=INITMONEY*(1-10/100),CLOSEOUT; // 权益回撤10%止损
TRADE_AGAIN(5);
注:有TRADE_AGAIN(N)函数的模型支持同一指令连续发,因此能够实现加减仓。
8、CHECKSIG_MIN和CHECKSIG函数有什么区别?
答:区别在于回测使用的数据不同,回测精度不同。
CHECKSIG_MIN、MULTSIG_MIN是逐分钟频率计算信号,计算速度快,计算精度略差。
CHECKSIG、MULTSIG函数是逐笔tick数据计算信号,计算精度高,计算速度略慢。
9、模型中条件A想要以收盘价方式执行,条件B想以指令价方式执行该如何实现?
答:一个模型只能是收盘价模型或者指令价模型,不同条件设置不同的执行方式可以使用REF函数调取上一根K线的状态来近似实现,比如:
REF(A,1),BK;//前一根K线满足A条件,立即下单
B,BK;//盘中满足B条件,立即下单
CHECKSIG_MIN(BK,'A',0,'C',0);//设置BK信号逐分钟计算,出信号立即下单不复核
10、信号复核是什么意思?
答:复核方式是指对已发出的信号进行检查,可以让交易策略的实现更加灵活。
指令价模型中如果策略设计思路不够严谨,可能会产生信号出现后再次消失的情况,称之为信号忽闪,即开错仓或者平错仓,这时可以使用信号复核进行恢复持仓。
软件中对消失信号的处理方式:
还没有成交时的信号消失处理 - 撤单
BK、SK信号消失处理 - 平仓
BPK、SPK信号消失处理 - 平仓+恢复建仓
BP、SP信号消失处理 - 恢复建仓