benyip 发表于 2013-12-9 23:28:19

已更新【回馈金魔方论坛2】缠论分笔缺口版

本帖最后由 benyip 于 2013-12-21 22:09 编辑

参数说明:
1、新笔标准同回馈1;

2、缺口处理            1:处理缺口 0:不处理缺口 (缺口定义:大于前一笔区间才算缺口)

3、限制高低同回馈1前提3       1:要求一笔高低 0:不要求一笔高低

//逐根
#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,0,1,1),
  缺口处理(1,0,1,1),
  限制高低(1,0,1,1);
  
VARIABLE:
  新高(0),新低(0),笔状态(0),K线方向(0),              //连续
  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),        //成笔条件
  NumericSimple 缺口(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[顶位置];
        笔[顶位置]=High[顶位置];
        今笔高点位置=顶位置;       
        今笔低点位置=最新完成K线位置;
        前笔高点位置=顶位置;
        前笔低点位置=底位置;
  End Else Begin
  //3.1.2 上涨K线
    If 新K形成 And K线方向[最新完成K线位置]=上涨 Then
    Begin
          K线类型[底位置]=底;
          笔状态[最新完成K线位置]=向下笔分型构造;  
          笔计数=1;
          笔尖[底位置]=Low[底位置];
          笔[底位置]=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 向上笔完成
          成笔条件=K线方向[最新完成K线位置+1]=上涨 And
             笔状态[最新完成K线位置+1]=向上笔延伸 And
             新高[最新完成K线位置+1]=新高[今笔高点位置]  And
             ((笔计数>新笔 And 新笔标准=True And (今笔低点位置-今笔高点位置)>新笔周期) Or
                 (笔计数>旧笔));
          If 成笔条件 Or (缺口处理 And 缺口) Then
          Begin       
            
                K线类型[今笔高点位置]=顶;
                笔状态[最新完成K线位置]=向上笔分型构造;
                笔计数=1;
                笔尖[今笔高点位置]=新高[今笔高点位置];
                笔[今笔高点位置]=新高[今笔高点位置];
                前笔高点位置=今笔高点位置;
                今笔低点位置=最新完成K线位置;
//                TL_ID[前笔低点位置]=Tl_New(Date[前笔低点位置],Time[前笔低点位置],新低[前笔低点位置],
//                                           Date[前笔高点位置],Time[前笔高点位置],笔尖[前笔高点位置]);
//                Tl_SetColor(TL_ID[前笔低点位置],ColorYellow);
//                Tl_SetStyle(TL_ID[前笔低点位置],3);               
                If 缺口处理 Then
                Begin
                  If 分型区间下沿[今笔高点位置]=笔尖[前笔低点位置] then
                    分型区间下沿[今笔高点位置]=新低[今笔低点位置];
                  If High[今笔低点位置]<新低[前笔低点位置] Then
            缺口=True;
                  Else
                    缺口=False;
        End;
             成笔条件=False;       
          End Else Begin
          //3.2.3.2 向上笔完成前
                //突破向下笔的低点
                找到符合K线=False;
            If 新低[最新完成K线位置]<新低[前笔低点位置] Then
                Begin
                  笔状态[最新完成K线位置]=向下笔延伸;
                  //向上笔区间大于向下笔区间的特殊情况
                  If 新高[今笔高点位置]>新高[前笔高点位置] And 限制高低=True 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 向下笔分型构造:
          If 新高[最新完成K线位置]>分型区间上沿[前笔低点位置] Then
          Begin
            笔状态[最新完成K线位置]=向上笔延伸;
                今笔高点位置=最新完成K线位置;
          End Else
            If High[最新完成K线位置]=分型区间上沿[前笔低点位置] Then
                  今笔高点位置=最新完成K线位置;
          
        Case 向上笔延伸:
          If High[最新完成K线位置]>=新高[今笔高点位置] Then
            今笔高点位置=最新完成K线位置;
               
        Default: Begin
          //向下笔完成
                 
          成笔条件=K线方向[最新完成K线位置+1]=下跌 And
             笔状态[最新完成K线位置+1]=向下笔延伸 And
             新低[最新完成K线位置+1]=新低[今笔低点位置] And
                 ((笔计数>新笔 And 新笔标准=True And (今笔高点位置-今笔低点位置)>新笔周期)
                 Or (笔计数>旧笔));
          If 成笔条件 Or (缺口处理 And 缺口) Then
          Begin
                K线类型[今笔低点位置]=底;
                笔状态[最新完成K线位置]=向下笔分型构造;
                笔计数=1;
                笔尖[今笔低点位置]=新低[今笔低点位置];
                笔[今笔低点位置]=新低[今笔低点位置];
                前笔低点位置=今笔低点位置;
                今笔高点位置=最新完成K线位置;
//                TL_ID[前笔高点位置]=Tl_New(Date[前笔高点位置],Time[前笔高点位置],新高[前笔高点位置],
//                                           Date[前笔低点位置],Time[前笔低点位置],笔尖[前笔低点位置]);
//            Tl_SetColor(TL_ID[前笔高点位置],COLORYELLOW);
//                Tl_SetStyle(TL_ID[前笔高点位置],3);
                If 缺口处理 Then
                Begin
                  If 分型区间上沿[今笔低点位置]=笔尖[前笔高点位置] Then
                        分型区间上沿[今笔低点位置]=新高[今笔高点位置];
                  If Low[今笔高点位置]>新高[前笔高点位置] Then
                    缺口=True;
                  Else
                    缺口=False;
                End;
            成笔条件=False;
          End Else Begin
            找到符合K线=False;
            If 新高[最新完成K线位置]>新高[前笔高点位置] Then
                Begin
                  笔状态[最新完成K线位置]=向上笔延伸;
                  //向下笔区间大于向上笔区间的特殊情况
                  If 新低[今笔低点位置]<新低[前笔低点位置]  And 限制高低=True  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;
















benyip 发表于 2013-12-9 23:31:24

本帖最后由 benyip 于 2013-12-9 23:49 编辑

不要求一笔高低:



要求一笔高低:


处理缺口要求高低:


不处理缺口要求高低:


不处理缺口不要求高低:



benyip 发表于 2013-12-9 23:39:01

各取所需。。。。{:4_103:}

benyip 发表于 2013-12-9 23:41:40

源码缺口比较语句那里,大家可以自定义多大距离才为缺口

客服_wenwen 发表于 2013-12-10 08:46:32

{:4_92:}

chenjiaq 发表于 2013-12-10 12:05:20

谢谢提供分享                        

justtemp 发表于 2013-12-10 15:43:28

benyip 发表于 2013-12-9 23:41 static/image/common/back.gif
源码缺口比较语句那里,大家可以自定义多大距离才为缺口

严重支持,感谢~

骑马追牛 发表于 2013-12-10 18:01:22

:D膜拜高手,顶帖。

骑马追牛 发表于 2013-12-14 21:40:12

优秀的指标贴,要顶:D

kpgood 发表于 2013-12-14 23:40:43

谢谢提供分享                        
页: [1] 2 3 4 5 6
查看完整版本: 已更新【回馈金魔方论坛2】缠论分笔缺口版