期货软件TB系统源代码解读系列62-基于收盘价与之前k线高低打分

策略说明:

本策略基于当前收盘价与之前k线的高低进行打分, 并通过打分的均值与对应的收盘价均值进行交易

系统要素:

1. 当当前收盘价格大于之前LookBack根K线内某一根k线的收盘价时记+1分, 否则记-1分, 加总这些分数以获得当前K线的得分

2. 对k线的打分计算一条均线

3. 对k线的收盘计算一条均线

入场条件:

1. 当价格高于收盘价均线, 且打分也高于打分均线时的入场做多

2. 当价格低于收盘价均线, 且打分也低于打分均线时的入场做空

出场条件: 

1. 基于ATR的保护性止损

2. 基于ATR的跟踪止损

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

做多的源代码及解读如下:

Params

  Numeric LookBack(10); //声明数值参数LookBack,初值10,用于给当前K线打分的回溯根数。//

  Numeric MALength(18); //声明数值参数MALength,初值18,均线值。//

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

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

Numeric TrailStopATRMulti(3); //声明数值参数TrailStopATRMulti,初值3,跟踪止损的ATR乘数。//

Numeric BreakEvenStopATRMulti(5); //声明数值参数BreakEvenStopATRMulti,初值5,盈亏平衡止损的ATR乘数。//

Vars

NumericSeries MA(0); //声明数值序列变量MA,初值0,收盘价均线。//

NumericSeries TrendScore(0); //声明数值序列变量TrendScore,初值0,当前K线的打分。//

NumericSeries TrendScoreMA(0); //声明数值序列变量TrendScoreMA,初值0,k线打分的均线。//

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

Numeric i; //声明数值变量i。//

Numeric Temp;//声明数值变量Temp。//

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

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

Numeric TrailStopL; //声明数值变量TrailStopL,基于ATR的跟踪止损。//

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

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

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

Begin

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

//系统设置,K线打分 - 当当前收盘价格大于之前LookBack根K线内某一根k线的收盘价时记+1分, 否则记-1分, 加总这些分数以获得当前K线的得分。//

TrendScore = 0;//初始赋值0.//

SetGlobalVar(1,0);//设置第一个位置全局变量,初值0.//

for i = LookBack DownTo 1 //从10循环到1//

  {

   If(i == LookBack)//假如变量 i 等于参数LookBack值。//

{

Temp = 0;//变量Temp赋值0.//

}

Else//变量i不等于参数LookBack值的。//

{

Temp = GetGlobalVar(1); //变量Temp赋值为位置1的全局变量值0。//

}

If(C>=C[i]) Temp = Temp +1;//假如当前收盘价c >=c[i],则变量Temp = Temp(初值0) + 1.//

Else Temp = Temp - 1;//假如当前收盘价C <C[i],则变量Temp = Temp(初值0)-1.//

SetGlobalVar(1,Temp); //设置位置为1的全局变量,值为Temp值。//

  }

TrendScore = GetGlobalVar(1);//获取位置1的全局变量值Temp,赋值给变量TrendScore。//

//均线和ATR计算。//

MA = AverageFC(C,MALength); //收盘价均线。//

TrendScoreMA = AverageFC(TrendScore,MALength);//代入相应数值,求得变量TrendScoreMA均线。//

ATR = AvgTrueRange(ATRLength);//计算ATR公式了,前面解读过了。//

//系统入场,当价格高于收盘价均线, 且打分也高于打分均线时的入场做多。//

If(MarketPosition <> 1 and MA[1] <> 0) //假如当前没有持多单,且前一均线值不等于0.//

{

If(Close[1] >= MA[1] and TrendScore[1] >= TrendScoreMA[1] And Vol > 0)//假如前一收盘价大于等于前一均线值,且前一变量TrendScore[1]大于等于前一变量TrendScoreMA[1],且成交量大于0的。//

{

Buy(0,Open); //以开盘价开仓买入。//

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

}

}

//系统出场。//

If(BarsSinceEntry == 0)//假如建仓数位等于0.//

HighAfterEntry = High;//记录持仓高价为当前最高价。//

Else //建仓数位不等于0的。//

HighAfterEntry = Max(HighAfterEntry[1],High);//把前一个持仓高价与当前最高价对比,取大值,再赋值给变量HighAfterEntry值。//

TrailStopL = HighAfterEntry[1] - TrailStopATRMulti * ATR[1];//基于ATR的跟踪止损计算公式,也是代入相应数值即可。//

BreakEvenStopL = LastEntryPrice;//基于ATR的盈亏平衡止损。//

If(MarketPosition == 1 and mp[1] == 1)//假如当前持有多单,且前一个mp[1]等于1.//

{

If(HighAfterEntry[1] >= BreakEvenStopL + BreakEvenStopATRMulti * ATR[1])//代入相应数值计算,与前一个持仓记录高价对比。//

{

if(TrailStopL >= BreakEvenStopL) ExitLineL = TrailStopL;//假如变量TrailStopL 大于等于变量BreakEvenStopL值。则出场价ExitLineL = 变量TrailStopL值。//

Else ExitLineL = BreakEvenStopL;//假如变量TrailStopL值小于变量BreakEvenStopL值的,则出场价ExitLineL = 变量BreakEvenStopL值。//

}

Else//持仓记录高价小的情况。//

{

if(TrailStopL >= ProtectStopL[1]) ExitLineL = TrailStopL;//假如变量TrailStopL大于等于前一变量ProtectStopL[1]值,则出场价ExitLineL = 变量TrailStopL值。//

Else ExitLineL = ProtectStopL[1];//假如变量TrailStopL小于前一变量ProtectStopL[1]值,则出场价ExitLineL = ProtectStopL[1]。//

}

//出场。//

if(L <= ExitLineL And Vol > 0)//假如当前低价小于等于ExitLineL值,且成交量大于0.//

{

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

}

}

MP = MarketPosition; //记录持仓状态。//

End

做空代码及结果如下:

Params

  Numeric LookBack(10);

  Numeric MALength(18);

  Numeric ATRLength(10);

Numeric ProtectStopATRMulti(0.5);

Numeric TrailStopATRMulti(3);

Numeric BreakEvenStopATRMulti(5);

Vars

NumericSeries MA(0);

NumericSeries TrendScore(0);

NumericSeries TrendScoreMA(0);

NumericSeries ATR(0);

Numeric i;

Numeric Temp;

NumericSeries LowAfterEntry;

NumericSeries ProtectStopS;

Numeric TrailStopS;

Numeric BreakEvenStopS;

Numeric ExitLineS;

NumericSeries MP;

Begin

If(!CallAuctionFilter()) Return;

TrendScore = 0;

SetGlobalVar(1,0);

for i = LookBack DownTo 1 

  {

   If(i == LookBack)

{

Temp = 0;

}

Else

{

Temp = GetGlobalVar(1);

}

If(C>=C[i]) Temp = Temp +1;

Else Temp = Temp - 1;

SetGlobalVar(1,Temp);

  }

TrendScore = GetGlobalVar(1);

MA = AverageFC(C,MALength);

TrendScoreMA = AverageFC(TrendScore,MALength);

ATR = AvgTrueRange(ATRLength);

If(MarketPosition <> -1 and MA[1] <> 0)

{

If(Close[1] <= MA[1] and TrendScore[1] <= TrendScoreMA[1] And Vol > 0)

{

SellShort(0,Open);

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

}

}

If(BarsSinceEntry == 0)

LowAfterEntry = Low;

Else

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

TrailStopS = LowAfterEntry[1] + TrailStopATRMulti * ATR[1];

BreakEvenStopS = LastEntryPrice;

If(MarketPosition == -1 and mp[1] == -1)

{

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

{

if(TrailStopS <= BreakEvenStopS) ExitLineS = TrailStopS;

Else ExitLineS = BreakEvenStopS;

}

Else

{

if(TrailStopS <= ProtectStopS[1]) ExitLineS = TrailStopS;

Else ExitLineS = ProtectStopS[1];

}

if(H >= ExitLineS And Vol > 0)

{

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

}

}

MP = MarketPosition;

End

整体看着也很一般,但能从中学到的就是全局变量可以灵活使用,当然,这只是个人观点。

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

推荐阅读更多精彩内容