2016-05-16 10 views
2

ich ein sigPeak Signal und meinen Code zu verwenden, versuchen dies für das Hinzufügen ist:Quantstrat sigPeak Fehler: „k muss eine nicht negative ganze Zahl sein“

add.signal(strategy=strat.id, name='sigPeak', 
      arguments=list(column='ADX.ADX', direction="peak", data=quote(mktdata)), 
      label='ADX.peak') 

Allerdings, wenn ich applySignals(..., applyIndicators(..)) laufe direkt nach dem Hinzufügen, dass ein, bekomme ich einen Fehler:

Error in FUN(X[[i]], ...) : k must be a non-negative integer 

ich glaube, es an einen contradictio in Codicum gebührt in den folgenden Zeilen von quantmod und quantstrat:

Quantstrat, in der Definition von sigPeak:

Lag(ret_sig,-1) 

Quantmod, in der Definition von Lag.quantmod.OHLC wie das ist derjenige, der auf XTS Objekten verwendet wird:

if(k.e<0||k.e!=as.integer(k.e)) stop("k must be a non-negative integer") 

dies mit der bedeutet, dass aktuelle Versionen von quantmod und quantstrat, sigPeak funktioniert einfach nicht?

Antwort

2

Ich bin nicht sicher, wenn diese Funktion in einem Arbeitszustand war. Diese Linie in Revision 588 im März 2011 Davor hinzugefügt wurde, war der Zustand der Funktion:

sigPeak <- function(label,data,column, direction=c("peak","bottom")){ 
    colNum<-match.names(column,colnames(data)) 
    direction=direction[1] # only use the first] 
    switch(direction, 
      "peak" = { Lag(data[,colNum],2) < Lag(data[,colNum],1) & Lag(data[,colNum],1) > data[,colNum] } , 
      "bottom","valley" = { Lag(data[,colNum],2) > Lag(data[,colNum],1) & Lag(data[,colNum],1) < data[,colNum] } 
    ) 
    colnames(ret_sig)<-paste(label,direction,"sig",sep='.') 
    return(ret_sig) 
} 

Sie können sehen, dass ret_sig erstellt nicht, bevor es über colnames verwiesen hat, so der Aufruf von colnames hätte geworfen ein Fehler.

Wie auch immer, um das Problem zu beheben, müssen Sie nur die Lag(ret_sig, -1) Linie entfernen. Der Wert wird keinem zugewiesen, also tut er nichts.

Berichtet und behoben in issue #41.