日内交易模型的形成+代码
看了很多人写的模型,也看了很多人发的模型,在此给予一个总结,在我看来,大多数人研究的是日内模型,对股指研究的偏多,由此我把日内模型的框架总结一下,并将一些容易用到的代码发表出来1.日内我建议就是做突破,别把一些没用的弄进去,过多的是给这个程序带来负面的影响,看了很多发策略的,把日内分成趋势和震荡,而且对这两个下了定义,就像恒温器一样,但不能用于实盘交易
2.日内别用技术指标来做进出场,技术指标我建议就是辅助,举个简单的例子,很多人喜欢MACD,RSI,KDJ,均线,但用他们来写进出场,你们盈利了吗?很多人都认为背离很好,超卖超买很实用,说实话,在中国这个不成熟的期货的市场,你用的指标天天都在背离,结果相信也亏损了不少,本人在国外发现外国人用的最多的就是突破,就那么简单
3,编程的要求,如果想做程序化,我建议真的要好好学学编程,原因就是很多人有好的策略,但对编程不是很了解,结果做出的策略和实际相差很远
以上是都是废话,来实际的吧!
我拿举例来说明日内框架的形成,也拿突破,就拿短线狙击手里面的突破举例乔治。安杰尔提到日内的几个阻力点,在此把他们给发出来,做多突破
做多。上涨值,买进高值,今天的高点,轴点突破值,做空相反
代码
mtHi = High;
mtLo = Low;
mtCl = Close;
//上涨值:=(REF(H,1)-REF(L,2)+REF(H,2)-REF(L,3)+REF(H,3)-REF(L,4))/3+REF(L,1);
UpperValue = (mtHi-mtLo+mtHi-mtLo+mtHi-mtLo)/3+mtLo;
//下跌值:=REF(H,1)-(REF(H,2)-REF(L,1)+REF(H,3)-REF(L,2)+REF(H,4)-REF(L,3))/3;
DownValue = mtHi-(mtHi-mtLo+mtHi-mtLo+mtHi-mtLo)/3;
//买进高值:=(REF(H,1)-REF(H,4))/3+REF(H,1);
BuyHiValue = (mtHi-mtHi)/3+mtHi;
//买进低值:=REF(L,1)-(REF(L,4)-REF(L,1))/3;
SellLoValue = mtLo-(mtLo-mtLo)/3;
//昨日高点:=REF(H,1);
TodayHi = mtHi;
//昨日低点:=REF(L,1);
Todaylo = mtLo;
//轴点突破买进值:=(REF(H,1)+REF(L,1)+REF(C,1))*2/3-REF(L,1);
BreakBuyValue = (mtHi+mtLo+mtCl)*2/3-mtLo;
//轴点突破卖出值:=(REF(H,1)+REF(L,1)+REF(C,1))*2/3-REF(H,1);
BreakSellValue = (mtHi+mtLo+mtCl)*2/3-mtHi;
//平均买值:=(上涨值+买进高值+今日高点+轴点突破买进值)/4;
AvgBuyValue = (UpperValue+BuyHiValue+TodayHi+BreakBuyValue)/4;
//平均卖值:=(下跌值+买进低值+昨日低点+轴点突破卖出值)/4;
AvgSellValue = (DownValue+SellLoValue+Todaylo+BreakSellValue)/4;
//上突破a:MAX(上涨值,买进高值,今日高点,轴点突破买进值,平均买值);
UpperBreak = IntPart(Max(UpperValue,Max(BuyHiValue,Max(TodayHi,Max(BreakBuyValue,AvgBuyValue))))/MinPoint)*MinPoint;
//下突破d:MIN(下跌值,买进低值,昨日低点,轴点突破卖出值,平均卖值);
DownBreak = IntPart(Min(DownValue,Min(SellLoValue,Min(Todaylo,Min(BreakSellValue,AvgSellValue))))/MinPoint)*MinPoint;
//止损上位b:MIN(上涨值,买进高值,今日高点,轴点突破买进值,平均买值);
UpperStop = IntPart(Min(UpperValue,Min(BuyHiValue,Min(TodayHi,Min(BreakBuyValue,AvgBuyValue))))/MinPoint)*MinPoint;
//止损下位c:MAX(下跌值,买进低值,昨日低点,轴点突破卖出值,平均卖值);
DownStop = IntPart(Max(DownValue,Max(SellLoValue,Max(Todaylo,Max(BreakSellValue,AvgSellValue))))/MinPoint)*MinPoint;
BuyPoint =DownStop+UpperBreak-DownBreak;//买点
PlotNumeric("BuyPoint",BuyPoint);
SellPoint =UpperStop-(UpperBreak-DownBreak);//卖点
以上就算出来一个买点和卖点,我们就可以按照这两个点进场,声明以上都是举例,原因我相信就算发出完整代码对你们也没有好处,策略一定要自己写出来
还是进入正题,以上有了两个点买点和卖点,那么就要对开仓的指令选择图标信息一般是BUY这些指令,便于我们测试,对于以上还是要严格的说一下,有很多人将这些没分清,并将A函数混合进来结果单日内就满仓,
marketposition 对应图标信号,BUY,SELL,SELLSHORT,BUYTOCOVER
a_sendorder对应a_totalposition,a_buyposition,a_sellposition,所以要将上面的分开,不然就是很多人说的不停的发单,这里给大家提醒一下。
继续正题,开仓过后我们要做什么,我们想要的是对信号的确认,这里就可以用刚刚说的那些技术指标,是我一般不会用同周期,拿均线来说,我愿意拿大周期来过滤,这里可以采用数据切分,数据库一些方法,TB的数据库使用太过繁琐,我建议大家就使用数据切分吧!
做任何一个策略都是希望拿到趋势,什么低买高卖的我没看见几个真正赚到钱的,更别说当日冲销的,我敢肯定他在欺骗你
过滤盘整的一些方法,1.大周期过滤,
2。高低点过滤,比如高点 m, 低点,N那么我们可以用(m-(m+n)/2)(m+n)/2,对做多下个定义,让这个值小于某个值,以免太多信号
3.价格过滤,我可以要求今天的开盘价大于N个周期的收盘价,或者昨日的收盘价大于前N个周期的收盘价,我在此要求上做多
4,区间过滤,很多时候,日内今日涨幅过大,第2天的波动就很小,那么可以对区间下一个定义,不然今天不做交易,那么我们可以把这个概念定义小一点,定义到单根K线上,当N根K线都小于这个值时,我们应该进场,而不是观望,原因是盘整过后就是大趋势
Params
Numeric MinRange(0.2);
Vars
NumericSeries DayOpen;
Numeric preDayHigh;
Numeric preDayLow;
NumericSeries preDayRange;
Begin
preDayHigh = HighD(1);
preDayLow = LowD(1);
If(Date!=Date)
{
DayOpen = Open;
preDayRange = preDayHigh - preDayLow;
If(preDayRange < Open*MinRange*0.01)
preDayRange = Open*MinRange*0.01;
}Else
{
DayOpen = DayOpen;
preDayRange = preDayRange;
}
这里就发一个别人写的简单区间,那么N根K线,这里自己定义序列变量,然后达到几根K线过后,我们就进场
以上4中是举例,还有很多,不依依介绍
上面说完,我认为要对单根K线的处理,一根K线不能连续的出现信号,在我理念里面一根K线就一个信号最好,包括反手我都不建议,只会让你滑点变大,当然你真的想反手,我建议延迟几个TICK比较好,TB交易指南里面有例子,如果不是这样,我们在平仓的时候加入 if(MarketPosition == 1 and BarsSinceEntry>=1){}
由于是突破,对再进场是必要的,这样才能拿到大趋势
Params
参数
Vars
BoolSeries bLongTrailingStoped(False);
BoolSeries bShortTrailingStoped(False);
NumericSeries HigherAfterEntry;
NumericSeries LowerAfterEntry;
Numeric myEntryPrice;
Numeric myExitPrice;
Begin
If(做多条件 and bLongTrailingStoped==False and MarketPosition ==0)
{
做多点
BUY(0,myEntryPrice)
bShortTrailingStoped = False;
}
If(做空条件 and bShortTrailingStoped == False and MarketPosition ==0)
{
做空点
SellShort(1,myEntryPrice);
bLongTrailingStoped=False;
}
if(MarketPosition == 1 and BarsSinceEntry>=1)
{
做多平仓点
Sell(0,myExitPrice);
bLongTrailingStoped=True;
}
}
if(MarketPosition == -1 and BarsSinceEntry>=1)
{
做空平仓点
BuyToCover(0,myExitPrice);
bShortTrailingStoped=True;
}
}
//再进场
If(BarsSinceEntry == 1)
{
HigherAfterEntry = EntryPrice;
LowerAfterEntry = HigherAfterEntry;
}Else If(BarsSinceEntry > 1)
{
HigherAfterEntry = Max(HigherAfterEntry,High);
LowerAfterEntry = Min(LowerAfterEntry,Low);
}
Commentary("HigherAfterEntry="+Text(HigherAfterEntry));
Commentary("LowerAfterEntry="+Text(LowerAfterEntry));
If(BarStatus > 0)
{
bLongTrailingStoped = bLongTrailingStoped;
bShortTrailingStoped = bShortTrailingStoped;
}
Commentary("bLongTrailingStoped="+IIFString(bLongTrailingStoped,"True","False"));
Commentary("bShortTrailingStoped="+IIFString(bShortTrailingStoped,"True","False"));
If(bLongTrailingStoped == True && MarketPosition==0 && High > HigherAfterEntry)
{
再次做多点,前高
Buy(1,myEntryPrice);
bLongTrailingStoped = False;
}
If(bShortTrailingStoped == True && MarketPosition==0 && Low < LowerAfterEntry)
{
再次做空点,前低
SellShort(1,myEntryPrice);
bShortTrailingStoped= False;
}
}
End
还有其他的下次再说,本人也没学TB多久,不好的希望大家提意见 由于是日内,可能出现开盘就要进场的原因,我们希望刚开盘时,不要被拒
begin
if(barstaus==2 && time==0.0900 &¤ttime<0.090005)return;
if(barstaus==2 && currenttime<0.090005)return;
这是早上,上面的时间是商品,股指把上面那个开盘的时间修改一下,
begin
if(barstaus ==2 && currenttime>=0.132955 && currenttime<0.133005)return;
这是下午,再次对上面两个时间函数说一下,
time,是指交易的时间,即当前的时间,currenttime是电脑操作系统的时间,如果搞混了,是会出问题的,如果你的电脑比交易所的时间慢,会导致你的交易部成功,所以还是小心
有人可能喜欢使用集合竞价,用此方法过滤,大家可以去看看指南里面的,里面有两种写法
以上有了进场,和再进场,我们对细节要求一下,这最主要是防止回测更准一点拿海龟举例, If(High > DonchianHi && TurtleUnits >= 1)
{
// 开仓价格取突破上轨+一个价位和最高价之间的较小值,这样能更接近真实情况,并能尽量保证成交
myEntryPrice = min(high,DonchianHi + MinPoint);
myEntryPrice = IIF(myEntryPrice < Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替
preEntryPrice = myEntryPrice;
Buy(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
PreBreakoutFailure = False;
}
我们看看这一句min(high,DonchianHi + MinPoint);,如果某根K线的最高点是1000,我们的突破点是900,那么加上两个滑点902<1000,这时候没问题,原因取最小的,那如果最高点是901,突破还是900,那么我们取的是901,而不是902,所以这里对回测不是很准,有人说用下根K线的开盘价,同理,开盘价一样可能比我们的突破价小,同样不是很准确,那如果该成max(high,DonchianHi + MinPoint);我们取最大的价,假如我们的突破价还是900,最高价901,滑点两个902,取902,那么这笔我们就交易不会成功,但是如果最高点是910,这同理取最大价,回测的价格就是以910这个价格,滑点就是10个而不是两个,原因是历史的高低点是不变的,就算用了开盘价也不一定准,真实交易部会刚好就那个价位交易,回测的时候我们就用高手续费来代替滑点,比如股指我们可以调成5%%,其他的依次类推,如果还是有不错的效果,策略就差不多
这是海龟的买进, 有了进场,对出场是很难的,TB指南里面有固定止损和跟踪止损,止盈,按照一般的止损,可以使用初始止损,这里就是固定的,即开盘后就下止损单,然后超过保本就采用保本止损,最后采用跟踪止损止盈,但我没用这种方法,我的原则只有止损,没有止盈,只有这样才能让利润最大化,简单的就是百分比,确定一个区间,让后让其自动止损,当然这比较简单,我们可以用通道平均线,或者形态止损,我采用了一个出击日形态,然后用到了8日成交量放大,并且要求这根K线的区间值是前8根K线的1.8倍我出场 贺天 发表于 2013-8-4 20:43 static/image/common/back.gif
有了进场,对出场是很难的,TB指南里面有固定止损和跟踪止损,止盈,按照一般的止损,可以使用初始止损,这 ...
TB公式中,本段出场源码怎么样编写?请楼主多多指教,谢谢 //买进高值:=(REF(H,1)-REF(H,4))/3+REF(H,1);
BuyHiValue = (mtHi-mtHi)/3+mtHi;
//买进低值:=REF(L,1)-(REF(L,4)-REF(L,1))/3;
SellLoValue = mtLo-(mtLo-mtLo)/3;
楼主,这段没看懂 不好意思,我编程的同时在编文华财经和金字塔,所以代码看起来有点乱了 //买进高值:=(REF(H,1)-REF(H,4))/3+REF(H,1);
BuyHiValue = (mtHi-mtHi)/3+mtHi;
//买进低值:=REF(L,1)-(REF(L,4)-REF(L,1))/3;
SellLoValue = mtLo-(mtLo-mtLo)/3;
//后面是文华财经的 天崖 发表于 2013-8-4 21:15 static/image/common/back.gif
TB公式中,本段出场源码怎么样编写?请楼主多多指教,谢谢
代码下周星期6继续讲,明天开盘了 wolaifa 发表于 2013-8-4 21:36 static/image/common/back.gif
//买进高值:=(REF(H,1)-REF(H,4))/3+REF(H,1);
BuyHiValue = (mtHi-mtHi)/3+mtHi;
//买进低值:=RE ...
上面//后面是文华财经的