Стратегия основана на RSI.
Когда RSI <30, инструмент покупается до RSI> 70
когда RSI> 70, инструмент продается до RSI <30 </p>
Стратегия настроена так, чтобы принимать только первый сигнал из ряда положительных сигналов. Это означает, что если есть 4 сигнала покупки подряд, он принимает только первый сигнал и ждет, пока не появится сигнал продажи, а позиция bulli sh закрывается и открывается новая позиция beari sh.
Проблема в том, что записи выполняются только там, где появляется второй сигнал. Создание разрыва между длинными и короткими позициями.
введите здесь описание изображения
между строками 60-116 есть методы add.rule, используемые для ввода позиций. Я не могу понять, почему стратегия ожидает появления второго сигнала для выполнения.
Спасибо, ребята.
library(quantstrat)
library(blotter)
library(foreach)
library(quantmod)
library(PerformanceAnalytics)
library(FinancialInstrument)
library(TTR)
library(xts)
library(zoo)
symbolString <- 'USDCAD=X'
currency('USD')
stock( symbolString, currency = 'USD', multiplier = 1 )
# Load historical Data
initDate <- '2007-01-01'
startDate <- '2012-01-01'
endDate <- '2015-08-10'
init_equity <- 50000
Sys.setenv( TZ = 'UTC')
getSymbols( symbolString, from = startDate, to = endDate, adjust = TRUE, src = 'yahoo')
`USDCAD=X` <- na.omit(`USDCAD=X`)
# Define names for portfolio, account and strategy
portfolioName <- accountName <- strategyName <- 'firstPortfolio'
rm.strat(strategyName)
# Initializae portfolio and account, orderbook and strategy
initPortf( name = portfolioName, symbols = symbolString, initDate = initDate)
initAcct( name = accountName, portfolios = portfolioName, initDate = initDate, initEq = init_equity)
initOrders( portfolio = portfolioName, symbols = symbolString, initDate = initDate)
addPosLimit(strategyName, symbolString, initDate, 1000, 1)
strategy( strategyName, store = TRUE )
# Add RSI indicator
#
add.indicator( strategy = strategyName, name = 'RSI',
arguments = list( price = quote(Cl(mktdata)), maType = "EMA"),
label = 'RSI')
# Adding signals
# Long signal
add.signal(strategy = strategyName, name="sigThreshold",
arguments = list(threshold=30, column="RSI",
relationship="lt",cross =TRUE),
label="longSignal")
# Short signal
add.signal(strategy = strategyName, name="sigThreshold",
arguments = list(threshold=70, column="RSI",
relationship="gt",cross =TRUE),
label="shortSignal")
# Adding rules
# go Long 100 shares
add.rule( strategyName, name = 'ruleSignal',
arguments = list( sigcol = "longSignal",
sigval = TRUE,
orderqty = 1000,
ordertype = "market",
orderside = "long",
osFUN = osMaxPos,
replace = TRUE,
TxnFees = -10),
enabled = TRUE,
type = 'enter',
label = 'EnterLong')
# Close long positions
add.rule( strategyName, name = "ruleSignal",
arguments = list( sigcol = "shortSignal",
sigval = TRUE,
orderside = "long",
ordertype = "market",
orderqty = "all",
TxnFees = -10,
replace = TRUE),
enabled = TRUE,
type = "exit",
label = "ExitLong")
#
# # go short 100 shares
add.rule( strategyName, name = "ruleSignal",
arguments = list( sigcol = "shortSignal",
sigval = TRUE,
orderqty = -1000,
ordertype = "market",
orderside = "short",
osFUN = osMaxPos,
replace = TRUE,
TxnFees = -10),
type = 'enter',
label = 'EnterShort')
# Closing short positions
add.rule( strategyName, name = "ruleSignal",
arguments = list( sigcol = "longSignal",
sigval = TRUE,
orderside = "short",
ordertype = "market",
orderqty = "all",
TxnFees = -10,
replace = TRUE),
type = "exit",
label = "ExitShort")
# Applying strategy to portfolio
results <- applyStrategy( strategy = strategyName, portfolios = portfolioName, symbols = symbolString)
# Updating portfolio
updatePortf( portfolioName)
dateRange <- time( getPortfolio(portfolioName)$summary)[-1]
updateAcct( portfolioName, dateRange)
updateEndEq(accountName)
chart.Posn( strategyName, "USDCAD=X")