切换到宽版
  • 723阅读
  • 0回复

金魔方缠论分笔公式 [复制链接]

上一主题 下一主题
离线白山
 

发帖
3187
金币
11739
威望
113
贡献值
18
开心币
365
只看楼主 倒序阅读 使用道具 楼主  发表于: 2021-01-29
金魔方缠论分笔公式(源码作者 benyip: zqbenye@163.com

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

//DrawLine(K线类型=顶,新高,K线类型=底,新低,0);
//DrawLine(K线类型=底,新低,K线类型=顶,新高,0);
成功=艰苦劳动+正确方法+少说空话 --爱因斯坦
快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个