期货软件TB系统源代码解读系列44-基于k线建立箱体突破系统

这个箱体理论是很有名的那个,我记得以前看过一个交易大神写的《 我如何在股市赚了200万》,他运用的就是箱体理论。这个TB里写的,我看了一下,有区别,但可以说也是一种别致的算法。看它的策略,如下:

策略说明:

本策略基于k线形成的区域设置进出场价格, 通过价格的上下突破来进行交易或取消做单  

系统要素:

k线区域按时间顺序从左向右共由4根k线组成, 最左边的k线标号为3

1. 如果1号k线收盘价高于3号k线最高点, 开始设置做多交易区域, 上轨为3号K线高点, 下轨为标号为1起CancelFlagN根K线的低点

如果标号为0的K线收盘价在上下轨之间, 则做多区域设置成功, 如果收盘价低于下轨则区域设置取消

2. 如果1号k线收盘价低于3号k线最低点, 开始设置做空交易区域, 下轨为3号K线低点, 上轨为标号为1起CancelFlagN根K线的高点

如果标号为0的K线收盘价在上下轨之间, 则做空区域设置成功, 如果收盘价高于上轨则区域设置取消

入场条件:

1. 做多区域设置成功时, 当前k线高于标号为0的K线高点时入场做多

2. 做空区域设置成功时, 当前k线低于标号为0的K线低点时入场做空

出场条件: 

1. 基于ATR的保护性止损

2. 基于ATR的盈亏平衡止损

3. 基于ATR的盈利止盈

看着这策略说明,想象力好的,凭空想像应该都知道这图像大概是什么样的,要是跟我一样想象力一般的,就对着TB图表,一个个看了,很容易理解的。接下来就直接看它做多的代码及解读了:

Params

  Numeric ATRLength(10); //声明数值参数ATRLength,初值10,即ATR的周期参数值。//

Numeric CancelFlagN(5); //声明数值参数CancelFlagN,初值5,用于计算取消区域成功设置标志的上下轨的N值。//

Numeric ProtectStopATRMulti(0.5); //声明数值参数PritectStopATRMulti,初值0.5,用于保护性止损的ATR系数。//

Numeric BreakEvenStopATRMulti(3); //声明数值参数BreakEvenStopATRMulti,初值3,用于盈亏平衡止损的ATR系数。//

Numeric ProfitTargetATRMulti(5); //声明数值参数ProfitTargetATRMulti,初值5,用于盈利止盈的ATR系数。//

Vars

NumericSeries ATR(0); //声明数值序列变量ATR,初值0.//

NumericSeries UpLine(0); //声明数值序列变量UpLine,初值0,即区域设置上轨。//

NumericSeries DownLine(0); //声明数值序列变量DownLine,初值0,区域设置下轨。//

NumericSeries DownLineTemp;//声明数值序列变量DownLineTemp。//

NumericSeries HighAfterEntry; //声明数值序列变量HighAfterEntry,即持仓后的高点记录。//

NumericSeries EntryPriceL(0); //声明数值序列变量EntryPriceL,初值0,即开仓价格线。//

BoolSeries EntryFlag(False); //声明布尔型序列变量EntryFlag,初值假,即入场标志。//

NumericSeries ProtectStopL; //声明数值序列变量ProtectStopL,即基于ATR的保护性止损。//

NumericSeries ProfitTargetStopL; //声明数值序列变量ProfitTargetStopL,即基于ATR的盈利止盈。//

Numeric BreakEvenStopL; //声明数值变量BreakEvenStopL,即基于ATR的盈亏平衡止损。//

Numeric ExitLineL; //声明数值变量ExitLineL,即平仓价格线。//

NumericSeries MP; //声明数值序列变量MP,即MarketPosition的状态记录。//

Begin

If(!CallAuctionFilter()) Return;// 集合竞价和小节休息过滤。//

//系统设置。//

ATR = AvgTrueRange(ATRLength);//抛物线的公式求法了,都写过四五次了。//

DownLineTemp = LowestFC(Low,CancelFlagN);//利用快速求最低函数LowestFC,把收盘价与周期5返回求值,即可算得变量DownLineTemp值了。//

//接下来的就是算法的具体体现了,1、k线区域按时间顺序从左向右共由4根k线组成, 最左边的k线标号为3, 当前K线标号为0;

2、如果1号k线收盘价高于3号k线最高点, 开始设置做多交易区域, 上轨为3号K线高点, 下轨为从标号为1起CancelFlagN根K线的低点;

3、如果标号为0的K线收盘价在上下轨之间, 则做多区域设置成功, 做多触发价为标号为0的K线高点, 如果之后k线收盘价低于下轨则区域设置取消。//

if(MarketPosition <> 1)//假如当前没有持多仓。//

{

If(EntryFlag[1] == False)//假如前一进场标志EntryFlag[1]为假的时候。//

{

If(Close[1] >= High[3])//假如前一k线收盘价Close[1] >=前三k线的高价High[3]。//

{

UpLine = High[3];//则变量UpLine = 前三k线的高价High[3]。//

DownLine = DownLineTemp[1];//变量DownLine = 前一个变量DownLineTemp[1]值。//

if(C[0]<=UpLine and C[0] >=DownLine) //再假如当前收盘价C[0] <=上轨UpLine,并且当前C[0] >=下轨DownLine。//

{

EntryFlag = True;//则布尔型变量EntryFlag为真。//

EntryPriceL = High[0];//进场线EntryPriceL = 当前k线的高价。//

}

}

}

Else If(EntryFlag[1] == True)//假如前一个进场标志EntryFlag[1]为真。//

{

if(C[0] < DownLine) EntryFlag = False;//假如当前k线收盘低于DownLine, 则做多区域设置取消。//

}

}

PlotNumeric("UpLine",UpLine);//画线上轨。//

PlotNumeric("DownLine",DownLine);//画线下轨。//

PlotNumeric("EntryPriceL",EntryPriceL);//画线进场价。//

//系统入场,做多区域设置成功时, 当前k线高于标号为0的K线高点时入场做多。//

If(MarketPosition <> 1 and CurrentBar >= ATRLength)//假如当前没有持多单,并且当前公式应用商品在当前Bar的索引值 >= 10.//

{

If(EntryFlag[1] == True and High >= EntryPriceL[1] And Vol > 0)//假如前一进场标志为真,并且当前高价High >=前一进场价EntryPriceL[1],并且成交量大于0.//

{

Buy(0,Max(Open,EntryPriceL[1]));//开仓买入。//

EntryFlag = False;//买入后,进场标志赋值为假。//

ProtectStopL = Low[1] - ProtectStopATRMulti * ATR[1];//基于ATR的保护性止损具体算法,代入相应数值就行了。//

ProfitTargetStopL = High[1] + ProfitTargetATRMulti * ATR[1];//基于ATR的盈利止盈,同理的,代入相应数值。//

}

}

//系统出场。//

If(BarsSinceEntry == 0)//建仓位置为0.//

HighAfterEntry = High;//最高价记录为建仓位置k线的高价。//

Else

HighAfterEntry = Max(HighAfterEntry[1],High);//就是建仓位置不是0的时候。//

BreakEvenStopL = LastEntryPrice;//基于ATR的盈亏平衡止损,即BreakEvenStopL = 当前持仓的最后一个建仓价格LastEntryPrice值。//

If(MarketPosition == 1 and mp[1] == 1 And Vol > 0)//假如当前持有多单,并且前一个变量mp[1] == 1,并且成交量大于0.//

{

If(HighAfterEntry[1] >= BreakEvenStopL + BreakEvenStopATRMulti * ATR[1])//出场线选择条件,都是代入相应数值计算后比较了。//

{

ExitLineL = BreakEvenStopL;//平仓价格ExitLineL = 平衡止损BreakEvenStopL。//

}

Else//出场线选择条件不成立的。//

{

ExitLineL = ProtectStopL[1];//平仓价格ExitLineL = 前一个保护性止损ProtectStopL[1]。//

}

//出场规则。//

if(Open >= ProfitTargetStopL[1])//假如当前开盘价Open >= 前一个盈利止盈ProfitTargetStopL[1]。//

{

Sell(0,Open);//开盘价平仓卖出。//

}

//基于ATR的保护性止损或盈亏平衡止损。//

Else if(L <= ExitLineL)//假如当前最低价L <= 平仓价ExitLineL。//

{

Sell(0,Min(Open, ExitLineL));//平仓卖出了,价格就是取两者比较的小值。//

}

}

MP = MarketPosition;//记录MarketPosition的状态,赋值给MP。//

End

设置了这么多保护性的条件,但收益一般,当然,有可能是基于ATR指标做的保护条件一般,要是不喜欢,可以自己改成习惯而且熟悉的指标就行。看着这画图,虽然我没有测试过,但可以大胆预测,把这开仓条件与固定止损止盈合在一起,结果都比这个好,不信的自己试试了。

下面是做空的代码及结果了:

Params

  Numeric ATRLength(10);

Numeric CancelFlagN(5);

Numeric ProtectStopATRMulti(0.5);

Numeric BreakEvenStopATRMulti(3);

Numeric ProfitTargetATRMulti(5);

Vars

NumericSeries ATR(0);

NumericSeries UpLine(0);

NumericSeries DownLine(0);

NumericSeries UpLineTemp;

NumericSeries LowAfterEntry;

NumericSeries EntryPriceS(0);

BoolSeries EntryFlag(False);

NumericSeries ProtectStopS;

NumericSeries ProfitTargetStopS;

Numeric BreakEvenStopS;

Numeric ExitLineS;

NumericSeries MP;

Begin

If(!CallAuctionFilter()) Return;

ATR = AvgTrueRange(ATRLength);

UpLineTemp = HighestFC(High,CancelFlagN);

if(MarketPosition <> -1)

{

If(EntryFlag[1] == False)

{

If(Close[1] <= Low[3])

{

UpLine = UpLineTemp[1];

DownLine = Low[3];

if(C[0]<=UpLine and C[0] >=DownLine) 

{

EntryFlag = True;

EntryPriceS = Low[0];

}

}

}

Else If(EntryFlag[1] == True)

{

if(C[0] > UpLine) EntryFlag = False;

}

}

PlotNumeric("UpLine",UpLine);

PlotNumeric("DownLine",DownLine);

PlotNumeric("EntryPriceS",EntryPriceS);

If(MarketPosition <> -1 and CurrentBar >= ATRLength)

{

If(EntryFlag[1] == True and Low <= EntryPriceS[1] And Vol > 0)

{

SellShort(0,Min(Open,EntryPriceS[1]));

EntryFlag = False;

ProtectStopS = High[1] + ProtectStopATRMulti * ATR[1];

ProfitTargetStopS = Low[1] - ProfitTargetATRMulti * ATR[1];

}

}

If(BarsSinceEntry == 0)

LowAfterEntry = Low;

Else

LowAfterEntry = Min(LowAfterEntry[1],Low);

BreakEvenStopS = LastEntryPrice;

If(MarketPosition == -1 and mp[1] == -1 And Vol > 0)

{

If(LowAfterEntry[1] <= BreakEvenStopS - BreakEvenStopATRMulti * ATR[1])

{

ExitLineS = BreakEvenStopS;

}

Else

{

ExitLineS = ProtectStopS[1];

}

if(Open <= ProfitTargetStopS[1])

{

BuyToCover(0,Open);

}

Else if(H >= ExitLineS)

{

BuyToCover(0,Max(Open, ExitLineS));

}

}

MP = MarketPosition;

End

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,635评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,543评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,083评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,640评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,640评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,262评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,833评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,736评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,280评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,369评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,503评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,870评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,340评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,460评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,909评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,512评论 2 359

推荐阅读更多精彩内容