将技术分析进行到底
提供专业的程序化交易解决方案

关于信号控制的思路

 

信号控制问题,分为三类:

  • 数据层面的信号控制问题:采用更优的数据处理方法,过滤错误信号。
  • 宏观层面的信号控制问题:根据已经出现的信号的信息,决定下一个满足条件的信号是否执行。
  • 微观层面的信号控制问题:属于算法交易,控制交易指令的执行。包括,信号执行时间、信号消失处理和委托价格方式等。

优化数据处理方法需要根据具体情况具体讨论,在这里不进行讨论。

微观层面的控制属于算法交易的范畴,会有其他文章进行介绍。

本文主要提供一些关于宏观层面信号控制的方案。

 

1.每根K线上最多2个开仓信号

//这是我们在上节最后讲过的一个问题。上节是从微观的角度来解决的。这里我们从宏观的角度,来研究一下解决这个问题的方案。
SIGN:=COUNTSIG(BK,1)+COUNTSIG(SK,1);//统计当前K线上,开仓信号的个数
KCOUND:=SIGN<2;//信号控制条件
KCOND && 买开仓条件,BK;
卖平仓条件,SP;
KCOND && 卖开仓条件,SK;
买平仓条件,BP;
MULTSIG_SEC(0,0,4);//信号控制函数

 

2.平仓后只出反向开仓信号

LKCOND:=COUNTSIG(SK,BARPOS)=0 || ISLASTBP;//买开仓限制条件:历史上没有出过卖开仓信号,或者前一个是买平仓信号
SKCOND:=COUNTSIG(BK,BARPOS)=0 || ISLASTSP;//卖开仓限制条件:历史上没有出过买开仓信号,或者前一个是卖平仓信号
LKCOND && 买开仓条件,BK;
卖平仓条件,SP;
SCOND && 卖开仓条件,SK;
买平仓条件,BP;

 

3.日内开仓不超过M次

方法一:

KN:=BARSLAST(DATE<>REF(DATE,1))+1;
SIGN:=COUNTSIG(BK,KN)+COUNTSIG(SK,KN);//统计日内买开和卖开总次数
KCOND:=SIGN<9;
KCOND && 买开仓条件,BK;
卖平仓条件,SP;
KCOND && 卖开仓条件,SK;
买平仓条件,BP;

方法二:

KN:=BARSLAST(DATE<>REF(DATE,1))+1;
SIGN:=COUNTSIG(BK,KN)+COUNTSIG(SK,KN);//统计日内买开和卖开总次数
KCOND:=SIGN<9;
IDLE(NOT(KCOND));//加入原模型中,如果不满足条件KCOND,则不执行开仓信号

方法二与方法一的区别在于:不满足KCOND时,方法一不发信号;而方法二仍发信号,但不执行。

这个方案中,两种方法效果相同。

 

4.区间内限制开仓信号不超过M个

//在09:00~11:30、13:30~15:00和21:00~02:30(次日)这三个时间段内,交易次数分别不能超过M次
T:=TIME=0900 || TIME=1330 || TIME=2100;//区间第一根K线满足的条件
KN:=BARSLAST(T)+1;
LSIGN:=COUNTSIG(BK,KN);//统计每个时间段内的买开仓信号个数
SSIGN:=COUNTSIG(SK,KN);//统计每个时间段内的卖开仓信号个数
LKCOND:=LSIGN<3;//每个时间段内,最多开3次多仓
SKCOND:=SSIGN<3;//每个时间段内,最多开3次空仓
LKCOND && 买开仓条件,BK;
卖平仓条件,SP;
SKCOND && 卖开仓条件,SK;
买平仓条件,BP;

 

5.平仓亏损后,回到开仓价时回补

//前一个信号是SP,并且前一次平仓亏损,并且最新价大于前一次买开仓价格
LKCOND:=LASTOFFSETPROFIT<0 && ISLASTSP && C>BKPRICE;
//前一个信号是SP,并且前一次平仓亏损,并且最新价大于前一次买开仓价格
SKCOND:=LASTOFFSETPROFIT<0 && ISLASTBP && C<SKPRICE;
LKCOND && 买开仓条件,BK;
卖平仓条件,SP;
SKCOND && 卖开仓条件,SK;
卖平仓条件,BP;

 

6.平仓亏损后过滤M根K线内的信号

KCOND1:=LASTOFFSETPROFIT>0;//最近一次平仓盈利
KCOND2:=LASTOFFSETPROFIT<0 && ISLASTSP && BARSSP>3;//最近一次卖平仓亏损后,三根K线内不满足条件
KCOND3:=LASTOFFSETPROFIT<0 && ISLASTBP && BARSBP>3;//最近一次买平仓亏损后,三根K线内不满足条件
KCOND:=KCOND1 || KCOND2 || KCOND3;//信号控制条件
KCOND && 买开仓条件,BK;
卖平仓条件,SP;
KCOND && 卖开仓条件,SK;
买平仓条件,BP;

 

7.平仓亏损大于M,只反方向开仓

KCOND1:=LASTOFFSETPROFIT>-5000;//最近一次平仓盈利,或者平仓亏损小于5000
LKCOND:=KCOND1 || (LASTOFFSETPROFIT<-5000 && ISLASTBP);//多头限制条件:KCOND1,或者,平仓亏损大于5000并且前一个信号是BP才满足条件
SKCOND:=KCOND1 || (LASTOFFSETPROFIT<-5000 && ISLASTSP);//空头限制条件:KCOND1,或者,平仓亏损大于5000并且前一个信号是SP才满足条件
LKCOND && 买开仓条件,BK;
卖平仓条件,SP;
SKCOND && 卖开仓条件,SK;
卖平仓条件,BP;

 

8.日内亏损M次、平仓亏损金额超过N之后停止交易

方法一:

KN:=BARSLAST(DATE<>REF(DATE,1))+1;
TOP:=OFFSETPROFIT-REF(OFFSETPROFIT,KN);//连续运行情况下当天累计平仓盈亏
KCOND1:=TODAYLOSSTIMES<3 || TOP>-10000;//日内亏损小于3次,或者累计平仓亏损小于10000
KCOND2:=TODAYWINTIMES<7 || TOP<30000;//日内盈利小于7次,或者累计平仓盈利小于30000
KCOND:=KCOND1 && KCOND2;//交易控制条件
KCOND && 买开仓条件,BK;
卖平仓条件,SP;
KCOND && 卖开仓条件,SK;
买平仓条件,BP;

方法二:

KN:=BARSLAST(DATE<>REF(DATE,1))+1;
TOP:=OFFSETPROFIT-REF(OFFSETPROFIT,KN);//连续运行情况下当天累计平仓盈亏
KCOND1:=TODAYLOSSTIMES<3 || TOP>-10000;//日内亏损小于3次,或者累计平仓亏损小于10000
KCOND2:=TODAYWINTIMES<7 || TOP<30000;//日内盈利小于7次,或者累计平仓盈利小于30000
KCOND:=KCOND1 && KCOND2;//交易控制条件
IDLE(NOT(KCOND));//加入原模型中,如果不满足条件KCOND,则不执行开仓信号

方法二与方法一的区别在于:不满足KCOND时,方法一不发信号;而方法二仍发信号,但不执行。

本方案中,两种方法效果不同。

方法二中,不满足KCOND条件是,虽然不执行信号,但是发出的理论信号会改变函数OFFSETPROFIT、TODAYWINTIMES、TODAYLOSSTIMES的理论值。

 

9.连续亏损M次、当日平仓亏损金额超过N之后停止交易

方法一:

KN:=BARSLAST(DATE<>REF(DATE,1))+1;
TOP:=OFFSETPROFIT-REF(OFFSETPROFIT,KN);//连续运行情况下当天累计平仓盈亏
KCOND1:=TNUMSEQLOSS<3 || TOP>-10000;//日内亏损小于3次,或者累计平仓亏损小于10000
KCOND2:=TNUMSEQWIN<7 || TOP<30000;//日内盈利小于7次,或者累计平仓盈利小于30000,
KCOND:=KCOND1 && KCOND2;//交易控制条件
KCOND && 买开仓条件,BK;
卖平仓条件,SP;
KCOND && 卖开仓条件,SK;
买平仓条件,BP;

方法二:

KN:=BARSLAST(DATE<>REF(DATE,1))+1;
TOP:=OFFSETPROFIT-REF(OFFSETPROFIT,KN);//连续运行情况下当天累计平仓盈亏
KCOND1:=TNUMSEQLOSS<3 || TOP>-10000;//日内亏损小于3次,或者累计平仓亏损小于10000
KCOND2:=TNUMSEQWIN<7 || TOP<30000;//日内盈利小于7次,或者累计平仓盈利小于30000,
KCOND:=KCOND1 && KCOND2;//交易控制条件
IDLE(NOT(KCOND));//加入原模型中,如果不满足条件KCOND,则不执行开仓信号

方法二与方法一的区别在于:不满足KCOND时,方法一不发信号;而方法二仍发信号,但不执行。

本方案中,两种方法效果不同。

方法二中,不满足KCOND条件是,虽然不执行信号,但是发出的理论信号会改变函数OFFSETPROFIT、TODAYWINTIMES、TODAYLOSSTIMES的理论值。

 

10.当前最大连续亏损次数为历史最大连续亏损次数,停止交易

方法一:

KCOND:=TNUMSEQLOSS<TMAXSEQLOSS;
KCOND && 买开仓条件,BK;
卖平仓条件,SP;
KCOND && 卖开仓条件,SK;
买平仓条件,BP;

方法二:

KCOND:=TNUMSEQLOSS<TMAXSEQLOSS;
IDLE(NOT(KCOND));//加入原模型中,如果不满足条件KCOND,则不执行开仓信号

方法二与方法一的区别在于:不满足KCOND时,方法一不发信号;而方法二仍发信号,但不执行。

本方案中,两种方法效果不同。

方法二中,不满足KCOND条件是,虽然不执行信号,但是发出的理论信号会改变函数TODAYWINTIMES、TODAYLOSSTIMES的理论值。

 

11.根据连续平仓亏损次数调整下单手数

//初始开仓手数为1,每亏损一次增加1手,最大开仓3手。因为下单手数是变化的,所以要使用非过滤模型的形式。
DN:=MIN(TNUMSEQLOSS+1,3);//下单手数根据连续亏损次数调整
买开仓条件,BK(DN);
卖平仓条件,SP(BKVOL);
卖开仓条件,SK(DN);
卖平仓条件,BP(SKVOL);

 

12.用PANZHENG函数过滤信号

方法一:

//我们设计PANZHENG函数的初衷是,给大家的交易系统提供一种信号控制的解决方案。可以通过使用该函数实现过滤掉某些K线上的信号。
//该函数可能无法适应所有的交易策略,建议大家加入自己的模型进行历史回测,以便分析该函数对模型是否适用。
PANZHENG=0 && 买开仓条件,BK;
卖平仓条件,SP;
PANZHENG=0 && 卖开仓条件,SK;
买平仓条件,BP;

方法二:

IDLE(PANZHENG=1);//加入原模型中,如果不满足条件KCOND,则不执行开仓信号

方法二与方法一的区别在于:不满足KCOND时,方法一不发信号;而方法二仍发信号,但不执行。

本方案中,两种方法效果可能不同。

 

13.理论权益达到某回撤条件,则停止执行信号

GG:=HHV(MONEYTOT,0);//
IDLE((MONEYTOT<GG*0.95&&MONEYTOT>GG*0.92)||MONEYTOT<GG*0.85);//加入原模型,理论权益回撤大于0.05且小于0.08,或者大于0.15,只发出信号,但不执行

 

 

 

未经允许不得转载:文华程序化 » 关于信号控制的思路
分享到: (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

横冲直撞 一直到最远方