期货软件TB系统源代码解读系列73-恒温器系统

策略说明:

通过计算市场的潮汐指数,把市场划分为震荡和趋势两种走势;震荡市中

采用开盘区间突破进场;趋势市中采用布林通道突破进场。

系统要素:

1、潮汐指数

2、关键价格

3、布林通道

4、真实波幅

5、出场均线

入场条件:

1、震荡市中采用开盘区间突破进场

2、趋势市中采用布林通道突破进场

出场条件:

1、震荡市时进场单的出场为反手信号和ATR保护性止损

2、趋势市时进场单的出场为反手信号和均线出场

做多代码及解读如下:

Params

Numeric swingTrendSwitch(20); // 声明数值参数swingTrendSwitch,初值20,即潮汐指数小于此值为震荡市,否则为趋势市。//

Numeric swingPrcnt1(0.50); // 声明数值参数swingPrcnt1,初值0.5,即震荡市开仓参数。//

Numeric swingPrcnt2(0.75); // 声明数值参数swingPrcnt2,初值0.75,即震荡市开仓参数。//

Numeric atrLength(10); //声明数值参数atrLength,初值10,即真实波幅参数。//

Numeric bollingerLengths(50); // 声明数值参数bollingerLengths,初值50,即布林通道参数。//

Numeric numStdDevs(2); //声明数值参数numStdDevs,即布林通道参数。//

Numeric trendLiqLength(50); // 声明数值参数trendLiqLength,初值50,趋势市时进场单的出场均线参数。//

Numeric Lots(0); // 声明数值参数Lots,初值0,即交易手数。//

Vars

NumericSeries cmiVal(0); //声明数值序列变量cmiVal,初值0,即潮汐指数。//

BoolSeries buyEasierDay(False); // 声明布尔型序列变量buyEasierDay,初值为假,宜买市。//

BoolSeries sellEasierDay(False); //声明布尔型序列变量sellEasierDay,初值为假, 宜卖市。//

NumericSeries myATR(0); // 声明数值序列变量myATR,初值为0,即真实波幅。//

NumericSeries MidLine(0); // 声明数值序列变量MidLine,初值0,即布林通道中轨。//

Numeric Band(0); //声明数值变量Band,初值0.//

NumericSeries upBand(0); // 声明数值序列变量upBand,初值0,即布林通道上轨。//

NumericSeries dnBand(0); //声明数值序列变量dnBand,初值0, 布林通道下轨。//

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

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

NumericSeries keyOfDay(0); // 声明数值序列变量keyOfDay,初值0,即关键价格。//

NumericSeries swingBuyPt(0); //声明数值序列变量swingBuypt,初值0,即 震荡市的买触发价格。//

NumericSeries swingSellPt(0); // 声明数值序列变量swingSellpt,初值0,震荡市的卖触发价格//

NumericSeries trendBuyPt(0); //声明数值序列变量trendBuypt,初值0,即 趋势市的买触发价格。//

NumericSeries trendSellPt(0); // 声明数值序列变量trendSellpt,初值0,即趋势市的卖触发价格。//

NumericSeries swingProtStop(0); //声明数值序列变量swingProtStop,初值0, 震荡市时进场单的出场触发价格//

NumericSeries trendProtStop(0); // 声明数值序列变量trendProtStop,初值0,即趋势市时进场单的出场触发价格。//

BoolSeries swingEntry(False); //声明布尔型序列变量swingEntry,初值为假,即 震荡市时进场标识。//

Begin

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

// 计算潮汐指数用以区分震荡市与趋势市。//

cmiVal = Abs(Close - Close[29])/(Highest(High,30) - Lowest(Low,30))*100; //照顺序来看吧,第一个绝对值函数Abs,即当前收盘价减去前第29个收盘价,取绝对值;再看求最高价函数Highest,即求30周期的最高价;同理,最低函数Lowest,求30周期的最低价。最后代入公式求解,即得cmiVal值。//

trendLokBuy = Average(Low,3);//求3周期内最低价均值。//

trendLokSell= Average(High,3);//求3周期内最高价均值。//

// 关键价格。//

keyOfDay = (High + Low + Close)/3;  //其实就是3个价格的平均值。//

// 震荡市中收盘价大于关键价格为宜卖市,否则为宜买市。//

buyEasierDay = False;//赋值为假。//

sellEasierDay = False;//赋值为假。//

If(Close[1] > keyOfDay[1]) sellEasierDay = True;//假如前一个收盘价大于前一个关键价,则变量sellEasierDay赋值为真。//

If(Close[1] <= keyOfDay[1]) buyEasierDay = True;//假如前一个收盘价小于等于前一个关键价,则变量buyEasierDay赋值为真。//

// 计算震荡市的进场价格//

myATR = AvgTrueRange(atrLength);//求10周期的真实波动值。//

If(buyEasierDay == True)//假如变量buyEasierDay等于真的。//

{

swingBuyPt = Open + swingPrcnt1*myATR[1];//代入相应数值即可。//

swingSellPt = Open - swingPrcnt2*myATR[1];//同理,代入相应数值。//

}

If(sellEasierDay == True)//假如变量sellEasierDay等于真。//

{

swingBuyPt = Open + swingPrcnt2*myATR[1];//代入相应数值了。//

swingSellPt = Open - swingPrcnt1*myATR[1];//同理的,其实主要看的就是系数。//

}

swingBuyPt = Max(swingBuyPt,trendLokBuy[1]);//比较变量swingBuyPt与前一个变量trendLokBuy值,取较大值。//

swingSellPt = Min(swingSellPt,trendLokSell[1]); //比较swingSellPt值与前一个trendLokSell值,取较小值。//

// 计算趋势市的进场价格,即布林带系统。//

MidLine = AverageFC(Close,bollingerLengths); //50周期的收盘价均值。//

Band = StandardDev(Close,bollingerLengths,2); //标准差求值,可返回之前解读的布林线看具体函数代码。//

upBand = MidLine + numStdDevs*Band;//上轨道计算公式。//

dnBand = MidLine - numStdDevs*Band; //下轨道计算公式。//

trendBuyPt = upBand;//把上轨道赋值给变量trendBuyPt值。//

trendSellPt = dnBand;//把下轨道赋值给变量trendSellPt值。//

// 震荡市。//

If(cmiVal[1] < swingTrendSwitch) //假如前一个变量cmiVal值小于变量swingTrendSwitch值。//

{

If(MarketPosition != 1 And High >= swingBuyPt) //假如当前没有持多单,且最高价大于等于变量swingBuyPt值。//

{

Buy(Lots,Max(Open,swingBuyPt));//开仓买入。//

swingEntry = True;//变量swingEntry赋值为真。//

}

If(MarketPosition == 1 And BarsSinceEntry >= 1 And Low <= swingSellPt) //假如当前持有多单,且建仓数位大于等于1,且最低价小于等于变量swingSellPt值。//

{

Sell(0,Min(Open,swingSellPt));//平仓。//

swingEntry = False;//变量sweingEntry赋值为假。//

}

}

swingProtStop = 3*myATR;//止损价swingProtStop = 3 *变量myATR值。//

trendProtStop = Average(Close,trendLiqLength); //50周期收盘价均值。//

  // 趋势市判断。//

If(cmiVal[1] >= swingTrendSwitch) //假如前一cmiVal值大于等于变量swingTrendSwitch值。//

{

// 震荡市时进场单在趋势市的出场。//

If(swingEntry == True) //假如变量swingEntry等于真。//

{

If(MarketPosition == 1 And BarsSinceEntry >= 1 And Low <= (EntryPrice - swingProtStop[1])) //假如当前持有多单,且建仓数位大于等于1,且最低价小于等于进场价减去前一止损价。//

{

Sell(0,Min(Open,EntryPrice - swingProtStop[1])); //平仓。//

swingEntry = False;//变量swingEntry赋值为假。//

}

}

  // 趋势市时进出场 。//

If(swingEntry == False) //假如变量swingEntry等于假。//

{

If(MarketPosition != 1 And BarsSinceExit >= 1 And High >= trendBuyPt[1]) //假如当前没有持仓,且出场数位大于等于1,且最高价大于等于前一变量trendBuyPt值。//

{

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

}

If(MarketPosition == 1 And BarsSinceEntry >= 1 And Low <= Max(trendSellPt[1],trendProtStop[1])) //假如持有多单,且建仓数位大于等于1,且最低价小于等于两出场价中的较大值。//

{

Sell(0,Min(Open,Max(trendSellPt[1],trendProtStop[1])));//平仓,这里先看比较max值,再比较min值,最后以较小价为平仓价。//

}

}

}

End

做空代码及结果如下:

Params

Numeric swingTrendSwitch(20);

Numeric swingPrcnt1(0.50);

Numeric swingPrcnt2(0.75);

Numeric atrLength(10);

Numeric bollingerLengths(50);

Numeric numStdDevs(2);

Numeric trendLiqLength(50);

Numeric Lots(0);

Vars

NumericSeries cmiVal(0);

BoolSeries buyEasierDay(False);

BoolSeries sellEasierDay(False);

NumericSeries myATR(0);

NumericSeries MidLine(0);

Numeric Band(0);

NumericSeries upBand(0);

NumericSeries dnBand(0);

NumericSeries trendLokBuy(0);

NumericSeries trendLokSell(0);

NumericSeries keyOfDay(0);

NumericSeries swingBuyPt(0);

NumericSeries swingSellPt(0);

NumericSeries trendBuyPt(0);

NumericSeries trendSellPt(0);

NumericSeries swingProtStop(0);

NumericSeries trendProtStop(0);

BoolSeries swingEntry(False);

Begin

If(!CallAuctionFilter()) Return;

cmiVal = Abs(Close - Close[29])/(Highest(High,30) - Lowest(Low,30))*100;

trendLokBuy = Average(Low,3);

trendLokSell= Average(High,3);

keyOfDay = (High + Low + Close)/3;

buyEasierDay = False;

sellEasierDay = False;

If(Close[1] > keyOfDay[1]) sellEasierDay = True;

If(Close[1] <= keyOfDay[1]) buyEasierDay = True;

myATR = AvgTrueRange(atrLength);

If(buyEasierDay == True)

{

swingBuyPt = Open + swingPrcnt1*myATR[1];

swingSellPt = Open - swingPrcnt2*myATR[1];

}

If(sellEasierDay == True)

{

swingBuyPt = Open + swingPrcnt2*myATR[1];

swingSellPt = Open - swingPrcnt1*myATR[1];

}

swingBuyPt = Max(swingBuyPt,trendLokBuy[1]);

swingSellPt = Min(swingSellPt,trendLokSell[1]);

MidLine = AverageFC(Close,bollingerLengths);

Band = StandardDev(Close,bollingerLengths,2); 

upBand = MidLine + numStdDevs*Band;

dnBand = MidLine - numStdDevs*Band; 

trendBuyPt = upBand;

trendSellPt = dnBand;

If(cmiVal[1] < swingTrendSwitch)

{

If(MarketPosition != -1 And Low <= swingSellPt)

{

SellShort(Lots,Min(Open,swingSellPt));

swingEntry = True;

}

If(MarketPosition == -1 And BarsSinceEntry >= 1 And High >= swingBuyPt)

{

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

swingEntry = False;

}

}

swingProtStop = 3*myATR;

trendProtStop = Average(Close,trendLiqLength);

If(cmiVal[1] >= swingTrendSwitch)

{

If(swingEntry == True)

{

If(MarketPosition == -1 And BarsSinceEntry >= 1 And High >= (EntryPrice + swingProtStop[1]))

{

BuyToCover(0,Max(Open,EntryPrice + swingProtStop[1]));

swingEntry = False;

}

}

If(swingEntry == False)

{

If(MarketPosition != -1 And BarsSinceExit >= 1 And Low <= trendSellPt[1])

{

SellShort(Lots,Min(Open,trendSellPt[1]));

}

If(MarketPosition == -1 And BarsSinceEntry >= 1 And High >= Min(trendBuyPt[1],trendProtStop[1]))

{

BuyToCover(0,Max(Open,Min(trendBuyPt[1],trendProtStop[1])));

}

}

}

End

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

推荐阅读更多精彩内容