benyip 发表于 2013-12-5 15:10:45

已更新【回馈金魔方论坛1】缠论分笔(金魔方语言,逐根)

本帖最后由 benyip 于 2013-12-22 23:44 编辑

1、逐根模式;
2、参数0: 使用旧笔标准;
     参数1: 使用新笔标准;


3、保证一笔最高最低点是该笔的顶和底(注:指包含处理后,不一定是实际的最高最低,以后其他应用时可以根据情况标准化为最高最低点,如同线段划分时的标准化概念)

欢迎大家试用,多提意见!以后有时间,再分享线段公式。

源码:
//逐根
#Run_By_Bar
#Run_Every_Bar
#NoDefaultOutput
#MainChart
//自定义
#define 上涨             1
#define 下跌            -1
#define 盘整             0
#Define 顶               1
#Define 底              -1
#Define 上破             2
#Define 下破            -2
#Define 废弃的顶         3
#Define 废弃的底        -3
#Define 分型右侧元素延伸 1
#Define 向上笔分型构造   5
#Define 向上笔延伸       6
#Define 向下笔分型构造  -5
#Define 向下笔延伸      -6
#Define 笔中的顶         7
#Define 笔中的底        -7
#Define 新笔周期         3
#Define 新笔             3
#Define 旧笔             4
#Define 最新完成K线位置  0

Input:
  新笔标准(1);
  
VARIABLE:
  新高(0),新低(0),笔状态(0),K线方向(0),TL_ID(-1),                //连续
  K线类型(0), 分型区间上沿(0), 分型区间下沿(0), 笔尖(Invalid),  //离散
  
  NumericSimple i(0),
  NumericSimple 前笔高点位置(0),//顶位置
  NumericSimple 前笔低点位置(0),//底位置
  NumericSimple 今笔高点位置(0),//顶位置
  NumericSimple 今笔低点位置(0),//底位置
  
  NumericSimple 顶位置(0),//笔中分型顶
  NumericSimple 底位置(0),//笔中分型底
  NumericSimple 分型上沿(0),//分型区间上沿
  NumericSimple 分型下沿(0),//分型区间下沿
  
  NumericSimple 分型右侧元素(1),//分型右侧元素包含
  NumericSimple 新K形成(0),     //非包含
  NumericSimple 找到符合K线(0), //特殊处理时标志
  NumericSimple 笔计数(0);      //计算一笔的非包含K线数

//******************************主程序******************************

//1.第一根K线处理
笔:笔尖,LineDot,ColorYellow;

  
IF BARPOS=最新完成K线位置+1 THEN
BEGIN
  前笔高点位置=最新完成K线位置;
  前笔低点位置=最新完成K线位置;
  今笔高点位置=最新完成K线位置;
  今笔低点位置=最新完成K线位置;
  顶位置=最新完成K线位置;
  底位置=最新完成K线位置;
  分型上沿=High[最新完成K线位置];
  分型下沿=Low[最新完成K线位置];
  新高[最新完成K线位置]=分型上沿;
  新低[最新完成K线位置]=分型下沿;
  K线方向[最新完成K线位置]=盘整;
  笔状态[最新完成K线位置]=盘整;
  Print('第一根K线处理');
  
  Exit;
END;

前笔高点位置++;
前笔低点位置++;
今笔高点位置++;
今笔低点位置++;
顶位置++;
底位置++;

//2.K线处理
新K形成=True;
//2.1 K线方向
  //2.1.1 上升K线
If High[最新完成K线位置]>新高[最新完成K线位置+1] And
   Low[最新完成K线位置]>新低[最新完成K线位置+1]  Then
Begin
  K线方向[最新完成K线位置]=上涨;
  顶位置=最新完成K线位置;
End Else Begin
  //2.1.2 下降K线
  If High[最新完成K线位置]<新高[最新完成K线位置+1] And
     Low[最新完成K线位置]<新低[最新完成K线位置+1] Then
  Begin
    K线方向[最新完成K线位置]=下跌;
        底位置=最新完成K线位置;
  End Else Begin
  //2.1.3 包含K线,保持原方向
    K线方向[最新完成K线位置]=K线方向[最新完成K线位置+1];
        新K形成=False;
  End;
End;       

//2.2 非包含处理序列K线
If 新K形成=False Then
Begin
  If K线方向[最新完成K线位置]=下跌 Then
  Begin
    新高[最新完成K线位置]=Min(High[最新完成K线位置],新高[最新完成K线位置+1]);
        If Low[最新完成K线位置]<=新低[最新完成K线位置+1] Then
        Begin
          新低[最新完成K线位置]=Low[最新完成K线位置];
          底位置=最新完成K线位置;
          分型下沿=Low[最新完成K线位置];
          If 分型右侧元素=分型右侧元素延伸 Then
            分型区间下沿[顶位置]=Min(分型区间下沿[顶位置],新低[最新完成K线位置]);
        End Else
          新低[最新完成K线位置]=新低[最新完成K线位置+1];       
  End Else Begin
        If High[最新完成K线位置]>=新高[最新完成K线位置+1] Then
        Begin
          新高[最新完成K线位置]=High[最新完成K线位置];
          顶位置=最新完成K线位置;
          分型上沿=High[最新完成K线位置];
          If 分型右侧元素=分型右侧元素延伸 Then
            分型区间上沿[底位置]=Max(分型区间上沿[底位置],新高[最新完成K线位置]);
        End Else
          新高[最新完成K线位置]=新高[最新完成K线位置+1];
        If K线方向[最新完成K线位置]=上涨 Then
      新低[最新完成K线位置]=Max(Low[最新完成K线位置],新低[最新完成K线位置+1]);
        Else Begin
          If Low[最新完成K线位置]<=新低[最新完成K线位置+1] Then
          Begin
            新低[最新完成K线位置]=Low[最新完成K线位置];
            底位置=最新完成K线位置;
            分型下沿=Low[最新完成K线位置];
                If 分型右侧元素=分型右侧元素延伸 Then
              分型区间下沿[顶位置]=Min(分型区间下沿[顶位置],新低[最新完成K线位置]);
          End Else
            新低[最新完成K线位置]=新低[最新完成K线位置+1];
        End;
  End;
End Else Begin
  新高[最新完成K线位置]=High[最新完成K线位置];
  新低[最新完成K线位置]=Low[最新完成K线位置];
  If K线方向[最新完成K线位置]=下跌 And (K线方向[最新完成K线位置+1]=上涨 Or
     K线方向[最新完成K线位置+1]=盘整) Then
  Begin
    分型区间上沿[顶位置]=分型上沿;
        分型区间下沿[顶位置]=Min(分型下沿,新低[最新完成K线位置]);
    分型下沿=新低[最新完成K线位置];
        K线类型[顶位置]=笔中的顶;
        分型右侧元素=True;
  End Else Begin
    If K线方向[最新完成K线位置]=上涨 And (K线方向[最新完成K线位置+1]=下跌 Or
     K线方向[最新完成K线位置+1]=盘整) Then
        Begin
          分型区间下沿[底位置]=分型下沿;
          分型区间上沿[底位置]=Max(分型上沿,新高[最新完成K线位置]);
          分型上沿=新高[最新完成K线位置];
          K线类型[底位置]=笔中的底;
          分型右侧元素=True;
        End Else Begin
          分型右侧元素=False;
          If K线方向[最新完成K线位置]=下跌 Then
          Begin
            分型上沿=新高[最新完成K线位置+1];
                分型下沿=新低[最新完成K线位置];
          End Else Begin
            分型上沿=新高[最新完成K线位置];
                分型下沿=新低[最新完成K线位置+1];
          End;
        End;
  End;
  
  笔计数++;
End;

//3.笔处理

笔状态[最新完成K线位置]=笔状态[最新完成K线位置+1];

//3.1 盘整K线
If K线方向[最新完成K线位置+1]=盘整 Then
Begin
  //3.1.1 下跌K线
  If 新K形成 And K线方向[最新完成K线位置]=下跌 Then
  Begin
    K线类型[顶位置]=顶;
        笔状态[最新完成K线位置]=向上笔分型构造;
        笔计数=1;
        笔尖[顶位置]=High[顶位置];
        笔[顶位置]=笔尖[顶位置];
        今笔高点位置=顶位置;       
        今笔低点位置=最新完成K线位置;
        前笔高点位置=顶位置;
        前笔低点位置=底位置;
  End Else Begin
  //3.1.2 上涨K线
    If 新K形成 And K线方向[最新完成K线位置]=上涨 Then
    Begin
          K线类型[底位置]=底;
          笔状态[最新完成K线位置]=向下笔分型构造;  
          笔计数=1;
          笔尖[底位置]=Low[底位置];
          笔[底位置]=笔尖[底位置];
          今笔低点位置=底位置;       
          今笔高点位置=最新完成K线位置;
          前笔高点位置=顶位置;
      前笔低点位置=底位置;
    End;
  End;
End;

//3.2 下跌K线
If K线方向[最新完成K线位置]=下跌 Then
Begin
  Switch (笔状态[最新完成K线位置+1])
  Begin
    //3.2.1 向下笔延伸
        Case 向上笔分型构造:
          If 新低[最新完成K线位置]<分型区间下沿[前笔高点位置] Then
          Begin
            笔状态[最新完成K线位置]=向下笔延伸;
                今笔低点位置=最新完成K线位置;
          End Else
            If Low[最新完成K线位置]=分型区间下沿[前笔高点位置] Then
                  今笔低点位置=最新完成K线位置;
          
        //3.2.2 向下笔继续延伸          
        Case 向下笔延伸:
          If Low[最新完成K线位置]<=新低[今笔低点位置] Then
            今笔低点位置=最新完成K线位置;
       
        //3.2.3 向下笔分型构造或向上笔延伸
        Default: Begin
          //3.2.3.1 向上笔完成
          If K线方向[最新完成K线位置+1]=上涨 And
             笔状态[最新完成K线位置+1]=向上笔延伸 And
             新高[最新完成K线位置+1]=新高[今笔高点位置]  And
             ((笔计数>新笔 And 新笔标准=True And (今笔低点位置-今笔高点位置)>新笔周期) Or
                 (笔计数>旧笔)) Then
          Begin
                        
                  K线类型[今笔高点位置]=顶;
                  笔状态[最新完成K线位置]=向上笔分型构造;
                  笔计数=1;
                  笔尖[今笔高点位置]=新高[今笔高点位置];
                  笔[今笔高点位置]=笔尖[今笔高点位置];
                  前笔高点位置=今笔高点位置;
                  今笔低点位置=最新完成K线位置;
//                  TL_ID[前笔低点位置]=Tl_New(Date[前笔低点位置],Time[前笔低点位置],新低[前笔低点位置],
//                                             Date[前笔高点位置],Time[前笔高点位置],笔尖[前笔高点位置]);
//                  Tl_SetColor(TL_ID[前笔低点位置],ColorYellow);
//                  Tl_SetStyle(TL_ID[前笔低点位置],3);
          End Else Begin
          //3.2.3.2 向上笔完成前
                //突破向下笔的低点
                找到符合K线=False;
            If 新低[最新完成K线位置]<新低[前笔低点位置] Then
                Begin
                  笔状态[最新完成K线位置]=向下笔延伸;
                  //向上笔区间大于向下笔区间的特殊情况
                  If 新高[今笔高点位置]>新高[前笔高点位置] Then
                  Begin
                    K线类型[最新完成K线位置]=下破;
                        K线类型[前笔低点位置]=废弃的底;
                        K线类型[前笔高点位置]=废弃的顶;
                        笔尖[前笔低点位置]=Invalid;
                        笔尖[前笔高点位置]=Invalid;
                        笔[前笔高点位置]=Invalid;
                        笔[前笔低点位置]=Invalid;
//                        If TL_ID[前笔高点位置]<>-1 Then
//                          Tl_Delete(TL_ID[前笔高点位置]);
                        //查找合适的笔尖
                        i=前笔高点位置+1;
                        While i<DataCount Do
                        Begin
                          //查找符合的顶或底
                          If K线类型=顶 Then
                          Begin
                            If 笔尖>=新高[前笔高点位置] Then
                                Begin
                                  找到符合K线=True;
                                  Break;
                                End Else Begin
                                  K线类型=废弃的顶;
                                  笔尖=Invalid;
                                  笔=Invalid;
//                                  Tl_Delete(TL_ID);
                                End;
                          End Else Begin
                            If K线类型=底 Then
                                Begin
                                  前笔低点位置=i;
                                  If 笔尖<=新低[今笔低点位置] Then
                                  Begin
                                    找到符合K线=True;
                                        Break;
                                  End Else Begin
                                    K线类型=废弃的底;
                                        笔尖=Invalid;
                                        笔=Invalid;
//                                        Tl_Delete(TL_ID);
                                  End;
                                End;
                          End;
                          i++;
                        End;                       
                        //找到向下笔或找不到符合的笔
                        If (找到符合K线=True And K线类型=底) Or 找到符合K线=False Then
                        Begin                          
                          前笔高点位置=今笔高点位置;
                          K线类型[今笔高点位置]=顶;
                          笔尖[今笔高点位置]=新高[今笔高点位置];
                          笔[今笔高点位置]=笔尖[今笔高点位置];
                          笔计数=0;
//                          If 找到符合K线=True Then
//                            Tl_SetEnd(TL_ID,Date[前笔高点位置],Time[前笔高点位置],笔尖[前笔高点位置]);
                          i=今笔高点位置-1;
                          While i>=最新完成K线位置 Do
                          Begin
                            If (High>新高 And Low>新低) Or
                                   (High<新高 And Low<新低) Then
                                  笔计数++;
                                  i--;
                          End;
                          If 笔计数<2 Or (笔计数>1 And 新低[最新完成K线位置]>=分型区间下沿[今笔高点位置]) Then
                            笔状态[最新完成K线位置]=向上笔分型构造;
                        End Else
                          If 找到符合K线=True And K线类型=顶 Then
                          Begin                            
                        今笔高点位置=i;
                                前笔高点位置=i;
                                笔计数=旧笔;
//                                Tl_Delete(TL_ID[前笔高点位置]);
                          End;
                  End Else Begin
                        i=前笔高点位置;
                        找到符合K线=True;
                    K线类型[前笔低点位置]=废弃的底;
                        笔尖[前笔低点位置]=Invalid;
                        笔[前笔低点位置]=Invalid;
//                        If TL_ID[前笔高点位置]<>-1 Then
//                          Tl_Delete(TL_ID[前笔高点位置]);
                        今笔高点位置=前笔高点位置;
                        笔计数=旧笔;
                  End;                  
                  //查找前笔低点
                  If 找到符合K线=True And K线类型=顶 Then
                  Begin
                    i++;
                    While i<DataCount Do
                    Begin
                      If 找到符合K线=True And K线类型=底 Then
                          Begin
                            前笔低点位置=i;
                    Break;
                          End;
                          i++;
                End;
                  End;
                  今笔低点位置=最新完成K线位置;
                End;
          End;
    End
  End;
End;

//3.3 上涨K线
If K线方向[最新完成K线位置]=上涨 Then
Begin
  Switch(笔状态[最新完成K线位置+1]) Begin
    Case 向下笔分型构造:
      Begin       
          If 新高[最新完成K线位置]>分型区间上沿[前笔低点位置] Then
          Begin
            笔状态[最新完成K线位置]=向上笔延伸;
                今笔高点位置=最新完成K线位置;
          End Else begin
            If High[最新完成K线位置]=分型区间上沿[前笔低点位置] Then
                  今笔高点位置=最新完成K线位置;
                end;
          End
          
        Case 向上笔延伸:
          If High[最新完成K线位置]>=新高[今笔高点位置] Then
            今笔高点位置=最新完成K线位置;
               
        Default: Begin
          //向下笔完成
          If K线方向[最新完成K线位置+1]=下跌 And
             笔状态[最新完成K线位置+1]=向下笔延伸 And
             新低[最新完成K线位置+1]=新低[今笔低点位置] And
                 ((笔计数>新笔 And 新笔标准=True And
                   (今笔高点位置-今笔低点位置)>新笔周期) Or
                   (笔计数>旧笔)) Then
          Begin                  
                  K线类型[今笔低点位置]=底;
                  笔状态[最新完成K线位置]=向下笔分型构造;
                  笔计数=1;
                  笔尖[今笔低点位置]=新低[今笔低点位置];
                  笔[今笔低点位置]=新低[今笔低点位置];
                  前笔低点位置=今笔低点位置;
                  今笔高点位置=最新完成K线位置;
//                  TL_ID[前笔高点位置]=Tl_New(Date[前笔高点位置],Time[前笔高点位置],新高[前笔高点位置],
//                                             Date[前笔低点位置],Time[前笔低点位置],笔尖[前笔低点位置]);
//              Tl_SetColor(TL_ID[前笔高点位置],COLORYELLOW);
//                  Tl_SetStyle(TL_ID[前笔高点位置],3);
          End Else Begin
            找到符合K线=False;
            If 新高[最新完成K线位置]>新高[前笔高点位置] Then
                Begin
                  笔状态[最新完成K线位置]=向上笔延伸;
                  //向下笔区间大于向上笔区间的特殊情况
                  If 新低[今笔低点位置]<新低[前笔低点位置] Then
                  Begin
                    K线类型[最新完成K线位置]=上破;
                        K线类型[前笔低点位置]=废弃的底;
                        K线类型[前笔高点位置]=废弃的顶;
                        笔尖[前笔低点位置]=Invalid;
                        笔尖[前笔高点位置]=Invalid;
                        笔[前笔低点位置]=Invalid;
                        笔[前笔高点位置]=Invalid;
//                        If TL_ID[前笔低点位置]<>-1 Then
//                          Tl_Delete(TL_ID[前笔低点位置]);
                        //查找合适的笔尖
                        i=前笔低点位置+1;
                        While i<DataCount Do
                        Begin
                          //查找符合的顶或底
                          If K线类型=顶 Then
                          Begin
                            前笔高点位置=i;
                            If 笔尖>=新高[今笔高点位置] Then
                                Begin
                                  找到符合K线=True;
                                  Break;
                                End Else Begin
                                  K线类型=废弃的顶;
                                  笔尖=Invalid;
                                  笔=Invalid;
//                                  Tl_Delete(TL_ID);
                                End;
                          End Else Begin
                            If K线类型=底 Then
                                Begin
                                  If 笔尖<=新低[今笔低点位置] Then
                                  Begin
                                    找到符合K线=True;
                                        Break;
                                  End Else Begin
                                    K线类型=废弃的底;
                                        笔尖=Invalid;
                                        笔=Invalid;
//                                        Tl_Delete(TL_ID);
                                  End;
                                End;
                          End;
                          i++;
                        End;                       
                        //找到向上笔或找不到符合的笔
                        If (找到符合K线=True And K线类型=顶) Or 找到符合K线=False Then
                        Begin                                               
                          前笔低点位置=今笔低点位置;
                          K线类型[今笔低点位置]=底;
                          笔尖[今笔低点位置]=新低[今笔低点位置];
                          笔[今笔低点位置]=新低[今笔低点位置];
                          笔计数=0;
//                          If 找到符合K线=True Then
//                            Tl_SetEnd(TL_ID,Date[前笔低点位置],Time[前笔低点位置],笔尖[前笔低点位置]);
                          i=今笔低点位置-1;
                          While i>=最新完成K线位置 Do
                          Begin
                            If (High>新高 And Low>新低) Or
                                   (High<新高 And Low<新低) Then
                                  笔计数++;
                                  i--;
                          End;
                          
                          If 笔计数<2 Or (笔计数>1 And 新高[最新完成K线位置]<=分型区间上沿[今笔低点位置]) Then
                            笔状态[最新完成K线位置]=向下笔分型构造;
                          
                        End Else
                          If 找到符合K线=True And K线类型=底 Then
                          Begin
                        今笔低点位置=i;
                                前笔低点位置=i;
                                笔计数=旧笔;
//                                Tl_Delete(TL_ID[前笔低点位置]);
                          End;
                  End Else Begin
                        i=前笔低点位置;
                        找到符合K线=True;
                    K线类型[前笔高点位置]=废弃的顶;
                        笔尖[前笔高点位置]=Invalid;
                        笔[前笔高点位置]=Invalid;
//                        If TL_ID[前笔低点位置]<>-1 Then
//                          Tl_Delete(TL_ID[前笔低点位置]);
                        今笔低点位置=前笔低点位置;
                        笔计数=旧笔;
                  End;                  
                  //查找前笔高点
                  If 找到符合K线=True And K线类型=底 Then
                  Begin
                    i++;
                    While i<DataCount Do
                    Begin
                      If 找到符合K线=True And K线类型=顶 Then
                          Begin
                            前笔高点位置=i;
                    Break;
                          End;
                          i++;
                End;
                  End;
                  今笔高点位置=最新完成K线位置;
                End;
          End;
        End
  End;
End;




debug版(能看到更多变量):














benyip 发表于 2013-12-5 15:38:34

做了小修改,之前复制的请更新 :P

benyip 发表于 2013-12-5 16:16:49

效果如图:
新笔:


旧笔:

客服_wenwen 发表于 2013-12-5 17:23:05

{:4_86:}
{:4_92:}

John 发表于 2013-12-5 17:26:21

{:4_86:}

ptLibert 发表于 2013-12-5 17:59:26

景仰。

zzm930925 发表于 2013-12-5 19:15:01

{:3_41:}膜拜

fantasynew 发表于 2013-12-5 20:01:25

感谢分享大作,收下研究

fantasynew 发表于 2013-12-5 20:05:19

请问有引用未来数据吗?即画线会根据新k线改变

justtemp 发表于 2013-12-6 07:59:37

{:4_86:}有如滔滔江水。。。
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 已更新【回馈金魔方论坛1】缠论分笔(金魔方语言,逐根)