系统交易论坛 - 开拓者期货自动交易平台's Archiver

hjl 发表于 2010-7-30 15:08

关于卡夫曼自适应移动平均

对以下语句不甚理解:
AMAValue =AdaptiveMovAvg(close,terms,2,30);
    if(close==AMAValue)
         return;         //如果Bar个数小于计算周期,直接返回


恳请指教!!!!!

lh948 发表于 2010-7-30 17:31

close==AMAValue//如果Bar个数小于计算周期,直接返回
指的是如果bar周期数不够所填参数的计算,则return,不进行以下公式运行。

hjl 发表于 2010-9-1 14:04

//------------------------------------------------------------------------
// 简称: 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公式修改和重写的权利
//------------------------------------------------------------------------
公式中的if(AMAValue<AMAValue[1])
        {
                if(ExtHigh!=0)
                {
                        if((AMAValue - ExtHigh)>filter)
                                ShortEntryCon = true;
                }为什么要这么写?AMAValue - ExtHigh永远都小于零,filter都是大于等于零的,那这句话就永远不成立了!不甚明白

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.