限制 Quantstrat 中的职位数量
Limit number of Position in Quantstrat
最近几天我一直在摸不着头脑,试图了解如何限制策略中的头寸数量。这是一个通道突破策略(进入 long/shirt 20 天突破通道,设置 10 天 high/low 止损。
不想让系统传销。只接受 1 个职位,即
- 如果在第 1 天我有一个信号,并且市场保持趋势,它会打印出新的信号,但它们必须被取消,因为我们已经处于一个位置。
我尝试了我所发现的一切,但我一直无法实现任何目标。我知道我必须调整 osMaxPos 和 addPosLimit 但我似乎做错了。
这是我的代码。提前致谢。
#Import des données
GBPUSD <- getdata("GBPUSD.csv")
GBPUSD <- getdata("GBPUSD.csv")
AUDUSD <- getdata("AUDUSD.csv")
EURUSD <- getdata("EURUSD.csv")
XAUUSD <- getdata("XAUUSD.csv")
EURCHF <- getdata("EURCHF.csv")
### Création des devises
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" #date d'initialisation de l'environement
start.date <- "2001-10-01" #1ere date du jeu de donnée
end.date <- Sys.Date() #dernière date du jeu de donnée
initial.capital <- 1000000 #Capital de départ
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, #nom du book
symbols = symbols, #list des instruments
initDate=init.date, #date de départ du book
currency='USD') #devise de référence du book
initAcct(account.st, #nom du compte
portfolios = portfolio.st, #nom du portfeuille rattaché au compte
initDate = init.date, #date de départ du compte
currency = "USD", #devise du compte
initEq = initial.capital) #capital de départ du compte
initOrders(portfolio.st, #initialisation du container des orgers
initDate = init.date) #date de départ du book d'ordre
strategy("Breakout",store = TRUE)
#Definition des indicateurs
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")
##Definition des signaux
add.signal("Breakout", #nom de la strategie
name="sigCrossover", #type de signal
arguments = list(columns =c("Close","high.Donchian20"), #liste des colonnes pour déterminer le signal
relationship="gt"), #type de relation du signal (sup ou égal, sup, inférieur etc..)
label = "long") #label de la colonne du signal
add.signal("Breakout", #nom de la strategie
name="sigCrossover", #type de signal
arguments = list(columns =c("Close","low.Donchian10"), #liste des colonnes pour déterminer le signal
relationship="lt"), #type de relation du signal (sup ou égal, sup, inférieur etc..)
label = "exitlong") #label de la colonne du signal
add.signal("Breakout", #nom de la strategie
name="sigCrossover", #type de signal
arguments = list(columns =c("Close","low.Donchian20"), #liste des colonnes pour déterminer le signal
relationship="lt"), #type de relation du signal (sup ou égal, sup, inférieur etc..)
label = "short")
add.signal("Breakout", #nom de la strategie
name="sigCrossover", #type de signal
arguments = list(columns =c("Close","high.Donchian10"), #liste des colonnes pour déterminer le signal
relationship="gt"), #type de relation du signal (sup ou égal, sup, inférieur etc..)
label = "exitshort") #label de la colonne du signal
#Limite
#addPosLimit( portfolio = "Breakout", # add position limit rules
# symbol = "AUDUSD",
# timestamp = init.date,
# maxpos = tradesize)
addPosLimit("Breakout","AUDUSD",maxpos = 1, minpos = -1,timestamp = as.POSIXct(init.date))
getPosLimit(portfolio = "Breakout","AUDUSD", timestamp = as.POSIXct(init.date))
##Definition des règles
add.rule("Breakout", #nom de la strategie
name = "ruleSignal", #
arguments = list(sigcol ="long", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty=tradesize, #taille de l'ordre
osFun = osMaxPos,
replace = FALSE,
ordertype = "market", #type d'ordre
orderside ="long"), #sens
type = "enter", #ouverture ou fermeture de pose
label = "Enterlong") #label si exécution
add.rule("Breakout", #nom de la strategie
name = "ruleSignal", #
arguments = list(sigcol ="exitlong", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty="all", #taille de l'ordre
replace = FALSE,
ordertype = "market", #type d'ordre
orderside ="long"), #sens
type = "exit", #ouverture ou fermeture de pose
label = "Exitlong") #label si exécution
add.rule("Breakout", #nom de la strategie
name = "ruleSignal", #
arguments = list(sigcol ="short", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty=-tradesize,#taille de l'ordre
replace = FALSE,
ordertype = "market", #type d'ordre
orderside ="short"), #sens
type = "enter", #ouverture ou fermeture de pose
label = "Entershort") #label si exécution
add.rule("Breakout", #nom de la strategie
name = "ruleSignal", #
arguments = list(sigcol ="exitshort", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty="all",#taille de l'ordre
osFun = osMaxPos,
replace = FALSE,
ordertype = "market", #type d'ordre
orderside ="short"), #sens
type = "exit", #ouverture ou fermeture de pose
label = "Exitshort") #label si exécution
out <- applyStrategy("Breakout", portfolios = portfolio.st)
你的代码有不少问题。我会尽力解释所有这些。
初始化
您通常不需要在调用 initPortf
、initAcct
和 initOrders
时设置 initDate
。错误地设置该值可能会导致问题。所以这些电话应该是:
initPortf(portfolio.st, #nom du book
symbols = symbols, #list des instruments
currency='USD') #devise de référence du book
initAcct(account.st, #nom du compte
portfolios = portfolio.st, #nom du portfeuille rattaché au compte
currency = "USD", #devise du compte
initEq = initial.capital) #capital de départ du compte
initOrders(portfolio.st) #initialisation du container des orgers
持仓限制
您在调用 addPosLimit
时将 max/min 交易规模设置为 1,但您的交易规模为 100 万。因此任何订单都将被拒绝,因为它会使您超出头寸限制。您还应该知道 addPosLimit
的 timestamp
参数决定了限制何时生效。如果您始终希望它们生效,则应将时间戳设置为数据中第一次观察之前的时间。另请注意,您仅为 AUDUSD
创建了头寸限制。您需要为每个交易品种创建头寸限制。
addPosLimit("Breakout", "GBPUSD", maxpos = tradesize, timestamp = start(GBPUSD)-1)
addPosLimit("Breakout", "AUDUSD", maxpos = tradesize, timestamp = start(AUDUSD)-1)
addPosLimit("Breakout", "EURUSD", maxpos = tradesize, timestamp = start(EURUSD)-1)
规则
一个问题是您将 osFun
传递给了 ruleSignal
。 ruleSignal
没有 osFun
参数。参数是 osFUN
(大小写很重要)。另一个问题是您在短 exit 规则中指定了 osFun = osMaxPos
,而不是 entry 规则。
add.rule("Breakout", name = "ruleSignal",
arguments = list(sigcol = "long", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty = tradesize, #taille de l'ordre
osFUN = osMaxPos,
replace = FALSE,
ordertype = "market", #type d'ordre
orderside = "long"), #sens
type = "enter", label = "Enterlong")
add.rule("Breakout", name = "ruleSignal",
arguments = list(sigcol = "exitlong", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty = "all", #taille de l'ordre
replace = FALSE,
ordertype = "market", #type d'ordre
orderside = "long"), #sens
type = "exit", label = "Exitlong")
add.rule("Breakout", name = "ruleSignal",
arguments = list(sigcol = "short", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty = -tradesize,#taille de l'ordre
osFUN = osMaxPos,
replace = FALSE,
ordertype = "market", #type d'ordre
orderside = "short"), #sens
type = "enter", label = "Entershort")
add.rule("Breakout", name = "ruleSignal",
arguments = list(sigcol = "exitshort", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty = "all", #taille de l'ordre
replace = FALSE,
ordertype = "market", #type d'ordre
orderside = "short"), #sens
type = "exit", label = "Exitshort")
最近几天我一直在摸不着头脑,试图了解如何限制策略中的头寸数量。这是一个通道突破策略(进入 long/shirt 20 天突破通道,设置 10 天 high/low 止损。
不想让系统传销。只接受 1 个职位,即 - 如果在第 1 天我有一个信号,并且市场保持趋势,它会打印出新的信号,但它们必须被取消,因为我们已经处于一个位置。
我尝试了我所发现的一切,但我一直无法实现任何目标。我知道我必须调整 osMaxPos 和 addPosLimit 但我似乎做错了。
这是我的代码。提前致谢。
#Import des données
GBPUSD <- getdata("GBPUSD.csv")
GBPUSD <- getdata("GBPUSD.csv")
AUDUSD <- getdata("AUDUSD.csv")
EURUSD <- getdata("EURUSD.csv")
XAUUSD <- getdata("XAUUSD.csv")
EURCHF <- getdata("EURCHF.csv")
### Création des devises
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" #date d'initialisation de l'environement
start.date <- "2001-10-01" #1ere date du jeu de donnée
end.date <- Sys.Date() #dernière date du jeu de donnée
initial.capital <- 1000000 #Capital de départ
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, #nom du book
symbols = symbols, #list des instruments
initDate=init.date, #date de départ du book
currency='USD') #devise de référence du book
initAcct(account.st, #nom du compte
portfolios = portfolio.st, #nom du portfeuille rattaché au compte
initDate = init.date, #date de départ du compte
currency = "USD", #devise du compte
initEq = initial.capital) #capital de départ du compte
initOrders(portfolio.st, #initialisation du container des orgers
initDate = init.date) #date de départ du book d'ordre
strategy("Breakout",store = TRUE)
#Definition des indicateurs
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")
##Definition des signaux
add.signal("Breakout", #nom de la strategie
name="sigCrossover", #type de signal
arguments = list(columns =c("Close","high.Donchian20"), #liste des colonnes pour déterminer le signal
relationship="gt"), #type de relation du signal (sup ou égal, sup, inférieur etc..)
label = "long") #label de la colonne du signal
add.signal("Breakout", #nom de la strategie
name="sigCrossover", #type de signal
arguments = list(columns =c("Close","low.Donchian10"), #liste des colonnes pour déterminer le signal
relationship="lt"), #type de relation du signal (sup ou égal, sup, inférieur etc..)
label = "exitlong") #label de la colonne du signal
add.signal("Breakout", #nom de la strategie
name="sigCrossover", #type de signal
arguments = list(columns =c("Close","low.Donchian20"), #liste des colonnes pour déterminer le signal
relationship="lt"), #type de relation du signal (sup ou égal, sup, inférieur etc..)
label = "short")
add.signal("Breakout", #nom de la strategie
name="sigCrossover", #type de signal
arguments = list(columns =c("Close","high.Donchian10"), #liste des colonnes pour déterminer le signal
relationship="gt"), #type de relation du signal (sup ou égal, sup, inférieur etc..)
label = "exitshort") #label de la colonne du signal
#Limite
#addPosLimit( portfolio = "Breakout", # add position limit rules
# symbol = "AUDUSD",
# timestamp = init.date,
# maxpos = tradesize)
addPosLimit("Breakout","AUDUSD",maxpos = 1, minpos = -1,timestamp = as.POSIXct(init.date))
getPosLimit(portfolio = "Breakout","AUDUSD", timestamp = as.POSIXct(init.date))
##Definition des règles
add.rule("Breakout", #nom de la strategie
name = "ruleSignal", #
arguments = list(sigcol ="long", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty=tradesize, #taille de l'ordre
osFun = osMaxPos,
replace = FALSE,
ordertype = "market", #type d'ordre
orderside ="long"), #sens
type = "enter", #ouverture ou fermeture de pose
label = "Enterlong") #label si exécution
add.rule("Breakout", #nom de la strategie
name = "ruleSignal", #
arguments = list(sigcol ="exitlong", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty="all", #taille de l'ordre
replace = FALSE,
ordertype = "market", #type d'ordre
orderside ="long"), #sens
type = "exit", #ouverture ou fermeture de pose
label = "Exitlong") #label si exécution
add.rule("Breakout", #nom de la strategie
name = "ruleSignal", #
arguments = list(sigcol ="short", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty=-tradesize,#taille de l'ordre
replace = FALSE,
ordertype = "market", #type d'ordre
orderside ="short"), #sens
type = "enter", #ouverture ou fermeture de pose
label = "Entershort") #label si exécution
add.rule("Breakout", #nom de la strategie
name = "ruleSignal", #
arguments = list(sigcol ="exitshort", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty="all",#taille de l'ordre
osFun = osMaxPos,
replace = FALSE,
ordertype = "market", #type d'ordre
orderside ="short"), #sens
type = "exit", #ouverture ou fermeture de pose
label = "Exitshort") #label si exécution
out <- applyStrategy("Breakout", portfolios = portfolio.st)
你的代码有不少问题。我会尽力解释所有这些。
初始化
您通常不需要在调用 initPortf
、initAcct
和 initOrders
时设置 initDate
。错误地设置该值可能会导致问题。所以这些电话应该是:
initPortf(portfolio.st, #nom du book
symbols = symbols, #list des instruments
currency='USD') #devise de référence du book
initAcct(account.st, #nom du compte
portfolios = portfolio.st, #nom du portfeuille rattaché au compte
currency = "USD", #devise du compte
initEq = initial.capital) #capital de départ du compte
initOrders(portfolio.st) #initialisation du container des orgers
持仓限制
您在调用 addPosLimit
时将 max/min 交易规模设置为 1,但您的交易规模为 100 万。因此任何订单都将被拒绝,因为它会使您超出头寸限制。您还应该知道 addPosLimit
的 timestamp
参数决定了限制何时生效。如果您始终希望它们生效,则应将时间戳设置为数据中第一次观察之前的时间。另请注意,您仅为 AUDUSD
创建了头寸限制。您需要为每个交易品种创建头寸限制。
addPosLimit("Breakout", "GBPUSD", maxpos = tradesize, timestamp = start(GBPUSD)-1)
addPosLimit("Breakout", "AUDUSD", maxpos = tradesize, timestamp = start(AUDUSD)-1)
addPosLimit("Breakout", "EURUSD", maxpos = tradesize, timestamp = start(EURUSD)-1)
规则
一个问题是您将 osFun
传递给了 ruleSignal
。 ruleSignal
没有 osFun
参数。参数是 osFUN
(大小写很重要)。另一个问题是您在短 exit 规则中指定了 osFun = osMaxPos
,而不是 entry 规则。
add.rule("Breakout", name = "ruleSignal",
arguments = list(sigcol = "long", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty = tradesize, #taille de l'ordre
osFUN = osMaxPos,
replace = FALSE,
ordertype = "market", #type d'ordre
orderside = "long"), #sens
type = "enter", label = "Enterlong")
add.rule("Breakout", name = "ruleSignal",
arguments = list(sigcol = "exitlong", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty = "all", #taille de l'ordre
replace = FALSE,
ordertype = "market", #type d'ordre
orderside = "long"), #sens
type = "exit", label = "Exitlong")
add.rule("Breakout", name = "ruleSignal",
arguments = list(sigcol = "short", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty = -tradesize,#taille de l'ordre
osFUN = osMaxPos,
replace = FALSE,
ordertype = "market", #type d'ordre
orderside = "short"), #sens
type = "enter", label = "Entershort")
add.rule("Breakout", name = "ruleSignal",
arguments = list(sigcol = "exitshort", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty = "all", #taille de l'ordre
replace = FALSE,
ordertype = "market", #type d'ordre
orderside = "short"), #sens
type = "exit", label = "Exitshort")