程序化交易策略.docx
《程序化交易策略.docx》由会员分享,可在线阅读,更多相关《程序化交易策略.docx(8页珍藏版)》请在冰豆网上搜索。
程序化交易策略
超级日内组合策略
(The Super Combo Day Trading Strategy)
成功的日内突破策略核心是开盘后不久,寻找到未来上涨趋势的近低点和下跌趋势的近高点。
最怕的是在高点附近买进,在低点附近卖空。
但是,我们通过观察测评可以发现,除去少部分买在低点,卖在高点的交易,绝大部分都是突破失败的例子。
那么是否有这样的策略,在行情突破的时候做突破,若突破失败,自动切换成处理突破失败的策略呢?
你可能会说,不太可能吧?
但今天介绍的超级组合策略正是基于这种想法开发的。
策略简述:
超级日内组合策略是我目前整理策略发布以来最复杂的一个。
简化后还是一堆文字,所以简述我就不写了,大家直接看策略详情吧。
个人觉得若你能理解后独立写出这个策略的代码,金字塔平台上几乎任意的图表程序化编程都难不倒你了。
看这个策略之前,请先阅读Hans123、恒温器策略,相关概念不在此文重述了。
策略详情:
超级日内组合策略属于有很多个模块处理不同行情的复杂策略,如同R-breaker一样,将考虑突破及突破失败2种情况,但细节方面会更复杂。
当然,在有条理的情况下,使用金字塔软件实现策略还是相对容易的。
首先,我们策略依然沿用突破、突破失败这类思想,并且引入了恒温器策略中趋买市、趋卖市的概念,这3者将是这个策略的基础。
对于策略突破的部分:
时间处理上,我们将沿用Hans123策略的想法,开盘30分钟内不交易。
其次,对于突破进场点,超级日内组合策略将使用类似恒温器策略中区间突破、趋买市、趋卖市的思想。
首先,我们判断是否交易?
经过长期的观察和研究,策略的开发者得出结论,一般短K线后面往往跟随着长K线,而我们追踪的正是长K线。
所以,若昨天是短K,今日我们才入场,否则不入场。
我们采用以下的方式来判断K线是否为短K。
比较昨开-昨收的绝对值和前10天该值的平均值。
若前者小于后者85%,我们认定为短K,反之为长K。
接下来,我们来确定进场的点位,若收盘价小于等于前一日的收盘价为趋买市,反之为趋卖市。
趋买市的开多条件为今开+30%前10日的真实区间。
开空条件为今开-60%的前10日真实区间。
趋卖市开多条件为今开+60%的前10日真实区间,开空条件为今开-30%前10日的真实区间。
接着,我们来处理突破失败的部分(反趋势)。
在该系统中,我们以多头为例,将以下三种情况定义为突破失败:
1、市场比昨日最高价向上跳空一定高度接着又下跌到最高价以下一定位置。
2、开盘价在昨日最高价以下,后超过该价,然后又下跌至该价以下一定位置。
3、多头头寸开始但在中午12点前失败,失败是以触发停止为标志的。
如果失败不是发生的很快,我们可以利用这个优势。
反之,为向下突破失败。
然后,我们来处理止损的部分。
(依然以多头为例)
1、在常规情况下,我们多头止损点是开仓价-10日波幅区间的25%和3个大点( IF下是15个最小变动价位)较大的那个。
这里混合使用固定止损和百分比保护止损的理由是:
百分比止损能较好地适应市场的情况,它是个自适应参数系统。
它及固定止损对比的好处是,若市场是高波动的,用固定止损就会使大部分交易亏损;若市场波动率低,一个固定的止损价位会导致风险大于收益和最后的净亏损。
但是,若前一天的波动非常的小(比如前一天开盘就涨停了)。
百分比系统会产生一个很荒唐的值,所以我们设置了一个3个点的条件作为下限。
2、在突破失败的情况下反手入场,我们在止损点为开仓价-10日波动区间的15%和3个大点的较大值。
这是因为当天市场可能是没有方向的。
反复的震荡会让我们有很大的损失,在已经亏损了一次的情况下,我们将执行更严格的风控。
3、当我们赚取的利润已经等于10天波动区间的50%时,我们采用保本止损策略,止损价调整为开仓价+滑点和手续费。
4、当时间超过下午14:
30后,止损点设置为低于、高于前3跟5分钟线的低高点。
?
这是因为,我们发现交易的最后30-45分钟,市场全天的趋势将消退,极少数情况下会出现大幅翻转(我记得今年某次PTA,深深地V型翻转,伤透了心),我们当然不希望盈利在最后丢掉,所以设置了这个较小的止损,市场一有不利我们的风吹草动,我们就撤。
5、一天最多进场多头、空头各一对。
换句话说,进场2次就停止。
总结:
这个策略只是一个抛砖引玉,它糅合了足够多的思想。
大家可以此为例,尝试创造出自己一堆堆的策略咯。
代码:
//策略:
超级日内组合系统
//类型:
日内5、走完K线
//版本:
1.0
//修订时间:
2012.12.24
//DESIGNEDBYROGARZ
//中间变量
INPUT:
SS(1,1,100,1),K1(0.3,0.1,1,0.1),K2(0.6,0.1,1,0.1),BOCP(0.25,0,1,0.01),FBOCP(0.25,0,1,0.01);
VARIABLE:
开多次数=0,开空次数=0,趋买市=0,趋卖市=0,多头止损价=0,空头止损价=0;
CYC:
=BARSLAST(DATE>REF(DATE,1))+1;
昨开:
=CALLSTOCK(STKLABEL,VTOPEN,6,-1);
昨收:
=CALLSTOCK(STKLABEL,VTCLOSE,6,-1);
昨昨收:
=CALLSTOCK(STKLABEL,VTCLOSE,6,-2);//昨天的前一天的收盘价,暂称为昨昨收
昨低:
=CALLSTOCK(STKLABEL,VTLOW,6,-1);
昨高:
=CALLSTOCK(STKLABEL,VTHIGH,6,-1);
今高:
=IF(CYC=1,HIGH,REF(HHV(HIGH,CYC),1));
今低:
=IF(CYC=1,LOW,REF(LLV(LOW,CYC),1));
今开:
=IF(CYC=1,OPEN,REF(OPEN,CYC-1));
10日平均波幅:
=ref(MA(CALLSTOCK(STKLABEL,VTHIGH,6,0)-CALLSTOCK(STKLABEL,VTLOW,6,0),10),1);//AVERAGERANGE
10日平均开收盘区间:
=ref(MA(ABS(CALLSTOCK(STKLABEL,VTopen,6,0)-CALLSTOCK(STKLABEL,VTclose,6,0)),10),1);//AVERAGEOCRANGE
开关:
=ABS(昨开-昨收)<0.85*10日平均开收盘区间;//CANTRADE
3周期最高价:
=REF(HHV(HIGH,3),1);
3周期最低价:
=REF(LLV(LOW,3),1);
多头突破确认价:
=昨高+BOCP*10日平均波幅;//LONGBREAKPT
空头突破确认价:
=昨低-BOCP*10日平均波幅;//SHORTBREAKPT
多翻空确认价:
=昨低+FBOCP*10日平均波幅;//LONGFBOPOINT
空翻多确认价:
=昨高-FBOCP*10日平均波幅;//SHORTFBOPOINT
手数:
=SS;
开仓历时:
=ENTERBARS+1;
//交易条件
IF昨收<=昨昨收THENBEGIN//昨日收盘价小于等于昨昨收为趋买市(BUYEASIERDAY)
趋买市:
=1;
趋买市开多价:
今开+K1*10日平均波幅;//BUYBOPT
趋买市开空价:
今开-K2*10日平均波幅;//SELLBOPOINT
END
IF昨收>昨昨收THENBEGIN//昨日收盘价大于昨昨收为趋买市(SELLEASIERDAY)
趋卖市:
=1;
趋卖市开多价:
今开+K2*10日平均波幅;//BUYBOPT
趋卖市开空价:
今开-K1*10日平均波幅;//SELLBOPOINT
END
//交易系统
//突破
IFTIME>=094500ANDTIME<143000AND开关=1THENBEGIN
{趋买市}
IF趋买市=1AND开多次数=0THENBEGIN
趋买市开多:
BUY(C>=趋买市开多价ANDHOLDING=0,手数,MARKET);
多头止损价:
=MIN(ENTERPRICE-0.25*10日平均波幅,ENTERPRICE-3);//这个策略用于股指,多头常规止损价为开仓价减25%的10日平均波幅和3个大点的较小值。
开多次数:
=1;
END
IF趋买市=1AND开空次数=0THENBEGIN
趋买市开空:
BUYSHORT(CLOSE<=趋买市开空价ANDHOLDING=0,手数,MARKET);
空头止损价:
=Max(ENTERPRICE+0.25*10日平均波幅,ENTERPRICE+3);//这个策略用于股指,空头常规止损价为开仓价加25%的10日平均波幅和3个大点的较小值。
开空次数:
=1;
END
{趋卖市}
IF趋卖市=1AND开多次数=0THENBEGIN
趋卖市开多:
BUY(CLOSE>趋卖市开多价ANDHOLDING=0,手数,MARKET);
多头止损价:
=MIN(ENTERPRICE-0.25*10日平均波幅,ENTERPRICE-3);
开多次数:
=1;
END
IF趋卖市=1AND开空次数=0THENBEGIN
趋卖市开空:
BUYSHORT(CLOSE<趋卖市开空价ANDHOLDING=0,手数,MARKET);
空头止损价:
=Max(ENTERPRICE+0.25*10日平均波幅,ENTERPRICE+3);
开空次数:
=1;
END
END
//突破失败
{多头突破失败情况1:
价格曾经高于多头突破确认价,最新价又回落至空翻多确认价}
IF今高>多头突破确认价ANDC<多翻空确认价ANDTIME<143000AND开空次数=0ANDHOLDING>=0THENBEGIN
多头止损1:
SELL(1,手数,MARKET);
多翻空1:
BUYSHORT(1,手数,MARKET);
开空次数:
=1;
END
{多头突破失败情况2:
突破入场后,行情反转。
止损的同时我们反手开空,但前提是时间在中午11:
30之前,且多头进场在至少4根K之前。
瞬间止损我们不允许反转,因为这往往是市场的膝跳反射}
IFHOLDING>=0ANDTIME<143000AND开空次数=0THENBEGIN
IFC<=多头止损价THENBEGIN
多头止损2:
SELL(1,手数,MARKET);
IFTIME<=110000AND开仓历时>=4THENBEGIN
多翻空2:
BUYSHORT(1,手数,MARKET);
空头止损价:
=MIN(ENTERPRICE+0.15*10日平均波幅,ENTERPRICE+3);//多翻空止损价为开仓价加15%的10日平均波幅和3个大点的较小值。
开空次数:
=1;
END
END
END
{空头突破失败情况1:
价格曾经低于空头突破确认价,最新价又上涨至空翻多确认价}
IF今低<空头突破确认价ANDC>空翻多确认价ANDTIME<143000AND开多次数=0ANDHOLDING<=0THENBEGIN
空头止损1:
SELLSHORT(1,手数,MARKET);
空翻多1:
BUY(1,手数,MARKET);
开多次数:
=1;
END
{空头突破失败情况2:
突破入场后,行情反转。
止损的同时我们反手开多,但前提是时间在中午11:
30之前,且空头进场在至少4根K之前。
瞬间止损我们不允许反转,因为这往往是市场的膝跳反射}
IFHOLDING<0ANDTIME<143000AND开多次数=0THENBEGIN
IFC>=空头止损价THENBEGIN
空头止损2:
SELLSHORT(1,手数,MARKET);
IFTIME<=110000AND开仓历时>=4THENBEGIN
空翻多2:
BUY(1,手数,MARKET);
多头止损价:
=MIN(ENTERPRICE-0.15*10日平均波幅,ENTERPRICE-3);//多翻空止损价为开仓价加15%的10日平均波幅和3个大点的较小值。
开多次数:
=1;
END
END
END
//止损
IFHOLDING>0ANDC<多头止损价ANDTIME<151000THEN常规多头止损:
SELL(1,手数,MARKET);
IFHOLDING<0ANDC>空头止损价ANDTIME<151000THEN常规空头止损:
SELLSHORT(1,手数,MARKET);
//止损价调整
{若持多单,而5分钟K高点超过了开仓价+50%10日平均波幅,止损调整为保本型}
IF今高>ENTERPRICE+0.5*10日平均波幅THEN多头止损价:
=ENTERPRICE+2*MINDIFF;
IF今低=ENTERPRICE-2*MINDIFF;
{若时间处于14:
30以后,多头跟踪止损为过去3个5分钟的最高低点及多空头止损价中的较大值}
IFTIME>=143000THENBEGIN
多头止损价:
=MAX(多头止损价,3周期最低价);
空头止损价:
=MIN(空头止损价,3周期最高价);
END
//日内平仓
IFTIME>=151000THENBEGIN
收盘平多:
SELL(1,手数,MARKET);
收盘平空:
SELLSHORT(1,手数,MARKET);
趋卖市:
=0;
趋买市:
=0;
开多次数:
=0;
开空次数:
=0;
多头止损价:
=0;
空头止损价:
=0;
END
恒温器策略
策略简述
当CMI指标小于20时,策略处于震荡模式。
若处于趋买市:
最新价>max(开盘价+0.5*10日ART,3日平均低价),做多。
最新价>max(开盘价-0.75*10日ART,3日平均高价),做空。
若处于趋卖市:
最新价>max(开盘价-0.75*10日ART,3日最低价),做多。
最新价>max(开盘价+0.5*10日ART,3日最高价),做空。
当CMI指标大于20时,策略处于趋势模式。
趋势策略使用 布林带策略
进入趋势模式后,有震荡模式下的持仓,以开仓价+-3个10日ATR为出场条件。
策略详述
恒温器策略以其能够在震荡和趋势市场中自动调节交易行为而得名。
看到自动调节的字眼,很多人会觉得这一定是个高级、神秘的策略。
但事实恰恰相反,这是个简单的策略组合,这类策略的关键在于将不同市场状态下能成功应用的策略相结合。
市场状态转换,我们采用CMI指标(市场波皱指标)作为评判标准。
当CMI值小于20,短周期震荡模式下运用的是区间突破结合模式识别策略。
我们将系统归于震荡模式。
模式识别依靠关键价指标(关键价指的是(high+low+close)/3),如果当收盘价高于昨天的关键价,我们推测明天的市场是熊市(趋卖市),反之亦然。
但是我们需明白,我们不是神算,不可能预测明天的市场,所以我们是计划以熊市手段去操作,但仍可以做多,只不过需要走出一定的行情。
当CMI值大于20,该策略系统在趋势模式下(长周期)运用的是个类似布林通道策略(常规布林策略此处不做介绍)。
值得称道的是,该模型考虑了趋势模式下,原有震荡持仓的处理问题。
因为震荡模式的出场是以3日高低均价为准。
但是把这个标准放在趋势模式下就不合时宜了,该策略的方法是以开仓价+-3个10日ATR为出场条件(一个相对较长期的条件)。
代码
//策略:
恒温器系统
//类型:
中长期通道突破
//中间变量
input:
m(50,5,300,30),N(1.25,0.1,10,0.1),ss(1,1,100,1),k1(0.5,0.1,1,0.1),k2(0.75,0.1,1,0.1);
variable:
A:
=0;//0表示仓位是在趋势模式下下单 1表示在震荡模式下下单
MID:
MA(CLOSE,M);//布林中轨
UPPER:
MID+N*STD(CLOSE,M);//布林上轨
LOWER:
MID-N*STD(CLOSE,M);//布林下轨
今开:
=callstock(stklabel,vtopen,6,0);
CMI:
=abs(close-ref(close,29))/(hhv(high,30)-LLV(L,30))*100;//0-100 取值越大,说明趋势越强,CMI<20震荡模式,反之为趋势
关键价:
(high+low+close)/3;//关键价的计算,国外常称作中枢价格(pivotpoint)
ATR10:
=ma(tr,10);
3日均低价:
=ma(L,3);
3日均高价:
=ma(h,3);
手数:
=ss;
//交易条件
ifC<关键价 thenbegin
趋买市开多平空条件:
=C>max(今开+k1*ATR10,3日均低价);
趋买市开空平多条件:
=C
end
ifc>关键价 thenbegin
趋卖市开多平空条件:
=C>max(今开+k2*atr10,3日均低价);
趋卖市开空平多条件:
=C
end
趋势开多条件:
=c>upper;
趋势开空条件:
=c
趋势平多条件:
=c
趋势平空条件:
=c>mid;
震荡多单平仓条件:
=c<=enterprice-3*atr10;
震荡空单平仓条件:
=c>=enterprice+3*ATR10;
//交易系统
ifcmi<20thenbegin{震荡模式}
ifC<关键价 thenbegin
趋买市平空:
sellshort(趋买市开多平空条件 andholding<=0,手数,market);
趋买市平多:
sell(趋买市开空平多条件 andholding>=0,手数,market);
趋买市开多:
buy(趋买市开多平空条件 andholding<=0,手数,market);
趋买市开空:
buyshort(趋买市开空平多条件 andholding>=0,手数,market);
A:
=1;
end
ifc>关键价 thenbegin
趋卖市平空:
sellshort(趋卖市开多平空条件 andholding<=0,手数,market);
趋卖市平多:
sell(趋卖市开空平多条件 andholding>=0,手数,market);
趋卖市开多:
buy(趋卖市开多平空条件 andholding<=0,手数,market);
趋卖市开空:
buyshort(趋卖市开空平多条件 andholding>=0,手数,market);
a:
=1;
end
ENd
ifcmi>=20thenBEGIN{趋势模式}
ifa:
=1thenbegin//趋势模式下原震荡模式下仓位处理
震荡多单平仓:
sell(震荡多单平仓条件 andholding>0,手数,market);
震荡空单平仓:
sellshort(震荡空单平仓条件 andholding<0,手数,market);
a:
=0;
end
ifa:
=0thenbegin
趋势平空:
sellshort(趋势平空条件 andholding<0,手数,market);
趋势平多:
sell(趋势平多条件 andholding>0,手数,market);
趋势开多:
buy(趋势开多条件 andholding<=0,手数,market);
趋势开空:
buyshort(趋势开空条件 andholding>=0,手数,market);
A:
=0;
end
end