Глядя на источник, sigPeak
генерирует сигнал, когда у вас фактически есть паттерн «треугольник» в базовом временном ряду, и генерирует сигнал, когда «треугольник» завершен.Имеет смысл использовать этот сигнал в сочетании с другими для генерации значимого торгового сигнала (возможно, сгладить временной ряд sigPeak с помощью EMA
и т. Д., Чтобы сделать его более устойчивым, и действовать так, чтобы он нарушал некоторое пороговое значение между 0 и 1 и т. Д.)
Ваша ошибка говорит о том, что pti.buy не является именем столбца в mktdata
.Таким образом, ваш add.rule
должен изменить аргумент sigcol = "pti.buy"
на любое имя столбца, содержащего ваш сигнал входа.Похоже, что это должно быть sigcol = "pti.buy.peak.sig.pti.buy"
, и тогда все должно работать.
При ближайшем рассмотрении sigPeak
, похоже, что имя столбца, выводимого из sigPeak
, принимает форму [label] .peak.sig. [метка], когда direction = "peak"
или [метка] .valley.sig. [метка], когда direction = "valley"
(при использовании тока direction = "bottom"
генерируется ошибка в sigPeak
из-за ошибки в коде переключателя внутри sigPeak
).Не совсем интуитивно.
Простой способ использования sigPeak
- изменить функцию и передать ее в качестве функции для add.signal
.Я делаю это с sigPeak2
ниже.
Вот воспроизводимый пример с использованием sigPeak
, который может помочь:
library(quantstrat)
strategy.st <- "RSI"
initEq=100000
port.st<-'RSI'
rm.strat(strategy.st)
stratRSI <- strategy(strategy.st, store = TRUE)
add.indicator(strategy = strategy.st, name = "RSI", arguments = list(price = quote(getPrice(mktdata))), label="pti")
sigPeak2 <- function (label, data, column, direction = c("peak", "bottom")) {
if (!is.numeric(column)) {
colNum <- match.names(column, colnames(data))
}
else colNum <- column
direction = direction[1]
switch(direction, peak = {
ret_sig <- Lag(data[, colNum], 2) < Lag(data[, colNum],
1) & Lag(data[, colNum], 1) > data[, colNum]
}, bottom = , valley = {
ret_sig <- Lag(data[, colNum], 2) > Lag(data[, colNum],
1) & Lag(data[, colNum], 1) < data[, colNum]
})
if (!missing(label))
colnames(ret_sig) <- label
return(ret_sig)
}
add.signal(strategy = strategy.st,
name = 'sigPeak',
arguments = list(data = quote(mktdata),
column = 'pti',
direction = 'peak'),
label = 'drop')
add.signal(strategy = strategy.st,
name = 'sigPeak2',
arguments = list(data = quote(mktdata),
column = 'pti',
direction = 'bottom'),
label = 'jump')
add.signal(strategy = strategy.st, name="sigThreshold",
arguments = list(threshold=70, column="pti",relationship="gt", cross= TRUE),
label="RSI.gt.70")
add.signal(strategy = strategy.st, name="sigThreshold",
arguments = list(threshold=60, column="pti",relationship="lt", cross= TRUE),
label="RSI.lt.60")
add.signal(strategy = strategy.st, name="sigFormula",arguments = list(formula = "RSI.gt.70 == 1 & jump == 1"),label="enterLong")
add.signal(strategy = strategy.st, name="sigFormula",arguments = list(formula = "RSI.lt.60 == 1 & drop.peak.sig.drop == 1"),label="exitLong")
add.rule(strategy = strategy.st, name='ruleSignal',
arguments = list(sigcol="enterLong",
sigval=TRUE,
orderqty= 100,
TxnFees=0,
ordertype='market',
orderside='long',
pricemethod='market',
replace=FALSE),
type='enter', path.dep=TRUE)
add.rule(strategy = strategy.st, name='ruleSignal',
arguments = list(sigcol="exitLong",
sigval=TRUE,
orderqty='all',
TxnFees=0,
ordertype='market',
orderside='long',
pricemethod='market',
replace=FALSE),
type='exit', path.dep=TRUE)
currency("USD")
symbols = c("SPY")
stock.str = symbols
startDate <- "2013-01-01"
getSymbols(stock.str,from=startDate, to= Sys.Date())
for(symbol in symbols){
stock(symbol, currency="USD",multiplier=1)
}
initPortf(port.st, symbols=symbols)
initAcct(port.st, portfolios=port.st, initEq=initEq)
initOrders(portfolio=port.st)
for(symbol in symbols){ addPosLimit(port.st, symbol, timestamp = startDate, maxpos = 1000) }
applyStrategy(strategy=strategy.st, portfolios=port.st)
updatePortf(strategy.st)
updateAcct(strategy.st)
updateEndEq(strategy.st)
chart.Posn(strategy.st, Symbol = 'SPY', Dates = '2000::')