Skip to content

chan2zen/rust-chan

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Rust 实现缠论(缠中说禅)的通达信插件

使用方法

rustup target add  i686-pc-windows-msvc
cargo build --release --target i686-pc-windows-msvc
copy .\target\i686-pc-windows-msvc\release\zen_stock.dll C:\tdx\T0002\dlls

通达信公式

绑定到第二个dll,并编辑公式如下:

1、 缠论端点和买卖点公式,命名为 ZEN2

BI_QK:=0; {是否缺口突破成笔, 1-是,0-否}
PIVOT:=1; {0 - 笔中枢, 1 - 段中枢, 2 - 走势中枢}
MODE:=(1+BI_QK*4) * 1000 + PIVOT * 10;
M_VALUE:=100; {获取转折点极值,端点最大最小值}
M_EDGE:=200; {获取转折点类型,笔、段、走势高低点}
M_SIG:=400; {买卖信号}
M_ZG:=200; {中枢高}
M_ZD:=300; {中枢低,如果出现中枢扩张,返回负值}
M_ZP:=100; {中枢起始位置, 返回 -2 和 2}
MERGE:=0;
FRAC_X:=TDXDLL2(1, HIGH, LOW, MODE+M_EDGE);
FRAC:IF(FRAC_X=-100 OR FRAC_X=-1 OR FRAC_X=-200 OR (MERGE<>1 AND FRAC_X=-3), -1, IF((MERGE<>1 AND FRAC_X=3) OR FRAC_X=1 OR FRAC_X=100 OR FRAC_X=200, 1, 0)); {笔极点}
DUAN:IF(FRAC_X=-100 OR FRAC_X=-200, -1, IF(FRAC_X=100 OR FRAC_X=200, 1, 0)); {段极点}
TIP:IF(FRAC_X=-200, -1, IF(FRAC_X=200, 1, 0)); {中阴段当前极点}
POLE_VALUE:TDXDLL2(1, HIGH, LOW, MODE+M_VALUE);
STATE:IF(FRAC_X>10 AND FRAC_X<>100, FRAC_X, 0);
SIG:TDXDLL2(2, HIGH, LOW, MODE+M_SIG);

XX:IF(FRAC_X=-3, -1, IF(FRAC_X=3, 1, DRAWNULL)); {中阴被合并的特征极点}
一买:SIG==1;
一卖:SIG==-1;
三买:SIG==3 OR SIG==23;
三卖:SIG==-3 OR SIG==-23;
二买:SIG==2 OR SIG==23;
二卖:SIG==-2 OR SIG==-23;

笔幅:IF(FRAC=-1, REF(POLE_VALUE, BARSLAST(FRAC=1)) - POLE_VALUE, IF(FRAC=1, POLE_VALUE - REF(POLE_VALUE, BARSLAST(FRAC=-1)), DRAWNULL));
笔天数:IF(FRAC=-1, BARSLAST(FRAC=1) + 1 , IF(FRAC=1, BARSLAST(FRAC=-1) + 1, DRAWNULL));
笔力度:IF(FRAC=1 OR FRAC=-1, 笔幅/笔天数*100, DRAWNULL);

段幅:IF(DUAN=-1, REF(POLE_VALUE, BARSLAST(DUAN=1)) - POLE_VALUE, IF(DUAN=1, POLE_VALUE - REF(L, BARSLAST(DUAN=-1)), DRAWNULL));
段天数:IF(DUAN=-1, BARSLAST(DUAN=1) + 1 , IF(DUAN=1, BARSLAST(DUAN=-1) + 1, DRAWNULL));
段力度:IF(DUAN=1 OR DUAN=-1, 段幅/段天数*100, DRAWNULL);

前笔天数:=IF(FRAC=-1, REF(笔天数, REF(BARSLAST(FRAC=-1), BARSLAST(FRAC=1)) + BARSLAST(FRAC=1)), REF(笔天数, REF(BARSLAST(FRAC=1), BARSLAST(FRAC=-1)) + BARSLAST(FRAC=-1)));
前笔幅:=IF(FRAC=-1, REF(笔幅, REF(BARSLAST(FRAC=-1), BARSLAST(FRAC=1)) + BARSLAST(FRAC=1)), REF(笔幅, REF(BARSLAST(FRAC=1), BARSLAST(FRAC=-1)) + BARSLAST(FRAC=-1)));
前笔力度:=IF(FRAC=-1, REF(笔力度, REF(BARSLAST(FRAC=-1), BARSLAST(FRAC=1)) + BARSLAST(FRAC=1)), REF(笔力度, REF(BARSLAST(FRAC=1), BARSLAST(FRAC=-1)) + BARSLAST(FRAC=-1)));

前段天数:=IF(DUAN=-1, REF(段天数, REF(BARSLAST(DUAN=-1), BARSLAST(DUAN=1)) + BARSLAST(DUAN=1)), REF(段天数, REF(BARSLAST(DUAN=1), BARSLAST(DUAN=-1)) + BARSLAST(DUAN=-1)));
前段幅:=IF(DUAN=-1, REF(段幅, REF(BARSLAST(DUAN=-1), BARSLAST(DUAN=1)) + BARSLAST(DUAN=1)), REF(段幅, REF(BARSLAST(DUAN=1), BARSLAST(DUAN=-1)) + BARSLAST(DUAN=-1)));
前段力度:=IF(DUAN=-1, REF(段力度, REF(BARSLAST(DUAN=-1), BARSLAST(DUAN=1)) + BARSLAST(DUAN=1)), REF(段力度, REF(BARSLAST(DUAN=1), BARSLAST(DUAN=-1)) + BARSLAST(DUAN=-1)));

笔极量能:IF(FRAC=-1 OR FRAC=1, HHV(V, 5), DRAWNULL);
段极量能:IF(DUAN=-1 OR DUAN=1, HHV(V, 5), DRAWNULL);
前笔极量能:=IF(FRAC=-1, REF(笔极量能, REF(BARSLAST(FRAC=-1), BARSLAST(FRAC=1)) + BARSLAST(FRAC=1)), REF(笔极量能, REF(BARSLAST(FRAC=1), BARSLAST(FRAC=-1)) + BARSLAST(FRAC=-1)));
前段极量能:=IF(DUAN=-1, REF(段极量能, REF(BARSLAST(DUAN=-1), BARSLAST(DUAN=1)) + BARSLAST(DUAN=1)), REF(段极量能, REF(BARSLAST(DUAN=1), BARSLAST(DUAN=-1)) + BARSLAST(DUAN=-1)));

笔背离:笔天数 >= 前笔天数 AND (笔幅 < 前笔幅 OR 笔力度 < 前笔力度);
段背离:段天数 >= 前段天数 AND (段幅 < 前段幅 OR 段力度 < 前段力度);

BISE:TDXDLL2(2, HIGH, LOW, MODE+M_ZP);
INSE:=BACKSET(BISE=2, BARSLAST(BISE=-2)+1);
BIZG_ORIG:=TDXDLL2(2, HIGH, LOW, MODE+M_ZG);
BIZD_ORIG:=TDXDLL2(2, HIGH, LOW, MODE+M_ZD);
BIZG:ABS(BIZG_ORIG);
BIZD:ABS(BIZD_ORIG);
BIEXT:BIZG_ORIG<0,NODRAW;

前中枢数量:=REF(COUNT(BISE=-2, BARSLAST(ABS(DUAN)=1)), 1);
背驰比较点:=(ABS(DUAN)=1 OR BISE=2) AND 前中枢数量 > 0;

段起点:=REF(BARSLAST(ABS(DUAN)=1), 1) + 1;
前中枢起点:=REF(BARSLAST(BISE=-2), 1) + 1;
前中枢终点:=BARSLAST(BISE=2);
向上:DUAN=1 OR (DUAN!=-1 AND BARSLAST(DUAN=-1) < BARSLAST(DUAN=1));
前前中枢终点:=IF(前中枢数量=1, REF(BARSLAST(ABS(DUAN)=1), 1) + 1, REF(BARSLAST(BISE=2), 前中枢起点) + 前中枢起点),NODRAW;

小B幅:IF(背驰比较点, ABS(IF(向上, REF(POLE_VALUE, 前中枢终点), REF(POLE_VALUE, 前中枢终点)) - POLE_VALUE), DRAWNULL),NODRAW;
小B天数:IF(背驰比较点,  前中枢终点+1, DRAWNULL),NODRAW;
小A幅:IF(背驰比较点, ABS(IF(向上, REF(POLE_VALUE, 前前中枢终点), REF(POLE_VALUE, 前前中枢终点)) - IF(向上, REF(POLE_VALUE, 前中枢起点), REF(POLE_VALUE, 前中枢起点))) , DRAWNULL),NODRAW;
小A天数:IF(背驰比较点, 前前中枢终点 - 前中枢起点 + 1, DRAWNULL),NODRAW;
背驰:小B幅 > 0 AND 小A幅 > 0 AND ((小B天数 >= 小A天数 AND 小B幅 < 小A幅) OR 小B幅/小B天数 < 小A幅/小A天数);

2、专家系统公式

{多头买入(买开)} ENTERLONG: ZEN2.一买;
{多头卖出(卖平)} EXITLONG: ZEN2.一卖;
{空头卖出(卖开)} ENTERSHORT: ZEN2.三卖;
{空头买入(买平)} EXITSHORT: ZEN2.三买;

3、主图绘图公式

FRAC:=ZEN2.FRAC,NODRAW;
DUAN1:=ZEN2.DUAN;
信号:ZEN2.SIG,NODRAW;
笔背:ZEN2.笔背离,NODRAW;
段背:ZEN2.段背离,NODRAW;
背驰:ZEN2.背驰,NODRAW;

笔幅:ZEN2.笔幅,NODRAW;
笔天数:ZEN2.笔天数,NODRAW;
段幅:ZEN2.段幅,NODRAW;
笔力度:ZEN2.笔力度,NODRAW;

DRAWLINE(FRAC=-1,ZEN2.POLE_VALUE,FRAC=+1,ZEN2.POLE_VALUE,0), DOTLINE, COLORRED;
DRAWLINE(FRAC=+1,ZEN2.POLE_VALUE,FRAC=-1,ZEN2.POLE_VALUE,0), DOTLINE, COLORRED;

BISE:=ZEN2.BISE;
BIZG:=ZEN2.BIZG;
BIZD:=ZEN2.BIZD;

NOTEXT_BIZG:IF(BIZG>0,BIZG,DRAWNULL),COLORBROWN;
NOTEXT_BIZD:IF(BIZD>0,BIZD,DRAWNULL),COLORBROWN;
NOTEXT_BISE:STICKLINE(BISE=-2 OR BISE=2,BIZD,BIZG,0,0),COLORBROWN;

DRAWLINE(DUAN1=-1,ZEN2.POLE_VALUE,DUAN1=+1,ZEN2.POLE_VALUE,0), LINETHICK2, COLORFF8000;
DRAWLINE(DUAN1=+1,ZEN2.POLE_VALUE,DUAN1=-1,ZEN2.POLE_VALUE,0), LINETHICK2, COLORFF8000;

DRAWLINE(DUAN1=-1,ZEN2.POLE_VALUE,DUAN1=+2,ZEN2.POLE_VALUE,0), LINETHICK2, COLORLIBLUE;
DRAWLINE(DUAN1=+1,ZEN2.POLE_VALUE,DUAN1=-2,ZEN2.POLE_VALUE,0), LINETHICK2, COLORLIBLUE;

DRAWICON(ZEN2.笔背离, IF(FRAC=-1,H, L), 31);
DRAWICON(ZEN2.段背离, IF(DUAN1=-1,H, L), 32);
DRAWICON(ZEN2.背驰, IF(FRAC=-1,H,L), 8);

4、采用强弱顶底分型作为笔和线段主图指标

MERGE:=0;
LEAP:=0;
BI_QK:=0; {是否缺口突破成笔}
PIVOT:=0; {0 - 笔中枢, 1 - 段中枢, 2 - 走势中枢}
MODE:=(1+BI_QK*4) * 1000 + PIVOT * 10;
M_VALUE:=100; {获取转折点极值,端点最大最小值}
M_EDGE:=200; {获取转折点类型,笔、段、走势高低点}
M_FX:=500; {分型}
M_SIG:=400; {买卖信号}
M_ZG:=200; {中枢高}
M_ZD:=300; {中枢低,如果出现中枢扩张,返回负值}
M_ZP:=100; {中枢起始位置, 返回 -2 和 2}
POLE_VALUE:=TDXDLL2(1, HIGH, LOW, MODE+M_VALUE),NODRAW;
FXX:TDXDLL2(2, HIGH, LOW, MODE+M_FX),NODRAW;
FX:=IF(FXX==-1 OR FXX==-2, -1, IF(FXX==1 OR FXX==2, 1, 0)),NODRAW;
FB:=TFILTER(FXX==-2, FXX==2, 1),NODRAW;
FS:=TFILTER(FXX==-2, FXX==2, 2),NODRAW;
DRAWLINE(FX==-1,IF(POLE_VALUE<>DRAWNULL,POLE_VALUE,L),FX==+1,IF(POLE_VALUE<>DRAWNULL,POLE_VALUE,H),0), LINETHICK1, COLORRED;
DRAWLINE(FX==1,IF(POLE_VALUE<>DRAWNULL,POLE_VALUE,H),FX==-1,IF(POLE_VALUE<>DRAWNULL,POLE_VALUE,L),0), LINETHICK1, COLORRED;

DRAWLINE(FB==1,IF(POLE_VALUE<>DRAWNULL,POLE_VALUE,L),FS==+1,IF(POLE_VALUE<>DRAWNULL,POLE_VALUE,H),0), LINETHICK2, COLORRED;
DRAWLINE(FS==1,IF(POLE_VALUE<>DRAWNULL,POLE_VALUE,H),FB==1,IF(POLE_VALUE<>DRAWNULL,POLE_VALUE,L),0), LINETHICK2, COLORRED;

DRAWICON(FXX==2, L, 8);
DRAWICON(FXX==-2, H, 7);

5、选股公式,周期内最近7天有2买

N=7;
B1B:=BARSLAST(ZEN2.SIG=1);
B2B:=BARSLAST(ZEN2.SIG=2);
B1B > B2B AND B2B < N;