如何求通达信上次MACD>0时,对应成交量之和。
如何求通达信上次MACD>0时,对应成交量之和。
2条回答 默认 最新
关注我是YJlio杨利杰让我来给你回答,以下回答来自ChatGpt5.2 Thinking 深度思考
结论
通达信里要做“上次 MACD>0 时对应成交量之和”,核心就是两步:用
BARSLAST找到“上次满足条件的位置/距离”,再用SUM(VOL, N)做区间累加。(cnblogs.com)
由于你正文未识别,我把最常见的两种需求都给出(你直接套用其中一个即可)。
原因
BARSLAST(X):返回上一次条件 X 成立到当前的周期数(今天成立则为 0)。(cnblogs.com)SUM(VOL, N):统计最近 N 周期的成交量总和(VOL为成交量序列)。(m.eastmoney.com)
所以:只要把 N = 距离上次条件成立的周期数(必要时 +1) 算对,区间成交量就能求出来。
步骤
下面公式建议你自己先计算 MACD,避免不同版本里“系统自带 MACD 变量名”差异导致报错。
① 需求A:从“最近一次 MACD>0 的那根K线”到当前的成交量累加
解释:不管当前 MACD 是否 >0,都从“上次出现 MACD>0 的那根K线”开始,一直累加到今天。
DIFF:=EMA(CLOSE,12)-EMA(CLOSE,26); DEA:=EMA(DIFF,9); MACD:=2*(DIFF-DEA); N1:=BARSLAST(MACD>0)+1; {+1 表示把“那根K线”本身也算进去} VOL_SUM_A:=SUM(VOL,N1);② 需求B:当前这一段“连续 MACD>0(红柱区间)”内的成交量之和
解释:只在 MACD>0 时计算“本轮红柱段”成交量;MACD<=0 时输出 0(或你也可以改成 DRAWNULL)。
DIFF:=EMA(CLOSE,12)-EMA(CLOSE,26); DEA:=EMA(DIFF,9); MACD:=2*(DIFF-DEA); VOL_SUM_RED:=IF(MACD>0,SUM(VOL,BARSLAST(MACD<0)),0);③ 需求C:上一段“完整红柱区间(上一次连续 MACD>0)”的成交量之和(并在后面持续显示)
解释:在“红柱刚结束(由 >0 变为 <=0)”那一刻,把上一段红柱区间的成交量记录下来,然后一直沿用该值。
DIFF:=EMA(CLOSE,12)-EMA(CLOSE,26); DEA:=EMA(DIFF,9); MACD:=2*(DIFF-DEA); VOL_SUM_RED:=IF(MACD>0,SUM(VOL,BARSLAST(MACD<0)),0); END_RED:=REF(MACD,1)>0 AND MACD<=0; LAST_RED_VOL_SUM:=VALUEWHEN(END_RED,REF(VOL_SUM_RED,1));VALUEWHEN(COND,X):当 COND 成立时取 X,否则沿用上一次 COND 成立时的 X(用于“记录并保持”)。(公式大师)
验证
- 先把周期数画出来,确认 N 是否符合你的预期:
N1:=BARSLAST(MACD>0)+1; N1; {直接输出看看:当“上次 MACD>0”是今天时应为 1;昨天则应为 2}- 手工抽查一段K线:
- 找到图上“上次 MACD>0 的那根K线”,往右数到今天一共 N1 根;
- 把这 N1 根的 VOL 相加,应该等于
VOL_SUM_A。
- 若出现一直为 1 或一直为 0:
- 说明你的
MACD变量没有正确计算/引用(例如写在选股公式里却没定义 MACD),按我上面“先算 DIFF/DEA/MACD”的写法即可。
补充
你到底该用 A/B/C 取决于你对“上次 MACD>0”的理解:
- A:从“最近一次出现 MACD>0 的那根K线”累加到今天(最通用)。
- B:求“当前这一轮红柱段”的成交量。
- C:求“上一轮完整红柱段”的成交量,并持续显示(很多人真正想要的是这个)。
如果你把“上次”理解为“排除今天(即上一次,不含当前)”,把条件改成
REF(MACD>0,1)再套BARSLAST即可:
N2:=BARSLAST(REF(MACD>0,1))+1; VOL_SUM_EXCLUDE_TODAY:=SUM(VOL,N2);本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报