1.java火焰如何实践?趋势
2.《BPF 之巅:洞悉Linux系统和应用性能》读书笔记(四)火焰图
3.火焰图使用
4.perf和火焰图使用方法
5.通达信捕捉牛股利器 条件选股公式
java火焰如何实践?
火焰图(Flame Graph)是一种可视化程序性能分析工具,由Brendan Gregg在年创造,火焰用于追踪程序函数调用与时间分配。源码火焰图通过矩形“火焰”形象展示函数调用栈,趋势宽度反映时间占比,火焰高度表示调用深度。源码tbf无源码遇到栈顶宽矩形表明性能瓶颈,趋势需重点优化。火焰火焰图分为CPU、源码Off-CPU、趋势Memory、火焰Hot/Cold、源码Differential类型,趋势分别针对不同场景。火焰CPU火焰图展现CPU占用情况,源码Off-CPU火焰图展示非CPU操作,如I/O、锁等待。冷热火焰图对比CPU与非CPU时间,Differential火焰图对比两次性能分析结果。Continuous Profiling技术在实际运行环境下收集性能数据,用于诊断和优化代码。更多实现方式可通过设计不同语言的Agent,集成Pyroscope等工具,实现精细化监控。Pyroscope开源仓库提供了火焰图组件源码,包括数据结构定义、jweixin 源码模型解析等关键部分。组件内部通过Maybe模型处理可能存在的null/undefined问题,确保操作安全。点击火焰图的流程涉及计算点击坐标对应的数据位置,使用xyToIndex、xyToData等方法实现。日志服务SLS优化了性能监控功能,融合了Pyroscope版本与日志服务特色,提供性能数据采集与监控服务。
火焰图(Flame Graph)是Brendan Gregg于年创建的一种程序性能分析可视化工具,它以图形方式直观展示程序函数调用栈以及函数调用所占时间比例。火焰图通过矩形“火焰”形象地呈现,宽度代表函数时间占比,高度反映函数调用深度。发现栈顶宽度较大的矩形,意味着存在性能瓶颈,应进行重点优化。
火焰图通常分为五种类型:CPU、Off-CPU、Memory、Hot/Cold、Differential,分别用于不同的分析场景。CPU火焰图专注于展示CPU活动,Off-CPU火焰图关注非CPU操作,如I/O、osask源码等待锁等。冷热火焰图对比CPU与非CPU时间分配,Differential火焰图则用于比较两次性能分析的结果。
Continuous Profiling是一种持续性能分析技术,能够在实际运行环境中收集代码行级别的性能数据,然后通过可视化呈现,帮助开发人员诊断问题和优化代码。与传统静态分析不同,Continuous Profiling不会显著影响应用性能,提供更准确的性能问题诊断,并支持在部署环境中进行优化和调试。
从实现角度看,火焰图可以视为“栈-值”数据结构的可视化展示,只要符合数据结构要求,任何数据都可以转化为火焰图的形式。例如,创始人Gregg提出的CPU、Off-CPU、Memory类型,可以扩展出更多应用场景,例如Pyroscope工具,通过Server和Agent两部分,记录、聚合和存储应用执行动作数据,支持不同语言的性能监控。
Pyroscope开源仓库提供了火焰图组件的routeros 源码源码解析,包括数据结构定义、模型解析等关键部分。源码分析聚焦于火焰图部分和模型定义,以及如何将数据从应用端收集并聚合到Server端。组件内部使用Maybe模型处理可能存在的null/undefined问题,提供安全且高效的数据操作方式。通过Maybe模型,可以轻松处理函数参数中的空值,避免在代码库中进行繁琐的空值检查。
火焰图组件内部数据结构与描述说明了点击火焰图的全流程,从点击开始,通过OnClick事件触发,核心方法xyToIndex计算点击坐标对应的数据位置。xyToIndex方法结合火焰图的状态分类,通过二分查找计算i位置,然后在i所在层级进行查找,确定j位置。xyToIndex方法与后续的xyToData等方法,共同实现点击火焰图时的数据获取流程。
在性能监控方面,日志服务SLS基于Pyroscope v0..1版本开发,并在此基础上进行了优化,提供性能数据的采集与监控服务。SLS性能监控功能融合了日志服务的特色能力,提供更全面的性能数据支持。此外,xpshop源码SLS性能监控文档提供了详细的功能介绍、数据查询方法、数据对比等信息,为开发者提供丰富资源进行性能分析与优化。
通过上述分析,火焰图作为性能分析工具,不仅提供直观的性能问题诊断方式,还通过持续优化和扩展,满足不同场景下的性能分析需求。Pyroscope等工具的集成与优化,使得火焰图在实际开发和运维中发挥重要作用,帮助开发者高效定位和解决问题,提升应用性能。
《BPF 之巅:洞悉Linux系统和应用性能》读书笔记(四)火焰图
确定 CPU 繁忙的原因是性能分析的关键,通常涉及分析堆栈跟踪。通过以固定速率采样进行分析,可以查看哪些代码路径很热,即 CPU 上繁忙的路径。这通常通过创建一个定时中断来工作,该中断收集当前程序计数器、函数地址或整个堆栈回溯,并在打印摘要报告时将这些内容转换为人类可读的内容。然而,分析数据可能长达数千行,并且难以理解。为了解决这个问题,火焰图被引入,它是采样堆栈跟踪的可视化,可以快速识别热代码路径。
火焰图背后的原理是使用 CPU 采样方法来获取正在某个 CPU 上执行的方法以及该方法的调用栈。在画图时,可以按照方法出现的频次进行颜色填充。但实际中,CPU 上发生的调用实在太多,得到的结果如同“发丝图”,难以分析。因此,需要进行同类项合并。从堆栈底部开始做同类项合并,虽然信息量有所减少,但仍然太多。解决办法是先对数据进行排序,然后合并同类项,这样就可以找出在 CPU 上执行时间比较长的方法,并且不需要关注方法的调用时间点。
火焰图如何制作?首先,通过性能分析获取 CPU 上执行的方法及其调用栈。然后,按照方法的出现频次进行颜色填充,形成火焰图。火焰图是 SVG ,可以与用户互动。通过鼠标悬浮,可以显示函数名、抽样次数以及占据总抽样次数的百分比。点击火焰图中的某一层,可以放大显示详细信息。按下 Ctrl + F 可以进行关键词或正则表达式的搜索,高亮显示符合条件的函数名。
火焰图分为 On-CPU 和 Off-CPU 两种类型。On-CPU 火焰图显示了在 CPU 上执行的时间比较长的函数,帮助识别性能问题。Off-CPU 火焰图则关注线程脱离 CPU 的事件,帮助分析等待事件和阻塞情况。在分析 Off-CPU 火焰图时,可以采用一些策略,如查看不了解的 kernel 方法的文档,安装内核源代码,查找 syscall.h,获取内核源代码并浏览相关文档。
火焰图是一种有效的性能分析工具,帮助识别热代码路径,找出性能瓶颈。通过火焰图的分析,可以优化代码,提升系统性能。
火焰图使用
火焰图是svg格式的矢量图,基于perf软件性能分析工具。通过记录和采样软件在系统上的行为数据,将信息图形化,形成直观的可视化数据矢量图。
使用perf脚本对指定进程进行采样,生成火焰图。火焰图显示函数块长度,表示采样量、工作频率和性能消耗。通过图象,用户能清晰看到自己代码的工作效率,便于针对性优化源码性能。
安装perf和FlameGraph是火焰图应用的基础。on-cpu火焰图聚焦于进程/线程在运行时的CPU使用情况。通过脚本抓取进程/线程数据,生成火焰图。注意,脚本不适用于监测睡眠中不工作的进程/线程。
火焰图能有效定位和分析代码问题。例如,优化前vsnprintf使用频率高,占6.7%,经分析后,调整日志过滤判断,优化后降至1.%,性能提升5个百分点。同样,火焰图揭示了std::list::size()接口的复杂度问题。
off-cpu火焰图针对进程/线程因阻塞操作而变慢的情况。通过分析慢操作数据,生成火焰图,提供深入性能洞察。了解详细原理,请参阅相关资料。
火焰图是性能分析的强大工具,通过图形化展示,帮助开发者识别性能瓶颈,优化代码,提升应用效率。
perf和火焰图使用方法
简介
perf是linux上的性能分析工具,用于统计或采样事件,以分析程序性能。
安装与编译
在编译内核时,可能遇到数据类型不匹配导致的warning被当作error的错误,通过在makefile中删除-Werror选项解决。
使用方法
使用perf前需了解其命令层级与功能,包括全局概览、全局细节、特定功能分析等。
perf list
查看当前系统支持的性能事件。
perf stat
分析系统/进程的整体性能概况。
perf top
实时查看当前系统进程函数占用率情况。
perf report
读取perf record生成的数据文件,并显示分析数据。
perf annotate
提供指令级别的record文件定位,显示汇编和源码信息。
perf record
记录一段时间内系统/进程的性能时间。
火焰图
可视化分析CPU占用情况,便于找到性能瓶颈。
总结
使用perf与火焰图,可以高效了解程序性能,指导问题分析与优化。
通达信捕捉牛股利器 条件选股公式
通达信选股公式:
条件选股公式源码:
年认同价:=MA(C,);
价格中枢:=(SUM(年认同价,0)/(BARSSINCE(年认同价>0)+));
箱顶:=价格中枢*1.2;
箱底:=价格中枢*0.8;
毛利润率:=FINANCE()/FINANCE();
成长价值:=年认同价*(1+毛利润率);
收益价值:=年认同价+FINANCE();
回调认同:=EMA(EXPMA(C,),);
多头:=(回调认同>REF(回调认同,1))AND(成长价值>REF(成长价值,1))AND(收益价值>REF(收益价值,1))AND(DYNAINFO(7)>0);
回调条件:=COUNT(C<回调认同,5)>=3;
回调突破:=(REF(C,1)<=REF(回调认同,1))AND(C>回调认同)AND(回调条件)AND多头;
成长条件:=COUNT(C<成长价值,5)>=3;
成长突破:=(REF(C,1)<=REF(成长价值,1))AND(C>成长价值)AND(成长条件)AND多头;
收益条件:=COUNT(C<收益价值,5)>=3;
收益突破:=(REF(C,1)<=REF(收益价值,1))AND(C>收益价值)AND(收益条件)AND多头;
箱底条件:=COUNT(C<箱底,5)>=3;
箱底突破:=(REF(C,1)<=REF(箱底,1))AND(C>箱底)AND(箱底条件)AND多头;
价格条件:=COUNT(C<价格中枢,5)>=3;
价格突破:=(REF(C,1)<=REF(价格中枢,1))AND(C>价格中枢)AND(价格条件)AND多头;
箱顶条件:=COUNT(C<箱顶,5)>=3;
箱顶突破:=(REF(C,1)<=REF(箱顶,1))AND(C>箱顶)AND(箱顶条件)AND多头;
突破买点:(回调突破+成长突破+收益突破+箱底突破+价格突破+箱顶突破);
专买老鼠仓
{ 老鼠仓}
AA1:=AMOUNT/V;
BB1:=L<AA1*0.9;
CC1:=(C-REF(C,1))/REF(C,1)*>1.2;
DD1:=L<MA(C,5)*0.;
EE1:=V<MA(V,5)*1.5;
FF1:=BB1 AND CC1 AND DD1 AND EE1;
DRAWTEXT(FF1,(LOW* 0.),'老鼠仓'),COLORFF;
老鼠仓是个很不错的指标,信号发出一般都在一个波段的底部起涨之时。
根据本人的实践,使用指标时候要注意几点:
1 该指标可以添加到任何一个主图里面去,比如MA均线什么的。
2 出现信号当天买进股票,第二天收阳继续持股,直到出阴为止。
3 第二天出阴考虑卖出,非常适合短线操作!
老鼠仓(选股公式)
AA1:=AMOUNT/V;
BB1:=L<AA1*0.9;
CC1:=(C-REF(C,1))/REF(C,1)*>1.2;
DD1:=L<MA(C,5)*0.;
EE1:=V<MA(V,5)*1.5;
老鼠仓:BB1AND CC1 AND DD1 AND EE1;
理想选股(选股公式)
VAR1:=MA((LOW+HIGH+CLOSE)/3,5);
VAR2:=CLOSE=HHV(C,4) AND REF(C,1)=LLV(C,4);
VAR3:=REF(C,1)=LLV(C,4) AND C>=REF(C,2) OR REF(C,2)=LLV(C,4) ANDREF(C,1)<=REF(C,3) AND REF(C,2)<REF(C,4) AND C>=REF(C,1);
VAR4:=VAR1>REF(VAR1,1) AND REF(VAR1,1)<REF(VAR1,2);
VAR5:=LOW<HHV(VAR1,) AND HIGH>HHV(VAR1,) AND CLOSE>REF(C,1) ANDCLOSE>OPEN;
VAR6:=VAR5 AND COUNT(VAR4,2);
VAR7:=VAR6 AND NOT(REF(VAR6,1));
VAR8:=*EMA(EMA(C-REF(C,1),6),6)/EMA(EMA(ABS(C-REF(C,1)),6),6);
VAR9:=EMA(MA(C,),);
VAR:=FILTER((LLV(VAR8,2)=LLV(VAR8,7) AND COUNT(VAR8<0,2) ANDCROSS(VAR8,MA(VAR8,2)))=1,5);
VAR:=SMA(EMA((C-REF(C,1))/REF(C,1),5)*,3,1)*;
VAR:=FILTER(((CROSS(VAR,0) OR CROSS(C,VAR9)) AND VAR)=1,3);
VAR:=MA(C,)>=REF(MA(C,),3) AND CROSS(C,MA(C,));
RSV:=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*;
K:=SMA(RSV,3,1);
D:=SMA(K,3,1);
J:=3*K-2*D;
金叉:=CROSS(J,D);
死叉:=CROSS(D,J);
买1:=(VAROR VAR) AND VAR;
买2:=(VAROR VAR) AND VAR3;
买3:=(VAROR VAR) AND VAR2;
买4:=(VAR2AND VAR) OR (VAR3 AND VAR);
买5:=(金叉AND VAR3) OR (金叉 AND VAR2) OR (金叉 AND VAR);
ST:=EXIST(C/REF(C,1)>1.,);
输出:=(买1OR 买2OR 买3OR 买4OR 买5OR VAR7) AND ST;
MA5:=MA(C,5),COLORWHITE;
X:=(3*C+L+O+H)/6;
多空线:=(*X+*REF(X,1)+*REF(X,2)+*REF(X,3)+*REF(X,4)+*REF(X,5)+*REF(X,6)
+*REF(X,7)+*REF(X,8)+*REF(X,9)+*REF(X,)+9*REF(X,)+8*REF(X,)
+7*REF(X,)+6*REF(X,)+5*REF(X,)+4*REF(X,)+3*REF(X,)+2*REF(X,)+
REF(X,))/,COLORFFFF,LINETHICK1;
AB:=DRAWLINE(HIGH>=HHV(HIGH,),HIGH,LOW<=LLV(LOW,3),HHV(HIGH,3),1),COLORYELLOW;
CROSS(MA5,多空线) and CROSS(C,AB) and 输出 ;
点石成金(选股公式)
KS:=(CLOSE-MA(CLOSE,))/MA(CLOSE,)*(-);
RSV:=(CLOSE-LLV(LOW,))/(HHV(HIGH,)-LLV(LOW,))*;
FASTK:=SMA(RSV,3,1);K:=SMA(FASTK,3,1);D:=SMA(K,5,1);
Var1:=CLOSE/MA(CLOSE,)*<;
Var2:=CLOSE/MA(CLOSE,)*<;
Var3:=HIGH>LOW*1.;
Var4:=Var3 AND COUNT(Var3,5)>1;
Var4 AND (Var1 OR Var2) AND REF(KS,1)>= AND REF(KS,1)/KS>=1.AND
CLOSE/REF(CLOSE,1)>=1.;
牛市绝底(选股公式)
VAR1:=REF(CLOSE,1);
VAR2:=((SMA(MAX((CLOSE - VAR1),0),7,1) / SMA(ABS((CLOSE - VAR1)),7,1)) * );
VAR3:=((SMA(MAX((CLOSE - VAR1),0),,1) / SMA(ABS((CLOSE - VAR1)),,1)) *);
VAR4:=(( * (HHV(HIGH,) - LOW)) / HHV(HIGH,));
VAR5:=(( * (HIGH - LLV(LOW,))) / LLV(LOW,));
牛市绝底:VAR2< AND VAR3 < AND (VAR2 + VAR3) > AND VAR4 > ANDBARSCOUNT(CLOSE) > ;
飞弹一号(选股公式)
var1:=c/ma(c,)*<;
var2:=c/ma(c,)*<;
var3:=h>=l*1.;
var4:=var3 and count(var3,5)>=2;
xg:var4 and (var1 or var2) and count(h=l and c=o and c<ref(c,1),3)=0
and hhv(v/capital,)<0.8;
跟庄建仓源码
A:=DYNAINFO(7);
A:=BARSCOUNT(CLOSE);
A:=(SMA((CLOSE / HHV(HIGH,)),3,1) * );
A:=IF((A > ),A,0);
A:=IF((LOW > A),0,IF((HIGH < A),1,(((A - LOW) + 0.) / ((HIGH -LOW) + 0.))));
A:=DMA(A,(VOL / CAPITAL)) * ;
A:=IF((((A > 0) AND (A > REF(A,1))) AND (A <= )),A,0);
Var1:=3*SMA((CLOSE-LLV(LOW,))/(HHV(HIGH,)-LLV(LOW,))*,5,1)-2*SMA(SMA((CLOSE-LLV(LOW,))/(HHV(HIGH,)-LLV(LOW,))*,5,1),3,1);
Var2:=EMA(Var1,8);
Var3:=3*SMA((C-LLV(L,))/(HHV(H,)-LLV(L,))*,5,1)-2*SMA(SMA((C-LLV(L,))/(HHV(H,)-LLV(L,))*,5,1),3,1);
趋势:=EMA(Var3,3)-;
STICKLINE(趋势>,趋势,,5,0);
DRAWICON(CROSS(趋势,0),0,1);
STICKLINE((A > 0 AND (趋势< OR 趋势>REF(趋势,1)AND趋势<)),0,A,6,0),colorFFff;
机构建仓区:0,LINETHICK0,colorFFFF;
Var4:=(趋势-REF(趋势,1))/REF(趋势,1)*;
STICKLINE(趋势<=,0,,3,0),colorcc;
DRAWTEXT(FILTER(趋势<=,),,'准备现金'),colorcc;
STICKLINE(趋势<= AND Var4>,0,,2,0),colorff;
Var5:=FILTER((趋势<= AND Var4>),);
DRAWTEXT(Var5,,'买入'),colorff;
STICKLINE(趋势>= AND Var4,0,,3,0),colorgray;
Var6:=FILTER((趋势>= AND Var4),);
DRAWTEXT(Var6,,'清仓'),colorgray;
Var7:=LLV(LOW,);
Var8:=HHV(HIGH,);
Var9:=EMA((CLOSE-Var7)/(Var8-Var7)*4,4)*;
STICKLINE(Var9>,,,3,2),COLORRED;
Var:=(Var9-LLV(Var9,4))/(HHV(Var9,4)-LLV(Var9,4))*;
DRAWTEXT(IF(CROSS(Var9,Var) AND Var9>,,0),,'险'),ColorFF;
DRAWICON(CROSS(,Var9),,9);
Var:=SMA(ABS(L-REF(L,1)),3,1)/SMA(MAX(L-REF(L,1),0),3,1)*;
Var:=HHV(Var,)*8;
火焰山:EMA(IF(LOW<=Var7AND 趋势<,(Var+Var),0),3)/,COLORRED,linethick2;
STICKLINE(火焰山>0,0 ,火焰山*1.2,4,0 ),COLORRED;
Var:=(MA(C,1)+MA(C,3)+MA(C,5)+MA(C,7)+MA(C,9))/5;
Var:=(MA(C,2)+MA(C,4)+MA(C,6)+MA(C,8)+MA(C,))/5;
趋势线:趋势,colorff;
Var:=MAX(EMA(Var,2)-EMA(Var,5),0)*;
Var:=EMA(Var,5);
波浪峰:Var,stick,colorffff;
STICKLINE(Var<REF(Var,1),0,Var,1,0),colorff;
Var:=MA(趋势线,8);
if(CROSS(Var2,Var) AND Var2<,,0),COLORRED;
DRAWTEXT(CROSS(趋势线,Var2)AND 趋势线>REF(趋势线,1)AND 趋势线<,,'追涨'),COLORffff;
风险区:IF(趋势>,趋势,),colorffff;
双信号"全仓"选股(选股公式)
FF:=EMA(CLOSE,3);
MA:=EMA(CLOSE,);
TTJ:=CROSS(FF,MA);
上:=EMA(C,3),COLORBLUE,LINETHICK1;
中:=EMA(C,5),COLORWHITE,LINETHICK1;
下:=EMA(中,5),COLORFF,LINETHICK1;
QQ:= C<中;
MM:=上>REF(上,1)AND REF(上,1)<REF(上,2) ;
V1:=ABS((2*CLOSE+HIGH+LOW)/4-MA(CLOSE,))/MA(CLOSE,);
V2:=(1-7/)*(DMA(CLOSE,V1));
V3:=(1+7/)*(DMA(CLOSE,V1));
V5:=MA((LOW+HIGH+CLOSE)/3,5);
MA1:=MEMA(CLOSE,5);
MA2:=ATAN((MA1/REF(MA1,1)-1)*)*/3.;
MA3:=IF(MA2>0,MA2,MA2);
MA5:=MA(CLOSE,5),COLOR;
MA:=MA(CLOSE,),COLORFFF0,LINETHICK2;
VAR:=CLOSE=HHV(C,4) AND (REF(C,1)>=REF(C,2) OR REF(C,1)>=REF(C,3))
OR REF(C,1)=HHV(C,4) AND CLOSE>=REF(C,2) OR REF(C,2)=HHV(C,4) AND
REF(C,3)=LLV(C,4) AND C>=REF(C,1) OR REF(C,3)=HHV(C,4) AND
C>=REF(C,1) AND C>=REF(C,2);
{ 收盘价=4日内收盘价的最高值AND 昨收>=2日前的收盘价}
VAR:=CLOSE=HHV(C,4) AND REF(C,1)=LLV(C,4);
{ 收盘价=4日内收盘价的最高值AND 昨收=4日内收盘价的最低值}
VAR:=CLOSE=LLV(C,4) AND (REF(C,1)<REF(C,2) OR REF(C,1)<REF(C,3)) OR
REF(C,1)=LLV(C,4) AND C<REF(C,2) OR REF(C,2)=LLV(C,4) AND
REF(C,1)=HHV(C,4) AND C<REF(C,1) OR REF(C,3)=LLV(C,4) AND
C<REF(C,1) AND C<REF(C,2);
{ 收盘价=4日内收盘价的最低值AND (昨收<2日前的收盘价}
VAR:=REF(C,1)=LLV(C,4) AND C>=REF(C,2) OR REF(C,2)=LLV(C,4) AND
REF(C,1)<=REF(C,3) AND REF(C,2)<REF(C,4) AND C>=REF(C,1);
{ 昨收=4日内收盘价的最低值AND 收盘价>=2日前的收盘价}
VAR:=REF(C,1)=HHV(C,4) AND C<REF(C,2) OR (REF(C,2)=HHV(C,4) AND
REF(C,1)>REF(C,3) OR REF(C,3)=HHV(C,4) AND REF(C,1)>REF(C,2)) AND
REF(C,2)>=REF(C,4) AND C<REF(C,1);
{ 昨收=4日内收盘价的最高值AND 收盘价<2日前的收盘价}
VAR:=V5>REF(V5,1) AND REF(V5,1)<REF(V5,2);
{ 今日V5向上形成拐点}
VAR:=LOW<HHV(V5,) AND HIGH>HHV(V5,) AND CLOSE>REF(C,1) ANDCLOSE>OPEN;
VAR:=VAR AND COUNT(VAR,2);
VAR:=*EMA(EMA(C-REF(C,1),6),6)/EMA(EMA(ABS(C-REF(C,1)),6),6);
VAR:=EMA(MA(C,),);
VAR:=FILTER((LLV(VAR,2)=LLV(VAR,7) AND COUNT(VAR<0,2) AND
CROSS(VAR,MA(VAR,2)))=1,5);
VAR:=FILTER((HHV(VAR,2)=HHV(VAR,7) AND COUNT(VAR>,2) AND
CROSS(MA(VAR,2),VAR))=1,1);
VAR:=SMA(EMA((C-REF(C,1))/REF(C,1),5)*,3,1)*;
VAR:=FILTER(((CROSS(VAR,0) OR CROSS(C,VAR)) AND VAR)=1,3);
VAR:=MA(C,)>=REF(MA(C,),3) AND CROSS(C,MA(C,));
VAR:=VAR AND NOT(REF(VAR,1));
RSV:=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*;
K:=SMA(RSV,3,1);
D:=SMA(K,3,1);
J:=3*K-2*D;
金叉:=CROSS(J,D);
死叉:=CROSS(D,J);
买1:=(VAROR VAR) AND VAR;
买2:=(VAROR VAR) AND VAR;
买3:=(VAROR VAR) AND VAR;
买4:=(VARAND VAR) OR (VAR AND VAR);
买5:=(金叉AND VAR) OR (金叉 AND VAR) OR (金叉 AND VAR);
TTJ0:=VAR;
TTJ1:=买1OR 买2OR 买3OR 买4OR 买5AND MM;
XG0:=TTJ AND TTJ0;
XG1:=TTJ AND TTJ1;
XG:=XG0 OR XG1;
{ 以下波浪理论浪底重叠"买底"选股原码}
PL5:=ZIG(3,5);
EN1:=ZIG(3,5)>REF(ZIG(3,5),1) AND REF(ZIG(3,5),1)<=REF(ZIG(3,5),2) ANDREF(ZIG(3,5),2)<=REF(ZIG(3,5),3);
EX1:=ZIG(3,5)<REF(ZIG(3,5),1) AND REF(ZIG(3,5),1)>=REF(ZIG(3,5),2) ANDREF(ZIG(3,5),2)>=REF(ZIG(3,5),3);
PL:=ZIG(3,);
EN2:=ZIG(3,)>REF(ZIG(3,),1) AND REF(ZIG(3,),1)<=REF(ZIG(3,),2)AND REF(ZIG(3,),2)<=REF(ZIG(3,),3);
EX2:=ZIG(3,)<REF(ZIG(3,),1) AND REF(ZIG(3,),1)>=REF(ZIG(3,),2)AND REF(ZIG(3,),2)>=REF(ZIG(3,),3);
PL:=ZIG(3,);
EN3:=ZIG(3,)>REF(ZIG(3,),1) AND REF(ZIG(3,),1)<=REF(ZIG(3,),2)AND REF(ZIG(3,),2)<=REF(ZIG(3,),3);
EX3:=ZIG(3,)<REF(ZIG(3,),1) AND REF(ZIG(3,),1)>=REF(ZIG(3,),2)AND REF(ZIG(3,),2)>=REF(ZIG(3,),3);
PL:=ZIG(3,);
走强1:=BARSLAST(PL5<REF(PL5,1));
走弱1:=BARSLAST(PL5>REF(PL5,1));
走强2:=BARSLAST(PL<REF(PL,1));
走弱2:=BARSLAST(PL>REF(PL,1));
走强3:=BARSLAST(PL<REF(PL,1));
走弱3:=BARSLAST(PL>REF(PL,1));
ZTJZ5:=IF(PL>REF(PL,1),COUNT(EN1,走强2),0);
ZTJD5:=IF(PL>REF(PL,1),COUNT(EX1,走强2),0);
DTJZ5:=IF(PL<REF(PL,1),COUNT(EN1,走弱2),0);
DTJD5:=IF(PL<REF(PL,1),COUNT(EX1,走弱2),0);
ZTJZ:=IF(PL>REF(PL,1),COUNT(EN2,走强3),0);
ZTJD:=IF(PL>REF(PL,1),COUNT(EX2,走强3),0);
DTJZ:=IF(PL<REF(PL,1),COUNT(EN2,走弱3),0);
DTJD:=IF(PL<REF(PL,1),COUNT(EX2,走弱3),0);
TJ:=EN2 AND ZTJZ5=1;
TJ:=EN1 AND PL>REF(PL,1) AND ZTJZ5=2;
TJ:=EN2 AND DTJZ=1;
TJ:=EN3 AND ZTJZ=1;
TJ:=EN2 AND PL>REF(PL,1) AND ZTJZ=2;
XG:=TJ OR TJ OR TJ OR TJ OR TJ;
{ 以下二者结合共同选股}
XG:=XG OR XG;
W:EXIST(XG,1);