金融分析基础(十三)—— 双均线区间突破模型

模型概述

移动平均线有很好的方向性、稳定性和趋势性,通过对均线的金叉死叉以及多头排列等可以判断出做空进场的时机及趋势,但当行情出现震荡或无明显趋势时,双均线系统会产生假信号使我们最终产生亏损,这也是所有线性系统的致命缺陷。区间突破可以过滤一部分的震荡,但当趋势出现是往往会提早出场或者反向做单,因此它不具有明显的趋势性 和持仓的稳定性,因此结合线性以及区间的优点得到我们的双均线区间突破模型。

策略要点

  • 定义长短两条均线
  • 计算均线的金叉死叉周期内的高低点
  • 将均线系统与区间高低点结合使用

开仓条件:

  • 双均线多头排列且突破区间高点,开多
  • 双均线空头排列且突破区间低点,开空

平仓条件:

  • 跟踪止盈止损出场
  • 趋势反转正反手出场

代码实现

在TB中编写如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
Params
Numeric N1(14);
Numeric N2(31);
Numeric SS(1);
Numeric TR(4);
Vars
BoolSeries condition1;
BoolSeries condition2;
BoolSeries condition3;
BoolSeries condition4;
BoolSeries condition5;
BoolSeries condition6;
NumericSeries var1;
NumericSeries var2;
NumericSeries bka;
NumericSeries bkx;
NumericSeries var3;
NumericSeries var4;
NumericSeries var3op;
NumericSeries var4op;
NumericSeries Myprice;
NumericSeries Myprice2;
NumericSeries Myprice3;
NumericSeries LowerAfterEntry;
NumericSeries HigherAfterEntry;
Begin
var1 = Average(C[1], N1);//短周期均线
var2 = Average(C[1], N2);//中周期均线

condition1 = CrossOver(var1, var2);//金叉
condition2 = CrossUnder(var1, var2);//死叉

If(condition1){
bka = CurrentBar;
}
If(condition2){
bkx = CurrentBar;
}

var3 = Highest(H[1],(bka-bkx)+1);//计算本次金叉至上次死叉的时间范围内的高点
var4 = Lowest(L[1], (bkx-bka)+1);//计算本次死叉至上次金叉的时间范围内的低点

condition3 = condition1 and bka>bkx and bka>0 and bkx>0 and CurrentBar>0;//当均线金叉同时满足bka>bkx且bka与bkx都不为0时条件3成立(多头条件)
If(condition3){
var3op = var3;//条件3成立时将var3赋值给var3op,保存金叉时的最高点到全局变量var3op里
}
condition4 = condition2 and bkx>bka and bka>0 and bkx>0 and CurrentBar>0;//当均线死叉同时满足bkx>bka且bka与bkx都不为0时条件3成立(多头条件)
If(condition4){
var4op = var4;//条件4成立时将var4赋值给var4op,保存死叉时的最低点到全局变量var4op里
}

condition5 = var1 > var2 and CrossOver(C[1], var3op);//当短周期均线大于中周期均线且价格突破最高点条件成立
If(condition5 and MarketPosition<>1){
Myprice = Open;//保存本根bar的开盘价
Buy(SS, Myprice);//按开盘价开多头
LowerAfterEntry = EntryPrice;//保存多头开仓价格
}
condition6 = var1 < var2 and CrossUnder(C[1], var4op);//当短周期均线小于中周期均线且价格突破最低点条件成立
If(condition6 and MarketPosition<>-1){
Myprice = open;//保存本根bar的开盘价
SellShort(SS, Myprice);//按开盘价开空头
HigherAfterEntry = EntryPrice;//保存空头开仓价格
}

//跟踪止盈止损,记录多头最低价和空头最高价
If(MarketPosition==1 and BarsSinceEntry==0){//有多头持仓,刚进场时的本根bar线序号
HigherAfterEntry = HigherAfterEntry[1];
LowerAfterEntry = Max(LowerAfterEntry,low);//多头出场的参考价格
}
If(MarketPosition==-1 and BarsSinceEntry==0){//有空头持仓,刚进场时的本根bar线序号
HigherAfterEntry = Min(HigherAfterEntry, High);
LowerAfterEntry = LowerAfterEntry[1];
}
If(MarketPosition<>0 and BarsSinceEntry>=1){//不再是本根bar线
HigherAfterEntry = Min(HigherAfterEntry, High);
LowerAfterEntry = Max(LowerAfterEntry,low);
}

//执行部分,跟踪出场

Myprice2 = LowerAfterEntry - Open * TR / 100;//多头出场线
PlotNumeric("Myprice2", Myprice2);
If(MarketPosition==1 and Low<=Myprice2 and BarsSinceEntry>0);{//当持有多头持仓,最新价格跌破止损线,同时平仓信号和开仓信号不在同一跟bar线
Myprice2 = Min(Myprice2, Open);//如果跳空击破,取值最新的bar线的开盘价,若不是,去出场线价格
Sell(SS, Myprice2);//多头平仓
Commentary("多头出场");
}
Myprice3 = HigherAfterEntry + Open + TR / 100;
PlotNumeric("Myprice3", Myprice3);
If(MarketPosition == -1 and High >= Myprice3 and BarsSinceEntry > 0){//当空头持仓,最新价格突破出场线,同时平仓信号和开仓信号不在同一根bar线
Myprice3 = Max(Myprice3, Open);//如果跳空击破,取值最新的bar线的开盘价,若不是,去出场线价格
BuyToCover(SS, Myprice3);//空头平仓
Commentary("空头出场");
}


End

大家可以跑一下结果看看情况~

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2020-2021 chenk
  • 由 帅气的CK本尊 强力驱动
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信