yaqh273150622 发表于 2015-9-23 10:00:57

TB自带公式CL_trendscore_l(K线打分)

//------------------------------------------------------------------------
// 简称: CL_TrendScore_L
// 名称: 基于收盘价与之前k线高低进行打分的交易系统多
// 类别: 公式应用
// 类型: 内建应用
//------------------------------------------------------------------------

//----------------------------------------------------------------------//
// 策略说明:
//                         本策略基于当前收盘价与之前k线的高低进行打分, 并通过打分的均值与对应的收盘价均值进行交易
//                         
// 系统要素:
//                         1. 当当前收盘价格大于之前LookBack根K线内某一根k线的收盘价时记+1分, 否则记-1分, 加总这些分数以获得当前K线的得分
//                         2. 对k线的打分计算一条均线
//                         3. 对k线的收盘计算一条均线
// 入场条件:
//                         1. 当价格高于收盘价均线, 且打分也高于打分均线时的入场做多
//                         2. 当价格低于收盘价均线, 且打分也低于打分均线时的入场做空
// 出场条件:
//                         1. 基于ATR的保护性止损
//                         2. 基于ATR的跟踪止损
//                         3. 基于ATR的盈亏平衡止损
//
//                 注: 当前策略仅为做多系统, 如需做空, 请参见CL_TrendScore_S
//----------------------------------------------------------------------//

Params
    Numeric LookBack(10);                                //用于给当前K线打分的回溯根数
    Numeric MALength(18);                                //均线值
    Numeric ATRLength(10);                                //ATR的值
        Numeric ProtectStopATRMulti(0.5);        //保护性止损的ATR乘数
        Numeric TrailStopATRMulti(3);                //跟踪止损的ATR乘数
        Numeric BreakEvenStopATRMulti(5);        //盈亏平衡止损的ATR乘数
       
Vars
        NumericSeries MA(0);                                //收盘价均线
        NumericSeries TrendScore(0);                //当前K线的打分
        NumericSeries TrendScoreMA(0);                //k线打分的均线
        NumericSeries ATR(0);                                //ATR

        Numeric i;
        Numeric Temp;
       
        NumericSeries HighAfterEntry;                 //持仓后的高点记录

        NumericSeries ProtectStopL;                        //基于ATR的保护性止损
        Numeric TrailStopL;                                        //基于ATR的跟踪止损
        Numeric BreakEvenStopL;                                //基于ATR的盈亏平衡止损
        Numeric ExitLineL;                                        //平仓线
       
        NumericSeries MP;                                        //MarketPosition状态记录
Begin

        // 集合竞价和小节休息过滤
        If(!CallAuctionFilter()) Return;
       
        //系统设置
        //K线打分 - 当当前收盘价格大于之前LookBack根K线内某一根k线的收盘价时记+1分, 否则记-1分, 加总这些分数以获得当前K线的得分
       
        TrendScore = 0;
        SetGlobalVar(1,0);
       
        for  i = LookBack DownTo 1 /*循环次数*/
    {
            If(i == LookBack)
                {
                        Temp = 0;
                }
                Else
                {
                        Temp = GetGlobalVar(1);
                }
               
                If(C>=C) Temp = Temp +1;
                Else Temp = Temp - 1;
                SetGlobalVar(1,Temp);                       
    }
       
        TrendScore = GetGlobalVar(1);
        //PlotNumeric("TrendScore",TrendScore);

        //均线和ATR计算
        MA = AverageFC(C,MALength);
        TrendScoreMA = AverageFC(TrendScore,MALength);
        ATR = AvgTrueRange(ATRLength);
        //PlotNumeric("TrendScoreMA",TrendScoreMA);
        //PlotNumeric("MA",MA);
       
        //系统入场
        //当价格高于收盘价均线, 且打分也高于打分均线时的入场做多
        If(MarketPosition <> 1 and MA <> 0)
        {
                If(Close >= MA and TrendScore >= TrendScoreMA And Vol > 0)
                {
                        Buy(0,Open);
                        //基于ATR的保护性止损
                        ProtectStopL = Low - ProtectStopATRMulti * ATR;
                }
        }
       
        //系统出场

        If(BarsSinceEntry == 0)
                HighAfterEntry = High;
        Else       
                HighAfterEntry = Max(HighAfterEntry,High);

        //基于ATR的跟踪止损
        TrailStopL = HighAfterEntry - TrailStopATRMulti * ATR;
       
        //基于ATR的盈亏平衡止损
        BreakEvenStopL = LastEntryPrice;
       
        If(MarketPosition == 1 and mp == 1)        {
                //出场线选择
                If(HighAfterEntry >= BreakEvenStopL + BreakEvenStopATRMulti * ATR)
                {
                        if(TrailStopL >= BreakEvenStopL) ExitLineL = TrailStopL;
                        Else ExitLineL = BreakEvenStopL;
                }
                Else
                {
                        if(TrailStopL >= ProtectStopL) ExitLineL = TrailStopL;
                        Else ExitLineL = ProtectStopL;
                }

                //出场
                if(L <= ExitLineL And Vol > 0)
                {
                        Sell(0,Min(Open, ExitLineL));
                }
        }
        //PlotNumeric("ProtectStopL",ProtectStopL);
        //PlotNumeric("TrailStopL",TrailStopL);
        //PlotNumeric("BreakEvenStopL",BreakEvenStopL);
        //PlotNumeric("ExitLineL",ExitLineL);
               
        MP = MarketPosition;               
               
End

//------------------------------------------------------------------------
// 编译版本        GS2014.10.25
// 版权所有        TradeBlazer Software 2003-2014
// 更改声明        TradeBlazer Software保留对TradeBlazer平
//                        台每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------

yaqh273150622 发表于 2015-9-23 10:03:47

两个问题,
If(MarketPosition == 1 and mp == 1)   
为什么要对前面一个持仓状态进行定义,都是开多的话,前一个持仓信号不也是多头吗?
第二
MP = MarketPosition;      
对MP的定义放到了最后,我尝试放到前面就定义,效果差了很多。


请各位帮忙指点下小白。

小米 发表于 2015-9-23 11:01:28

yaqh273150622 发表于 2015-9-23 10:03 static/image/common/back.gif
两个问题,
If(MarketPosition == 1 and mp == 1)   
为什么要对前面一个持仓状态进行定义,都是开多的 ...

软件自带的这些公式都是根据国外经典策略来编写的,这里为何要判断 mp==1 应该是与原著所提的需求的有关。有兴趣的建议去相关的原著策略思路来看看。。
MP = MARKETPOSITION如果放到代码前段,那如果当前bar有开平仓信号的,这个就不能真实记录当前bar的MP状态了。。所以得放到后面呀

yaqh273150622 发表于 2015-11-10 20:48:18

小米 发表于 2015-9-23 11:01 static/image/common/back.gif
软件自带的这些公式都是根据国外经典策略来编写的,这里为何要判断 mp==1 应该是与原著所提的需求的有 ...

非常感谢!
页: [1]
查看完整版本: TB自带公式CL_trendscore_l(K线打分)