以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  公式模型编写问题提交  (http://weistock.com/bbs/list.asp?boardid=4)
----  [求助]请教老师画线的问题  (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=73466)

--  作者:tom2046
--  发布时间:2014/12/23 16:38:20
--  [求助]请教老师画线的问题
请教老师把下面这个金魔方的画线程序给改成金字塔能用的,谢谢。

// 该指标显示为主图指标,不是独立坐标
// #MAINCHART
//逐根
#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(0),                //连续
  K线类型(0), 分型区间上沿(0), 分型区间下沿(0), 笔尖(0),  //离散
  
  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线处理


  
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;
Tl_Delete(TL_ID[前笔高点位置]);
//查找合适的笔尖
i=前笔高点位置+1;
While i<DataCount Do
Begin
 //查找符合的顶或底
 If K线类型[i]=顶 Then 
 Begin
   If 笔尖[i]>新高[今笔高点位置] Then
Begin
 找到符合K线=True;
 Break;
End Else Begin
 K线类型[i]=废弃的顶;
 笔尖[i]=Invalid;
 Tl_Delete(TL_ID[i]);
End;
 End Else Begin
   If K线类型[i]=底 Then
Begin
 前笔低点位置=i;
 If 笔尖[i]<新低[最新完成K线位置] Then
 Begin
   找到符合K线=True;
Break;
 End Else Begin
   K线类型[i]=废弃的底;
笔尖[i]=Invalid;
Tl_Delete(TL_ID[i]);
 End;
End;
 End;
 i++;
End;
//找到向下笔或找不到符合的笔
If (找到符合K线=True And K线类型[i]=底) Or 找到符合K线=False Then
Begin  
 前笔高点位置=今笔高点位置;
 K线类型[今笔高点位置]=顶;
 笔尖[今笔高点位置]=新高[今笔高点位置];
 笔计数=0;
 Tl_SetEnd(TL_ID[i],Date[前笔高点位置],Time[前笔高点位置],笔尖[前笔高点位置]);
 i=今笔高点位置-1;
 While i>=最新完成K线位置 Do
 Begin
   If (High[最新完成K线位置]>新高[最新完成K线位置+1] And 
                   Low[最新完成K线位置]>新低[最新完成K线位置+1]) Or
  (High[最新完成K线位置]<新高[最新完成K线位置+1] And 
                   Low[最新完成K线位置]<新低[最新完成K线位置+1]) Then
 笔计数++;
 i--;
 End;
 If 笔计数<2 Or (笔计数>1 And 新低[i]>=分型区间下沿[今笔高点位置]) Then
   笔状态[最新完成K线位置]=向上笔分型构造;
End Else
 If 找到符合K线=True And K线类型[i]=顶 Then
 Begin    
       今笔高点位置=i;
前笔高点位置=i;
笔计数=旧笔;
 End;
 End Else Begin
i=前笔高点位置;
找到符合K线=True;
   K线类型[前笔低点位置]=废弃的底;
笔尖[前笔低点位置]=Invalid;
Tl_Delete(TL_ID[前笔高点位置]);
今笔高点位置=前笔高点位置;
笔计数=旧笔;
 End;  
 //查找前笔低点
 If 找到符合K线=True And K线类型[i]=顶 Then
 Begin
   i++;
   While i<DataCount Do
   Begin
     If 找到符合K线=True And K线类型[i]=底 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 
 //向下笔完成
 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;
Tl_Delete(TL_ID[前笔低点位置]);
//查找合适的笔尖
i=前笔低点位置+1;
While i<DataCount Do
Begin
 //查找符合的顶或底
 If K线类型[i]=顶 Then 
 Begin
   前笔高点位置=i;
   If 笔尖[i]>新高[最新完成K线位置] Then
Begin
 找到符合K线=True;
 Break;
End Else Begin
 K线类型[i]=废弃的顶;
 笔尖[i]=Invalid;
 Tl_Delete(TL_ID[i]);
End;
 End Else Begin
   If K线类型[i]=底 Then
Begin
 If 笔尖[i]<新低[今笔低点位置] Then
 Begin
   找到符合K线=True;
Break;
 End Else Begin
   K线类型[i]=废弃的底;
笔尖[i]=Invalid;
Tl_Delete(TL_ID[i]);
 End;
End;
 End;
 i++;
End;
//找到向上笔或找不到符合的笔
If (找到符合K线=True And K线类型[i]=顶) Or 找到符合K线=False Then
Begin  
 前笔低点位置=今笔低点位置;
 K线类型[今笔低点位置]=底;
 笔尖[今笔低点位置]=新低[今笔低点位置];
 笔计数=0;
 Tl_SetEnd(TL_ID[i],Date[前笔低点位置],Time[前笔低点位置],笔尖[前笔低点位置]);
 i=今笔低点位置-1;
 While i>=最新完成K线位置 Do
 Begin
   If (High[最新完成K线位置]>新高[最新完成K线位置+1] And 
                   Low[最新完成K线位置]>新低[最新完成K线位置+1]) Or
  (High[最新完成K线位置]<新高[最新完成K线位置+1] And 
                   Low[最新完成K线位置]<新低[最新完成K线位置+1]) Then
 笔计数++;
 i--;
 End;
 If 笔计数<2 Or (笔计数>1 And 新高[i]<=分型区间上沿[今笔低点位置]) Then
   笔状态[最新完成K线位置]=向下笔分型构造;
End Else
 If 找到符合K线=True And K线类型[i]=底 Then
 Begin
       今笔低点位置=i;
前笔低点位置=i;
笔计数=旧笔;
 End;
 End Else Begin
i=前笔低点位置;
找到符合K线=True;
   K线类型[前笔高点位置]=废弃的顶;
笔尖[前笔高点位置]=Invalid;
Tl_Delete(TL_ID[前笔低点位置]);
今笔低点位置=前笔低点位置;
笔计数=旧笔;
 End;  
 //查找前笔高点
 If 找到符合K线=True And K线类型[i]=底 Then
 Begin
   i++;
   While i<DataCount Do
   Begin
     If 找到符合K线=True And K线类型[i]=顶 Then
 Begin
   前笔高点位置=i;
           Break;
 End;
 i++;
       End;
 End;
 今笔高点位置=最新完成K线位置;
End;
 End;
End
  End;
End;

//DrawLine(K线类型=顶,新高,K线类型=底,新低,0);
//DrawLine(K线类型=底,新低,K线类型=顶,新高,0);

--  作者:jinzhe
--  发布时间:2014/12/23 16:51:55
--  

这样看上去太吃力,能讲下策略思路吗?


--  作者:tom2046
--  发布时间:2014/12/23 18:58:36
--  
其实就是缠的K线合并处理分型后的笔的划分,如下图:

图片点击可在新窗口打开查看此主题相关图片如下:qq截图20141223185636.jpg
图片点击可在新窗口打开查看


--  作者:tom2046
--  发布时间:2014/12/23 19:05:28
--  
其实就是缠的K线合并处理分型后的笔的划分,因为我不懂编程,所以不知道如何用程序实现,但好像这个程序用的函数都没有太特别的,应该改成金字塔可识别的函数就可以了吧?运行结果如下图:

图片点击可在新窗口打开查看此主题相关图片如下:qq截图20141223185636.jpg
图片点击可在新窗口打开查看

--  作者:jinzhe
--  发布时间:2014/12/24 8:57:35
--  

 太复杂了,无法处理