开拓者期货期权程序化系统交易论坛

标题: 缠中说禅TB版 [打印本页]

作者: binzhiyao    时间: 2015-8-9 15:28:18     标题: 缠中说禅TB版

本帖最后由 binzhiyao 于 2015-8-9 15:28 编辑

本人最近在学习 缠论 ,在学习的过程中尝试量化.
以下是源码, 希望熟悉缠论的朋友可以指教.
本人QQ:110951948 请多多指教

网络状况好的时候再补上图

-------------------------K线(显示的时候需要设置成柱状)-------------------------
Params
        NumericSeries s_czsc_high;
        NumericSeries s_czsc_low;
        NumericSeries s_direction;
        NumericSeries s_status;

        //包含
        NumericRef czsc_high;                //当前K线高点
        NumericRef czsc_low;                //当前K线低点
        //分型
        NumericRef direction;                //当前K线方向
        NumericRef status;                        //当前K线状态(0.表示延续方向 1.表示K线转变方向)
       
Begin
        If(s_czsc_high>0 or s_czsc_low>0){                                                                                                                                        //存在缠中说禅K线的
                If((s_czsc_high>High and s_czsc_low<Low) or (High>s_czsc_high and Low<s_czsc_low)){                                //是否存在包含关系
                        If(s_direction>0){                                                                                                                                                        //依据上一根K线方向确定当前K线方向
                                direction=1; status=0;
                                czsc_high=Max(s_czsc_high,High); czsc_low=Max(s_czsc_low,Low);                                                        //更新最高点和最低点
                        }
                        Else If(s_direction<0){
                                direction=-1; status=0;
                                czsc_high=Min(s_czsc_high,High); czsc_low=Min(s_czsc_low,Low);
                        }
                }
                Else{                                                                                                                                                                                        //不存在包含关系
                        If(s_direction>0){                                                                                                                                                         //依据上一根K线方向确定当前K线方向
                                If(High<s_czsc_high){                                                                                                                                        //是否发生转向
                                        direction=-1; status=1;
                                        czsc_high=High; czsc_low=Low;
                                }Else{
                                        direction=1; status=0;
                                        czsc_high=Max(s_czsc_high,High); czsc_low=Max(s_czsc_low,Low);
                                }
                        }
                        Else If(s_direction<0){
                                If(Low>s_czsc_low){
                                        direction=1;status=1;
                                        czsc_high=High; czsc_low=Low;
                                }Else{
                                        direction=-1; status=0;
                                        czsc_high=Min(s_czsc_high,High); czsc_low=Min(s_czsc_low,Low);
                                }
                        }
                }       
        }
        Else{
                If((High>High[1] and Low<Low[1]) or (High[1]>High and Low[1]<Low)){                                                                //当不存在缠中说禅K线时用K线高低点作为依据判断存在包含关系
                        If(High[1]>High[2]){                                                                                                                                                //判断方向
                                direction=1; status=0;
                                czsc_high=Max(High[1],High); czsc_low=Max(Low[1],Low);
                        }
                        Else If(Low[1]<Low[2]){
                                direction=-1; status=0;
                                czsc_high=Min(High[1],High); czsc_low=Min(Low[1],Low);
                        }
                }Else{
                        If(High[2]<High[1]){
                                If(High[1]>High){
                                        direction=-1; status=1;
                                        czsc_high=High; czsc_low=Low;
                                }Else{
                                        direction=1; status=0;
                                        czsc_high=Max(High[1],High); czsc_low=Max(Low[1],Low);
                                }
                        }
                        Else If(Low[2]>Low[1]){
                                If(Low[1]<Low){
                                        direction=1; status=1;
                                        czsc_high=High; czsc_low=Low;
                                }Else{
                                        direction=-1; status=0;
                                        czsc_high=Min(High[1],High); czsc_low=Min(Low[1],Low);
                                }
                        }
                }
        }

        If(czsc_low>0 or czsc_high>0){
                PlotNumeric("czsc",czsc_low,czsc_high);                                                                                                                        //输出缠中说禅K线
                Commentary("("+Text(direction)+","+Text(status)+")");
        }       
        Return True;
End


-------------------------笔-------------------------
Params
        NumericSeries s_czsc_high;
        NumericSeries s_czsc_low;
        NumericSeries s_direction;
        NumericSeries s_status;
        NumericSeries s_pen;                                                                                                //11 表示底        10 表示上行        -11表示顶        -10表示下行
       
        NumericRef pen;
Vars
        Numeric i(0);
Begin
        If(s_status==0){                                                                                                        //如果还没开始则延续状态
                pen = s_direction*10;
        }
        Else{
                While(i<50){If(s_pen==11 or s_pen==-11){break;}i=i+1;}        //回溯50个缠中说禅笔,直至符合条件中断(50可根据周期自定义)
                If(s_pen==10 or s_pen==-10){                                                                //如果回溯50个仍没符合条件的则延续状态
                        If(s_direction>0){
                                pen = s_direction*10+s_status;
                                PlotString("l","|",s_czsc_low);
                        }
                        else{
                                pen = s_direction*10-s_status;
                                PlotString("u","|",s_czsc_high);
                        }
                }
                Else{
                        If(i<3){                                                                                                        //i为相隔的bar数,相隔的Kbar数不符合笔的要求则维持原来状态
                                pen = s_direction[1]*10;       
                        }
                        Else{
                                If(s_direction==1 and s_pen==11){                                        //同方向转变状态的,则比较哪个更低或更高,留下更低的或更高的或保持状态
                                        If(s_czsc_low[1]<s_czsc_low[i+2]){
                                                pen = s_direction*10+s_status;
                                                PlotString("l","|",s_czsc_low);
                                                Unplot("p",i+1);
                                                PlotNumeric("p",s_czsc_low);
                                        }
                                        Else{
                                                pen = s_direction[1]*10;
                                        }
                                }
                                Else If(s_direction==-1 and s_pen==-11){
                                        If(s_czsc_high[1]>s_czsc_high[i+2]){
                                                pen = s_direction*10-s_status;
                                                PlotString("u","|",s_czsc_high);
                                                Unplot("p",i+1);
                                                PlotNumeric("p",s_czsc_high);
                                        }
                                        Else{
                                                pen = s_direction[1]*10;
                                        }
                                }
                                Else{                                                                                                        //不同方向的则需要依据当前方向判断前后两个分型之间有没有重叠,有重叠则无效,无重叠则确认为笔
                                        If(s_direction>0){
                                                If(s_czsc_high[1]<s_czsc_low[i+2]){
                                                        pen = s_direction*10+s_status;
                                                        PlotString("l","|",s_czsc_low);
                                                        PlotNumeric("p",s_czsc_low);
                                                }else{
                                                        pen = s_direction[1]*10;
                                                }                                       
                                        }
                                        else{
                                                If(s_czsc_low[1]>s_czsc_high[i+2]){
                                                        pen = s_direction*10-s_status;
                                                        PlotString("u","|",s_czsc_high);
                                                        PlotNumeric("p",s_czsc_high);
                                                }else{
                                                        pen = s_direction[1]*10;
                                                }                                       
                                        }
                                }
                        }
                }
        }
        Return True;
End



-------------------------段-------------------------

Params
        NumericSeries s_czsc_high;
        NumericSeries s_czsc_low;
        NumericSeries s_pen;
        NumericSeries s_duan;                                                                                        //1表示段点        0表示非段点
        NumericRef duan;
Vars
        Numeric i(0);                                                                                                        //当前回溯的bar数
        Numeric pre_i(0);                                                                                                //上次回溯的bar数
        Numeric last_pen(0);                                                                                        //最后一笔的最后一个分型的最高点或最低点
Begin
        duan=0;                                                                                                                        //初始化段
        If(s_pen==11 or s_pen==-11){                                                                        //当笔的时候则开始往前回溯是否形成段
                While(i<60){                                                                                                //第一次回溯(60可依据周期调整)
                        If(s_pen==s_pen){                                                                        //如果同向则清除上一次的段
                                Unplot("d",i);
                        }
                        Else If(s_pen==-1*s_pen){                                                        //如果不同向则进入第二轮回溯
                                pre_i=i;break;
                        }
                        i=i+1;
                }
                If(s_pen==-1*s_pen and s_duan[i-1]==0){                                        //方向相反且不是段点,则进入第二轮回溯
                        While(i<60+pre_i){
                                If(s_pen==s_pen){pre_i=i;break;}i=i+1;
                        }
                        If(s_pen==s_pen and s_duan[i-1]==0){                                        //方向相同且不是段点,则进入第三轮回溯
                                While(i<60+pre_i){
                                        If(s_pen==-1*s_pen){pre_i=i;break;}i=i+1;
                                }
                                If(s_pen==-1*s_pen){                                                                //段的头尾分型的方向是相反的
                                        If(s_pen==11){                                                                //如果尾部是底,则头部是顶,那么顶部最低点大于等于底部最低点则为有效段
                                                If(s_czsc_low>=s_czsc_low){duan=1;}
                                        }
                                        Else If(s_pen==-11){                                                        //如果尾部是顶,则头部是底,那么顶部最高点小于等于底部最高点则为有效段
                                                If(s_czsc_high<=s_czsc_high){duan=1;}
                                        }
                                }
                        }
                }
        }
        If(duan>0){                                                                                                                //输出段点
                If(s_pen==11){PlotNumeric("d",s_czsc_low);}Else{PlotNumeric("d",s_czsc_high);}
        }
        Return True;
End

-------------------------测试-------------------------

Vars
        NumericSeries s_czsc_high;
        NumericSeries s_czsc_low;
        NumericSeries s_direction;
        NumericSeries s_status;
       
        NumericSeries s_pen_value;

        //包含
        Numeric czsc_high;
        Numeric czsc_low;
        Numeric direction;
        Numeric status;
       
        //分型和笔
        NumericSeries s_pen;
        Numeric pen;
        //段
        NumericSeries s_duan;
        Numeric duan;

Begin
        czsc_k(s_czsc_high,s_czsc_low,s_direction,s_status,czsc_high,czsc_low,direction,status);
        s_czsc_high=czsc_high; s_czsc_low=czsc_low; s_direction=direction; s_status=status;
       
        czsc_pen(s_czsc_high,s_czsc_low,s_direction,s_status,s_pen,pen);
        s_pen=pen;

        czsc_duan(s_czsc_high,s_czsc_low,s_pen,s_duan,duan);
        s_duan=duan;
       
        Commentary("czsc_high2:"+Text(czsc_high));
        Commentary("czsc_low2:"+Text(czsc_low));
End
作者: yhqh958287    时间: 2015-8-10 09:08:19

真心不错
但说好的“补上图”呢?
作者: hs906080    时间: 2016-10-3 19:31:59

继续你的后期啊大神
作者: zxjt30920087    时间: 2017-7-22 13:39:17

大神,好样的。
作者: zxjt30920087    时间: 2017-7-22 14:10:00

[attach]35804[/attach]


这就是图片
作者: rdmn01    时间: 2018-6-29 15:39:06

为啥出现”numericseries 策略参数只能是基本类型“?
作者: rlqh81700112    时间: 2019-1-2 11:14:49

函数里面不能使用序列类型吧
作者: rlqh81700112    时间: 2019-1-2 11:22:00

原作者故意打乱了一些关键代码,现尝试补全后效果如图。
作者: aurthor    时间: 2019-1-3 13:56:48

rlqh81700112 发表于 2019-1-2 11:22
原作者故意打乱了一些关键代码,现尝试补全后效果如图。

@rlqh81700112    能分享一下正确代码吗
作者: chen15706661513    时间: 2019-2-14 10:52:14

rlqh81700112 发表于 2019-1-2 11:22
原作者故意打乱了一些关键代码,现尝试补全后效果如图。

能分享一下代码吗
作者: flybirds2008    时间: 2020-9-3 14:22:49

rlqh81700112 发表于 2019-1-2 11:22
原作者故意打乱了一些关键代码,现尝试补全后效果如图。

补的漂亮




欢迎光临 开拓者期货期权程序化系统交易论坛 (http://bbs.tb18.net/) Powered by Discuz! X2