# Testing quantstrat with very simple strategy: # - go short 1 lot VXX on "2011-02-11" close # - cover short on open one day after return to cash signal appeared # (go to cash == (signal =0) appeared on "2011-02-10" so we should # cover short on "2009-02-11" open) # # I was playing with prefer and delay option but do not work the way I # would like them to. Is this by design and my goal can be accomplished # in some other way? # ############################################################################### require(quantstrat) signals<-function(x, date, label="signal", lag=0) { signal <- xts(rep(0, NROW(x)), order.by=index(x)) signal[date] <- -1 colnames(signal) <- label if (lag != 0) { signal <- lag.xts(signal, k=lag) } signal <- na.locf(signal) signal[is.na(signal), ] <- 0 return(signal) } #baseDir = "/home/data_warehouse/data/sources/ib" #getSymbols("VXX", src="FI", dir=paste(baseDir, "/TRADES", sep="")) #VXX <- align.time(VXX) #VXX <- to.daily(VXX) getSymbols("VXX") VXX <- adjustOHLC(VXX) # Idea from G See: https://stat.ethz.ch/pipermail/r-sig-finance/2012q2/010227.html VXX$PreviousC <- lag.xts(Cl(VXX)) VXX$NextO <- lag.xts(Op(VXX), k=-1) # Test if signals work VXX.signals <- signals(VXX, "2011-02-09", lag=-1) subset="2011-02" dev.new() chart_Series(VXX, subset=subset) add_TA(VXX.signals < 0, border=NA, col="lightsalmon", on=-1) add_TA(VXX.signals) VXX <- VXX[subset] .qty <- 1 .th <- 0.0005 .TxnFees=-1.9 #.txn <- 0 trade.percent <- 1.00 initEq <- 100000 tradeSize <- initEq*trade.percent initDate <- "2011-02-01" .from <- "2002-10-21" .to <- "2008-07-04" #.to <- "2003-12-31" s <- "qs.test" p <- "qs.test" a <- "qs.test" #' Remove objects associated with a strategy #' #' Remove the order_book, account, and portfolio #' @param name name of the portfolio. rm.strat.test <- function(name='default') { if (is.strategy(name)) name <- name[['name']] try(rm(list=paste("order_book",name,sep="."), pos=.strategy)) try(rm(list=paste(c("account", "portfolio"), name, sep="."), pos=.blotter)) } rm.strat.test(p) options(width=240) #Sys.setenv(TZ="GMT") currency("USD") stock("VXX", "USD") initPortf(p, symbols=c("VXX"), initDate=initDate, currency="USD") initAcct(a, portfolios=p, initDate=initDate, currency="USD") initOrders(p, initDate=initDate) ### strategy ###################################################################### strategy(s, store=TRUE) ### indicators s <- add.indicator(s, 'signals', arguments=list( x=quote(VXX), date="2011-02-09", label="signal.enter", lag=-1 ), label='signal.enter') s <- add.indicator(s, 'signals', arguments=list( x=quote(VXX), date="2011-02-09", label="signal.exit", lag=0 ), label='signal.exit') s <- add.signal(s, 'sigThreshold', arguments = list(column="signal.exit", relationship="eq", threshold=0, cross=TRUE), label='cash') s <- add.signal(s, 'sigThreshold', arguments = list(column="signal.enter", relationship="lt", threshold=0, cross=TRUE), label='short') s <- add.rule(s, 'ruleSignal', arguments=list(sigcol='cash' , sigval=TRUE, replace=FALSE, TxnFees=.TxnFees, orderside='short', orderqty='all', ordertype='market', prefer='Open', delay=0 ), type='exit', label='ExitShort2CASH') s <- add.rule(s, 'ruleSignal', arguments=list(sigcol='short' , sigval=TRUE, replace=FALSE, TxnFees=.TxnFees, orderside='short', orderqty=-.qty, ordertype='market', prefer='Close', delay=0 ), type='enter', label='EnterSHORT') applyStrategy(s, p, verbose = FALSE) #applyStrategy(s, p, prefer='Open', verbose = FALSE) updatePortf(p, Symbols="VXX", , Dates=paste('::',as.Date(Sys.time()),sep='')) ############################################################################### dev.new() chart.Posn(p, "VXX") VXX.signals <- signals(VXX, "2011-02-09") add_TA(VXX.signals < 0, border=NA, col="lightsalmon", on=-1) add_TA(getPortfolio(p)$symbols[["VXX"]]$posPL$Pos.Qty) add_TA(getPortfolio(p)$symbols[["VXX"]]$posPL$Pos.Value) print(getOrderBook(p)) txns <- getTxns(p, "VXX") txns mktdata["2011-02-08/2011-02-11"] #> mktdata["2011-02-08/2011-02-11"] # VXX.Open VXX.High VXX.Low VXX.Close VXX.Volume VXX.Adjusted PreviousC NextO signal.enter signal.exit cash short #2011-02-08 28.62 29.19 28.25 28.42 13997600 28.42 28.77 28.69 -1 0 0 1 #2011-02-09 28.69 29.11 28.35 28.51 18603000 28.51 28.42 29.14 0 -1 0 0 #2011-02-10 29.14 29.25 28.30 28.51 17734000 28.51 28.51 28.75 0 0 1 0 #2011-02-11 28.75 28.80 27.93 28.02 14826100 28.02 28.51 28.00 0 0 0 0 # Well, I want this: #> print(getOrderBook(p)) #$qs.test #$qs.test$VXX # Order.Qty Order.Price Order.Type Order.Side Order.Threshold Order.Status Order.StatusTime Prefer Order.Set Txn.Fees Rule #2011-02-01 "0" NA "init" "long" "0" "closed" "2011-02-01" "" "" "0" "" #2011-02-08 "-1" "28.42" "market" "short" NA "closed" "2011-02-09 00:00:00" "Close" NA "-1.9" "EnterSHORT" #2011-02-10 "all" "29.14" "market" "short" NA "closed" "2011-02-11 00:00:00" "Open" NA "-1.9" "ExitShort2CASH" # # #attr(,"class") #[1] "order_book" #> #> txns <- getTxns(p, "VXX") #> txns # Txn.Qty Txn.Price Txn.Fees Txn.Value Txn.Avg.Cost Net.Txn.Realized.PL #2011-02-01 0 0.00 0.0 0.00 0.00 0.00 #2011-02-09 -1 28.51 -1.9 -28.51 28.51 -1.90 #2011-02-11 1 28.75 -1.9 28.75 28.75 -2.14 # But I get this: #> print(getOrderBook(p)) #$qs.test #$qs.test$VXX # Order.Qty Order.Price Order.Type Order.Side Order.Threshold Order.Status Order.StatusTime Prefer Order.Set Txn.Fees Rule #2011-02-01 "0" NA "init" "long" "0" "closed" "2011-02-01" "" "" "0" "" #2011-02-08 "-1" "28.42" "market" "short" NA "closed" "2011-02-09 00:00:00" "Close" NA "-1.9" "EnterSHORT" #2011-02-10 "all" "29.14" "market" "short" NA "closed" "2011-02-11 00:00:00" "Open" NA "-1.9" "ExitShort2CASH" # # #attr(,"class") #[1] "order_book" #> #> txns <- getTxns(p, "VXX") #> txns # Txn.Qty Txn.Price Txn.Fees Txn.Value Txn.Avg.Cost Net.Txn.Realized.PL #2011-02-01 0 0.00 0.0 0.00 0.00 0.00 #2011-02-09 -1 28.51 -1.9 -28.51 28.51 -1.90 #2011-02-11 1 28.02 -1.9 28.02 28.02 -1.41