2017-11-12 3 views
1

私のカスタムインジケータ関数内の現在のシンボル文字列、たとえば「GOOG」にアクセスしたいとします。ここに私が作ることができる最も基本的な例があります。applyIndi​​catorsまたはapplyStrategyを適用したときにカスタム関数内で現在の「シンボル」を取得する方法

require(quantstrat) 
Sys.setenv(TZ="UTC") 
symbols <- c("GOOG", "AAPL") 
getSymbols(symbols, src="yahoo") 
strategy.st <- "test" 
strategy(strategy.st, store=TRUE) 


test_fun <- function(x){ 
    print(symbol) ##### i want to access the current symbol eg "GOOG" 
    return(x) 
} 



add.indicator(strategy = strategy.st, 
       name = "test_fun", 
       arguments = list(x = quote(Cl(mktdata))), 
       label = "test_ind") 


mktdata <- applyIndicators(strategy = strategy.st, GOOG) 

Error in print(symbol) : object 'symbol' not found 
Called from: print(symbol) 

答えて

1

mktdata = GOOG引数に既に必要なデータが含まれているため、applyIndicator関数のシンボルをスタンドアロン関数呼び出しとして取得することは実際には意味がありません。私はあなたがこれを行うことができ

...あなたが作業するとき、あなたががapplyStrategyを呼び出すときにかかわらずapplyIndicatorコールでシンボルを取得したい疑う:

require(quantstrat) 
Sys.setenv(TZ="UTC") 
symbols <- c("GOOG", "AAPL") 
getSymbols(symbols, src="yahoo") 

currency("USD") 
stock(c("GOOG", "AAPL"), "USD") 

strategy.st <- "test" 
portfolio.st <- "test" 
rm.strat(strategy.st) 
initPortf(portfolio.st, symbols = symbols) 
strategy(strategy.st, store=TRUE) 


account.st <- "test" 
initAcct(account.st, portfolios = portfolio.st, initEq = 1000) 
initOrders(portfolio.st) 



test_fun <- function(x){ 
    symbol <- parent.frame(n = 2)$symbol 
    print(symbol) ##### i want to access the current symbol eg "GOOG" 
    return(x) 
} 



add.indicator(strategy = strategy.st, 
       name = "test_fun", 
       arguments = list(x = quote(Cl(mktdata))), 
       label = "test_ind") 
applyStrategy(strategy.st, portfolio.st) 

これは、親環境のでapplyStrategy用に動作しますシンボルループの周りにいくつかのレベルがループし(各反復でapplyIndicatorsを呼び出す)、インジケータが計算されている現在のシンボルを保持するsymbolがあります。

これは、applyIndicatorsに渡されるcurrenctシンボルのmktdataオブジェクト内のデータだけでなく、より高度なインジケータ構築を行う場合は、グローバル環境または他の環境から外部データを引き出すことができます。

(より簡単なアプローチは、単に列名がシンボルラベルが含まれている場合、testfunxオブジェクト内に存在してもよいOHLC列名からシンボル名を抽出することもある。)

+0

ありがとうございました!はい、実際には私はapplyStrategy()関数を実行しています。カスタムインジケータは、シンボルを使用してデータフレームのルックアップを行います。そのため、シンボルコードが必要でした。 –

+0

謝罪私はちょうど答えたとマークしました、ありがとう –

関連する問題