设为首页收藏本站

 找回密码
 注册
查看: 22281|回复: 22
打印 上一主题 下一主题

根据卡夫曼自适应移动平均写的交易系统 [复制链接]

Rank: 8Rank: 8

精华
0
UID
2037
积分
5849
帖子
91
主题
28
阅读权限
100
注册时间
2008-7-31
最后登录
2019-4-1
跳转到指定楼层
1#
发表于 2008-12-15 16:37:40 |只看该作者 |正序浏览
根据卡夫曼自适应移动平均思想写的简单的交易系统,但是测试下来,比普通两根均线交叉的交易系统的效果还差了一点。
请TB老师帮忙看看,非常感谢!
//------------------------------------------------------------------------
// 简称: AdaptiveMovAvg
// 名称: 自适应移动平均
// 类别: 交易指令
// 类型: 其他
// 输出:
//------------------------------------------------------------------------
Params
        Numeric        FilterSet(0.1);//过滤器偏移量
        Numeric        lots(1);
        Numeric        terms(10);//自适应计算周期
        Numeric        AMAOffSetPercent(0.55);//前后两日均线差值触发值百分比
Vars
        NumericSeries        AMAValue;
        Numeric        ExtHigh;//前高
        Numeric        ExtLow;//前低
        Numeric        filter;
        Numeric        AMAOffSet;
        Bool        LongEntryCon(false);
        Bool        ShortEntryCon(false);
Begin
        AMAValue = AdaptiveMovAvg(close,terms,2,30);
        if(close == AMAValue)
                return;       //如果bar个数小于计算周期,直接返回
        AMAOffSet=AvgPrice()*AMAOffSetPercent/100;       //取当前均价的0.0055作为均线触发值
        filter = StandardDev(AMAValue,20,2)*FilterSet;        //计算过滤器的值
        if(AMAValue>AMAValue[1]and AMAValue[1]<AMAValue[2])
                ExtLow = AMAValue[1];        //计算前低
        if(AMAValue<AMAValue[1]and AMAValue[1]>AMAValue[2])
                ExtHigh = AMAValue[1];       //计算前高
       

        if(AMAValue>AMAValue[1])   //如果今天的均线值大于昨天
        {
                if(ExtLow!=0)    //如果前低不为零
                {
                               if((AMAValue - ExtLow)>filter)     //将均线值减去最低值,看是否大于过滤器
                                LongEntryCon = true;
                }Else
                {
                        if((AMAValue-AMAValue[1])>AMAOffSet )   //如果前低为零,即没有产生前低,则直接比较两日的均线值是否大于触发值
                                        LongEntryCon = true;
                }
        }
               
        if(AMAValue<AMAValue[1])
        {
                if(ExtHigh!=0)
                {
                        if((AMAValue - ExtHigh)>filter)
                                ShortEntryCon = true;
                }Else
                {
                        f((AMAValue[1]-AMAValue)>AMAOffSet )
                                ShortEntryCon = true;
                }
        }
        Commentary("AMA:"+TEXT(AMAValue));
        Commentary("filter:"+TEXT(filter));
        Commentary("ExtLow:"+TEXT(ExtLow));
        Commentary("ExtHigh:"+TEXT(ExtHigh));
        Commentary("LongCon:"+IIFString(LongEntryCon,"true","false"));
        Commentary("ShortCon:"+IIFString(ShortEntryCon,"true","false"));
        Commentary("AMAOffSet:"+text(AMAOffSet));

        if(MarketPosition !=1 and LongEntryCon)
                buy(lots,NextOpen);
        if(MarketPosition !=-1 and ShortEntryCon)
                SellShort(lots,NextOpen);
end

//------------------------------------------------------------------------
// 编译版本        GS2004.06.12
// 用户版本        2008/12/06 15:39
// 版权所有        cf_38607
// 更改声明        TradeBlazer Software保留对TradeBlazer平台
//                        每一版本的TrabeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
已有 1 人评分威望 收起 理由
一个人行走 + 1 赞一个!

总评分: 威望 + 1   查看全部评分

Rank: 2

精华
0
UID
217043
积分
69
帖子
38
主题
17
阅读权限
30
注册时间
2015-8-14
最后登录
2024-5-17
23#
发表于 2016-9-9 16:22:24 |只看该作者
Params
         Numeric        FilterSet(0.1);//过滤器偏移量
        Numeric        lots(1);
         Numeric        terms(10);//自适应计算周期
        Numeric        AMAOffSetPercent(0.55);//前后两日均线差值触发值百分比
Vars
         NumericSeries        AMAValue;
         Numeric        ExtHigh;//前高
        Numeric        ExtLow;//前低
        Numeric        filter;
         Numeric        AMAOffSet;
         Bool        LongEntryCon(false);
         Bool        ShortEntryCon(false);
Begin
         AMAValue = AdaptiveMovAvg(close,terms,2,30);
         if(close == AMAValue)
                 return;                                     //如果bar个数小于计算周期,直接返回
                                 
                                 
        AMAOffSet=AvgPrice()*AMAOffSetPercent/100;       //取当前均价的0.0055作为均线触发值
               
        filter = StandardDev(AMAValue,20,2)*FilterSet;        //计算过滤器的值
               
        if(AMAValue[1]>AMAValue[2]and AMAValue[2]<AMAValue[3])
                 ExtLow = AMAValue[2];        //计算前低
                                 
        if(AMAValue[1]<AMAValue[2]and AMAValue[2]>AMAValue[3])
                 ExtHigh = AMAValue[2];       //计算前高
        

         if(AMAValue[1]>AMAValue[2])   //如果今天的均线值大于昨天
        {
                 if(ExtLow!=0)    //如果前低不为零
                {
                                if((AMAValue[1] - ExtLow)>filter)     //将均线值减去最低值,看是否大于过滤器
                                                                {
                                LongEntryCon = true;
                                                                }
                 }Else  if((AMAValue[1]-AMAValue[2])>AMAOffSet )   //如果前低为零,即没有产生前低,则直接比较两日的均线值是否大于触发值
                                                 {
                                        LongEntryCon = true;
                         }
         }
                 
         if(AMAValue[1]<AMAValue[2])
         {
                 if(ExtHigh!=0)
                 {
                         if((AMAValue[1] - ExtHigh)>filter)
                                                 {
                                 ShortEntryCon = true;
                                                 }
                 }Else   if((AMAValue[2]-AMAValue[1])>AMAOffSet )
                                                 
                                                 {
                                 ShortEntryCon = true;
                                                 }
                 }
         
         Commentary("AMA:"+TEXT(AMAValue));
         Commentary("filter:"+TEXT(filter));
         Commentary("ExtLow:"+TEXT(ExtLow));
         Commentary("ExtHigh:"+TEXT(ExtHigh));
         Commentary("LongCon:"+IIFString(LongEntryCon,"true","false"));
         Commentary("ShortCon:"+IIFString(ShortEntryCon,"true","false"));
         Commentary("AMAOffSet:"+text(AMAOffSet));

         if(MarketPosition !=1 and LongEntryCon)
                 buy(lots,Open);
         if(MarketPosition !=-1 and ShortEntryCon)
                 SellShort(lots,Open);
end

根据楼主的修改了一下。

使用道具 举报

Rank: 1

精华
0
UID
182975
积分
6
帖子
4
主题
1
阅读权限
10
注册时间
2014-3-20
最后登录
2015-1-13
22#
发表于 2014-12-25 20:36:04 |只看该作者
收藏了!

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
85182
积分
849
帖子
302
主题
11
阅读权限
60
注册时间
2011-12-8
最后登录
2013-10-28
21#
发表于 2011-12-20 17:31:10 |只看该作者
这个有价值的地方恐怕在过滤器了
http://qpic.cn/NifLLplMk若能一切随它去,便世间自在人。
      ---Derivatives

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
4250
积分
891
帖子
198
主题
42
阅读权限
60
注册时间
2009-4-28
最后登录
2019-12-1
20#
发表于 2010-3-30 16:19:11 |只看该作者
thank your work

使用道具 举报

Rank: 4

精华
0
UID
2808
积分
458
帖子
39
主题
6
阅读权限
50
注册时间
2008-11-19
最后登录
2021-4-1
19#
发表于 2008-12-25 20:27:24 |只看该作者
buy(lots,NextOpen,True); 替换 buy(lots,NextOpen);

请问这两个有什么区别呢?有什么不同呢?

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
2212
积分
1262
帖子
49
主题
11
阅读权限
60
注册时间
2008-8-27
最后登录
2015-12-17
18#
发表于 2008-12-24 09:26:40 |只看该作者
等到"NEXTOPEN"就来不及了,只好手工立即平掉多余仓位.

使用道具 举报

Rank: 8Rank: 8

精华
0
UID
2037
积分
5849
帖子
91
主题
28
阅读权限
100
注册时间
2008-7-31
最后登录
2019-4-1
17#
发表于 2008-12-24 04:01:59 |只看该作者

回复 #15 cyycjt 的帖子

可以采用BUY(LOTS,NEXTOPEN,TRUE)等方法解决,论坛里有很多关于这个问题的帖子。

使用道具 举报

Rank: 8Rank: 8

精华
0
UID
2037
积分
5849
帖子
91
主题
28
阅读权限
100
注册时间
2008-7-31
最后登录
2019-4-1
16#
发表于 2008-12-24 03:58:49 |只看该作者

回复 #14 wzmxw 的帖子

该公司的思路来自《精明较交易者》,这个网站里就有下。在投资学院一栏里面。如果您还有语句不清楚的,请注明是那句语句。另外,关于仓位的问题,请请教TB的各位老大,我也想听听,学习学习

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
2212
积分
1262
帖子
49
主题
11
阅读权限
60
注册时间
2008-8-27
最后登录
2015-12-17
15#
发表于 2008-12-23 17:25:29 |只看该作者
当设定市场效率 EffRatio >某值就开仓,
但 EffRatio在某值上下轻微浮动时,造成反复开仓.
不知可有解决之道?

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-5-23 18:46

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部