I have been scratching my head several times over the past few days, trying to figure out how to limit the number of positions in a strategy. His channel break strategy (go through a long / breakout 20d shirt with 10d high / low stop.
I do not want a pyramid system. Only 1 position is accepted ie - if on the 1st day I have a signal and the market continues the trend, it will print new signals, but they need to be fired, since we are already in a position.
I tried everything I found, but I could not achieve anything. I know what I need to configure using osMaxPos and addPosLimit, but it seems I'm doing it wrong.
Here is my code. Thanks in advance.
GBPUSD <- getdata("GBPUSD.csv")
GBPUSD <- getdata("GBPUSD.csv")
AUDUSD <- getdata("AUDUSD.csv")
EURUSD <- getdata("EURUSD.csv")
XAUUSD <- getdata("XAUUSD.csv")
EURCHF <- getdata("EURCHF.csv")
currency(c("USD","EUR","AUD","GBP","XAU","CHF"))
exchange_rate(c("EURUSD","GBPUSD","AUDUSD","XAUUSD","EURCHF"),"USD")
symbols <- c("GBPUSD","AUDUSD","EURUSD")
tradesize <- 1000000
init.date <- "2001-09-04"
start.date <- "2001-10-01"
end.date <- Sys.Date()
initial.capital <- 1000000
Breakout <- strategy("Breakout")
portfolio.st <- account.st <- strat.st <- "Breakout"
if (!exists('.blotter')) .blotter <- new.env()
if (!exists('.strategy')) .strategy <- new.env()
initPortf(portfolio.st,
symbols = symbols,
initDate=init.date,
currency='USD')
initAcct(account.st,
portfolios = portfolio.st,
initDate = init.date,
currency = "USD",
initEq = initial.capital)
initOrders(portfolio.st,
initDate = init.date)
strategy("Breakout",store = TRUE)
add.indicator("Breakout",
name = "DonchianChannel",
arguments=list(HL=quote(cbind(Hi(mktdata)[,1],Lo(mktdata)[,1])), n=20,include.lag=TRUE), label="Donchian20")
add.indicator("Breakout",
name = "DonchianChannel",
arguments=list(HL=quote(cbind(Hi(mktdata)[,1],Lo(mktdata)[,1])), n=10,include.lag=TRUE), label="Donchian10")
add.signal("Breakout",
name="sigCrossover",
arguments = list(columns =c("Close","high.Donchian20"),
relationship="gt"),
label = "long")
add.signal("Breakout",
name="sigCrossover",
arguments = list(columns =c("Close","low.Donchian10"),
relationship="lt"),
label = "exitlong")
add.signal("Breakout",
name="sigCrossover",
arguments = list(columns =c("Close","low.Donchian20"),
relationship="lt"),
label = "short")
add.signal("Breakout",
name="sigCrossover",
arguments = list(columns =c("Close","high.Donchian10"),
relationship="gt"),
label = "exitshort")
addPosLimit("Breakout","AUDUSD",maxpos = 1, minpos = -1,timestamp = as.POSIXct(init.date))
getPosLimit(portfolio = "Breakout","AUDUSD", timestamp = as.POSIXct(init.date))
add.rule("Breakout",
name = "ruleSignal",
arguments = list(sigcol ="long",
sigval = TRUE,
orderqty=tradesize,
osFun = osMaxPos,
replace = FALSE,
ordertype = "market",
orderside ="long"),
type = "enter",
label = "Enterlong")
add.rule("Breakout",
name = "ruleSignal",
arguments = list(sigcol ="exitlong",
sigval = TRUE,
orderqty="all",
replace = FALSE,
ordertype = "market",
orderside ="long"),
type = "exit",
label = "Exitlong")
add.rule("Breakout",
name = "ruleSignal",
arguments = list(sigcol ="short",
sigval = TRUE,
orderqty=-tradesize,
replace = FALSE,
ordertype = "market",
orderside ="short"),
type = "enter",
label = "Entershort")
add.rule("Breakout",
name = "ruleSignal",
arguments = list(sigcol ="exitshort",
sigval = TRUE,
orderqty="all",
osFun = osMaxPos,
replace = FALSE,
ordertype = "market",
orderside ="short"),
type = "exit",
label = "Exitshort")
out <- applyStrategy("Breakout", portfolios = portfolio.st)