Стратегия выполняется во втором сигнале индикатора (Quantstrat) - PullRequest
1 голос
/ 28 мая 2020

Стратегия основана на 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")

1 Ответ

0 голосов
/ 05 июля 2020

Поскольку у вас есть предел позиции, определенный с помощью addPosLimit, вы можете использовать cross=FALSE в sigThreshold в add.signal. Таким образом, сигнал будет верным до тех пор, пока RSI будет выше / ниже вашего верхнего / нижнего порога, а не только когда он пересекает порог. Однако стоит упомянуть, что вы, вероятно, захотите отделить сигналы входа от сигналов выхода. Обычно они не оптимальны при симметричном использовании. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...