2013-02-02 34 views
-1

我試圖使用MFI生成買/賣信號來測試策略。這實際上應該很簡單,但是R給我一個很難的時間。在q中添加qountmod數據框中的計算列

這裏是我的代碼:

q <- get(getSymbols('spy',src='yahoo')) 
q$mfi <- MFI(q[,2:4],q[,5],5) 
sig <- function(row) { 
if (row$mfi < 20) { return (1)} 
else if (row$mfi > 80) { return (-1)} 
else { return (0)}} 
q$result<-apply(q,1,sig) 

是我得到的錯誤是:

Error in row$mfi : $ operator is invalid for atomic vectors 

如果有使用簡單的條件,我將不勝感激的測試策略,更好的方法...

+0

做,當你運行'typeof運算(行),你會得到什麼'? –

+0

您應該使用'[]'[indexing operator](http://cran.r-project.org/doc/manuals/R-lang.html#Indexing)訪問行。你還沒有在代碼中定義'x'。 –

+0

SeñorO - 你是對的,這是一個錯誤 - 我需要寫q而不是x。埃裏克,我不能到行類型,因爲該功能失敗。 q是「xts」「zoo」類型。 – haki

回答

1

這裏不需要使用apply,使用ifelse,它是矢量化的

mfi <- c(10,15,20,50,70,90,100) 
res <- ifelse(mfi < 20, 1, ifelse(mfi < 80,0,-1)) 

rbind(mfi,res) ## rbind here just to show you the result and you can compare 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
mfi 10 15 20 50 70 90 100 
res 1 1 0 0 0 -1 -1 

編輯 DUT的calrify到OP

q <- getSymbols('XXX') 
q$mfi <- .... 
q$rsi <- .... 
sig <- function(q,...) { 
    if('mfi' %in% names(q)) 
    res <- ifelse(mfi < 20, 1, 
        ifelse(mfi < 80,0,-1)) 
    else 
    res <- NULL 
    res 
} 
sig(q) 
[1] 1 1 0 0 0 -1 -1 
+0

感謝您的快速回放。最終我想創建一個通用函數信號(),除了包含所有相關指標的Quantmod數據幀(行)以外,還會生成買入/賣出信號。它可以是mfi,rsi等......這是一個簡單的例子。 – haki

+0

@ user2000875在我的設計中不能使用的功能?用正確的MFI替換mfi(你不要在你的問題中給出正確的MFI),然後調用上面的行,你將得到你的指標。你會應用相同的指標mfi/rsi等?我想這不是一個好主意,把所有這一切都在同一個功能... – agstudy

+0

我會解釋。對於代表股票q的給定數據框,我想使用通用函數'signal()'產生買/賣信號。該功能可以使用不同的指標。該功能即時生成 - 這裏唯一的常數是數據集,最新變化是生成信號的函數。格式應該是'q <-getSymbols('XXX'); #添加相關指標。 #使用函數信號()生成買入賣出信號。如果我按照你的建議來做,我將不得不「控制」每個指標,並且將我的自我限制在非常簡單的條件下。 – haki