2013-11-25 13 views
6

Ich bin ein Neuling für R und ich habe einige Probleme mit der Erstellung eines technischen Indikators. Genauer gesagt möchte ich einen Indikator Fibonacci erstellen, der zu chartSeries hinzugefügt wird und aus 5 horizontalen Zeilen besteht. Die Daten, mit denen ich arbeite, sind die Schlusskurse einer Aktie. Der Graph, den ich erstellen möchte, hat also eine horizontale Linie im Punkt des maximalen Schlusskurses, eine horizontale Linie im Punkt des minimalen Schlusskurses und drei horizontale Linien zwischen den beiden vorherigen. Der Code, den ich um die fünf Werte einer Zeitreihe der Schlusskurse der Aktie zu nehmen geschrieben hat, ist die folgende:Wie man einen technischen Indikator im quantmod-Paket erstellt

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) 
} 

ich auch den folgenden Code, um die technische Indikator zur bestehenden chartSeries Plot hinzufügen geschrieben von quantmod Paket:

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) 
} 
} 

das Problem ist, dass die Anzeige nicht auf das Diagramm hinzugefügt zu werden, und ich bin auch die folgende Fehlermeldung erhalten:

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

Irgendwelche Ideen für das, was ich falsch mache?

Antwort

7

Anstatt die add* Funktion von Grund auf neu zu schreiben, könnten Sie einfach newTA verwenden:

> 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" 

Hmm, offenbar get.current.chob nicht exportiert wird ... das ist in Ordnung, wir können nur die Funktion selbst ändern. Nach addFibonacci <- newTA(Fibonacci,on=1) Aufruf wird addFibonacci wie folgt definiert:

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) 
    } 
} 

Und Sie können sehen, wo ich den Anruf zu get.current.chob() mit quantmod:::get.current.chob() ersetzt. Jetzt sollte es funktionieren.

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

Erfolg!

enter image description here

+0

Vielen Dank für die Antwort und Hilfe. Ich wusste nicht, dass ich die newTA-Funktion verwenden könnte. Ich wundere mich nur, warum ich nicht einfach addFibonacci() aufrufen kann und das Plot, das ich will, wie alle AddTA-Funktionen nehme, und stattdessen muss ich die chartSeries-Funktion aufrufen? Zum Beispiel, wenn ich die addFibonacci aufrufen, nehme ich: Fehler in addFibonacci(): Objekt 'chartSeries.chob' nicht gefunden – user3017291