require(quantmod)
require(xts)
data2 <- read.csv("data2.csv",header=T)
data2 <- as.xts(read.zoo(data2))

Macd <- function(data,fast=12,slow=26,difnm=9){

  total <- slow+difnm#EMA26需要累積26天，MACD9需要累積9天，這裡為34天
  Dl <- (Hi(data)+Lo(data)+2*Cl(data))/4 #每日需求指數
  nEMA <- runMean(Dl,n=fast) #12日快線的平均
  mEMA <- runMean(Dl,n=slow)#26日慢線的平均
  DIF <- nEMA-mEMA #快慢線平均相減
  MACD <- runMean(DIF,n=difnm)#快慢線平均相減的九日平均
  nEMA <- nEMA[total]#能有計算結果的第一天 首日EMA12
  mEMA <- mEMA[total]#首日EMA26
  MACD <- MACD[total]#首日MACD
  DIF <- DIF[total]#首日OSC
  Date <- as.character(index(data[total,]))
  all <- data.frame(Date,MACD,DIF,stringsAsFactors = FALSE) #合併第一天的macd osc 日期 
  
  for(w in c((total+1):nrow(data))){ #從第35天開始到最後
    todayCl <- as.numeric(Dl[w])  #每一天的Dl
    nEMA=(nEMA*(fast-1)+todayCl*2)/(fast+1) #nEMA=(前一日nEMA*(n-1)＋今日收盤價×2)/(n+1)
    mEMA=(mEMA*(slow-1)+todayCl*2)/(slow+1)#mEMA=(前一日mEMA*(m-1)＋今日收盤價×2)/(m+1)
    DIF=nEMA-mEMA
    MACD=(MACD*(difnm-1)+DIF*2)/(difnm+1)
    Date <- as.character(index(data[w,]))
    all <- rbind(all,c(Date,MACD,DIF))#合併新資料到dataframe
  }
  all$Date <- as.Date(all$Date) #轉型態整理資料 以下可省略
  all$MACD <- round(as.numeric(all$MACD),2)
  all$DIF <- round(as.numeric(all$DIF),2)
  all$OSC <- all$DIF-all$MACD
  all <- as.xts(read.zoo(all))
  
}

macd <- Macd(data2,12,26,9)
