matpeak 2026-02-11 23:00 采纳率: 40%
浏览 4
已结题

如何求通达信上次MACD>0时,对应成交量之和。

如何求通达信上次MACD>0时,对应成交量之和。
如何求通达信上次MACD>0时,对应成交量之和。

  • 写回答

2条回答 默认 最新

  • 杨利杰YJlio 优质创作者: 操作系统技术领域 2026-02-12 15:11
    关注

    我是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(用于“记录并保持”)。(公式大师)


    验证

    1. 先把周期数画出来,确认 N 是否符合你的预期:
    N1:=BARSLAST(MACD>0)+1;
    N1;   {直接输出看看:当“上次 MACD>0”是今天时应为 1;昨天则应为 2}
    
    1. 手工抽查一段K线
    • 找到图上“上次 MACD>0 的那根K线”,往右数到今天一共 N1 根;
    • 把这 N1 根的 VOL 相加,应该等于 VOL_SUM_A
    1. 若出现一直为 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);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月20日
  • 已采纳回答 2月12日
  • 创建了问题 2月11日