如何在quantstrat中输入相互抵消的订单?例如,一旦我进入交易,我立即开出两个订单:"止损"和"获利".一旦填满,另一个将被取消.
#Enter signal
strategy <- add.rule(strategy, name="ruleSignal",
arguments=list(sigcol="EnterBuy", sigval=TRUE, orderqty=100,
ordertype="market", orderside="long",
pricemethod="market", osFUN=osMaxPos),
type="enter", path.dep=TRUE)
#Stop loss
strategy <- add.rule(strategy, name="ruleSignal",
arguments=list(sigcol="EnterBuy", sigval=TRUE,
orderqty="all", ordertype="stoplimit",
orderside="short", threshold=-5,
tmult=FALSE),
type="exit", path.dep=TRUE)
#Take profit
strategy <- add.rule(strategy, name="ruleSignal",
arguments=list(sigcol="EnterBuy", sigval=TRUE,
orderqty="all", ordertype="stoplimit",
orderside="short", threshold=5,
tmult=FALSE),
type="exit", path.dep=TRUE)
Run Code Online (Sandbox Code Playgroud)
目前,他们正在独立工作.
当我使用时,enable.rule我无法覆盖规则的内部enabled=FALSE.
例如:
## Stop Loss Rule
stratstocky <- add.rule(stratstocky,
name = "ruleSignal",
arguments = list(sigcol = "sdH",
sigval = TRUE,
replace = FALSE,
orderside = "long",
ordertype = "stoptrailing",
tmult = TRUE,
threshold = quote(stopLossPercent),
orderqty = "all",
orderset = "ocolong"),
type = "chain",
parent = "getLong",
label = "StopTrailingLong",
enabled = FALSE
)
Run Code Online (Sandbox Code Playgroud)
当我在applyStrategy之前放置此代码时:
enable.rule(stratstocky, type="chain", "StopTrail", enable=TRUE)
Run Code Online (Sandbox Code Playgroud)
规则不会启用或激活.激活规则的唯一方法是改变它的内部启用TRUE.我尝试过精确的拼写,但它对我不起作用.
这不是一个大问题,因为我可以参数化规则的内部启用并以这种方式控制它,但更喜欢使用现有代码来运行我的系统.
对enable.rule问题的任何见解?
我想在RStudio中使用最新的R版本时安装一个软件包.特别是quantstrat包可能吗?
这是我最新版本的3.4.1
我的错误信息:
Warning in install.packages :
package ‘quantstrat’ is not available (for R version 3.4.1)
Run Code Online (Sandbox Code Playgroud) 我一直在经历Guy的量子讲座(下面的链接),并且在反复尝试重新执行代码之后,我得到一些初始错误,这些错误阻止了讲座中的大部分后续代码的运行.
这是代码(从讲座中复制,只需很少的重新安排):
rm(list=ls(all=TRUE)) #added this to delete memory
library(quantstrat)
library(blotter) #added this hoping it would rectify the errors
library(FinancialInstrument) #added this hoping it would rectify the errors
# initialize portfolio, accounts and orders
qs.strategy <- "qsFaber"
initPortf(qs.strategy, 'SPY', initDate = '1997-12-31')
initAcct(qs.strategy, portfolios = qs.strategy, initDate = '1997-12-31', initEq= 1e6)
Run Code Online (Sandbox Code Playgroud)
以下是我得到的错误:
1)
> initPortf(qs.strategy, 'SPY', initDate = '1997-12-31')
Error in exists(paste("portfolio", name, sep = "."), envir = .blotter, :
object '.blotter' not found
Run Code Online (Sandbox Code Playgroud)
2)
> initAcct(qs.strategy, portfolios = qs.strategy, initDate …Run Code Online (Sandbox Code Playgroud) 在过去的几天里,我一直在摸不着头脑,试图了解如何限制策略中的持仓数量。它是一种通道突破策略(做多/突破 20 日突破通道,并设置 10 日高点/低点止损。
\n\n我不希望系统金字塔式的。仅接受 1 个头寸,即\n- 如果在第一天我有一个信号,并且市场保持趋势,它将打印新信号,但必须将其忽略,因为我们已经处于某个位置。
\n\n我尝试了我发现的一切,但一无所获。我知道我必须调整 osMaxPos 和 addPosLimit 但似乎我做错了。
\n\n这是我的代码。提前致谢。
\n\n#Import des donn\xc3\xa9es\nGBPUSD <- getdata("GBPUSD.csv")\nGBPUSD <- getdata("GBPUSD.csv")\nAUDUSD <- getdata("AUDUSD.csv")\nEURUSD <- getdata("EURUSD.csv")\nXAUUSD <- getdata("XAUUSD.csv")\nEURCHF <- getdata("EURCHF.csv")\n\n### Cr\xc3\xa9ation des devises\ncurrency(c("USD","EUR","AUD","GBP","XAU","CHF"))\nexchange_rate(c("EURUSD","GBPUSD","AUDUSD","XAUUSD","EURCHF"),"USD")\nsymbols <- c("GBPUSD","AUDUSD","EURUSD")\ntradesize <- 1000000\n\n\n\ninit.date <- "2001-09-04" #date d\'initialisation de l\'environement\nstart.date <- "2001-10-01" #1ere date du jeu de donn\xc3\xa9e\nend.date <- Sys.Date() #derni\xc3\xa8re date du jeu de donn\xc3\xa9e\ninitial.capital <- 1000000 #Capital de d\xc3\xa9part\nBreakout <- strategy("Breakout")\n\n\nportfolio.st <- account.st <- strat.st <- "Breakout"\n\nif (!exists(\'.blotter\')) .blotter <- new.env()\nif …Run Code Online (Sandbox Code Playgroud) 我正在使用一些指标构建基本交易策略。我的问题是我希望它在多个股票上运行,而不必指定我想要测试的每个单独的股票。
目前我可以使用向量一次获取多个符号,如下所示
# Get Shares from Yahoo Finance
Stocks<- ASX_200_Companies_Copy$Code
getSymbols(Stocks, from = from, to = to, src = "yahoo", adjust = TRUE)
Run Code Online (Sandbox Code Playgroud)
我可以轻松地在 Excel 文档中生成包含股票代码列表的向量。所以这将为我生成 200 个单独的符号。生成所有指标后,我将针对单个资产创建如下测试策略
# Test the strategy
test_Master <- applyIndicators(strategy.st.Master, mktdata = OHLC(BHP.AX))
Master_Strategy <- applySignals(strategy = strategy.st.Master, mktdata = test_Master)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我一次只能测试一项资产的策略,如果我想在大型数据集中找到趋势,这将不会有效。
指定股票作为 OHLC 的参数会产生以下错误
test_Master <- applyIndicators(strategy.st.Master, mktdata = OHLC(Stocks))
Error in Cl(mktdata) : subscript out of bounds: no column name containing "Close"
Run Code Online (Sandbox Code Playgroud)
我想简单地绑定一些生成的单独股票。然而这也不起作用。
Stocks <- cbind(BHP.AX, CBA.AX)
test_Master <- applyIndicators(strategy.st.Master, mktdata = OHLC(Stocks)) …Run Code Online (Sandbox Code Playgroud) 我希望特定资产(符号)的最大允许位置是资本(初始分配+ PL)和指标的函数.我试过更换osMaxPos.我在顶部添加了这个,初始值是硬编码的,ddQ是我的指标,
updatePortf(portfolio, symbol, Dates=paste('::',as.Date(timestamp),sep=''))
cumPL <- sum(getPortfolio(portfolio)$symbols[[symbol]]$posPL$Net.Trading.PL)
print(paste0("expFluct", data$ddQ[timestamp]*2))
maxPosVal <- (10e6+cumPL) * data$ddQ[timestamp]*2
print(paste0("maxPosVal = ", maxPosVal))
addPosLimit(portfolio,
symbol=symbol,
timestamp = first(index(data)),
maxpos = maxPosVal
)
Run Code Online (Sandbox Code Playgroud)
这可行,但在每次通话时标记我的投资组合时,会执行日内策略,大约2年的1分钟数据从几分钟到几小时.有人能指出一种更有效的方法吗?谢谢.
我用的时候:
stratRank <- add.rule(stratRank, name="ruleSignal",
arguments=list(sigcol="EntryCond", sigval=TRUE, orderqty=max.size,
ordertype="market", orderside="long", pricemethod="market",
replace=FALSE,osFUN=osMaxPos,TxnFees=pennyPerShare), type="enter")
stratRank <- add.rule(stratRank, name="ruleSignal",
arguments=list(sigcol="ExitCond", sigval=TRUE, orderqty="all",
ordertype="market", orderside="long", pricemethod="market",
replace=FALSE,TxnFees=pennyPerShare), type="exit")
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
Error in `[.xts`(ordersubset, , "Order.Status") : unsupported type
Run Code Online (Sandbox Code Playgroud)
我以为这个pennyPerShare功能可以添加吗?难道我做错了什么?
注意,that works如果我使用静态交易成本:
stratRank <- add.rule(stratRank, name="ruleSignal",
arguments=list(sigcol="EntryCond", sigval=TRUE, orderqty=max.size,
ordertype="market", orderside="long", pricemethod="market",
replace=FALSE,osFUN=osMaxPos,TxnFees=-5), type="enter")
stratRank <- add.rule(stratRank, name="ruleSignal",
arguments=list(sigcol="ExitCond", sigval=TRUE, orderqty="all",
ordertype="market", orderside="long", pricemethod="market",
replace=FALSE,TxnFees=-5), type="exit")
Run Code Online (Sandbox Code Playgroud)
并session info:为当前的设置.任何建议都很棒.最好的祝福
sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=Swedish_Sweden.1252 …Run Code Online (Sandbox Code Playgroud) 假设我的入场价是 50,所以在一天开始时,我下限价单 1 手出价 50。在交易日,市场崩盘,我的出价被填满。在真实世界的实时交易场景中,我的执行将在同一每日柱上以 50 的价格执行。即使我使用 1 分钟柱并且填充发生在 14:00 实时,数据和价格在 14:01 与交易和填充完全无关。
此外,如果我已经在进行交易(比如说做空 @ 50s),并且我在 80 年代下止损单并且市场交易到 80 年代 - 我将在那时和那里被止损,大约在价格附近80 年代的人给予或采取一些滑点。下一个柱线,无论是每日、每小时还是 1 分钟,都可能在 150 点开盘。将在下一个柱线开盘时执行该交易的回测现在可能与会发生的情况不同步实时现场场景。
我知道任何根据柱线收盘计算其交易信号的策略都可能会受到巨大偏差的影响,而不会强制执行下一根柱线。但是对于具有预定义进入/退出信号的策略(我认为这将是大多数),在同一条柱上执行的能力至关重要!
在上面链接的帖子中,Josh Ulrich 提到添加allowMagicalThinking=TRUE对 applyStrategy 和 applyRules 的调用。但是,我似乎找不到任何关于它的文档,而且我对它的实现没有任何效果。我错过了什么?
调用 applyRules:
test <- applyRules(strategy=strategy.st,portfolio=portfolio.st, symbol = symbols, mktdata=mktdata , allowMagicalThinking=TRUE)
Run Code Online (Sandbox Code Playgroud)
或者,调用策略:
out <- applyStrategy(strategy=strategy.st,portfolios=portfolio.st, allowMagicalThinking=TRUE)
Run Code Online (Sandbox Code Playgroud) 我正试图在R的Quantstrat包中运行回测策略.该工具为小麦期货,报价为美分.合约规模为5000蒲式耳.因此我添加了以下代码.
future(symbols,
currency = "USD",
tick_size = 0.25,
multiplier = 50)
Run Code Online (Sandbox Code Playgroud)
然而,当运行模型时,当利润太小时,它似乎会产生损失,这促使我看看如何在印刷包中计算交易费用,如github上的此代码所示.
#' @param ConMult Contract/instrument multiplier for the Symbol if it is not defined in an instrument specification
Run Code Online (Sandbox Code Playgroud)
这是否意味着当我指定时.txnfees <- -10,税费是50*-10 = -500,在这种情况下我应该指定TxnFees为-0.2.如何为每个订单指定设定金额?