MACD值计算

create or replace procedure pro_macd(s_code VARCHAR2) authid current_user is
       str_lastdate             varchar2(10) :='';-- :=to_char(sysdate,'yyyy_mm_dd');
       Val_last_ema12      number; 
       Val_last_ema26      number; 
       Val_last_dea        number; 
       Val_ema12           number; 
       Val_ema26           number; 
       Val_dif             number; 
       Val_dea             number;
       Val_macd            number;
       Val_price            number;

        cursor c_stk is
          select t.code,t.stockname,t.day from stockhis t
          --where t.code='000025' and (t.code,t.day) not in(select code,day from STOCKMACD);
          where t.code=s_code and (t.code,t.day) not in(select code,day from STOCKMACD) and t.day>'2020-01-01'
          order by day asc;
        stk c_stk%rowtype;
         /**
          1、计算移动平均值(EMA)
            12日EMA的算式为:EMA(12)=前一日EMA(12)×11/13+今日收盘价×2/13
            26日EMA的算式为:EMA(26)=前一日EMA(26)×25/27+今日收盘价×2/27
          2、计算离差值(DIF)
            DIF=今日EMA(12)-今日EMA(26)
          3、计算DIF的9日EMA
            根据离差值计算其9日的EMA,即离差平均值,是所求的MACD值。为了不与指标原名相混淆,此值又名DEA或DEM。
            今日DEA(MACD)=前一日DEA×8/10+今日DIF×2/10
          关键的一点是:新股上市首日,其DIFF,DEA以及MACD都为0,因为当日不存在前一日,无法做迭代
          **/
begin
      dbms_output.put_line('start'||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
      --s_date :='2015-01-01';
      for stk in c_stk loop
          dbms_output.put_line(stk.code||stk.stockname);

          if str_lastdate = '' then
            --str_lastdate=fun_get_lastmacdday(stk.code,stk.day);
            select day into str_lastdate from (select * from stockmacd t where t.day<stk.day order by day desc) r where rownum=1;
          end if;
          dbms_output.put_line('str_lastdate:'||str_lastdate);
          
          select t.price,nvl(m.ema12,0),nvl(m.ema26,0),nvl(m.dea,0) into Val_price, Val_last_ema12, Val_last_ema26,Val_last_dea
            from stockhis t left join STOCKMACD m on t.code=m.code and m.day=str_lastdate--(to_date(m.day,'yyyy-mm-dd hh24:mi:ss')+1)
            where t.code=stk.code and t.day=stk.day;
            
          if str_lastdate is null or str_lastdate = '' then
            dbms_output.put_line('first day:'||stk.code||stk.day);
            --关键的一点是:新股上市首日,其DIFF,DEA以及MACD都为0,因为当日不存在前一日,无法做迭代
            Val_ema12 :=0*11/13 + Val_price*2/13; 
            Val_ema26 :=0*25/27 + Val_price*2/27;
            insert into STOCKMACD values(stk.code, stk.day,0,0,0,Val_price,Val_ema12,Val_ema26,0,0,0);
            commit;
          else
            Val_ema12 :=Val_last_ema12*11/13 + Val_price*2/13; 
            Val_ema26 :=Val_last_ema26*25/27 + Val_price*2/27; 
            Val_dif :=Val_ema12 - Val_ema26;
            Val_dea :=Val_last_dea*8/10 + Val_dif*2/10;
            Val_macd :=(Val_dif - Val_dea)*2;
            
            insert into STOCKMACD values(stk.code, stk.day, Val_last_ema12, Val_last_ema26, Val_last_dea,Val_price,Val_ema12, Val_ema26, Val_dif, Val_dea,Val_macd);
            commit;
         end if;
         
         str_lastdate :=stk.day;
      end loop;
      EXCEPTION
         when others then
            --dbms_output.put_line(sqlcode||':'||SQLERRM);
            dbms_output.put_line(SQLERRM);
end pro_macd;

参考 MACD指标的原理和计算方法

一、MACD指标的原理

  MACD指标是根据均线的构造原理,对股票价格的收盘价进行平滑处理,求出算术平均值以后再进行计算,是一种趋向类指标。

  MACD指标是运用快速(短期)和慢速(长期)移动平均线及其聚合与分离的征兆,加以双重平滑运算。而根据移动平均线原理发展出来的MACD,一则去除了移动平均线频繁发出假信号的缺陷,二则保留了移动平均线的效果,因此,MACD指标具有均线趋势性、稳重性、安定性等特点,是用来研判买卖股票的时机,预测股票价格涨跌的技术分析指标。

  指标主要是通过EMA、DIF和DEA(或叫MACD、DEM)这三值之间关系的研判,DIF和DEA连接起来的移动平均线的研判以及DIF减去DEM值而绘制成的柱状图(BAR)的研判等来分析判断行情,预测股价中短期趋势的主要的股市技术分析指标。其中,DIF是核心,DEA是辅助。DIF是快速平滑移动平均线(EMA1)和慢速平滑移动平均线(EMA2)的差。BAR柱状图在股市技术软件上是用红柱和绿柱的收缩来研判行情。

  二、MACD指标的计算方法

  MACD在应用上,首先计算出快速移动平均线(即EMA1)和慢速移动平均线(即EMA2),以此两个数值,来作为测量两者(快慢速线)间的离差值(DIF)的依据,然后再求DIF的N周期的平滑移动平均线DEA(也叫MACD、DEM)线。

  以EMA1的参数为12日,EMA2的参数为26日,DIF的参数为9日为例来看看MACD的计算过程

  1、计算移动平均值(EMA)

  12日EMA的算式为

  EMA(12)=前一日EMA(12)×11/13+今日收盘价×2/13

  26日EMA的算式为

  EMA(26)=前一日EMA(26)×25/27+今日收盘价×2/27

  2、计算离差值(DIF)

  DIF=今日EMA(12)-今日EMA(26)

  3、计算DIF的9日EMA

  根据离差值计算其9日的EMA,即离差平均值,是所求的MACD值。为了不与指标原名相混淆,此值又名DEA或DEM。

  今日DEA(MACD)=前一日DEA×8/10+今日DIF×2/10

  计算出的DIF和DEA的数值均为正值或负值。

  理论上,在持续的涨势中,12日EMA线在26日EMA线之上,其间的正离差值(+DIF)会越来越大;反之,在跌势中离差值可能变为负数(—DIF),也会越来越大,而在行情开始好转时,正负离差值将会缩小。指标MACD正是利用正负的离差值(±DIF)与离差值的N日平均线(N日EMA)的交叉信号作为买卖信号的依据,即再度以快慢速移动线的交叉原理来分析买卖信号。另外,MACD指标在股市软件上还有个辅助指标——BAR柱状线,其公式为:BAR=2×(DIF-DEA),我们还是可以利用BAR柱状线的收缩来决定买卖时机。

  离差值DIF和离差平均值DEA是研判MACD的主要工具。其计算方法比较烦琐,由于目前这些计算值都会在股市分析软件上由计算机自动完成,因此,投资者只要了解其运算过程即可,而更重要的是掌握它的研判功能。另外,和其他指标的计算一样,由于选用的计算周期的不同,MACD指标也包括日MACD指标、周MACD指标、月MACD指标年MACD指标以及分钟MACD指标等各种类型。经常被用于股市研判的是日MACD指标和周MACD指标。虽然它们的计算时的取值有所不同,但基本的计算方法一样。

  在实践中,将各点的DIF和DEA(MACD)连接起来就会形成在零轴上下移动的两条快速(短期)和慢速(长期)线,此即为MACD图。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

末点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值