Я ищу примеры кодов оптимизации параметров в Quantstrat при использовании пользовательских индикаторов. Большинство примеров, которые я могу найти в Интернете, используют SMA, MACD и другие классические индикаторы. Мне это не очень помогает, так как я хотел бы в основном оптимизировать торговые системы с помощью пользовательских индикаторов.
Есть ли у кого-нибудь соответствующие ссылки или материалы?
Чтобы быть более конкретным, я впервые пробую вариант оптимизации индикатора. Индикатор, который я использую, — это импульс леса MACD. Я пытаюсь оценить эффективность этого индикатора по сравнению с обычным пересечением сигнальной линии MACD. Но я не хочу слишком зацикливаться на этом конкретном индикаторе, так как моя цель состоит в том, чтобы иметь жизнеспособный код оптимизации для будущих пользовательских индикаторов, которые я буду использовать.
Вот код, данные представляют собой внутридневные котировки EURUSD (5-минутные свечи):
library(quantstrat)
Sys.setenv(TZ = "UTC")
currency(c('EUR', 'USD'))
exchange_rate(c('EURUSD'), tick_size=0.0001)
init_date <- "2018-01-07"
start_date <- "2018-01-08"
end_date <- "2018-01-08"
init_equity <- 1e8 # $100,000,000
adjustment <- FALSE
basic_symbols <- function() {
symbols <- c(
"EUR"
)
}
symbols <- basic_symbols()
portfolio.st <- "Port.Luxor.Opt"
account.st <- "Acct.Luxor.Opt"
strategy.st <- "Strat.Luxor.Opt"
rm.strat(portfolio.st)
rm.strat(account.st)
initPortf(name = portfolio.st,
symbols = symbols,
initDate = init_date)
initAcct(name = account.st,
portfolios = portfolio.st,
initDate = init_date,
initEq = init_equity)
initOrders(portfolio = portfolio.st,
symbols = symbols,
initDate = init_date)
strategy(strategy.st, store = TRUE)
fastMA_custom = 12
fastMA_custom2 = 12
slowMA_custom = 26
slowMA_custom2 = 26
signalMA_custom = 9
signalMA_custom2 = 9
maType="EMA"
MAforest = 3
forest <- function(x){
step1 <- EMA(x,fastMA_custom)
step2 <- EMA(x,slowMA_custom)
step3 <- step1-step2
step4 <- EMA(step3,signalMA_custom)
step5 <- step3-step4
return(step5)
}
smaforest <- function(x){
step1 <- EMA(x,fastMA_custom2)
step2 <- EMA(x,slowMA_custom2)
step3 <- step1-step2
step4 <- EMA(step3,signalMA_custom2)
step5 <- step3-step4
step6 <- EMA(step5,MAforest)
return(step6)
}
add.indicator(strategy = strategy.st,
name ="forest",
arguments = list(x=quote(Cl(mktdata))),
label="forest")
add.indicator(strategy=strategy.st,
name ="smaforest",
arguments = list(x=quote(Cl(mktdata))),
label="smaforest")
add.distribution(strategy.st,
paramset.label = "forestopt",
component.type = "indicator",
component.label = "forest",
variable = list(fastMA_custom= 8:14),
label = "fastMA_custom")
add.signal(strategy = strategy.st,
name="sigCrossover",
arguments = list(columns = c("forest", "smaforest"),
relationship = "gte"),
label = "long")
add.signal(strategy = strategy.st,
name="sigCrossover",
arguments = list(columns = c("forest", "smaforest"),
relationship = "lte"),
label = "short")
add.rule(strategy.st,
name = "ruleSignal",
arguments = list(sigcol = "long",
sigval = TRUE,
orderqty = 100000,
ordertype = "market",
orderside = "long",
TxnFees = -1,
replace = FALSE),
type = "enter",
label = "EnterLONG")
add.rule(strategy.st,
name = "ruleSignal",
arguments = list(sigcol = "short",
sigval = TRUE,
orderqty = -100000,
ordertype = "market",
orderside = "short",
replace = FALSE,
TxnFees = -1
),
type = "enter",
label = "EnterSHORT")
add.rule(strategy.st,
name = "ruleSignal",
arguments = list(sigcol = "short",
sigval = TRUE,
orderside = "long",
ordertype = "market",
orderqty = "all",
TxnFees = -1,
replace = TRUE),
type = "exit",
label = "Exit2SHORT")
add.rule(strategy.st,
name = "ruleSignal",
arguments = list(sigcol = "long",
sigval = TRUE,
orderside = "short",
ordertype = "market",
orderqty = "all",
TxnFees = -1,
replace = TRUE),
type = "exit",
label = "Exit2LONG")
addPosLimit(portfolio.st, 'EUR', timestamp=initDate, maxpos=500, minpos=0)
resultsopt <- apply.paramset(strategy.st,
paramset.label = "forestopt",
portfolio.st = portfolio.st,
account.st = account.st,
nsamples = 0)
Тестирование на истории без части оптимизации работает отлично. Это действительно бит оптимизации, который вызывает ошибку.
Вот ошибка, которую я получаю:
ошибка при вызове функции объединения: «simpleError in fun (результат 1, результат 2, результат 3, результат 4, результат 5, результат 6, результат 7): попытка выбрать менее одного элемента»