以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (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线合并处理分型后的笔的划分,如下图: |
-- 作者:tom2046 -- 发布时间:2014/12/23 19:05:28 -- 其实就是缠的K线合并处理分型后的笔的划分,因为我不懂编程,所以不知道如何用程序实现,但好像这个程序用的函数都没有太特别的,应该改成金字塔可识别的函数就可以了吧?运行结果如下图: |
-- 作者:jinzhe -- 发布时间:2014/12/24 8:57:35 -- 太复杂了,无法处理 |