期货软件TB系统源代码解读系列27-基于MACD判断的交易系统

之前写过一篇关于MACD的代码解读,我想这个MACD算法求值,大家应该都了解过了。这次写的就是看TB系统里自带写有的基于MACD判断的交易系统,这程序化系统还是不错的。

我们先来看它的算法规则,如下:

策略说明:

基于MACD在价格回撤时进行判断的交易系统

系统要素:

1. 用MACD慢线在零轴上判断趋势

2. 在多头趋势中以收盘价和波动率构成入场出场通道

入场条件:

1. 价格高于MACD慢线上穿零轴的当前价格和波动率组成的通道上轨

 出场条件: 

1. macd慢线在零轴下

2. 价格低于MACD慢线上穿零轴的当前价格和波动率组成的通道下轨

3. 价格低于多头趋势形成时的最低价格出场

算法清楚了,我们来看它的代码解读及结果如何的:

Params

Numeric FastMA(4);     //声明数值参数FastMA,初值为4.即macd短周期值。//

Numeric SlowMA(10);    //声明数值参数SlowMA,初值为10,即macd长周期值。//

Numeric AvgMA(16);     //声明数值参数AvgMA,初值为16,即MACD慢线周期值。//

Numeric ATRLen(10);    //声明数值参数ATRLen,初值为10,即atr周期值。//

Numeric EATRPcnt(1);   //声明数值参数EATRPcnt,初值为1,即入场通道波动率过滤数值。//

Numeric XATRPcnt(1);   //声明数值参数XATRPcnt,初值为1,即出场通道波动率过滤数值。//

Vars

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

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

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

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

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

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

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

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

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

Bool Con1;//声明布尔型变量Con1。//

Bool Con2;//声明布尔型变量Con2.//

Numeric Minpoint;//声明数值变量Minppout。//

NumericSeries Upperband; //买入触发价//

NumericSeries Exitband;  //出场触发价//

Begin

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

Minpoint = Minmove * PriceScale;//正常最小跳动固定计算公式了。//

MACDLine = XAverage( Close, FastMA ) - XAverage( Close, SlowMA ) ; //代入相应数值计算macd快线值。//

SignalLine = XAverage( MACDLine, AvgMA );  //代入相应数值计算macd慢线。//

AATR = AvgTrueRange(ATRLen);   //计算atr波动率。//

ZeroLine = 0;   //零轴线。//

Con1 = CrossOver(SignalLine,ZeroLine);  //慢线上穿零轴。//

If (Con1 == True) //当慢线上穿零轴时候,定义为多头趋势。//

{

UpTrend = True;//为真。//

SignalFlag = False;//为真。//

DnTrend = False;//为真。//

}

Con2 = CrossUnder(SignalLine,ZeroLine);  //慢线下穿零轴。//

If(Con2 == True)     //当慢线下穿零轴时候,定义为空头趋势。//

{

UpTrend = False;//为假。//

BuySetup = False;//为假。//

SignalFlag = False;//为假。//

DnTrend = True;//为真。//

}


If(UpTrend == True) //多头趋势时记录当前最低价以及设置入场条件。//

{

If (SignalFlag == False ) //假如尔型序列变量SignalFlag等于假的。//

{

BuySetup = True;//为真。//

CTrendLow = Low;//序列变量CTrenalLow = 最低价Low。//

}

If (MACDLine < SignalLine And Low < CTrendLow[1] )  //MACD均线空头排列时候,且当前价格更低时更新最低价。//

CTrendLow = Low;//更新,序列变量CTrenalLow = 最低价Low。//

}

    If (BuySetup[1] == True and BuySetup[2] == False)   // 满足入场条件设定入场价格以及出场价格,即前一个为真,再前一个为假。//

{

Upperband = Close[1] + (EATRPcnt * AATR[1]) ;//进场计算公式。//                

Exitband = Close[1] - (XATRPcnt * AATR[1]) ;//出场计算公式。//

}

//系统入场。//

If (BuySetup[1] == True and MarketPosition == 0) //做多的条件。//

{

      If(High >= Upperband)//假如高价大于进场计算公式值。//

{

Buy(0,Max(Open,Upperband));//取开盘价与进场价的最大值,开多。//

BuySetup = False; //为假,即持有多单时不再满足入场条件。//

SignalFlag = True;//为真。//

}

}

//系统出场。//

If(MarketPosition==1 and BarsSinceEntry > 0 ) //出场的条件。//                       

{

If(DnTrend[1] == True) //为真,即多头趋势不在时,多头出场。//

{

Sell(0,Open);    //卖出。//

}

Else if(Low <= CTrendLow[1] - Minpoint and  CTrendLow[1] - Minpoint >= Exitband)    //持有多单后低于入场最低价格出场。//

    {

Sell(0,min(Open,CTrendLow[1] - Minpoint));    //取开盘价与出场价的最小值,止损卖掉。//

}

Else if(Low<= Exitband)     //持有多单后低于出场价格出场。//

    {

Sell(0,min(Open,Exitband));//卖出。//

}

}

End

看着数据跟图片觉得一般,但这上边是只开多头的,做空代码及结果如下了:

Params

Numeric FastMA(4);    

Numeric SlowMA(10);    

Numeric AvgMA(16);     

Numeric ATRLen(10);    

Numeric EATRPcnt(1);   

Numeric XATRPcnt(1);   

Vars

NumericSeries MACDLine(0); 

NumericSeries SignalLine(0); 

NumericSeries ZeroLine(0); 

NumericSeries AATR(0); 

BoolSeries UpTrend(False); 

BoolSeries DnTrend(False); 

BoolSeries SellSetup(False); 

NumericSeries CTrendHigh(0); 

BoolSeries SignalFlag(False);

Bool Con1;

Bool Con2;

Numeric Minpoint;

NumericSeries Lowerband; 

NumericSeries Exitband;  

Begin

If(!CallAuctionFilter()) Return;

Minpoint = Minmove * PriceScale;

MACDLine = XAverage( Close, FastMA ) - XAverage( Close, SlowMA ) ; 

SignalLine = XAverage( MACDLine, AvgMA );                         

AATR = AvgTrueRange(ATRLen);                                       

ZeroLine = 0;                                                       

Con1 = CrossOver(SignalLine,ZeroLine);                               

If (Con1 == True) 

{

UpTrend = True;

DnTrend = False;

SignalFlag = False;

SellSetup = False;

}

Con2 = CrossUnder(SignalLine,ZeroLine);                              

If(Con2 == True)                 

{

DnTrend = True;

SignalFlag = False;

UpTrend = False;

}

If(DnTrend == True) 

{

If (SignalFlag == False )               

{

SellSetup = True;

CTrendHigh = High;

}

If (MACDLine > SignalLine and High > CTrendHigh[1] ) 

CTrendHigh = High;

}

    If(SellSetup[1] == True and SellSetup[2] == False)

{

Lowerband = Close[1] - (EATRPcnt * AATR[1]);

Exitband = Close[1] + (XATRPcnt * AATR[1]);

}

//系统入场

If (SellSetup[1] == True and MarketPosition == 0) 

{

If( Low <= Lowerband) 

{

SellShort(0,Min(Open,Lowerband));

SellSetup = False; 

SignalFlag = True;

}

}

//系统出场

If(MarketPosition==-1 and BarsSinceEntry > 0 )

{

If(UpTrend[1] == True) 

{

BuyToCover(0,Open);

}

Else if(High>=CTrendHigh[1] + Minpoint and CTrendHigh[1] + Minpoint <= Exitband ) 

{

BuyToCover(0,max(Open,CTrendHigh[1] + Minpoint));

}

Else if(High>= Exitband) 

{

BuyToCover(0,max(Open, Exitband));

}

}

End

两者一结合起来,结果还是很差的,难道这个系统就不行了吗?我看未必,这原因我们来分析下:

1.参数的选择,一个系统在没有做参数优化时,它的参数都是随意写上的,没有数据依据,所以结果可能就是很差的,在这要做的,先统计分析出一个合理的参数。

2.操作周期,比如你选择长线的,最好是用4h或者日周期图表,这可以减少你的操作次数,看上面数据,我们可以看到盈亏手数对比,是1:4,这就得需要一个一次大的盈利才能补回来,可它的买卖规则里,没能体现出来,所以结果很差的。

3.以MACD的0轴上下来区分多空趋势,本身就存在一定的弊端。

这系统好不好,我也不好评论,但是我能从中学到的是如何做好买卖规则的细致处理。

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

推荐阅读更多精彩内容