2013-11-25 7 views
6

मैं आर के लिए नौसिखिया हूं और मुझे तकनीकी संकेतक के निर्माण के साथ कुछ समस्याएं आ रही हैं। अधिक विशेष रूप से, मैं एक सूचक, Fibonacci बनाना चाहता हूं, जिसे chartSeries में जोड़ा जाएगा और इसमें 5 क्षैतिज रेखाएं होंगी। जिस डेटा के साथ मैं काम कर रहा हूं वह स्टॉक की समाप्ति कीमत है। तो जिस ग्राफ को मैं बनाना चाहता हूं, उसके पास अधिकतम समापन मूल्य के बिंदु पर एक क्षैतिज रेखा होगी, न्यूनतम समापन मूल्य के बिंदु में एक क्षैतिज रेखा और पिछले दो के बीच तीन क्षैतिज रेखाएं होंगी।क्वांटमोड पैकेज में तकनीकी संकेतक कैसे बनाएं

Fibonacci <- function(x) { 
x <- try.xts(x, error = as.matrix) 
n <- nrow(x) 
min <- runMin(x,n=n) 
max <- runMax(x,n=n) 
high <- 0.62*(max-min) + min 
middle <- 0.5*(max-min) + min 
low <- 0.38*(max-min) + min 
res <-cbind(na.spline(min),na.spline(max),na.spline(high), 
      na.spline(middle),na.spline(low)) 
colnames(res)<- c("min","max","high","middle","low") 
reclass (res, x) 
} 

मैं भी निम्न कोड मौजूदा chartSeries साजिश करने के लिए तकनीकी सूचक जोड़ने के लिए लिखा है: कोड मैं आदेश एक शेयर के समापन की कीमतों के एक समय श्रृंखला के पांच मूल्यों लेने के लिए लिखा था निम्नलिखित है quantmod पैकेज की:

addFibonacci<- function(col = "red",overlay = TRUE){ 
stopifnot("package:TTR" %in% search() || require("TTR", quietly = TRUE)) 
lchob <- quantmod:::get.current.chob() 
x <- as.matrix([email protected]) 
chobTA <- new("chobTA") 
[email protected] <- !overlay 
if (!is.OHLC(x)) 
    stop("Fibonacci requires HL series") 
else { 
fibon <- Fibonacci(Cl(x)) 
} 
[email protected] <- fibon[[email protected]] 
[email protected] <- match.call() 
[email protected] <- 1 
[email protected] <- list(xrange = [email protected], colors = [email protected], 
    color.vol = [email protected], multi.col = [email protected], 
    spacing = [email protected], width = [email protected], bp = [email protected], 
    x.labels = [email protected], time.scale = [email protected], 
    col = col) 
if (is.null(sys.call(-1))) { 
    TA <- [email protected]$TA 
    [email protected]$TA <- c(TA, chobTA) 
    [email protected] <- [email protected] + ifelse([email protected], 1, 
     0) 
    chartSeries.chob <- quantmod:::chartSeries.chob 
    do.call(chartSeries.chob, list(lchob)) 
    invisible(chobTA) 
} 
else { 
    return(chobTA) 
} 
} 

समस्या यह है कि सूचक चार्ट में जुड़ते नहीं है और मैं भी निम्न त्रुटि संदेश हो रही है है:

Error in do.call([email protected]$TA[[j]]@name, list([email protected]$TA[[j]])) : 
    'what' must be a character string or a function 

क्या मैं गलत कर रहा हूँ के लिए कोई विचार?

उत्तर

7

खरोंच से add* समारोह लेखन के बजाय, आप बस newTA इस्तेमाल कर सकते हैं:

> library(quantmod) 
> getSymbols("AAPL") 
[1] "AAPL" 
> addFibonacci <- newTA(Fibonacci,on=1) 
> chartSeries(AAPL, TA="addFibonacci()") 
Error in addFibonacci() : could not find function "get.current.chob" 

हम्म, जाहिरा तौर पर get.current.chob निर्यात नहीं किया है ... कि ठीक है, हम सिर्फ समारोह अपने आप को बदल सकते हैं। addFibonacci <- newTA(Fibonacci,on=1) कॉल करने के बाद, addFibonacci के रूप में परिभाषित किया गया है:

addFibonacci <- function (..., on = 1, legend = "auto") 
{ 
    #lchob <- get.current.chob() 
    lchob <- quantmod:::get.current.chob() 
    x <- as.matrix([email protected]) 
    x <- Fibonacci(x = x) 
    yrange <- NULL 
    chobTA <- new("chobTA") 
    if (NCOL(x) == 1) { 
     [email protected] <- x[[email protected]] 
    } 
    else [email protected] <- x[[email protected], ] 
    [email protected] <- "chartTA" 
    if (any(is.na(on))) { 
     [email protected] <- TRUE 
    } 
    else { 
     [email protected] <- FALSE 
     [email protected] <- on 
    } 
    [email protected] <- match.call() 
    legend.name <- gsub("^add", "", deparse(match.call())) 
    gpars <- c(list(...), list())[unique(names(c(list(), list(...))))] 
    [email protected] <- list(xrange = [email protected], yrange = yrange, 
     colors = [email protected], color.vol = [email protected], multi.col = [email protected], 
     spacing = [email protected], width = [email protected], bp = [email protected], 
     x.labels = [email protected], time.scale = [email protected], 
     isLogical = is.logical(x), legend = legend, legend.name = legend.name, 
     pars = list(gpars)) 
    if (is.null(sys.call(-1))) { 
     TA <- [email protected]$TA 
     [email protected]$TA <- c(TA, chobTA) 
     [email protected] <- [email protected] + ifelse([email protected], 1, 
      0) 
     chartSeries.chob <- chartSeries.chob 
     do.call("chartSeries.chob", list(lchob)) 
     invisible(chobTA) 
    } 
    else { 
     return(chobTA) 
    } 
} 

और आप देख सकते हैं, जहां मैं quantmod:::get.current.chob() साथ get.current.chob() करने के लिए कॉल बदल दिया। अब यह काम करना चाहिए।

chartSeries(AAPL, TA="addFibonacci()") 

सफलता!

enter image description here

+0

उत्तर और सहायता के लिए आपको बहुत बहुत धन्यवाद। मुझे नहीं पता था कि मैं न्यूटीए फ़ंक्शन का उपयोग कर सकता हूं। मैं बस सोच रहा हूं कि मैं केवल addFibonacci() को क्यों नहीं बुला सकता हूं और मैं जो प्लॉट चाहता हूं उसे ले सकता हूं, जैसे सभी एडीटीए फ़ंक्शंस, और इसके बजाय मुझे चार्ट श्रृंखला फ़ंक्शन को कॉल करना है? उदाहरण के लिए जब मैं addFibonacci को कॉल करता हूं तो मैं लेता हूं: addfibonacci() में त्रुटि: ऑब्जेक्ट 'chartSeries.chob' नहीं मिला – user3017291

संबंधित मुद्दे