0

このコードを実行しようとしています

OBVMA <- function(price,volume,n) {
price <- try.xts(price, error = as.matrix)
volume <- try.xts(volume, error = as.matrix)
if (!(is.xts(price) && is.xts(volume))) {
price <- as.vector(price)
volume <- as.vector(volume)
}
obvma <- c(volume[1], ifelse(ROC(price) > 0, volume, -volume)[-1])
obvma <- cumsum(obvma)
obvma <- runMean(obvma, n)
if (is.xts(obvma)) {
obvma <- xts(obvma, index(price))
colnames(obvma) <- "obvma"
}
reclass(obvma, price)
}

require(quantstrat)
suppressWarnings(rm("order_book.obvcross",pos=.strategy))
suppressWarnings(rm("account.obvcross","portfolio.obvcross",pos=.blotter))
suppressWarnings(rm("account.st","portfolio.st","stock.str","stratOBVCROSS","initDate","initEq",'start_t','end_t'))
stock.str='ALPHA.AT' 
currency('EUR')
stock(stock.str,currency='EUR',multiplier=1)
initDate='2001-12-31'
initEq=1000000
portfolio.st='obvcross'
account.st='obvcross'
initPortf(portfolio.st,symbols=stock.str, initDate=initDate)
initAcct(account.st,portfolios=portfolio.st, initDate=initDate)
initOrders(portfolio=portfolio.st,initDate=initDate)

stratOBVCROSS<- strategy(portfolio.st)

stratOBVCROSS <- add.indicator(strategy = stratOBVCROSS, name = "OBV", arguments = list(price = quote(Cl(mktdata)),volume = quote(Vo(mktdata))),label= "obv")
stratOBVCROSS <- add.indicator(strategy = stratOBVCROSS, name = "OBVMA", arguments = list(price = quote(Cl(mktdata)),volume = quote(Vo(mktdata)), n=20),label="obvma20")

stratOBVCROSS <- add.signal(strategy = stratOBVCROSS,name="sigCrossover",arguments = list(column=c("obv","obvma20"),relationship="gte"),label="obv.gte.obvma20")
stratOBVCROSS <- add.signal(strategy = stratOBVCROSS,name="sigCrossover",arguments = list(column=c("obv","obvma20"),relationship="lt"),label="obv.lt.obvma20")

stratOBVCROSS <- add.rule(strategy = stratOBVCROSS,name='ruleSignal', arguments = list(sigcol="obv.gte.obvma20",sigval=TRUE, orderqty=100, ordertype='market', orderside='long'),type='enter')
stratOBVCROSS <- add.rule(strategy = stratOBVCROSS,name='ruleSignal', arguments = list(sigcol="obv.lt.obvma20",sigval=TRUE, orderqty=-100, ordertype='market', orderside='long'),type='exit')

stratOBVCROSS <- add.rule(strategy = stratOBVCROSS,name='ruleSignal', arguments = list(sigcol="obv.lt.obvma20",sigval=TRUE, orderqty=-100, ordertype='market', orderside='short'),type='enter')
stratOBVCROSS <- add.rule(strategy = stratOBVCROSS,name='ruleSignal', arguments = list(sigcol="obv.gte.obvma20",sigval=TRUE, orderqty=100, ordertype='market', orderside='short'),type='exit')

getSymbols(stock.str,from=initDate)
for(i in stock.str)
  assign(i, adjustOHLC(get(i),use.Adjusted=TRUE))

start_t<-Sys.time()
out<-try(applyStrategy(strategy=stratOBVCROSS,portfolios=portfolio.st))

しかし、コードの最後の行を適用すると、このエラー メッセージが表示されます

Error in if (length(j) == 0 || (length(j) == 1 && j == 0)) { : 
  missing value where TRUE/FALSE needed

誰かがこのエラー メッセージの解決策を見つけるのを手伝ってくれませんか

前もって感謝します

4

2 に答える 2

3

問題は、列「obvma20」を探しているが、関数が「obvma」という名前の列を作成することです。

簡単な答えは、add.signal定義を「obvma」を使用するように変更することです。

関数の作成者(あなた)が列ラベルを特定の方法にしたいと仮定すると、quantstratは列名が存在する場所でそれらを上書きしません。将来、重複する列名を検索してその場合にラベルを適用するように変更する可能性がありますが、この場合でも、間違った列名を検索することになります。

于 2011-08-05T17:39:08.097 に答える
0

同様のエラーが発生します。たとえば、今 bbands.demo を実行すると、applyIndi​​cator が実際に以下のコードに従って列名を変更しているようです (これを持っていない別のマシンで古いパッケージを見つけることができたので、この動作は新しいようです)問題)。

例のように applyIndi​​cator のコードを実行して適用した直後:

** * **元の列名に注意してください。

Browse[2]> head(tmp_val) dn mavg up pctB 2007-01-03 NA NA NA NA 2007-01-04 NA NA NA NA 2007-01-05 NA NA NA NA 2007-01-08 NA NA NA NA 2007 -01-09 NA NA NA NA 2007-01-10 NA NA NA NA

これは、既存のコードの上に貼り付けられた「新しいコード」のようです。(以下の古いコードを参照)

閲覧[2]>

debug: if (ncol(tmp_val) == 1) {
    colnames(tmp_val) <- indicator$label
} else {
    colnames(tmp_val) <- paste(indicator$label, seq(1, ncol(tmp_val)), 
        sep = ".")
}

その結果 :

ブラウズ[2]>ヘッド(tmp_val)

****列名がどのように変更されたかに注意してください

       BBands.1 BBands.2 BBands.3 BBands.4

2007-01-03 NA NA NA NA 2007-01-04 NA NA NA NA 2007-01-05 NA NA NA NA 2007-01-08 NA NA NA NA 2007-01-09 NA NA NA NA 2007-01-10ななななな

* 以下のように呼び出すと、次のエラーが発生します。

if (length(j) == 0 || (length(j) == 1 && j == 0)) { : TRUE/FALSE が必要な場所に値がありません。さらに: 警告メッセージ: In download.file(paste( yahoo.URL, "s=", Symbols.name, "&a=", from.m, : ダウンロード長 83602 != 報告長 200

注意 vs 古いコード:

閲覧[2]>

 debug: if (is.null(colnames(tmp_val))) {
        if (ncol(tmp_val) == 1) {
            colnames(tmp_val) <- indicator$label
        }
        else {
            colnames(tmp_val) <- paste(indicator$label, seq(1, ncol(tmp_val)),
                sep = ".")
        }
    } else {
        if (ncol(tmp_val) > 1)
            colnames(tmp_val) <- paste(indicator$label, colnames(tmp_val),
                sep = ".")
    }

bbands のデモから、up は BBands.ind.1 に置き換えられます (ただし、「up」を BBands.ind.1 に置き換えると動作しないようです)。

stratBBands <- add.signal(stratBBands,name="sigCrossover",arguments = list(columns=c("Close","up"),relationship="gt"),label="Cl.gt.UpperBand")

 stratBBands <- add.signal(stratBBands,name="sigCrossover",arguments = list(columns=c("Close","dn"),relationship="lt"),label="Cl.lt.LowerBand")

 stratBBands <- add.signal(stratBBands,name="sigCrossover",arguments = list(columns=c("High","Low","mavg"),relationship="op"),label="Cross.Mid")
于 2013-03-24T17:15:19.250 に答える