网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

之前写过一篇关于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轴上下来区分多空趋势,本身就存在一定的弊端。

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

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
娜扎cos火野丽封神!这套二次元穿搭,把漫画感焊在身上

娜扎cos火野丽封神!这套二次元穿搭,把漫画感焊在身上

庭小娱
2026-04-27 11:00:45
强吻揉胸逼口交!日谐星「和解金加码8倍」砸2300万求放过 女网红崩溃

强吻揉胸逼口交!日谐星「和解金加码8倍」砸2300万求放过 女网红崩溃

ETtoday星光云
2026-06-03 15:34:21
手术机器人龙头暴跌30%,每次暴跌后都创新高

手术机器人龙头暴跌30%,每次暴跌后都创新高

码上闲叙
2026-06-02 05:42:19
有没有人敢爆自己的瓜?网友:确定玩这么大吗?

有没有人敢爆自己的瓜?网友:确定玩这么大吗?

夜深爱杂谈
2026-02-18 20:55:58
记者:与利物浦签短期合同是伊劳拉要求的,这是他一贯的方式

记者:与利物浦签短期合同是伊劳拉要求的,这是他一贯的方式

懂球帝
2026-06-03 10:14:23
男子戴呼吸面罩防烟打卡昆山南站,直言受不了一点烟味

男子戴呼吸面罩防烟打卡昆山南站,直言受不了一点烟味

映射生活的身影
2026-06-02 22:21:44
别阻止娃玩手机!马斯克:刷视频是如何让大脑变笨,得让孩子知晓

别阻止娃玩手机!马斯克:刷视频是如何让大脑变笨,得让孩子知晓

西红柿妈妈
2026-05-27 09:00:18
巴丹是台湾的,台湾是中国的!我国巴丹群岛,为何划给了菲律宾?

巴丹是台湾的,台湾是中国的!我国巴丹群岛,为何划给了菲律宾?

鹤羽说个事
2026-05-23 22:54:53
太疯狂了!一男子三年花30多万跑马拉松!妻子要求离婚!

太疯狂了!一男子三年花30多万跑马拉松!妻子要求离婚!

马拉松跑步健身
2026-06-02 21:39:57
调查发现:老年人若经常吃香蕉,用不了多久,身体或迎来3大改变

调查发现:老年人若经常吃香蕉,用不了多久,身体或迎来3大改变

芹姐说生活
2026-05-15 15:06:08
夏天最该吃的肉,不是鸡肉牛肉,这3种肉,鲜美营养,好吃不贵!

夏天最该吃的肉,不是鸡肉牛肉,这3种肉,鲜美营养,好吃不贵!

秀厨娘
2026-06-03 15:57:31
内塔尼亚胡:绝不允许伊朗威胁以色列的生存

内塔尼亚胡:绝不允许伊朗威胁以色列的生存

新华社
2026-06-02 23:29:05
20年前所有人都讨厌他,如今他成了最让人意外的黑马

20年前所有人都讨厌他,如今他成了最让人意外的黑马

一隅安稳
2026-06-02 01:08:20
广西一村庄十几个光棍扎堆晒太阳,直言没老婆再努力也没盼头

广西一村庄十几个光棍扎堆晒太阳,直言没老婆再努力也没盼头

捣蛋窝
2026-06-03 10:51:55
普京论坛开幕前,乌克兰无人机打中圣彼得堡油码头

普京论坛开幕前,乌克兰无人机打中圣彼得堡油码头

桂系007
2026-06-03 18:12:29
结束访华不到20天,特朗普紧急下禁令,要斩断中国“经济命脉”?

结束访华不到20天,特朗普紧急下禁令,要斩断中国“经济命脉”?

傲傲讲历史
2026-06-02 11:48:57
10、抑制两极分化是政府的责任

10、抑制两极分化是政府的责任

生命可以承受之轻
2026-06-02 16:05:06
终于有人发声了:11年前买入腾讯股票持有到2026年,单单分红就足以吓人,谁会是下一只“腾讯”?

终于有人发声了:11年前买入腾讯股票持有到2026年,单单分红就足以吓人,谁会是下一只“腾讯”?

新浪财经
2026-05-17 16:30:36
宁化县委书记王胜文接受纪律审查和监察调查

宁化县委书记王胜文接受纪律审查和监察调查

海峡网
2026-06-02 21:02:49
Arm没比x86便宜:RTX Spark笔记本价格曝光!顶配约3.2万元

Arm没比x86便宜:RTX Spark笔记本价格曝光!顶配约3.2万元

快科技
2026-06-02 18:47:07
2026-06-03 19:08:49
翊之依
翊之依
解说期货软件TB系统源代码
74文章数 95关注度
往期回顾 全部

财经要闻

AI,开始偷懒了?

头条要闻

网友花120万在直播间买原石 警方:30人拼单29个是托

头条要闻

网友花120万在直播间买原石 警方:30人拼单29个是托

体育要闻

选择中国品牌的库里,和他们的巨大野心

娱乐要闻

官方痛批乱象 刘涛郑恺等艺人遭点名

科技要闻

传DeepSeek融资意向500亿:腾讯投100亿

汽车要闻

专访蒋平:安全不做高低配 长安要让安全技术普惠

态度原创

亲子
艺术
家居
数码
房产

亲子要闻

想让孩子长高,到底怎么运动?专家一次讲透

艺术要闻

二十年前割麦的场景

家居要闻

江畔轻奢 观云大宅

数码要闻

618淘宝百亿补贴上线手机家电加补专场 空调价格降到千元大关

房产要闻

突发!254亩调规,海口江东的超级学校真的快来了!

无障碍浏览 进入关怀版