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 )
cmVxdWlyZShxdWFudG1vZCkKcmVxdWlyZSh4dHMpCmRhdGEyIDwtIHJlYWQuY3N2KCJkYXRhMi5jc3YiLGhlYWRlcj1UKQpkYXRhMiA8LSBhcy54dHMocmVhZC56b28oZGF0YTIpKQoKTWFjZCA8LSBmdW5jdGlvbihkYXRhLGZhc3Q9MTIsc2xvdz0yNixkaWZubT05KXsKCiAgdG90YWwgPC0gc2xvdytkaWZubSNFTUEyNumcgOimgee0r+epjTI25aSp77yMTUFDRDnpnIDopoHntK/nqY055aSp77yM6YCZ6KOh54K6MzTlpKkKICBEbCA8LSAoSGkoZGF0YSkrTG8oZGF0YSkrMipDbChkYXRhKSkvNCAj5q+P5pel6ZyA5rGC5oyH5pW4CiAgbkVNQSA8LSBydW5NZWFuKERsLG49ZmFzdCkgIzEy5pel5b+r57ea55qE5bmz5Z2HCiAgbUVNQSA8LSBydW5NZWFuKERsLG49c2xvdykjMjbml6XmhaLnt5rnmoTlubPlnYcKICBESUYgPC0gbkVNQS1tRU1BICPlv6vmhaLnt5rlubPlnYfnm7jmuJsKICBNQUNEIDwtIHJ1bk1lYW4oRElGLG49ZGlmbm0pI+W/q+aFoue3muW5s+Wdh+ebuOa4m+eahOS5neaXpeW5s+WdhwogIG5FTUEgPC0gbkVNQVt0b3RhbF0j6IO95pyJ6KiI566X57WQ5p6c55qE56ys5LiA5aSpIOmmluaXpUVNQTEyCiAgbUVNQSA8LSBtRU1BW3RvdGFsXSPpppbml6VFTUEyNgogIE1BQ0QgPC0gTUFDRFt0b3RhbF0j6aaW5pelTUFDRAogIERJRiA8LSBESUZbdG90YWxdI+mmluaXpU9TQwogIERhdGUgPC0gYXMuY2hhcmFjdGVyKGluZGV4KGRhdGFbdG90YWwsXSkpCiAgYWxsIDwtIGRhdGEuZnJhbWUoRGF0ZSxNQUNELERJRixzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpICPlkIjkvbXnrKzkuIDlpKnnmoRtYWNkIG9zYyDml6XmnJ8gCiAgCiAgZm9yKHcgaW4gYygodG90YWwrMSk6bnJvdyhkYXRhKSkpeyAj5b6e56ysMzXlpKnplovlp4vliLDmnIDlvowKICAgIHRvZGF5Q2wgPC0gYXMubnVtZXJpYyhEbFt3XSkgICPmr4/kuIDlpKnnmoREbAogICAgbkVNQT0obkVNQSooZmFzdC0xKSt0b2RheUNsKjIpLyhmYXN0KzEpICNuRU1BPSjliY3kuIDml6VuRU1BKihuLTEp77yL5LuK5pel5pS255uk5YO5w5cyKS8obisxKQogICAgbUVNQT0obUVNQSooc2xvdy0xKSt0b2RheUNsKjIpLyhzbG93KzEpI21FTUE9KOWJjeS4gOaXpW1FTUEqKG0tMSnvvIvku4rml6XmlLbnm6Tlg7nDlzIpLyhtKzEpCiAgICBESUY9bkVNQS1tRU1BCiAgICBNQUNEPShNQUNEKihkaWZubS0xKStESUYqMikvKGRpZm5tKzEpCiAgICBEYXRlIDwtIGFzLmNoYXJhY3RlcihpbmRleChkYXRhW3csXSkpCiAgICBhbGwgPC0gcmJpbmQoYWxsLGMoRGF0ZSxNQUNELERJRikpI+WQiOS9teaWsOizh+aWmeWIsGRhdGFmcmFtZQogIH0KICBhbGwkRGF0ZSA8LSBhcy5EYXRlKGFsbCREYXRlKSAj6L2J5Z6L5oWL5pW055CG6LOH5paZIOS7peS4i+WPr+ecgeeVpQogIGFsbCRNQUNEIDwtIHJvdW5kKGFzLm51bWVyaWMoYWxsJE1BQ0QpLDIpCiAgYWxsJERJRiA8LSByb3VuZChhcy5udW1lcmljKGFsbCRESUYpLDIpCiAgYWxsJE9TQyA8LSBhbGwkRElGLWFsbCRNQUNECiAgYWxsIDwtIGFzLnh0cyhyZWFkLnpvbyhhbGwpKQogIAp9CgptYWNkIDwtIE1hY2QoZGF0YTIsMTIsMjYsOSkK