From noreply at r-forge.r-project.org Mon Apr 1 17:51:06 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Mon, 1 Apr 2013 17:51:06 +0200 (CEST) Subject: [Blotter-commits] r1419 - pkg/quantstrat/demo Message-ID: <20130401155106.ED8B1184F9F@r-forge.r-project.org> Author: braverock Date: 2013-04-01 17:51:06 +0200 (Mon, 01 Apr 2013) New Revision: 1419 Modified: pkg/quantstrat/demo/maCross.R Log: - fix second SMA to use onlye the first Cl() column Modified: pkg/quantstrat/demo/maCross.R =================================================================== --- pkg/quantstrat/demo/maCross.R 2013-03-29 15:58:58 UTC (rev 1418) +++ pkg/quantstrat/demo/maCross.R 2013-04-01 15:51:06 UTC (rev 1419) @@ -22,14 +22,15 @@ ##### PLACE DEMO AND TEST DATES HERE ################# # -#if(isTRUE(options('in_test')$in_test)) -# # use test dates -# {initDate="2011-01-01" -# endDate="2012-12-31" -# } else -# # use demo defaults -# {initDate="1999-12-31" -# endDate=Sys.Date()} +if(isTRUE(options('in_test')$in_test)) + # use test dates + {initDate="2011-01-01" + endDate="2012-12-31" + } else { + # use demo defaults + initDate="1999-12-31" + endDate=Sys.Date() +} initEq=1000000 portfolio.st='macross' @@ -41,7 +42,7 @@ stratMACROSS<- strategy(portfolio.st) stratMACROSS <- add.indicator(strategy = stratMACROSS, name = "SMA", arguments = list(x=quote(Cl(mktdata)), n=50),label= "ma50" ) -stratMACROSS <- add.indicator(strategy = stratMACROSS, name = "SMA", arguments = list(x=quote(Cl(mktdata)), n=200),label= "ma200") +stratMACROSS <- add.indicator(strategy = stratMACROSS, name = "SMA", arguments = list(x=quote(Cl(mktdata)[,1]), n=200),label= "ma200") stratMACROSS <- add.signal(strategy = stratMACROSS,name="sigCrossover",arguments = list(columns=c("ma50","ma200"), relationship="gte"),label="ma50.gt.ma200") stratMACROSS <- add.signal(strategy = stratMACROSS,name="sigCrossover",arguments = list(column=c("ma50","ma200"),relationship="lt"),label="ma50.lt.ma200") @@ -59,7 +60,7 @@ assign(i, adjustOHLC(get(i),use.Adjusted=TRUE)) start_t<-Sys.time() -out<-try(applyStrategy(strategy=stratMACROSS , portfolios=portfolio.st)) +out<-applyStrategy(strategy=stratMACROSS , portfolios=portfolio.st) end_t<-Sys.time() print(end_t-start_t) From noreply at r-forge.r-project.org Mon Apr 1 18:02:29 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Mon, 1 Apr 2013 18:02:29 +0200 (CEST) Subject: [Blotter-commits] r1420 - pkg/quantstrat/demo Message-ID: <20130401160229.E099818460E@r-forge.r-project.org> Author: opentrades Date: 2013-04-01 18:02:29 +0200 (Mon, 01 Apr 2013) New Revision: 1420 Modified: pkg/quantstrat/demo/luxor.1.R pkg/quantstrat/demo/luxor.2.R Log: - fix second SMA to use onlye the first Cl() column Modified: pkg/quantstrat/demo/luxor.1.R =================================================================== --- pkg/quantstrat/demo/luxor.1.R 2013-04-01 15:51:06 UTC (rev 1419) +++ pkg/quantstrat/demo/luxor.1.R 2013-04-01 16:02:29 UTC (rev 1420) @@ -74,7 +74,7 @@ add.indicator(s, name = "SMA", arguments = list( - x = quote(Cl(mktdata)), + x = quote(Cl(mktdata)[,1]), n = .fast ), label="nFast" @@ -82,7 +82,7 @@ add.indicator(s, name="SMA", arguments = list( - x = quote(Cl(mktdata)), + x = quote(Cl(mktdata)[,1]), n = .slow ), label="nSlow" Modified: pkg/quantstrat/demo/luxor.2.R =================================================================== --- pkg/quantstrat/demo/luxor.2.R 2013-04-01 15:51:06 UTC (rev 1419) +++ pkg/quantstrat/demo/luxor.2.R 2013-04-01 16:02:29 UTC (rev 1420) @@ -74,7 +74,7 @@ add.indicator(s, name = "SMA", arguments = list( - x = quote(Cl(mktdata)), + x = quote(Cl(mktdata)[,1]), n = .fast ), label="nFast" @@ -82,7 +82,7 @@ add.indicator(s, name="SMA", arguments = list( - x = quote(Cl(mktdata)), + x = quote(Cl(mktdata)[,1]), n = .slow ), label="nSlow" From noreply at r-forge.r-project.org Wed Apr 3 23:08:23 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Wed, 3 Apr 2013 23:08:23 +0200 (CEST) Subject: [Blotter-commits] r1421 - pkg/quantstrat/R Message-ID: <20130403210823.3F7321845C2@r-forge.r-project.org> Author: opentrades Date: 2013-04-03 23:08:22 +0200 (Wed, 03 Apr 2013) New Revision: 1421 Modified: pkg/quantstrat/R/orders.R pkg/quantstrat/R/ruleSignal.R Log: - moved check for exit/all order with pos==0 from ruleSignal() into addOrder() to make sure that replace==TRUE is respected Modified: pkg/quantstrat/R/orders.R =================================================================== --- pkg/quantstrat/R/orders.R 2013-04-01 16:02:29 UTC (rev 1420) +++ pkg/quantstrat/R/orders.R 2013-04-03 21:08:22 UTC (rev 1421) @@ -361,23 +361,27 @@ orders<-NULL for (i in 1:length(price)) { if(is.null(prefer[i])) prefer[i] = '' - neworder<-xts(as.matrix(t(c(as.character(qty[i]), - price[i], - ordertype[i], - side, - threshold[i], - status, - statustimestamp, - prefer[i], - orderset[i], - TxnFees, label))), - order.by=(ordertime)) - - if(is.null(orders)) orders<-neworder - else orders <- rbind(orders,neworder) + + if(qty[i] != 'all' || getPosQty(portfolio, symbol, timestamp) != 0) + { + neworder<-xts(as.matrix(t(c(as.character(qty[i]), + price[i], + ordertype[i], + side, + threshold[i], + status, + statustimestamp, + prefer[i], + orderset[i], + TxnFees, label))), + order.by=(ordertime)) + + if(is.null(orders)) orders<-neworder + else orders <- rbind(orders,neworder) + } } - if(ncol(orders)!=11) { + if(!is.null(orders) && ncol(orders)!=11) { print("bad order(s):") print(orders) return() @@ -399,11 +403,14 @@ statustimestamp=timestamp) } # get order book - orderbook <- getOrderBook(portfolio) - orderbook[[portfolio]][[symbol]]<-rbind(orderbook[[portfolio]][[symbol]],orders) - # assign order book back into place (do we need a non-exported "put" function?) - assign(paste("order_book",portfolio,sep='.'),orderbook,envir=.strategy) - rm(orderbook) + if(!is.null(orders)) + { + orderbook <- getOrderBook(portfolio) + orderbook[[portfolio]][[symbol]]<-rbind(orderbook[[portfolio]][[symbol]],orders) + # assign order book back into place (do we need a non-exported "put" function?) + assign(paste("order_book",portfolio,sep='.'),orderbook,envir=.strategy) + rm(orderbook) + } return() } else { return(orders) Modified: pkg/quantstrat/R/ruleSignal.R =================================================================== --- pkg/quantstrat/R/ruleSignal.R 2013-04-01 16:02:29 UTC (rev 1420) +++ pkg/quantstrat/R/ruleSignal.R 2013-04-03 21:08:22 UTC (rev 1421) @@ -205,8 +205,8 @@ if(!is.null(orderqty) && orderqty!=0 && !is.null(orderprice)) #orderprice could have length > 1 { - if(orderqty != 'all' || getPosQty(portfolio, symbol, timestamp) != 0) - { +# if(orderqty != 'all' || getPosQty(portfolio, symbol, timestamp) != 0) +# { addOrder(portfolio=portfolio, symbol=symbol, timestamp=timestamp, @@ -224,7 +224,7 @@ prefer=prefer, TxnFees=TxnFees, label=label) - } +# } } } if(sethold) hold <<- TRUE From noreply at r-forge.r-project.org Wed Apr 3 23:36:46 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Wed, 3 Apr 2013 23:36:46 +0200 (CEST) Subject: [Blotter-commits] r1422 - pkg/quantstrat/R Message-ID: <20130403213646.46FEC180953@r-forge.r-project.org> Author: opentrades Date: 2013-04-03 23:36:45 +0200 (Wed, 03 Apr 2013) New Revision: 1422 Modified: pkg/quantstrat/R/orders.R Log: - patch: updateOrders() needs orderset=NULL instead of orderset=NA Modified: pkg/quantstrat/R/orders.R =================================================================== --- pkg/quantstrat/R/orders.R 2013-04-03 21:08:22 UTC (rev 1421) +++ pkg/quantstrat/R/orders.R 2013-04-03 21:36:45 UTC (rev 1422) @@ -477,6 +477,8 @@ side=NULL qtysign=NULL } + + if(is.na(orderset)) orderset=NULL # need the ability to pass a range like we do in blotter updatedorders<-getOrders(portfolio=portfolio, symbol=symbol, From noreply at r-forge.r-project.org Thu Apr 4 00:02:15 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Thu, 4 Apr 2013 00:02:15 +0200 (CEST) Subject: [Blotter-commits] r1423 - pkg/quantstrat/demo Message-ID: <20130403220215.B5583184F4D@r-forge.r-project.org> Author: opentrades Date: 2013-04-04 00:02:13 +0200 (Thu, 04 Apr 2013) New Revision: 1423 Modified: pkg/quantstrat/demo/luxor.1.R pkg/quantstrat/demo/luxor.2.R Log: - fixed up luxor.1.R and luxor.2.R to use replace parameter instead of ordersets - several other improvements in these demos Modified: pkg/quantstrat/demo/luxor.1.R =================================================================== --- pkg/quantstrat/demo/luxor.1.R 2013-04-03 21:36:45 UTC (rev 1422) +++ pkg/quantstrat/demo/luxor.1.R 2013-04-03 22:02:13 UTC (rev 1423) @@ -1,22 +1,23 @@ #!/usr/bin/Rscript --vanilla # -# Jan Humme (@opentrades) - August 2012 +# Jan Humme (@opentrades) - August 2012, revised April 2013 # -# Tested and found to work correctly using blotter r1123 +# Tested and found to work correctly using blotter r1420 # # From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) # # Paragraph 3.2: luxor without any optimizations options(width = 240) -#Sys.setenv(TZ="GMT") +Sys.setenv(TZ="UTC") +### + .fast = 10 .slow = 30 -.qty=100000 -.th=0.0005 -.txn=0 +.orderqty=100000 +.threshold=0.0005 ##### PLACE DEMO AND TEST DATES HERE ################# # @@ -30,49 +31,62 @@ # endDate=Sys.Date()} initDate = '2002-10-21' + .from='2002-10-21' #.to='2008-07-04' -#.to='2003-12-31' .to='2002-10-31' #### -s = 'luxor' -p = 'forex' -a = 'IB1' +strategy.st = 'luxor' +portfolio.st = 'forex' +account.st = 'IB1' -### +### packages +# +# quantstrat package will pull in many other packages: +# FinancialInstrument, quantmod, blotter, xts require(quantstrat) +### FinancialInstrument + currency(c('GBP', 'USD')) -exchange_rate(c('GBPUSD'), tick_size=0.0001) +exchange_rate('GBPUSD', tick_size=0.0001) -setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') +### quantmod -### +getSymbols.FI(Symbols='GBPUSD', + dir=system.file('extdata',package='quantstrat'), + from=.from, to=.to +) -getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) +# ALTERNATIVE WAY TO FETCH SYMBOL DATA +#setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') +#getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) + +### xts + GBPUSD = to.minutes30(GBPUSD) GBPUSD = align.time(to.minutes30(GBPUSD), 1800) -### +### blotter -initPortf(p, symbols='GBPUSD', initDate=initDate, currency='USD') -initAcct(a, portfolios=p, initDate=initDate, currency='USD') +initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') +initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') -### +### quantstrat -initOrders(p, initDate=initDate) +initOrders(portfolio.st, initDate=initDate) -### strategy ###################################################################### +### define strategy -strategy(s, store=TRUE) +strategy(strategy.st, store=TRUE) ### indicators -add.indicator(s, name = "SMA", +add.indicator(strategy.st, name = "SMA", arguments = list( x = quote(Cl(mktdata)[,1]), n = .fast @@ -80,7 +94,7 @@ label="nFast" ) -add.indicator(s, name="SMA", +add.indicator(strategy.st, name="SMA", arguments = list( x = quote(Cl(mktdata)[,1]), n = .slow @@ -90,7 +104,7 @@ ### signals -add.signal(s, 'sigCrossover', +add.signal(strategy.st, 'sigCrossover', arguments = list( columns=c("nFast","nSlow"), relationship="gte" @@ -98,7 +112,7 @@ label='long' ) -add.signal(s, 'sigCrossover', +add.signal(strategy.st, 'sigCrossover', arguments = list( columns=c("nFast","nSlow"), relationship="lt" @@ -108,83 +122,67 @@ ### rules -add.rule(s, 'ruleSignal', +add.rule(strategy.st, 'ruleSignal', arguments=list(sigcol='long' , sigval=TRUE, - replace=TRUE, orderside='short', ordertype='market', - TxnFees=.txn, orderqty='all', - orderset='ocoshort' + replace=TRUE ), type='exit', label='Exit2LONG' ) -add.rule(s, 'ruleSignal', +add.rule(strategy.st, 'ruleSignal', arguments=list(sigcol='short', sigval=TRUE, - replace=TRUE, orderside='long' , ordertype='market', - TxnFees=.txn, orderqty='all', - orderset='ocolong' + replace=TRUE ), type='exit', label='Exit2SHORT') -add.rule(s, 'ruleSignal', +add.rule(strategy.st, 'ruleSignal', arguments=list(sigcol='long' , sigval=TRUE, - replace=FALSE, orderside='long' , ordertype='stoplimit', prefer='High', - threshold=.th, - TxnFees=0, - orderqty=+.qty, - orderset='ocolong' + threshold=.threshold, + orderqty=+.orderqty, + replace=FALSE ), type='enter', label='EnterLONG' ) -add.rule(s, 'ruleSignal', +add.rule(strategy.st, 'ruleSignal', arguments=list(sigcol='short', sigval=TRUE, - replace=FALSE, orderside='short', ordertype='stoplimit', prefer='Low', - threshold=-.th, - TxnFees=0, - orderqty=-.qty, - orderset='ocoshort' + threshold=-.threshold, + orderqty=-.orderqty, + replace=FALSE ), type='enter', label='EnterSHORT' ) -# - ############################################################################### -applyStrategy(s, p, verbose = FALSE) -#applyStrategy(s, p, prefer='Open', verbose = FALSE) +applyStrategy(strategy.st, portfolio.st, verbose = FALSE) -updatePortf(p, Symbols='GBPUSD', ,Dates=paste('::',as.Date(Sys.time()),sep='')) +print(getOrderBook(portfolio.st)) ############################################################################### -chart.Posn(p, "GBPUSD") +updatePortf(portfolio.st, Symbols='GBPUSD', ,Dates=paste('::',as.Date(Sys.time()),sep='')) -print(getOrderBook(p)) +chart.Posn(portfolio.st, "GBPUSD") -#txns <- getTxns(p, 'GBPUSD') -#txns -###txns$Net -#cat('Net profit:', sum(txns$Net.Txn.Realized.PL), '\n') +tradeStats(portfolio.st, 'GBPUSD') -tradeStats(p, 'GBPUSD') - ##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### # book = getOrderBook(port) # stats = tradeStats(port) Modified: pkg/quantstrat/demo/luxor.2.R =================================================================== --- pkg/quantstrat/demo/luxor.2.R 2013-04-03 21:36:45 UTC (rev 1422) +++ pkg/quantstrat/demo/luxor.2.R 2013-04-03 22:02:13 UTC (rev 1423) @@ -1,22 +1,24 @@ #!/usr/bin/Rscript --vanilla # -# Jan Humme (@opentrades) - August 2012 +# Jan Humme (@opentrades) - August 2012, revised April 2013 # -# Tested and found to work correctly using blotter r1123 +# Tested and found to work correctly using blotter r1420 # # From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) # # Paragraph 3.2: luxor with $30 slippage and transaction costs options(width = 240) -#Sys.setenv(TZ="GMT") +Sys.setenv(TZ="UTC") +### + .fast = 10 .slow = 30 -.qty=100000 -.th=0.0005 -.txn=-30 +.orderqty=100000 +.threshold=0.0005 +.txn.fees=-30 ##### PLACE DEMO AND TEST DATES HERE ################# # @@ -30,49 +32,62 @@ # endDate=Sys.Date()} initDate = '2002-10-21' + .from='2002-10-21' #.to='2008-07-04' -#.to='2003-12-31' .to='2002-10-31' #### -s = 'luxor' -p = 'forex' -a = 'IB1' +strategy.st = 'luxor' +portfolio.st = 'forex' +account.st = 'IB1' -### +### packages +# +# quantstrat package will pull in many other packages: +# FinancialInstrument, quantmod, blotter, xts require(quantstrat) +### FinancialInstrument + currency(c('GBP', 'USD')) -exchange_rate(c('GBPUSD'), tick_size=0.0001) +exchange_rate('GBPUSD', tick_size=0.0001) -setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') +### quantmod -### +getSymbols.FI(Symbols='GBPUSD', + dir=system.file('extdata',package='quantstrat'), + from=.from, to=.to +) -getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) +# ALTERNATIVE WAY TO FETCH SYMBOL DATA +#setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') +#getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) + +### xts + GBPUSD = to.minutes30(GBPUSD) GBPUSD = align.time(to.minutes30(GBPUSD), 1800) -### +### blotter -initPortf(p, symbols='GBPUSD', initDate=initDate, currency='USD') -initAcct(a, portfolios=p, initDate=initDate, currency='USD') +initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') +initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') -### +### quantstrat -initOrders(p, initDate=initDate) +initOrders(portfolio.st, initDate=initDate) -### strategy ###################################################################### +### define strategy -strategy(s, store=TRUE) +strategy(strategy.st, store=TRUE) ### indicators -add.indicator(s, name = "SMA", +add.indicator(strategy.st, name = "SMA", arguments = list( x = quote(Cl(mktdata)[,1]), n = .fast @@ -80,7 +95,7 @@ label="nFast" ) -add.indicator(s, name="SMA", +add.indicator(strategy.st, name="SMA", arguments = list( x = quote(Cl(mktdata)[,1]), n = .slow @@ -90,7 +105,7 @@ ### signals -add.signal(s, 'sigCrossover', +add.signal(strategy.st, 'sigCrossover', arguments = list( columns=c("nFast","nSlow"), relationship="gte" @@ -98,7 +113,7 @@ label='long' ) -add.signal(s, 'sigCrossover', +add.signal(strategy.st, 'sigCrossover', arguments = list( columns=c("nFast","nSlow"), relationship="lt" @@ -108,83 +123,65 @@ ### rules -add.rule(s, 'ruleSignal', +add.rule(strategy.st, 'ruleSignal', arguments=list(sigcol='long' , sigval=TRUE, - replace=TRUE, orderside='short', ordertype='market', - TxnFees=.txn, orderqty='all', - orderset='ocoshort' + TxnFees=.txn.fees, + replace=TRUE ), type='exit', label='Exit2LONG' ) -add.rule(s, 'ruleSignal', +add.rule(strategy.st, 'ruleSignal', arguments=list(sigcol='short', sigval=TRUE, - replace=TRUE, orderside='long' , ordertype='market', - TxnFees=.txn, orderqty='all', - orderset='ocolong' + TxnFees=.txn.fees, + replace=TRUE ), type='exit', label='Exit2SHORT') -add.rule(s, 'ruleSignal', +add.rule(strategy.st, 'ruleSignal', arguments=list(sigcol='long' , sigval=TRUE, - replace=FALSE, orderside='long' , - ordertype='stoplimit', - prefer='High', - threshold=.th, - TxnFees=0, - orderqty=+.qty, - orderset='ocolong' + ordertype='stoplimit', prefer='High', threshold=.threshold, + orderqty=+.orderqty, + replace=FALSE ), type='enter', label='EnterLONG' ) -add.rule(s, 'ruleSignal', +add.rule(strategy.st, 'ruleSignal', arguments=list(sigcol='short', sigval=TRUE, - replace=FALSE, orderside='short', - ordertype='stoplimit', - prefer='Low', - threshold=-.th, - TxnFees=0, - orderqty=-.qty, - orderset='ocoshort' + ordertype='stoplimit', prefer='Low', threshold=-.threshold, + orderqty=-.orderqty, + replace=FALSE ), type='enter', label='EnterSHORT' ) -# - ############################################################################### -applyStrategy(s, p, verbose = FALSE) -#applyStrategy(s, p, prefer='Open', verbose = FALSE) +applyStrategy(strategy.st, portfolio.st, verbose = FALSE) -updatePortf(p, Symbols='GBPUSD', ,Dates=paste('::',as.Date(Sys.time()),sep='')) +print(getOrderBook(portfolio.st)) ############################################################################### -chart.Posn(p, "GBPUSD") +updatePortf(portfolio.st, Symbols='GBPUSD', ,Dates=paste('::',as.Date(Sys.time()),sep='')) -print(getOrderBook(p)) +chart.Posn(portfolio.st, "GBPUSD") -#txns <- getTxns(p, 'GBPUSD') -#txns -###txns$Net -#cat('Net profit:', sum(txns$Net.Txn.Realized.PL), '\n') +tradeStats(portfolio.st, 'GBPUSD') -tradeStats(p, 'GBPUSD') - ##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### # book = getOrderBook(port) # stats = tradeStats(port) From noreply at r-forge.r-project.org Thu Apr 4 00:26:38 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Thu, 4 Apr 2013 00:26:38 +0200 (CEST) Subject: [Blotter-commits] r1424 - pkg/quantstrat/demo Message-ID: <20130403222638.AD9E71847F6@r-forge.r-project.org> Author: opentrades Date: 2013-04-04 00:26:38 +0200 (Thu, 04 Apr 2013) New Revision: 1424 Modified: pkg/quantstrat/demo/luxor.1.R pkg/quantstrat/demo/luxor.2.R Log: - fixed small typo (irrelevant for results) Modified: pkg/quantstrat/demo/luxor.1.R =================================================================== --- pkg/quantstrat/demo/luxor.1.R 2013-04-03 22:02:13 UTC (rev 1423) +++ pkg/quantstrat/demo/luxor.1.R 2013-04-03 22:26:38 UTC (rev 1424) @@ -177,7 +177,7 @@ ############################################################################### -updatePortf(portfolio.st, Symbols='GBPUSD', ,Dates=paste('::',as.Date(Sys.time()),sep='')) +updatePortf(portfolio.st, Symbols='GBPUSD', Dates=paste('::',as.Date(Sys.time()),sep='')) chart.Posn(portfolio.st, "GBPUSD") Modified: pkg/quantstrat/demo/luxor.2.R =================================================================== --- pkg/quantstrat/demo/luxor.2.R 2013-04-03 22:02:13 UTC (rev 1423) +++ pkg/quantstrat/demo/luxor.2.R 2013-04-03 22:26:38 UTC (rev 1424) @@ -176,7 +176,7 @@ ############################################################################### -updatePortf(portfolio.st, Symbols='GBPUSD', ,Dates=paste('::',as.Date(Sys.time()),sep='')) +updatePortf(portfolio.st, Symbols='GBPUSD', Dates=paste('::',as.Date(Sys.time()),sep='')) chart.Posn(portfolio.st, "GBPUSD") From noreply at r-forge.r-project.org Sat Apr 6 15:09:42 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Sat, 6 Apr 2013 15:09:42 +0200 (CEST) Subject: [Blotter-commits] r1425 - pkg/quantstrat/demo Message-ID: <20130406130942.E2EB5184B8A@r-forge.r-project.org> Author: braverock Date: 2013-04-06 15:09:42 +0200 (Sat, 06 Apr 2013) New Revision: 1425 Modified: pkg/quantstrat/demo/macd.R Log: - fix labels to work with new match.names, clean up indentation - convert commented risk exits to use order chains Modified: pkg/quantstrat/demo/macd.R =================================================================== --- pkg/quantstrat/demo/macd.R 2013-04-03 22:26:38 UTC (rev 1424) +++ pkg/quantstrat/demo/macd.R 2013-04-06 13:09:42 UTC (rev 1425) @@ -56,26 +56,62 @@ strategy(strat.st, store=TRUE) #one indicator -add.indicator(strat.st, name = "MACD", arguments = list(x=quote(Cl(mktdata))) ) +add.indicator(strat.st, name = "MACD", + arguments = list(x=quote(Cl(mktdata))), + label='_' +) #two signals -add.signal(strat.st,name="sigThreshold",arguments = list(column="signal",relationship="gt",threshold=0,cross=TRUE),label="signal.gt.zero") -add.signal(strat.st,name="sigThreshold",arguments = list(column="signal",relationship="lt",threshold=0,cross=TRUE),label="signal.lt.zero") +add.signal(strat.st,name="sigThreshold", + arguments = list(column="signal._", + relationship="gt", + threshold=0, + cross=TRUE), + label="signal.gt.zero" +) + +add.signal(strat.st,name="sigThreshold", + arguments = list(column="signal._", + relationship="lt", + threshold=0, + cross=TRUE), + label="signal.lt.zero" +) #### # add rules # entry -add.rule(strat.st,name='ruleSignal', arguments = list(sigcol="signal.gt.zero",sigval=TRUE, orderqty=100, ordertype='market', orderside='long', threshold=NULL),type='enter',label='enter',storefun=FALSE) +add.rule(strat.st,name='ruleSignal', + arguments = list(sigcol="signal.gt.zero", + sigval=TRUE, + orderqty=100, + ordertype='market', + orderside='long', + threshold=NULL), + type='enter', + label='enter', + storefun=FALSE +) #alternatives for risk stops: # simple stoplimit order, with threshold multiplier -add.rule(strat.st,name='ruleSignal', arguments = list(sigcol="signal.gt.zero",sigval=TRUE, orderqty='all', ordertype='stoplimit', orderside='long', threshold=-.05,tmult=TRUE, orderset='exit2'),type='risk',label='risk',storefun=FALSE) +#add.rule(strat.st,name='ruleSignal', arguments = list(sigcol="signal.gt.zero",sigval=TRUE, orderqty='all', ordertype='stoplimit', orderside='long', threshold=-.05,tmult=TRUE, orderset='exit2'),type='chain', parent='enter', label='risk',storefun=FALSE) # alternately, use a trailing order, also with a threshold multiplier -#add.rule(strat.st,name='ruleSignal', arguments = list(sigcol="signal.gt.zero",sigval=TRUE, orderqty='all', ordertype='stoptrailing', orderside='long', threshold=-.15,tmult=TRUE, orderset='exit2'),type='risk',label='trailingexit') +#add.rule(strat.st,name='ruleSignal', arguments = list(sigcol="signal.gt.zero",sigval=TRUE, orderqty='all', ordertype='stoptrailing', orderside='long', threshold=-1,tmult=FALSE, orderset='exit2'), type='chain', parent='enter', label='trailingexit') # exit -add.rule(strat.st,name='ruleSignal', arguments = list(sigcol="signal.lt.zero",sigval=TRUE, orderqty='all', ordertype='market', orderside='long', threshold=NULL,orderset='exit2'),type='exit',label='exit') +add.rule(strat.st,name='ruleSignal', + arguments = list(sigcol="signal.lt.zero", + sigval=TRUE, + orderqty='all', + ordertype='market', + orderside='long', + threshold=NULL, + orderset='exit2'), + type='exit', + label='exit' +) #end rules #### @@ -96,7 +132,7 @@ plot(add_MACD(fast=fastMA, slow=slowMA, signal=signalMA,maType="EMA")) #look at the order book -getOrderBook('macd') +obook<-getOrderBook('macd') ############################################################################### # R (http://r-project.org/) Quantitative Strategy Model Framework From noreply at r-forge.r-project.org Sat Apr 6 16:23:16 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Sat, 6 Apr 2013 16:23:16 +0200 (CEST) Subject: [Blotter-commits] r1426 - pkg/quantstrat/R Message-ID: <20130406142316.BB8D81833DC@r-forge.r-project.org> Author: bodanker Date: 2013-04-06 16:23:16 +0200 (Sat, 06 Apr 2013) New Revision: 1426 Modified: pkg/quantstrat/R/orders.R pkg/quantstrat/R/ruleSignal.R Log: - Update tmult documentation Modified: pkg/quantstrat/R/orders.R =================================================================== --- pkg/quantstrat/R/orders.R 2013-04-06 13:09:42 UTC (rev 1425) +++ pkg/quantstrat/R/orders.R 2013-04-06 14:23:16 UTC (rev 1426) @@ -194,7 +194,9 @@ #' #' The 'limit', 'stoplimit', 'stoptrailing' and 'iceberg' order types are the only order types that make #' use of the order \code{threshold}. Thresholds may be specified in one of 2 ways: as a scalar (\code{tmult=FALSE}) -#' or as a multiplier for the current price (\code{tmult=TRUE}). +#' or as a multiplier for the current price (\code{tmult=TRUE}). If \code{tmult=TRUE}, \code{threshold} is converted to a +#' scalar by multiplying it with the price at the time of order entry, and the scalar will not change if the order is updated. +#' #' The threshold is then added to the prefered order price upon order entry. The correct sign for the threshold #' (pos or neg, ie. add or subtract) is automagically figured out from the order side and the order quantity (buy or sell); #' if the user provides the wrong sign for the threshold, then it will be reversed. In other words, the user may @@ -232,7 +234,7 @@ #' @param statustimestamp timestamp of a status update, will be blank when order is initiated #' @param prefer the prefered order price (eg. 'Close') #' @param delay what delay to add to timestamp when inserting the order into the order book, in seconds -#' @param tmult if TRUE, threshold is a percent multiplier for \code{price}, not a scalar. Threshold is converted to a scalar by multiplying it with the price, then added to the price just like a scalar threshold. +#' @param tmult if TRUE, threshold is a percent multiplier for \code{price}, not a scalar. Threshold is converted to a scalar by multiplying it with the price at the time of order entry (i.e. the scalar will not change if the order is updated, as in the case of a trailing stop), then it is added to the price just like a scalar threshold. #' @param replace TRUE/FALSE, whether to replace any other open order(s) on this symbol with the same properties as this order, default TRUE, see Details #' @param return if TRUE, return the row that makes up the order, default FALSE (will assign into the environment) #' @param \dots any other passthru parameters Modified: pkg/quantstrat/R/ruleSignal.R =================================================================== --- pkg/quantstrat/R/ruleSignal.R 2013-04-06 13:09:42 UTC (rev 1425) +++ pkg/quantstrat/R/ruleSignal.R 2013-04-06 14:23:16 UTC (rev 1426) @@ -35,7 +35,7 @@ #' @param orderside one of either "long" or "short", default NULL, see details #' @param orderset tag to identify an orderset; if one order of the set is filled, all others are canceled #' @param threshold numeric or name of indicator column in mktdata, default NULL, see Details -#' @param tmult if TRUE, threshold is a percent multiplier for \code{price}, not a scalar to be added/subtracted from price. threshold will be dynamically converted to a scalar at time of order entry +#' @param tmult if TRUE, threshold is a percent multiplier for \code{price}, not a scalar. Threshold is converted to a scalar by multiplying it with the price at the time of order entry (i.e. the scalar will not change if the order is updated, as in the case of a trailing stop), then it is added to the price just like a scalar threshold. #' @param replace TRUE/FALSE, whether to replace any other open order(s) on this portfolio symbol, default TRUE #' @param delay what delay to add to timestamp when inserting the order into the order book, in seconds #' @param osFUN function or text descriptor of function to use for order sizing, default \code{\link{osNoOp}} From noreply at r-forge.r-project.org Sun Apr 7 00:10:43 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Sun, 7 Apr 2013 00:10:43 +0200 (CEST) Subject: [Blotter-commits] r1427 - pkg/quantstrat/R Message-ID: <20130406221043.3560D180FDE@r-forge.r-project.org> Author: bodanker Date: 2013-04-07 00:10:42 +0200 (Sun, 07 Apr 2013) New Revision: 1427 Modified: pkg/quantstrat/R/orders.R pkg/quantstrat/R/strategy.R Log: - initiate order book as NULL instead of xts template object (avoids the potential for the order book index to be different than the data index) Modified: pkg/quantstrat/R/orders.R =================================================================== --- pkg/quantstrat/R/orders.R 2013-04-06 14:23:16 UTC (rev 1426) +++ pkg/quantstrat/R/orders.R 2013-04-06 22:10:42 UTC (rev 1427) @@ -76,9 +76,7 @@ symbols<-names(pfolio$symbols) } if(!is.null(symbols)){ - for (symbol in symbols){ - orders[[portfolio]][[symbol]] <- ordertemplate - } + orders[[portfolio]][symbols] <- list(NULL) } else { stop("You must specify a symbols list or a valid portfolio to retrieve the list from.") } @@ -114,6 +112,8 @@ orderbook <- getOrderBook(portfolio) if(!any(names(orderbook[[portfolio]]) == symbol)) stop(paste("symbol",symbol,"does not exist in portfolio",portfolio,"having symbols",names(orderbook[[portfolio]]))) ordersubset<-orderbook[[portfolio]][[symbol]] + if(is.null(ordersubset)) + return(NULL) #data quality checks if(!is.null(status) & !length(grep(status,c("open", "closed", "canceled", "revoked","replaced")))==1) stop(paste("order status:",status,' must be one of "open", "closed", "canceled", "revoked", or "replaced"')) @@ -366,17 +366,12 @@ if(qty[i] != 'all' || getPosQty(portfolio, symbol, timestamp) != 0) { - neworder<-xts(as.matrix(t(c(as.character(qty[i]), - price[i], - ordertype[i], - side, - threshold[i], - status, - statustimestamp, - prefer[i], - orderset[i], - TxnFees, label))), - order.by=(ordertime)) + neworder <- xts(t(c(as.character(qty[i]), price[i], ordertype[i], + side, threshold[i], status, statustimestamp, prefer[i], + orderset[i], TxnFees, label)), order.by=ordertime, + dimnames=list(NULL, c("Order.Qty", "Order.Price", "Order.Type", + "Order.Side", "Order.Threshold", "Order.Status", "Order.StatusTime", + "Prefer", "Order.Set", "Txn.Fees", "Rule"))) if(is.null(orders)) orders<-neworder else orders <- rbind(orders,neworder) Modified: pkg/quantstrat/R/strategy.R =================================================================== --- pkg/quantstrat/R/strategy.R 2013-04-06 14:23:16 UTC (rev 1426) +++ pkg/quantstrat/R/strategy.R 2013-04-06 22:10:42 UTC (rev 1427) @@ -152,7 +152,7 @@ ## Check for open orders rem.orders <- suppressWarnings(getOrders(portfolio=portfolio, symbol=symbol, status="open")) #, timespan=timespan, ordertype=ordertype,which.i=TRUE) - if(nrow(rem.orders)>0){pd <- TRUE} + if(NROW(rem.orders)>0){pd <- TRUE} if(pd==TRUE){sret$rules$pathdep<-applyRules(portfolio=portfolio, symbol=symbol, strategy=strategy, mktdata=mktdata, Dates=NULL, indicators=sret$indicators, signals=sret$signals, parameters=parameters, ..., path.dep=TRUE)} ret[[portfolio]][[symbol]]<-sret From noreply at r-forge.r-project.org Sun Apr 7 00:34:04 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Sun, 7 Apr 2013 00:34:04 +0200 (CEST) Subject: [Blotter-commits] r1428 - pkg/quantstrat/demo Message-ID: <20130406223404.76AEF1848AF@r-forge.r-project.org> Author: gsee Date: 2013-04-07 00:34:04 +0200 (Sun, 07 Apr 2013) New Revision: 1428 Modified: pkg/quantstrat/demo/pair_trade.R Log: formatting: "\t" --> " ", 80 margins, spaces between args, etc. Modified: pkg/quantstrat/demo/pair_trade.R =================================================================== --- pkg/quantstrat/demo/pair_trade.R 2013-04-06 22:10:42 UTC (rev 1427) +++ pkg/quantstrat/demo/pair_trade.R 2013-04-06 22:34:04 UTC (rev 1428) @@ -1,26 +1,28 @@ #Kindly contributed to quantstrat by Garrett See #code borrowed heavily from existing quantstrat demos -#This is a simple pairs trading example intended to illustrate how you can extend -#existing quantstrat functionality. It uses addPosLimits to specify levels and -#position limits, and shows how to pass a custom order sizing function to osFUN +# This is a simple pairs trading example intended to illustrate how you can +# extend existing quantstrat functionality. It uses addPosLimits to specify +# levels and position limits, and shows how to pass a custom order sizing +# function to osFUN -#Note that it would be easier to build a spread first and treat it as a single instrument -#instead of dealing with a portfolio of stocks. +# Note that it would be easier to build a spread first and treat it as a single +# instrument instead of dealing with a portfolio of stocks. -## given 2 stocks, calculate the ratio of their notional values. If the ratio falls below it's -# 2 stdev band, then when it crosses back above it, buy stock 1 and sell stock 2. -# If the ratio rises above it's 2 stdev band, then when it crosses back below -# it, sell stock 1 and buy stock 2. If the ratio crosses it's moving average, -# then flatten any open positions. +## given 2 stocks, calculate the ratio of their notional values. If the ratio +# falls below it's 2 stdev band, then when it crosses back above it, buy stock 1 +# and sell stock 2. If the ratio rises above it's 2 stdev band, then when it +# crosses back below it, sell stock 1 and buy stock 2. If the ratio crosses +# its moving average, then flatten any open positions. # The Qty of Stock A that it buys (sells) = MaxPos / lvls # The Qty of Stock B that is sells (buys) = MaxPos * Ratio / lvls suppressWarnings(rm("order_book.pair1",pos=.strategy)) suppressWarnings(rm("account.pairs", "portfolio.pair1", pos=.blotter)) -suppressWarnings(rm("initDate", "endDate", "startDate", "initEq", "SD", "N", "symb1", "symb2", - "portfolio1.st", "account.st", "pairStrat", "out1")) +suppressWarnings(rm("initDate", "endDate", "startDate", "initEq", "SD", "N", + "symb1", "symb2", "portfolio1.st", "account.st", + "pairStrat", "out1")) require(quantstrat) @@ -37,16 +39,17 @@ # {initDate="1999-12-31" # endDate=Sys.Date()} -initDate = '2009-01-01' -endDate = '2011-05-01' -startDate = '2009-01-02' -initEq = 100000 -SD = 2 -N = 20 +initDate <- '2009-01-01' +endDate <- '2011-05-01' +startDate <- '2009-01-02' +initEq <- 100000 +SD <- 2 +N <- 20 -MaxPos = 1500 #max position in stockA; -#max position in stock B will be max * ratio, i.e. no hard position limit in Stock B -lvls = 3 #how many times to fade; Each order's qty will = MaxPos/lvls +MaxPos <- 1500 #max position in stockA; +# max position in stock B will be max * ratio, i.e. no hard position limit in +# Stock B +lvls <- 3 #how many times to fade; Each order's qty will = MaxPos/lvls symb1 <- 'SPY' #change these to try other pairs symb2 <- 'DIA' #if you change them, make sure position limits still make sense @@ -56,160 +59,218 @@ getSymbols(c(symb1, symb2), from=startDate, to=endDate, adjust=TRUE) -#generic used to make sure the timestamps of all symbols are the same -#deletes rows where one of the stocks is missing data +# The following function is used to make sure the timestamps of all symbols are +# the same deletes rows where one of the stocks is missing data alignSymbols <- function(symbols, env=.GlobalEnv) { - if (length(symbols) < 2) - stop("Must provide at least 2 symbols") - if (any(!is.character(symbols))) - stop("Symbols must be vector of character strings.") - ff <- get(symbols[1],env=env) - for (sym in symbols[-1]) { - tmp.sym <- get(sym,env=env) - ff <- merge(ff,tmp.sym,all=FALSE) - } - for (sym in symbols) { - assign(sym,ff[,grep(sym,colnames(ff))],env=env) - } - symbols + # This is a simplified version of qmao::alignSymbols() + if (length(symbols) < 2) + stop("Must provide at least 2 symbols") + if (any(!is.character(symbols))) + stop("Symbols must be vector of character strings.") + ff <- get(symbols[1],env=env) + for (sym in symbols[-1]) { + tmp.sym <- get(sym,env=env) + ff <- merge(ff, tmp.sym, all=FALSE) + } + for (sym in symbols) { + assign(sym,ff[,grep(sym, colnames(ff))], env=env) + } + symbols } -alignSymbols(c(symb1,symb2)) +alignSymbols(c(symb1, symb2)) -#Define Instruments +# Define Instruments currency("USD") stock(symb1, currency="USD", multiplier=1) stock(symb2, currency="USD", multiplier=1) -#Initialize Portfolio, Account, and Orders +# Initialize Portfolio, Account, and Orders initPortf(name=portfolio1.st, c(symb1,symb2), initDate=initDate) initAcct(account.st, portfolios=portfolio1.st, initDate=initDate, initEq=initEq) -initOrders(portfolio=portfolio1.st,initDate=initDate) +initOrders(portfolio=portfolio1.st, initDate=initDate) -#osFUN will need to know which symbol is leg 1 and which is leg 2 as well as what the -#values are for MaxPos and lvls. So, create a slot in portfolio to hold this info. -pair <- c(1,2,MaxPos,lvls) -names(pair) <- c(symb1,symb2,"MaxPos","lvls") -.blotter[[paste('portfolio',portfolio1.st,sep='.')]]$pair <- pair +# osFUN will need to know which symbol is leg 1 and which is leg 2 as well as +# what the values are for MaxPos and lvls. So, create a slot in portfolio to +# hold this info. +pair <- c(1, 2, MaxPos, lvls) +names(pair) <- c(symb1, symb2, "MaxPos", "lvls") +.blotter[[paste('portfolio', portfolio1.st, sep='.')]]$pair <- pair # Create initial position limits and levels by symbol # allow 3 entries for long and short if lvls=3. -addPosLimit(portfolio=portfolio1.st, timestamp=initDate, symbol=symb1, maxpos=MaxPos, longlevels=lvls, minpos=-MaxPos, shortlevels=lvls) -addPosLimit(portfolio=portfolio1.st, timestamp=initDate, symbol=symb2, maxpos=MaxPos, longlevels=lvls, minpos=-MaxPos, shortlevels=lvls) +addPosLimit(portfolio=portfolio1.st, timestamp=initDate, symbol=symb1, + maxpos=MaxPos, longlevels=lvls, minpos=-MaxPos, shortlevels=lvls) +addPosLimit(portfolio=portfolio1.st, timestamp=initDate, symbol=symb2, + maxpos=MaxPos, longlevels=lvls, minpos=-MaxPos, shortlevels=lvls) # Create a strategy object pairStrat <- strategy('pairStrat') # Indicator function -calcRatio <- function(x) { #returns the ratio of notional close prices for 2 symbols - x1 <- get(x[1]) - x2 <- get(x[2]) - mult1 <- getInstrument(x[1])$multiplier - mult2 <- getInstrument(x[2])$multiplier - rat <- (mult1 * Cl(x1)) / (mult2 * Cl(x2)) - colnames(rat) <- 'Ratio' - rat -} -Ratio <- calcRatio(c(symb1[1],symb2[1])) #Indicator used for determining entry/exits +calcRatio <- function(x) { + #returns the ratio of notional close prices for 2 symbols + x1 <- get(x[1]) + x2 <- get(x[2]) + mult1 <- getInstrument(x[1])$multiplier + mult2 <- getInstrument(x[2])$multiplier + rat <- (mult1 * Cl(x1)) / (mult2 * Cl(x2)) + colnames(rat) <- 'Ratio' + rat +} +# Indicator used for determining entry/exits +Ratio <- calcRatio(c(symb1[1], symb2[1])) -#Put a slot in portfolio to hold hedge ratio so that it's available for order sizing function. -#In this example, the hedge ratio happens to be the same as the Ratio indicator. +# Store hedge ratio in portfolio so that it's available for order sizing +# function. In this example, the hedge ratio happens to be the same as the +# Ratio indicator. .blotter[[paste('portfolio',portfolio1.st,sep='.')]]$HedgeRatio <- Ratio #and make a function to get the most recent HedgeRatio getHedgeRatio <- function(portfolio, timestamp) { - portf <- getPortfolio(portfolio) - timestamp <- format(timestamp,"%Y-%m-%d %H:%M:%S") #ensures you don't get last value of next day if using intraday data and timestamp=midnight - toDate <- paste("::", timestamp, sep="") - Ratio <- last(portf$HedgeRatio[toDate]) - as.numeric(Ratio) + portf <- getPortfolio(portfolio) + timestamp <- format(timestamp,"%Y-%m-%d %H:%M:%S") + # above line ensures you don't get last value of next day if using intraday + # data and timestamp=midnight + toDate <- paste("::", timestamp, sep="") + Ratio <- last(portf$HedgeRatio[toDate]) + as.numeric(Ratio) } # Create an indicator - BBands on the Ratio -pairStrat <- add.indicator(strategy = pairStrat, name = "calcRatio", arguments = list(x=c(symb1,symb2))) -pairStrat <- add.indicator(strategy = pairStrat, name = "BBands", arguments = list(HLC=quote(Ratio), sd=SD, n=N, maType='SMA')) +pairStrat <- add.indicator(strategy=pairStrat, name = "calcRatio", + arguments=list(x=c(symb1,symb2))) +pairStrat <- add.indicator(strategy=pairStrat, name = "BBands", + arguments=list(HLC=quote(Ratio), sd=SD, n=N, + maType='SMA')) #applyIndicators(strategy=pairStrat,mktdata=get(symb1[1])) #for debugging -# Create signals - buy when crossing lower band from below, sell when crossing upper band from above, flatten when crossing mavg from above or from below -pairStrat <- add.signal(strategy = pairStrat, name = "sigCrossover", arguments= list(columns=c("Ratio","up"), relationship="lt"), label="cross.up") -pairStrat <- add.signal(strategy = pairStrat, name = "sigCrossover", arguments= list(columns=c("Ratio","dn"), relationship="gt"), label="cross.dn") -pairStrat <- add.signal(strategy = pairStrat, name = "sigCrossover", arguments= list(columns=c("Ratio","mavg"), relationship="lt"), label="cross.mid.fa") -pairStrat <- add.signal(strategy = pairStrat, name = "sigCrossover", arguments= list(columns=c("Ratio","mavg"), relationship="gt"), label="cross.mid.fb") +# Create signals - buy when crossing lower band from below, sell when crossing +# upper band from above, flatten when crossing mavg from above or from below +pairStrat <- add.signal(strategy=pairStrat, name="sigCrossover", + arguments=list(columns=c("Ratio","up"), + relationship="lt"), + label="cross.up") +pairStrat <- add.signal(strategy=pairStrat, name="sigCrossover", + arguments=list(columns=c("Ratio","dn"), + relationship="gt"), + label="cross.dn") +pairStrat <- add.signal(strategy=pairStrat, name="sigCrossover", + arguments=list(columns=c("Ratio","mavg"), + relationship="lt"), + label="cross.mid.fa") +pairStrat <- add.signal(strategy=pairStrat, name="sigCrossover", + arguments=list(columns=c("Ratio","mavg"), + relationship="gt"), + label="cross.mid.fb") -#make an order sizing function -#######################_ORDER SIZING FUNCTION_########################################################## -#check to see which stock it is. If it's the second stock, reverse orderqty and orderside -osSpreadMaxPos <- function (data, timestamp, orderqty, ordertype, orderside, portfolio, symbol, ruletype, ..., orderprice) -{ - portf <- getPortfolio(portfolio) - #check to make sure pair slot has the things needed for this function - if (!any(portf$pair == 1) && !(any(portf$pair == 2))) stop('pair must contain both values 1 and 2') - if (!any(names(portf$pair) == "MaxPos") || !any(names(portf$pair) == "lvls")) stop('pair must contain MaxPos and lvls') - - if (portf$pair[symbol] == 1) legside <- "long" - if (portf$pair[symbol] == 2) legside <- "short" - MaxPos <- portf$pair["MaxPos"] - lvls <- portf$pair["lvls"] - ratio <- getHedgeRatio(portfolio, timestamp) - pos <- getPosQty(portfolio, symbol, timestamp) - PosLimit <- getPosLimit(portfolio, symbol, timestamp) - qty <- orderqty - if (legside == "short") {#symbol is 2nd leg - ## Comment out next line to use equal ordersizes for each stock. - addPosLimit(portfolio=portfolio, timestamp=timestamp, symbol=symbol, maxpos=round(MaxPos*ratio,0), longlevels=lvls, minpos=round(-MaxPos*ratio,0), shortlevels=lvls) - ## - qty <- -orderqty #switch orderqty for Stock B - } - - if (qty > 0) orderside = 'long' - if (qty < 0) orderside = 'short' +# make an order sizing function +#######################_ORDER SIZING FUNCTION_################################## +# check to see which stock it is. If it's the second stock, reverse orderqty and +# orderside +osSpreadMaxPos <- function (data, timestamp, orderqty, ordertype, orderside, + portfolio, symbol, ruletype, ..., orderprice) { + portf <- getPortfolio(portfolio) + #check to make sure pair slot has the things needed for this function + if (!any(portf$pair == 1) && !(any(portf$pair == 2))) + stop('pair must contain both values 1 and 2') + if (!any(names(portf$pair) == "MaxPos") || !any(names(portf$pair) == "lvls")) + stop('pair must contain MaxPos and lvls') + + if (portf$pair[symbol] == 1) legside <- "long" + if (portf$pair[symbol] == 2) legside <- "short" + MaxPos <- portf$pair["MaxPos"] + lvls <- portf$pair["lvls"] + ratio <- getHedgeRatio(portfolio, timestamp) + pos <- getPosQty(portfolio, symbol, timestamp) + PosLimit <- getPosLimit(portfolio, symbol, timestamp) + qty <- orderqty + if (legside == "short") {#symbol is 2nd leg + ## Comment out next line to use equal ordersizes for each stock. + addPosLimit(portfolio=portfolio, timestamp=timestamp, symbol=symbol, + maxpos=round(MaxPos*ratio,0), longlevels=lvls, + minpos=round(-MaxPos*ratio,0), shortlevels=lvls) + ## + qty <- -orderqty #switch orderqty for Stock B + } + + if (qty > 0) orderside = 'long' + if (qty < 0) orderside = 'short' - orderqty <- osMaxPos(data=data,timestamp=timestamp,orderqty=qty,ordertype=ordertype, - orderside=orderside,portfolio=portfolio,symbol=symbol,ruletype=ruletype, ...) - - #Add the order here instead of in the ruleSignal function - if (!is.null(orderqty) & !orderqty == 0 & !is.null(orderprice)) { - addOrder(portfolio = portfolio, symbol = symbol, - timestamp = timestamp, qty = orderqty, price = as.numeric(orderprice), - ordertype = ordertype, side = orderside, replace = FALSE, - status = "open", ... = ...) - } - return(0) #so that ruleSignal function doesn't also try to place an order + orderqty <- osMaxPos(data=data,timestamp=timestamp, orderqty=qty, + ordertype=ordertype, orderside=orderside, + portfolio=portfolio, symbol=symbol, ruletype=ruletype, + ...) + + #Add the order here instead of in the ruleSignal function + if (!is.null(orderqty) & !orderqty == 0 & !is.null(orderprice)) { + addOrder(portfolio=portfolio, symbol=symbol, + timestamp=timestamp, qty=orderqty, price=as.numeric(orderprice), + ordertype=ordertype, side=orderside, replace=FALSE, + status="open", ...=...) + } + return(0) #so that ruleSignal function doesn't also try to place an order } -######################################################################################################## +################################################################################ -# Create entry and exit rules for longs and for shorts. Both symbols will get the same buy/sell signals, but osMaxPos will reverse those for the second symbol. -# orderqty's are bigger than PosLimits allow. osMaxPos will adjust the orderqty down to 1/3 the max allowed. (1/3 is because we are using 3 levels in PosLimit) -pairStrat <- add.rule(strategy = pairStrat, name='ruleSignal', arguments = list(sigcol="cross.dn", sigval=TRUE, orderqty=1e6, ordertype='market', orderside=NULL, osFUN='osSpreadMaxPos'), type='enter' ) -pairStrat <- add.rule(strategy = pairStrat, name='ruleSignal', arguments = list(sigcol="cross.up", sigval=TRUE, orderqty=-1e6, ordertype='market', orderside=NULL, osFUN='osSpreadMaxPos'), type='enter') -pairStrat <- add.rule(strategy = pairStrat, name='ruleSignal', arguments = list(sigcol="cross.mid.fb", sigval=TRUE, orderqty='all', ordertype='market', orderside=NULL), type='exit') -pairStrat <- add.rule(strategy = pairStrat, name='ruleSignal', arguments = list(sigcol="cross.mid.fa", sigval=TRUE, orderqty='all', ordertype='market', orderside=NULL), type='exit') +# Create entry and exit rules for longs and for shorts. Both symbols will get +# the same buy/sell signals, but osMaxPos will reverse those for the second +# symbol. +# orderqty's are bigger than PosLimits allow. osMaxPos will adjust the orderqty +# down to 1/3 the max allowed. (1/3 is because we are using 3 levels in +# PosLimit) +pairStrat <- add.rule(strategy=pairStrat, name='ruleSignal', + arguments=list(sigcol="cross.dn", sigval=TRUE, + orderqty=1e6, ordertype='market', + orderside=NULL, osFUN='osSpreadMaxPos'), + type='enter') +pairStrat <- add.rule(strategy=pairStrat, name='ruleSignal', + arguments=list(sigcol="cross.up", sigval=TRUE, + orderqty=-1e6, ordertype='market', + orderside=NULL, osFUN='osSpreadMaxPos'), + type='enter') +pairStrat <- add.rule(strategy=pairStrat, name='ruleSignal', + arguments=list(sigcol="cross.mid.fb", sigval=TRUE, + orderqty='all', ordertype='market', + orderside=NULL), + type='exit') +pairStrat <- add.rule(strategy=pairStrat, name='ruleSignal', + arguments=list(sigcol="cross.mid.fa", sigval=TRUE, + orderqty='all', ordertype='market', + orderside=NULL), + type='exit') -#applySignals(strategy=pairStrat, mktdata=applyIndicators(strategy=pairStrat,mktdata=get(symb1))) #for debugging +## for debugging +# applySignals(strategy=pairStrat, +# mktdata=applyIndicators(strategy=pairStrat, mktdata=get(symb1))) +## + out1<-applyStrategy(strategy=pairStrat, portfolios=portfolio1.st) -updatePortf(Portfolio=portfolio1.st,Dates=paste("::",as.Date(Sys.time()),sep='')) -updateAcct(account.st,Dates=paste(startDate,endDate,sep="::")) -updateEndEq(account.st,Dates=paste(startDate,endDate,sep="::")) -getEndEq(account.st,Sys.time()) +updatePortf(Portfolio=portfolio1.st, + Dates=paste("::", as.Date(Sys.time()), sep='')) +updateAcct(account.st, Dates=paste(startDate, endDate, sep="::")) +updateEndEq(account.st, Dates=paste(startDate, endDate, sep="::")) +getEndEq(account.st, Sys.time()) dev.new() -chart.Posn(Portfolio=portfolio1.st,Symbol=symb1) +chart.Posn(Portfolio=portfolio1.st, Symbol=symb1) dev.new() -chart.Posn(Portfolio=portfolio1.st,Symbol=symb2) +chart.Posn(Portfolio=portfolio1.st, Symbol=symb2) dev.new() -chartSeries(Cl(get(symb1))/Cl(get(symb2)),TA="addBBands(n=N,sd=SD)") +chartSeries(Cl(get(symb1))/Cl(get(symb2)), TA="addBBands(n=N,sd=SD)") ret1 <- PortfReturns(account.st) ret1$total <- rowSums(ret1) #ret1 -if("package:PerformanceAnalytics" %in% search() || require("PerformanceAnalytics",quietly=TRUE)) { -# getSymbols("SPY", from='1999-01-01') -# SPY.ret <- Return.calculate(SPY$SPY.Close) -# tmp <- merge(SPY.ret,ret1$total,all=FALSE) - dev.new() - charts.PerformanceSummary(ret1$total,geometric=FALSE,wealth.index=TRUE) +if("package:PerformanceAnalytics" %in% search() || + require("PerformanceAnalytics",quietly=TRUE)) { +# getSymbols("SPY", from='1999-01-01') +# SPY.ret <- Return.calculate(SPY$SPY.Close) +# tmp <- merge(SPY.ret,ret1$total,all=FALSE) + dev.new() + charts.PerformanceSummary(ret1$total, geometric=FALSE, wealth.index=TRUE) } From noreply at r-forge.r-project.org Sun Apr 7 23:29:51 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Sun, 7 Apr 2013 23:29:51 +0200 (CEST) Subject: [Blotter-commits] r1429 - pkg/quantstrat/demo Message-ID: <20130407212951.9D3081853B0@r-forge.r-project.org> Author: opentrades Date: 2013-04-07 23:29:51 +0200 (Sun, 07 Apr 2013) New Revision: 1429 Modified: pkg/quantstrat/demo/luxor.1.R pkg/quantstrat/demo/luxor.2.R Log: - some small improvements Modified: pkg/quantstrat/demo/luxor.1.R =================================================================== --- pkg/quantstrat/demo/luxor.1.R 2013-04-06 22:34:04 UTC (rev 1428) +++ pkg/quantstrat/demo/luxor.1.R 2013-04-07 21:29:51 UTC (rev 1429) @@ -16,8 +16,8 @@ .fast = 10 .slow = 30 -.orderqty=100000 -.threshold=0.0005 +.orderqty = 100000 +.threshold = 0.0005 ##### PLACE DEMO AND TEST DATES HERE ################# # @@ -44,7 +44,7 @@ ### packages # -# quantstrat package will pull in many other packages: +# quantstrat package will pull in some other packages: # FinancialInstrument, quantmod, blotter, xts require(quantstrat) @@ -146,9 +146,7 @@ add.rule(strategy.st, 'ruleSignal', arguments=list(sigcol='long' , sigval=TRUE, orderside='long' , - ordertype='stoplimit', - prefer='High', - threshold=.threshold, + ordertype='stoplimit', prefer='High', threshold=.threshold, orderqty=+.orderqty, replace=FALSE ), @@ -159,9 +157,7 @@ add.rule(strategy.st, 'ruleSignal', arguments=list(sigcol='short', sigval=TRUE, orderside='short', - ordertype='stoplimit', - prefer='Low', - threshold=-.threshold, + ordertype='stoplimit', prefer='Low', threshold=-.threshold, orderqty=-.orderqty, replace=FALSE ), @@ -173,7 +169,7 @@ applyStrategy(strategy.st, portfolio.st, verbose = FALSE) -print(getOrderBook(portfolio.st)) +View(getOrderBook(portfolio.st)[[portfolio.st]]$GBPUSD) ############################################################################### @@ -181,8 +177,10 @@ chart.Posn(portfolio.st, "GBPUSD") -tradeStats(portfolio.st, 'GBPUSD') +############################################################################### +View(tradeStats(portfolio.st, 'GBPUSD')) + ##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### # book = getOrderBook(port) # stats = tradeStats(port) Modified: pkg/quantstrat/demo/luxor.2.R =================================================================== --- pkg/quantstrat/demo/luxor.2.R 2013-04-06 22:34:04 UTC (rev 1428) +++ pkg/quantstrat/demo/luxor.2.R 2013-04-07 21:29:51 UTC (rev 1429) @@ -16,9 +16,9 @@ .fast = 10 .slow = 30 -.orderqty=100000 -.threshold=0.0005 -.txn.fees=-30 +.orderqty = 100000 +.threshold = 0.0005 +.txn.fees = -30 ##### PLACE DEMO AND TEST DATES HERE ################# # @@ -45,7 +45,7 @@ ### packages # -# quantstrat package will pull in many other packages: +# quantstrat package will pull in some other packages: # FinancialInstrument, quantmod, blotter, xts require(quantstrat) @@ -172,7 +172,7 @@ applyStrategy(strategy.st, portfolio.st, verbose = FALSE) -print(getOrderBook(portfolio.st)) +View(getOrderBook(portfolio.st)[[portfolio.st]]$GBPUSD) ############################################################################### @@ -180,8 +180,16 @@ chart.Posn(portfolio.st, "GBPUSD") -tradeStats(portfolio.st, 'GBPUSD') +############################################################################### +View(tradeStats(portfolio.st, 'GBPUSD')) + +############################################################################### + +# save the strategy in an .RData object for later retrieval + +save.strategy(strategy.st) + ##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### # book = getOrderBook(port) # stats = tradeStats(port) From noreply at r-forge.r-project.org Wed Apr 10 12:49:33 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Wed, 10 Apr 2013 12:49:33 +0200 (CEST) Subject: [Blotter-commits] r1430 - pkg/quantstrat/R Message-ID: <20130410104933.CCF071811AF@r-forge.r-project.org> Author: bodanker Date: 2013-04-10 12:49:33 +0200 (Wed, 10 Apr 2013) New Revision: 1430 Modified: pkg/quantstrat/R/rules.R Log: - update nextIndex dindex/cross logic for stoplimit, limit, and stoptrailing orders (stoptrailing orders may still need work) Modified: pkg/quantstrat/R/rules.R =================================================================== --- pkg/quantstrat/R/rules.R 2013-04-07 21:29:51 UTC (rev 1429) +++ pkg/quantstrat/R/rules.R 2013-04-10 10:49:33 UTC (rev 1430) @@ -388,9 +388,10 @@ if (is.na(col)) stop("no price discernable for stoplimit in applyRules") } cross<-sigThreshold(label='tmpstop',column=col,threshold=tmpprice,relationship=relationship) - if(any(cross[timespan])){ + cross <- cross[timespan][-1] # don't look for crosses on curIndex + if(any(cross)){ # find first index that would cross after this index - newidx <- curIndex + which(cross[timespan])[1] - 1 + newidx <- curIndex + which(cross)[1] # insert that into dindex assign.dindex(c(get.dindex(),newidx)) } @@ -443,7 +444,8 @@ } # use sigThreshold cross<-sigThreshold(label='tmplimit',column=col,threshold=tmpprice,relationship=relationship) - if(any(cross[timespan])){ + cross <- cross[timespan][-1] # don't look for crosses on curIndex + if(any(cross)){ # find first index that would cross after this index # # current index = which(cross[timespan])[1] @@ -451,7 +453,7 @@ # need to subtract 1 index==1 means current position # # newidx <- curIndex + which(cross[timespan])[1] #- 1 #curIndex/timestamp was 1 in the subset, we need a -1 offset? - newidx <- curIndex + which(cross[timespan])[2] - 1 #curIndex/timestamp was 1 in the subset, we need a -1 offset? + newidx <- curIndex + which(cross)[1] #if there are is no cross curIndex will be incremented on line 496 # with curIndex<-min(dindex[dindex>curIndex]). @@ -518,15 +520,15 @@ timespan <- paste(format(firsttime, "%Y-%m-%d %H:%M:%OS6"),"::",nextstamp,sep='') #get the subset of prices - mkt_price_series <-getPrice(mktdata[timespan],prefer=prefer) + mkt_price_series <-getPrice(mktdata[timespan],prefer=prefer)[-1] # don't look for crosses on curIndex col<-first(colnames(mkt_price_series)) if(tmpqty > 0){ # positive quantity 'buy' - move_order <- ifelse( (mkt_price_series+orderThreshold) < tmpprice, TRUE, FALSE ) + move_order <- (mkt_price_series+orderThreshold) < tmpprice #this ifelse creates a logical xts vector relationship="gte" } else { # negative quantity 'sell' - move_order <- ifelse( (mkt_price_series+orderThreshold) > tmpprice, TRUE, FALSE ) + move_order <- (mkt_price_series+orderThreshold) > tmpprice relationship="lte" } tmpidx<-NULL @@ -539,9 +541,10 @@ #make sure we don't cross before then # use sigThreshold cross<-sigThreshold(data=mkt_price_series, label='tmptrail',column=col,threshold=tmpprice,relationship=relationship) + cross <- cross[trailspan][-1] # don't look for crosses on curIndex # find first index that would cross after this index - if (any(cross[trailspan])){ - newidx <- curIndex + index(mktdata[index(which(cross[trailspan])[1]),which.i=TRUE]) + if (any(cross)){ + newidx <- curIndex + index(mktdata[index(which(cross)[1]),which.i=TRUE]) # insert that into dindex assign.dindex(c(get.dindex(),newidx)) } else { From noreply at r-forge.r-project.org Sat Apr 13 19:30:44 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Sat, 13 Apr 2013 19:30:44 +0200 (CEST) Subject: [Blotter-commits] r1431 - pkg/quantstrat/R Message-ID: <20130413173044.CE1C11852C8@r-forge.r-project.org> Author: braverock Date: 2013-04-13 19:30:44 +0200 (Sat, 13 Apr 2013) New Revision: 1431 Modified: pkg/quantstrat/R/signals.R Log: - change to use .xts means we need to pass index, not order.by, patch suggested by Robert Schmidt Modified: pkg/quantstrat/R/signals.R =================================================================== --- pkg/quantstrat/R/signals.R 2013-04-10 10:49:33 UTC (rev 1430) +++ pkg/quantstrat/R/signals.R 2013-04-13 17:30:44 UTC (rev 1431) @@ -316,7 +316,7 @@ # Vijay's PAST/AAII/SIPRO example # fieldVals <- try(eval(parse(text=expression), data)) ret_sig=NULL - ret_sig <- try(.xts(eval(parse(text=formula), as.list(data)),order.by=.index(data))) + ret_sig <- try(.xts(eval(parse(text=formula), as.list(data)),index=.index(data))) if(is.xts(ret_sig)){ if(isTRUE(cross)) ret_sig <- diff(ret_sig)==1 colnames(ret_sig)<-label From noreply at r-forge.r-project.org Sun Apr 14 23:53:14 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Sun, 14 Apr 2013 23:53:14 +0200 (CEST) Subject: [Blotter-commits] r1432 - pkg/quantstrat/R Message-ID: <20130414215315.00C5C18523A@r-forge.r-project.org> Author: bodanker Date: 2013-04-14 23:53:14 +0200 (Sun, 14 Apr 2013) New Revision: 1432 Modified: pkg/quantstrat/R/rules.R Log: - fix chain rule execution logic Modified: pkg/quantstrat/R/rules.R =================================================================== --- pkg/quantstrat/R/rules.R 2013-04-13 17:30:44 UTC (rev 1431) +++ pkg/quantstrat/R/rules.R 2013-04-14 21:53:14 UTC (rev 1432) @@ -630,19 +630,17 @@ chain = { if(!is.null(closed.orders)) { + # determine which closed orders are chained to an entry chain.rules <- strategy$rules[[type]] - for(parent in closed.orders[,'Rule']) - { - # there should be a nicer way to do this in R :-) JH - rules <- list() - for(rule in chain.rules) { - if(!is.null(rule$parent) && rule$parent == parent) - rules = c(rules, list(rule)) - } - if(length(rules) > 0) - { - ruleProc(rules, timestamp=timestamp, path.dep=path.dep, mktdata=mktdata, portfolio=portfolio, symbol=symbol, ruletype=type, mktinstr=mktinstr, parameters=list('chain.price'=as.numeric(closed.orders$Order.Price), ...)) - } + chain.rule.names <- sapply(chain.rules, '[[', 'parent') + closed.with.chain <- which(closed.orders$Rule %in% chain.rule.names) + # put rules/prices in same order + rules <- chain.rules[closed.with.chain] + chain.price <- closed.orders$Order.Price[closed.with.chain] + # loop over each rule and call ruleProc() + for(i in seq_along(closed.with.chain)) { + # call ruleProc in a loop, since it doesn't look like chain.price would be subset correctly + ruleProc(rules[i], timestamp=timestamp, path.dep=path.dep, mktdata=mktdata, portfolio=portfolio, symbol=symbol, ruletype=type, mktinstr=mktinstr, parameters=list(chain.price=as.numeric(chain.price[i]), ...)) } } }, From noreply at r-forge.r-project.org Mon Apr 15 13:29:00 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Mon, 15 Apr 2013 13:29:00 +0200 (CEST) Subject: [Blotter-commits] r1433 - pkg/quantstrat/R Message-ID: <20130415112900.657AA183A2B@r-forge.r-project.org> Author: bodanker Date: 2013-04-15 13:29:00 +0200 (Mon, 15 Apr 2013) New Revision: 1433 Modified: pkg/quantstrat/R/rules.R Log: - another fix to chain rule execution logic Modified: pkg/quantstrat/R/rules.R =================================================================== --- pkg/quantstrat/R/rules.R 2013-04-14 21:53:14 UTC (rev 1432) +++ pkg/quantstrat/R/rules.R 2013-04-15 11:29:00 UTC (rev 1433) @@ -633,12 +633,11 @@ # determine which closed orders are chained to an entry chain.rules <- strategy$rules[[type]] chain.rule.names <- sapply(chain.rules, '[[', 'parent') - closed.with.chain <- which(closed.orders$Rule %in% chain.rule.names) # put rules/prices in same order - rules <- chain.rules[closed.with.chain] - chain.price <- closed.orders$Order.Price[closed.with.chain] + rules <- chain.rules[match(closed.orders$Rule, chain.rule.names, nomatch=0L)] + chain.price <- closed.orders$Order.Price[closed.orders$Rule %in% chain.rule.names] # loop over each rule and call ruleProc() - for(i in seq_along(closed.with.chain)) { + for(i in seq_along(rules)) { # call ruleProc in a loop, since it doesn't look like chain.price would be subset correctly ruleProc(rules[i], timestamp=timestamp, path.dep=path.dep, mktdata=mktdata, portfolio=portfolio, symbol=symbol, ruletype=type, mktinstr=mktinstr, parameters=list(chain.price=as.numeric(chain.price[i]), ...)) } From noreply at r-forge.r-project.org Mon Apr 15 14:02:46 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Mon, 15 Apr 2013 14:02:46 +0200 (CEST) Subject: [Blotter-commits] r1434 - pkg/quantstrat/R Message-ID: <20130415120246.B3C0E18516E@r-forge.r-project.org> Author: bodanker Date: 2013-04-15 14:02:46 +0200 (Mon, 15 Apr 2013) New Revision: 1434 Modified: pkg/quantstrat/R/rules.R Log: - fix trailing stop move-order logic - tidy up: 1) put ordersubset[oo.idx,] into object to avoid repeated subsetting 2) replace grep() for order types with simple "==" 3) combine quantity in ('all','trigger',0) into one block Modified: pkg/quantstrat/R/rules.R =================================================================== --- pkg/quantstrat/R/rules.R 2013-04-15 11:29:00 UTC (rev 1433) +++ pkg/quantstrat/R/rules.R 2013-04-15 12:02:46 UTC (rev 1434) @@ -330,7 +330,8 @@ nidx=FALSE } else { - if(length(grep('^market$', ordersubset[oo.idx,'Order.Type'])) > 0) + ordersubset.oo.idx <- ordersubset[oo.idx,] + if(length(which('market'==ordersubset.oo.idx[,'Order.Type'])) > 0) { # if block above had a prefer exclusion, as below: # || hasArg('prefer') @@ -340,29 +341,24 @@ #if any type is market # set to curIndex+1 #curIndex<-curIndex+1 - if (is.na(curIndex) || (curIndex + 1) > length(index(mktdata))) curIndex=FALSE + if (is.na(curIndex) || (curIndex + 1) > nrow(mktdata)) curIndex=FALSE hasmktord <- TRUE #return(curIndex) # move to next index, a market order in this index would have trumped any other open order } - stoplimitorders <- grep('^stoplimit$', ordersubset[oo.idx,'Order.Type']) + stoplimitorders <- which('stoplimit'==ordersubset.oo.idx[,'Order.Type']) for(slorder in stoplimitorders) { - dindex <- get.dindex() - tmpqty <- ordersubset[oo.idx[slorder],'Order.Qty'] - if (tmpqty=='all' || tmpqty=='trigger'){ + tmpqty <- ordersubset.oo.idx[slorder,'Order.Qty'] + if (tmpqty=='all' || tmpqty=='trigger' || tmpqty==0){ #tmpqty<-osNoOp(timestamp=timestamp, orderqty=tmpqty, portfolio=portfolio, symbol=symbol,ruletype='exit' ) - #set to 0, and let the next block figure it out from orderside - tmpqty=0 - } - if (tmpqty==0) { #no position, so do some sleight of hand to figure out when the index may be needed - side <- ordersubset[oo.idx[slorder],'Order.Side'] + side <- ordersubset.oo.idx[slorder,'Order.Side'] if(side=='long') tmpqty=-1 else tmpqty=1 } tmpqty<-as.numeric(tmpqty) - tmpprice <- as.numeric(ordersubset[oo.idx[slorder],'Order.Price']) + tmpprice <- as.numeric(ordersubset.oo.idx[slorder,'Order.Price']) if (tmpqty > 0) { #buy if mktprice moves above stoplimitorder price relationship='gte' #if the Ask or Hi go above threshold our stop will be filled if(isBBOmktdata) { @@ -397,26 +393,19 @@ } } - limitorders<-grep('^limit$', ordersubset[oo.idx,'Order.Type']) + limitorders <- which('limit'==ordersubset.oo.idx[,'Order.Type']) for(lorder in limitorders) { - dindex<-get.dindex() - tmpqty<-ordersubset[oo.idx[lorder],'Order.Qty'] - if (tmpqty=='all' || tmpqty=='trigger'){ + tmpqty<-ordersubset.oo.idx[lorder,'Order.Qty'] + if (tmpqty=='all' || tmpqty=='trigger' || tmpqty==0){ #tmpqty<-osNoOp(timestamp=timestamp, orderqty=tmpqty, portfolio=portfolio, symbol=symbol,ruletype='exit' ) - #set to 0, and let the next block figure it out from orderside - tmpqty=0 - } - if (tmpqty==0) { #no position, so do some sleight of hand to figure out when the index may be needed - side <- ordersubset[oo.idx[lorder],'Order.Side'] - if(side=='long') tmpqty=-1 - else tmpqty=1 + side <- ordersubset.oo.idx[lorder,'Order.Side'] + if(side=='long') tmpqty <- -1 + else tmpqty <- 1 } tmpqty<-as.numeric(tmpqty) - - tmpprice<-as.numeric(ordersubset[oo.idx[lorder],'Order.Price']) - + tmpprice<-as.numeric(ordersubset.oo.idx[lorder,'Order.Price']) if(tmpqty>0){ #buying relationship="lte" #look for places where Mkt Ask <= our Bid @@ -463,13 +452,10 @@ # insert that into dindex assign.dindex(c(get.dindex(),newidx)) - } else{ - # no cross, move ahead - # nidx=TRUE #WHY WAS THIS HERE? } } # end loop over open limit orders - trailorders<-grep('^stoptrailing$', ordersubset[oo.idx,'Order.Type']) + trailorders <- which('stoptrailing'==ordersubset.oo.idx[,'Order.Type']) for(torder in trailorders) { firsttime<-NULL @@ -477,25 +463,14 @@ onum<-oo.idx[torder] orderThreshold <- as.numeric(ordersubset[onum,'Order.Threshold']) tmpqty<-ordersubset[onum,'Order.Qty'] - if (tmpqty=='all' || tmpqty=='trigger'){ + if (tmpqty=='all' || tmpqty=='trigger' || tmpqty==0){ #tmpqty<-osNoOp(timestamp=timestamp, orderqty=tmpqty, portfolio=portfolio, symbol=symbol,ruletype='exit' ) - #set to 0, and let the next block figure it out from orderside - tmpqty=0 - } - if (tmpqty==0) { #no position, so do some sleight of hand to figure out when the index may be needed - side <- ordersubset[oo.idx[torder],'Order.Side'] + side <- ordersubset.oo.idx[torder,'Order.Side'] if(side=='long') tmpqty=-1 else tmpqty=1 } tmpqty<-as.numeric(tmpqty) - if (tmpqty==0) { - #no position, so do some sleight of hand to figure out when the index may be needed - side <- ordersubset[onum,'Order.Side'] - if(side=='long') tmpqty=-1 - else tmpqty=1 - } - tmpqty<-as.numeric(tmpqty) tmpprice<-as.numeric(ordersubset[onum,'Order.Price']) tmpidx <- format(index(ordersubset[onum,]), "%Y-%m-%d %H:%M:%OS6") #this is the time the order was entered #print(tmpidx) @@ -524,11 +499,10 @@ col<-first(colnames(mkt_price_series)) if(tmpqty > 0){ # positive quantity 'buy' - move_order <- (mkt_price_series+orderThreshold) < tmpprice - #this ifelse creates a logical xts vector + move_order <- tmpprice - abs(orderThreshold) > mkt_price_series relationship="gte" } else { # negative quantity 'sell' - move_order <- (mkt_price_series+orderThreshold) > tmpprice + move_order <- tmpprice + abs(orderThreshold) < mkt_price_series relationship="lte" } tmpidx<-NULL @@ -541,7 +515,7 @@ #make sure we don't cross before then # use sigThreshold cross<-sigThreshold(data=mkt_price_series, label='tmptrail',column=col,threshold=tmpprice,relationship=relationship) - cross <- cross[trailspan][-1] # don't look for crosses on curIndex + cross <- cross[trailspan] # don't look for crosses on curIndex (curIndex is removed from mkt_price_series) # find first index that would cross after this index if (any(cross)){ newidx <- curIndex + index(mktdata[index(which(cross)[1]),which.i=TRUE]) @@ -549,7 +523,7 @@ assign.dindex(c(get.dindex(),newidx)) } else { #if we don't cross, do this - moveidx <- curIndex + orderidx - 1 + moveidx <- curIndex + orderidx assign.dindex(c(get.dindex(),moveidx)) } } # end any(move_order) check From noreply at r-forge.r-project.org Tue Apr 16 17:23:34 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Tue, 16 Apr 2013 17:23:34 +0200 (CEST) Subject: [Blotter-commits] r1435 - pkg/quantstrat/R Message-ID: <20130416152335.1B49F184E8D@r-forge.r-project.org> Author: bodanker Date: 2013-04-16 17:23:34 +0200 (Tue, 16 Apr 2013) New Revision: 1435 Modified: pkg/quantstrat/R/ruleOrderProc.R Log: - attempt to fix BBO stoptrailing logic Modified: pkg/quantstrat/R/ruleOrderProc.R =================================================================== --- pkg/quantstrat/R/ruleOrderProc.R 2013-04-15 12:02:46 UTC (rev 1434) +++ pkg/quantstrat/R/ruleOrderProc.R 2013-04-16 15:23:34 UTC (rev 1435) @@ -155,7 +155,7 @@ limit= , stoplimit =, iceberg = { - if (!isBBOmktdata) { #(isOHLCmktdata){ + if (!isBBOmktdata) { if( orderType == 'iceberg'){ stop("iceberg orders only supported for BBO data") } @@ -240,57 +240,63 @@ } }, stoptrailing = { - if(isBBOmktdata) # TODO BBO needs testing after fixes for OHLC by JH + if(isBBOmktdata) { - # if market moved through my price, execute - if(orderQty > 0) # positive quantity 'buy' - { - if(isBBOmktdata) prefer='offer' - if(orderPrice >= getPrice(mktdataTimestamp,prefer=prefer)[,1]){ #TODO maybe use last(getPrice) to catch multiple prints on timestamp? - # price we're willing to pay is higher than the offer price, so execute at the prevailing price - #txnprice = orderPrice - txnprice = as.numeric(getPrice(mktdataTimestamp,prefer=prefer)[,1]) #presumes unique timestamps - txntime = timestamp - } - } else { # negative quantity 'sell' - if(isBBOmktdata) prefer='bid' - if(orderPrice <= getPrice(mktdataTimestamp,prefer=prefer)[,1]){ - # we're willing to sell at a better price than the bid, so execute at the prevailing price - # txnprice = orderPrice - txnprice = as.numeric(getPrice(mktdataTimestamp,prefer=prefer)[,1]) #presumes unique timestamp - txntime = timestamp - } - } - # if market is beyond price+(-threshold), replace order - if(is.null(txnprice)) { - # we didn't trade, so check to see if we need to move the stop - # first figure out how to find a price - if(orderQty > 0){ - prefer='offer' - } else { - prefer='bid' + order.side <- ordersubset[ii, "Order.Side"] + mvstop <- FALSE + absOrderThreshold <- abs(orderThreshold) + # +++++++++ stop order price - buy + # ~~~~~~~~~ market price + # --------- stop order price - sell + if(orderQty > 0) { # positive quantity 'buy' + prefer <- 'ask' + mktPrice <- as.numeric(getPrice(mktdataTimestamp,prefer=prefer)[,1]) + # check to see if price moved through the limit + if(mktPrice >= orderPrice) { # buy when price >= stop + txnprice <- mktPrice + txntime <- timestamp } - - # check if we need to move the stop - mvstop=FALSE - if(orderQty > 0){ # positive quantity 'buy' - if( as.numeric(last(getPrice(x=mktdataTimestamp,prefer=prefer)[,1]))+orderThreshold < orderPrice ) mvstop=TRUE - } else { # negative quantity 'sell' - if( as.numeric(last(getPrice(x=mktdataTimestamp,prefer=prefer)[,1]))+orderThreshold > orderPrice ) mvstop=TRUE - + # move stop if price < stop - thresh + else { + mvstop <- orderPrice - absOrderThreshold > mktPrice + new.order.price <- min(orderPrice, mktPrice + absOrderThreshold) + #new.order.price <- mktPrice + absOrderThreshold } + } else { # negative quantity 'sell' + prefer <- 'bid' + mktPrice <- as.numeric(getPrice(mktdataTimestamp,prefer=prefer)[,1]) + # check to see if price moved through the limit + if(mktPrice <= orderPrice) { # sell when price <= stop + txnprice <- mktPrice + txntime <- timestamp + } + # move stop if price > stop + thresh + else { + mvstop <- orderPrice + absOrderThreshold < mktPrice + new.order.price <- max(orderPrice, mktPrice - absOrderThreshold) + #new.order.price <- mktPrice - absOrderThreshold + } + } if( isTRUE(mvstop) ){ + # if ordersubset[ii, "Order.Qty"] was character, we must recover it + new.order.qty <- ordersubset[ii, "Order.Qty"] + if(!is.na(suppressWarnings(as.numeric(new.order.qty)))) + new.order.qty <- as.numeric(new.order.qty) + neworder<-addOrder(portfolio=portfolio, symbol=symbol, timestamp=timestamp, - qty=orderQty, - price=as.numeric(getPrice(mktdataTimestamp,prefer=prefer)[,1]), + qty=new.order.qty, + price=new.order.price-orderThreshold, ordertype=orderType, - side=ordersubset[ii,"Order.Side"], + prefer=prefer, + side=order.side, threshold=orderThreshold, status="open", replace=FALSE, return=TRUE, + orderset=ordersubset[ii,"Order.Set"], + label=ordersubset[ii,"Rule"], ,...=..., TxnFees=txnfees) ordersubset<-rbind(ordersubset, neworder) @@ -299,7 +305,6 @@ ordersubset[ii,"Order.StatusTime"]<-format(timestamp, "%Y-%m-%d %H:%M:%S") next() } - } # else next } else if(isOHLCmktdata) From noreply at r-forge.r-project.org Wed Apr 17 13:01:33 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Wed, 17 Apr 2013 13:01:33 +0200 (CEST) Subject: [Blotter-commits] r1436 - pkg/quantstrat/demo Message-ID: <20130417110133.72DE4180484@r-forge.r-project.org> Author: opentrades Date: 2013-04-17 13:01:33 +0200 (Wed, 17 Apr 2013) New Revision: 1436 Added: pkg/quantstrat/demo/luxor.strategy.R Removed: pkg/quantstrat/demo/luxor.1.R pkg/quantstrat/demo/luxor.2.R pkg/quantstrat/demo/luxor.strategy.R Modified: pkg/quantstrat/demo/luxor.3.Parameters.tradegraphs.R Log: - removed luxor.1.R, as the only diff with luxor.2.R is txnfees - renamed luxor.2.R to luxor.strategy.R: the basic strategy - adjusted luxor.3.Parameters.tradegraphs.R for new fixed.parameters Deleted: pkg/quantstrat/demo/luxor.1.R =================================================================== --- pkg/quantstrat/demo/luxor.1.R 2013-04-16 15:23:34 UTC (rev 1435) +++ pkg/quantstrat/demo/luxor.1.R 2013-04-17 11:01:33 UTC (rev 1436) @@ -1,188 +0,0 @@ -#!/usr/bin/Rscript --vanilla -# -# Jan Humme (@opentrades) - August 2012, revised April 2013 -# -# Tested and found to work correctly using blotter r1420 -# -# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) -# -# Paragraph 3.2: luxor without any optimizations - -options(width = 240) -Sys.setenv(TZ="UTC") - -### - -.fast = 10 -.slow = 30 - -.orderqty = 100000 -.threshold = 0.0005 - -##### PLACE DEMO AND TEST DATES HERE ################# -# -#if(isTRUE(options('in_test')$in_test)) -# # use test dates -# {initDate="2011-01-01" -# endDate="2012-12-31" -# } else -# # use demo defaults -# {initDate="1999-12-31" -# endDate=Sys.Date()} - -initDate = '2002-10-21' - -.from='2002-10-21' -#.to='2008-07-04' -.to='2002-10-31' - -#### - -strategy.st = 'luxor' -portfolio.st = 'forex' -account.st = 'IB1' - -### packages -# -# quantstrat package will pull in some other packages: -# FinancialInstrument, quantmod, blotter, xts - -require(quantstrat) - -### FinancialInstrument - -currency(c('GBP', 'USD')) - -exchange_rate('GBPUSD', tick_size=0.0001) - -### quantmod - -getSymbols.FI(Symbols='GBPUSD', - dir=system.file('extdata',package='quantstrat'), - from=.from, to=.to -) - -# ALTERNATIVE WAY TO FETCH SYMBOL DATA -#setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') -#getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) - -### xts - -GBPUSD = to.minutes30(GBPUSD) -GBPUSD = align.time(to.minutes30(GBPUSD), 1800) - -### blotter - -initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') -initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') - -### quantstrat - -initOrders(portfolio.st, initDate=initDate) - -### define strategy - -strategy(strategy.st, store=TRUE) - -### indicators - -add.indicator(strategy.st, name = "SMA", - arguments = list( - x = quote(Cl(mktdata)[,1]), - n = .fast - ), - label="nFast" -) - -add.indicator(strategy.st, name="SMA", - arguments = list( - x = quote(Cl(mktdata)[,1]), - n = .slow - ), - label="nSlow" -) - -### signals - -add.signal(strategy.st, 'sigCrossover', - arguments = list( - columns=c("nFast","nSlow"), - relationship="gte" - ), - label='long' -) - -add.signal(strategy.st, 'sigCrossover', - arguments = list( - columns=c("nFast","nSlow"), - relationship="lt" - ), - label='short' -) - -### rules - -add.rule(strategy.st, 'ruleSignal', - arguments=list(sigcol='long' , sigval=TRUE, - orderside='short', - ordertype='market', - orderqty='all', - replace=TRUE - ), - type='exit', - label='Exit2LONG' -) - -add.rule(strategy.st, 'ruleSignal', - arguments=list(sigcol='short', sigval=TRUE, - orderside='long' , - ordertype='market', - orderqty='all', - replace=TRUE - ), - type='exit', - label='Exit2SHORT') - -add.rule(strategy.st, 'ruleSignal', - arguments=list(sigcol='long' , sigval=TRUE, - orderside='long' , - ordertype='stoplimit', prefer='High', threshold=.threshold, - orderqty=+.orderqty, - replace=FALSE - ), - type='enter', - label='EnterLONG' -) - -add.rule(strategy.st, 'ruleSignal', - arguments=list(sigcol='short', sigval=TRUE, - orderside='short', - ordertype='stoplimit', prefer='Low', threshold=-.threshold, - orderqty=-.orderqty, - replace=FALSE - ), - type='enter', - label='EnterSHORT' -) - -############################################################################### - -applyStrategy(strategy.st, portfolio.st, verbose = FALSE) - -View(getOrderBook(portfolio.st)[[portfolio.st]]$GBPUSD) - -############################################################################### - -updatePortf(portfolio.st, Symbols='GBPUSD', Dates=paste('::',as.Date(Sys.time()),sep='')) - -chart.Posn(portfolio.st, "GBPUSD") - -############################################################################### - -View(tradeStats(portfolio.st, 'GBPUSD')) - -##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### -# book = getOrderBook(port) -# stats = tradeStats(port) -# rets = PortfReturns(acct) -################################################################ Deleted: pkg/quantstrat/demo/luxor.2.R =================================================================== --- pkg/quantstrat/demo/luxor.2.R 2013-04-16 15:23:34 UTC (rev 1435) +++ pkg/quantstrat/demo/luxor.2.R 2013-04-17 11:01:33 UTC (rev 1436) @@ -1,197 +0,0 @@ -#!/usr/bin/Rscript --vanilla -# -# Jan Humme (@opentrades) - August 2012, revised April 2013 -# -# Tested and found to work correctly using blotter r1420 -# -# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) -# -# Paragraph 3.2: luxor with $30 slippage and transaction costs - -options(width = 240) -Sys.setenv(TZ="UTC") - -### - -.fast = 10 -.slow = 30 - -.orderqty = 100000 -.threshold = 0.0005 -.txn.fees = -30 - -##### PLACE DEMO AND TEST DATES HERE ################# -# -#if(isTRUE(options('in_test')$in_test)) -# # use test dates -# {initDate="2011-01-01" -# endDate="2012-12-31" -# } else -# # use demo defaults -# {initDate="1999-12-31" -# endDate=Sys.Date()} - -initDate = '2002-10-21' - -.from='2002-10-21' -#.to='2008-07-04' -.to='2002-10-31' - -#### - -strategy.st = 'luxor' -portfolio.st = 'forex' -account.st = 'IB1' - -### packages -# -# quantstrat package will pull in some other packages: -# FinancialInstrument, quantmod, blotter, xts - -require(quantstrat) - -### FinancialInstrument - -currency(c('GBP', 'USD')) - -exchange_rate('GBPUSD', tick_size=0.0001) - -### quantmod - -getSymbols.FI(Symbols='GBPUSD', - dir=system.file('extdata',package='quantstrat'), - from=.from, to=.to -) - -# ALTERNATIVE WAY TO FETCH SYMBOL DATA -#setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') -#getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) - -### xts - -GBPUSD = to.minutes30(GBPUSD) -GBPUSD = align.time(to.minutes30(GBPUSD), 1800) - -### blotter - -initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') -initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') - -### quantstrat - -initOrders(portfolio.st, initDate=initDate) - -### define strategy - -strategy(strategy.st, store=TRUE) - -### indicators - -add.indicator(strategy.st, name = "SMA", - arguments = list( - x = quote(Cl(mktdata)[,1]), - n = .fast - ), - label="nFast" -) - -add.indicator(strategy.st, name="SMA", - arguments = list( - x = quote(Cl(mktdata)[,1]), - n = .slow - ), - label="nSlow" -) - -### signals - -add.signal(strategy.st, 'sigCrossover', - arguments = list( - columns=c("nFast","nSlow"), - relationship="gte" - ), - label='long' -) - -add.signal(strategy.st, 'sigCrossover', - arguments = list( - columns=c("nFast","nSlow"), - relationship="lt" - ), - label='short' -) - -### rules - -add.rule(strategy.st, 'ruleSignal', - arguments=list(sigcol='long' , sigval=TRUE, - orderside='short', - ordertype='market', - orderqty='all', - TxnFees=.txn.fees, - replace=TRUE - ), - type='exit', - label='Exit2LONG' -) - -add.rule(strategy.st, 'ruleSignal', - arguments=list(sigcol='short', sigval=TRUE, - orderside='long' , - ordertype='market', - orderqty='all', - TxnFees=.txn.fees, - replace=TRUE - ), - type='exit', - label='Exit2SHORT') - -add.rule(strategy.st, 'ruleSignal', - arguments=list(sigcol='long' , sigval=TRUE, - orderside='long' , - ordertype='stoplimit', prefer='High', threshold=.threshold, - orderqty=+.orderqty, - replace=FALSE - ), - type='enter', - label='EnterLONG' -) - -add.rule(strategy.st, 'ruleSignal', - arguments=list(sigcol='short', sigval=TRUE, - orderside='short', - ordertype='stoplimit', prefer='Low', threshold=-.threshold, - orderqty=-.orderqty, - replace=FALSE - ), - type='enter', - label='EnterSHORT' -) - -############################################################################### - -applyStrategy(strategy.st, portfolio.st, verbose = FALSE) - -View(getOrderBook(portfolio.st)[[portfolio.st]]$GBPUSD) - -############################################################################### - -updatePortf(portfolio.st, Symbols='GBPUSD', Dates=paste('::',as.Date(Sys.time()),sep='')) - -chart.Posn(portfolio.st, "GBPUSD") - -############################################################################### - -View(tradeStats(portfolio.st, 'GBPUSD')) - -############################################################################### - -# save the strategy in an .RData object for later retrieval - -save.strategy(strategy.st) - -##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### -# book = getOrderBook(port) -# stats = tradeStats(port) -# rets = PortfReturns(acct) -################################################################ Modified: pkg/quantstrat/demo/luxor.3.Parameters.tradegraphs.R =================================================================== --- pkg/quantstrat/demo/luxor.3.Parameters.tradegraphs.R 2013-04-16 15:23:34 UTC (rev 1435) +++ pkg/quantstrat/demo/luxor.3.Parameters.tradegraphs.R 2013-04-17 11:01:33 UTC (rev 1436) @@ -7,7 +7,6 @@ tradeGraphs ( stats = stats, free.params = c("Param.indicator.1.nFast", "Param.indicator.2.nSlow"), - fixed.params = NULL, statistics = c("Net.Trading.PL", "maxDrawdown", "Avg.Trade.PL", "Num.Trades", "Profit.Factor"), title = 'Luxor SMA Parameter Scan' ) Deleted: pkg/quantstrat/demo/luxor.strategy.R =================================================================== --- pkg/quantstrat/demo/luxor.strategy.R 2013-04-16 15:23:34 UTC (rev 1435) +++ pkg/quantstrat/demo/luxor.strategy.R 2013-04-17 11:01:33 UTC (rev 1436) @@ -1,262 +0,0 @@ -#!/usr/bin/Rscript --vanilla -# -# Jan Humme (@opentrades) - August 2012 -# -# Tested and found to work correctly using blotter r1123 -# -# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) -# - -.fast = 6 -.slow = 44 - -.qty=100000 -.th=0.0005 -.txn=-30 -.timespan = 'T08:00/T12:00' -.timespan = 'T00:00/T23:59' - -.stoploss=0.001 -.stoptrailing=0.0015 -.takeprofit=0.003 - -#### - -require(quantstrat) - -s <- 'luxor' - -strategy(s, store=TRUE) - -### indicators - -add.indicator(s, name = "SMA", - arguments = list( - x = quote(Cl(mktdata)), - n = .fast - ), - label="nFast" -) - -add.indicator(s, name="SMA", - arguments = list( - x = quote(Cl(mktdata)), - n = .slow - ), - label="nSlow" -) - -### signals - -add.signal(s, name = 'sigCrossover', - arguments = list( - columns=c("nFast","nSlow"), - relationship="gte" - ), - label='long' -) - -add.signal(s, name = 'sigCrossover', - arguments = list( - columns=c("nFast","nSlow"), - relationship="lt" - ), - label='short' -) - -### rules ############ - -### stop-loss - -add.rule(s, name = 'ruleSignal', - arguments=list(sigcol='long' , sigval=TRUE, - replace=FALSE, - orderside='long', - ordertype='stoplimit', - tmult=TRUE, - threshold=.stoploss, - TxnFees=.txn, - orderqty='all', - orderset='ocolong' - ), - type='chain', - parent='EnterLONG', - label='StopLossLONG', - storefun=FALSE -) - -add.rule(s, name = 'ruleSignal', - arguments=list(sigcol='short' , sigval=TRUE, - replace=FALSE, - orderside='short', - ordertype='stoplimit', - tmult=TRUE, - threshold=.stoploss, - TxnFees=.txn, - orderqty='all', - orderset='ocoshort' - ), - type='chain', - parent='EnterSHORT', - label='StopLossSHORT', - storefun=FALSE -) - -### stop-trailing - -add.rule(s, name = 'ruleSignal', - arguments=list(sigcol='long' , sigval=TRUE, - replace=FALSE, - orderside='long', - ordertype='stoptrailing', - tmult=TRUE, - threshold=.stoptrailing, - TxnFees=.txn, - orderqty='all', - orderset='ocolong' - ), - type='chain', - parent='EnterLONG', - label='StopTrailingLONG', - storefun=FALSE -) - -add.rule(s, name = 'ruleSignal', - arguments=list(sigcol='short' , sigval=TRUE, - replace=FALSE, - orderside='short', - ordertype='stoptrailing', - tmult=TRUE, - threshold=.stoptrailing, - TxnFees=.txn, - orderqty='all', - orderset='ocoshort' - ), - type='chain', - parent='EnterSHORT', - label='StopTrailingSHORT', - storefun=FALSE -) - -### take-profit - -add.rule(s, name = 'ruleSignal', - arguments=list(sigcol='long' , sigval=TRUE, - replace=FALSE, - orderside='long', - ordertype='limit', - tmult=TRUE, - threshold=.takeprofit, - TxnFees=.txn, - orderqty='all', - orderset='ocolong' - ), - type='chain', - parent='EnterLONG', - label='TakeProfitLONG', - storefun=FALSE -) - -add.rule(s, name = 'ruleSignal', - arguments=list(sigcol='short' , sigval=TRUE, - replace=FALSE, - orderside='short', - ordertype='limit', - tmult=TRUE, - threshold=.takeprofit, - TxnFees=.txn, - orderqty='all', - orderset='ocoshort' - ), - type='chain', - parent='EnterSHORT', - label='TakeProfitSHORT', - storefun=FALSE -) - -### normal exits - -add.rule(s, name = 'ruleSignal', - arguments=list(sigcol='long' , sigval=TRUE, - replace=TRUE, - orderside='short', - ordertype='market', - TxnFees=.txn, - orderqty='all', - orderset='ocoshort' - ), - type='exit', - timespan = .timespan, - label='Exit2LONG', - storefun=FALSE -) - -add.rule(s, name = 'ruleSignal', - arguments=list(sigcol='short', sigval=TRUE, - replace=TRUE, - orderside='long' , - ordertype='market', - TxnFees=.txn, - orderqty='all', - orderset='ocolong' - ), - type='exit', - timespan = .timespan, - label='Exit2SHORT', - storefun=FALSE -) - -### entries - -add.rule(s, name = 'ruleSignal', - arguments=list(sigcol='long' , sigval=TRUE, - replace=FALSE, - orderside='long' , - ordertype='stoplimit', - prefer='High', - threshold=.th, - TxnFees=0, - orderqty=+.qty, - osFUN=osMaxPos, - orderset='ocolong' - ), - type='enter', - timespan = .timespan, - label='EnterLONG', - storefun=FALSE -) - -add.rule(s, name = 'ruleSignal', - arguments=list(sigcol='short', sigval=TRUE, - replace=FALSE, - orderside='short', - ordertype='stoplimit', - prefer='Low', - threshold=.th, - TxnFees=0, - orderqty=-.qty, - osFUN=osMaxPos, - orderset='ocoshort' - ), - type='enter', - timespan = .timespan, - label='EnterSHORT', - storefun=FALSE -) - -### - -save.strategy('luxor') - -##### PLACE THIS BLOCK AHEAD OF DATE INITS IN DEMO SCRIPT ###### -# if(!exists('in_test') || !isTRUE(in_test)){ -# initDate='2005-12-31' # ensure this is demo default -# endDate=Sys.Date() # ensure this is demo default -# } -################################################################ - -##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### -# book = getOrderBook(port) -# stats = tradeStats(port) -# rets = PortfReturns(acct) -################################################################ Copied: pkg/quantstrat/demo/luxor.strategy.R (from rev 1430, pkg/quantstrat/demo/luxor.2.R) =================================================================== --- pkg/quantstrat/demo/luxor.strategy.R (rev 0) +++ pkg/quantstrat/demo/luxor.strategy.R 2013-04-17 11:01:33 UTC (rev 1436) @@ -0,0 +1,198 @@ +#!/usr/bin/Rscript --vanilla +# +# Jan Humme (@opentrades) - August 2012, revised April 2013 +# +# Tested and found to work correctly using blotter r1420 +# +# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) +# +# Paragraph 3.2: luxor with $30 slippage and transaction costs + +options(width = 240) +Sys.setenv(TZ="UTC") + +### + +.fast = 10 +.slow = 30 + +.orderqty = 100000 +.threshold = 0.0005 +.txn.fees = -30 + +##### PLACE DEMO AND TEST DATES HERE ################# +# +#if(isTRUE(options('in_test')$in_test)) +# # use test dates +# {initDate="2011-01-01" +# endDate="2012-12-31" +# } else +# # use demo defaults +# {initDate="1999-12-31" +# endDate=Sys.Date()} + +initDate = '2002-10-21' + +.from='2002-10-21' +#.to='2008-07-04' +.to='2002-10-31' + +#### + +strategy.st = 'luxor' +portfolio.st = 'forex' +account.st = 'IB1' + +### packages +# +# quantstrat package will pull in some other packages: +# FinancialInstrument, quantmod, blotter, xts + +require(quantstrat) + +### FinancialInstrument + +currency(c('GBP', 'USD')) + +exchange_rate('GBPUSD', tick_size=0.0001) + +### quantmod + +getSymbols.FI(Symbols='GBPUSD', + dir=system.file('extdata',package='quantstrat'), + from=.from, to=.to +) + +# ALTERNATIVE WAY TO FETCH SYMBOL DATA +#setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') +#getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) + +### xts + +GBPUSD = to.minutes30(GBPUSD) +GBPUSD = align.time(to.minutes30(GBPUSD), 1800) + +### blotter + +initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') +initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') + +### quantstrat + +initOrders(portfolio.st, initDate=initDate) + +### define strategy + +strategy(strategy.st, store=TRUE) + +### indicators + +add.indicator(strategy.st, name = "SMA", + arguments = list( + x = quote(Cl(mktdata)[,1]), + n = .fast + ), + label="nFast" +) + +add.indicator(strategy.st, name="SMA", + arguments = list( + x = quote(Cl(mktdata)[,1]), + n = .slow + ), + label="nSlow" +) + +### signals + +add.signal(strategy.st, name='sigCrossover', + arguments = list( + columns=c("nFast","nSlow"), + relationship="gte" + ), + label='long' +) + +add.signal(strategy.st, name='sigCrossover', + arguments = list( + columns=c("nFast","nSlow"), + relationship="lt" + ), + label='short' +) + +### rules + +add.rule(strategy.st, name='ruleSignal', + arguments=list(sigcol='long' , sigval=TRUE, + orderside='short', + ordertype='market', + orderqty='all', + TxnFees=.txn.fees, + replace=TRUE + ), + type='exit', + label='Exit2LONG' +) + +add.rule(strategy.st, name='ruleSignal', + arguments=list(sigcol='short', sigval=TRUE, + orderside='long' , + ordertype='market', + orderqty='all', + TxnFees=.txn.fees, + replace=TRUE + ), + type='exit', + label='Exit2SHORT' +) + +add.rule(strategy.st, name='ruleSignal', + arguments=list(sigcol='long' , sigval=TRUE, + orderside='long' , + ordertype='stoplimit', prefer='High', threshold=.threshold, + orderqty=+.orderqty, + replace=FALSE + ), + type='enter', + label='EnterLONG' +) + +add.rule(strategy.st, name='ruleSignal', + arguments=list(sigcol='short', sigval=TRUE, + orderside='short', + ordertype='stoplimit', prefer='Low', threshold=-.threshold, + orderqty=-.orderqty, + replace=FALSE + ), + type='enter', + label='EnterSHORT' +) + +############################################################################### + +applyStrategy(strategy.st, portfolio.st, verbose = FALSE) + +View(getOrderBook(portfolio.st)[[portfolio.st]]$GBPUSD) + +############################################################################### + +updatePortf(portfolio.st, Symbols='GBPUSD', Dates=paste('::',as.Date(Sys.time()),sep='')) + +chart.Posn(portfolio.st, "GBPUSD") + +############################################################################### + +View(tradeStats(portfolio.st, 'GBPUSD')) + +############################################################################### + +# save the strategy in an .RData object for later retrieval + +save.strategy(strategy.st) + +##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### +# book = getOrderBook(port) +# stats = tradeStats(port) +# rets = PortfReturns(acct) +################################################################ From noreply at r-forge.r-project.org Thu Apr 18 22:08:22 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Thu, 18 Apr 2013 22:08:22 +0200 (CEST) Subject: [Blotter-commits] r1437 - pkg/quantstrat/demo Message-ID: <20130418200822.BB856184E8F@r-forge.r-project.org> Author: opentrades Date: 2013-04-18 22:08:22 +0200 (Thu, 18 Apr 2013) New Revision: 1437 Added: pkg/quantstrat/demo/luxor.1.strategy.R pkg/quantstrat/demo/luxor.2.add.paramsets.R Removed: pkg/quantstrat/demo/luxor.strategy.R Modified: pkg/quantstrat/demo/luxor.3.Parameters.R Log: - renamed luxor.strategy.R to luxor.1.strategy.R - introduced luxor.2.add.paramsets.R Copied: pkg/quantstrat/demo/luxor.1.strategy.R (from rev 1436, pkg/quantstrat/demo/luxor.strategy.R) =================================================================== --- pkg/quantstrat/demo/luxor.1.strategy.R (rev 0) +++ pkg/quantstrat/demo/luxor.1.strategy.R 2013-04-18 20:08:22 UTC (rev 1437) @@ -0,0 +1,198 @@ +#!/usr/bin/Rscript --vanilla +# +# Jan Humme (@opentrades) - August 2012, revised April 2013 +# +# Tested and found to work correctly using blotter r1420 +# +# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) +# +# Paragraph 3.2: luxor with $30 slippage and transaction costs + +options(width = 240) +Sys.setenv(TZ="UTC") + +### + +.fast = 10 +.slow = 30 + +.orderqty = 100000 +.threshold = 0.0005 +.txn.fees = -30 + +##### PLACE DEMO AND TEST DATES HERE ################# +# +#if(isTRUE(options('in_test')$in_test)) +# # use test dates +# {initDate="2011-01-01" +# endDate="2012-12-31" +# } else +# # use demo defaults +# {initDate="1999-12-31" +# endDate=Sys.Date()} + +initDate = '2002-10-21' + +.from='2002-10-21' +#.to='2008-07-04' +.to='2002-10-31' + +#### + +strategy.st = 'luxor' +portfolio.st = 'forex' +account.st = 'IB1' + +### packages +# +# quantstrat package will pull in some other packages: +# FinancialInstrument, quantmod, blotter, xts + +require(quantstrat) + +### FinancialInstrument + +currency(c('GBP', 'USD')) + +exchange_rate('GBPUSD', tick_size=0.0001) + +### quantmod + +getSymbols.FI(Symbols='GBPUSD', + dir=system.file('extdata',package='quantstrat'), + from=.from, to=.to +) + +# ALTERNATIVE WAY TO FETCH SYMBOL DATA +#setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') +#getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) + +### xts + +GBPUSD = to.minutes30(GBPUSD) +GBPUSD = align.time(to.minutes30(GBPUSD), 1800) + +### blotter + +initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') +initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') + +### quantstrat + +initOrders(portfolio.st, initDate=initDate) + +### define strategy + +strategy(strategy.st, store=TRUE) + +### indicators + +add.indicator(strategy.st, name = "SMA", + arguments = list( + x = quote(Cl(mktdata)[,1]), + n = .fast + ), + label="nFast" +) + +add.indicator(strategy.st, name="SMA", + arguments = list( + x = quote(Cl(mktdata)[,1]), + n = .slow + ), + label="nSlow" +) + +### signals + +add.signal(strategy.st, name='sigCrossover', + arguments = list( + columns=c("nFast","nSlow"), + relationship="gte" + ), + label='long' +) + +add.signal(strategy.st, name='sigCrossover', + arguments = list( + columns=c("nFast","nSlow"), + relationship="lt" + ), + label='short' +) + +### rules + +add.rule(strategy.st, name='ruleSignal', + arguments=list(sigcol='long' , sigval=TRUE, + orderside='short', + ordertype='market', + orderqty='all', + TxnFees=.txn.fees, + replace=TRUE + ), + type='exit', + label='Exit2LONG' +) + +add.rule(strategy.st, name='ruleSignal', + arguments=list(sigcol='short', sigval=TRUE, + orderside='long' , + ordertype='market', + orderqty='all', + TxnFees=.txn.fees, + replace=TRUE + ), + type='exit', + label='Exit2SHORT' +) + +add.rule(strategy.st, name='ruleSignal', + arguments=list(sigcol='long' , sigval=TRUE, + orderside='long' , + ordertype='stoplimit', prefer='High', threshold=.threshold, + orderqty=+.orderqty, + replace=FALSE + ), + type='enter', + label='EnterLONG' +) + +add.rule(strategy.st, name='ruleSignal', + arguments=list(sigcol='short', sigval=TRUE, + orderside='short', + ordertype='stoplimit', prefer='Low', threshold=-.threshold, + orderqty=-.orderqty, + replace=FALSE + ), + type='enter', + label='EnterSHORT' +) + +############################################################################### + +applyStrategy(strategy.st, portfolio.st) + +View(getOrderBook(portfolio.st)[[portfolio.st]]$GBPUSD) + +############################################################################### + +updatePortf(portfolio.st, Symbols='GBPUSD', Dates=paste('::',as.Date(Sys.time()),sep='')) + +chart.Posn(portfolio.st, "GBPUSD") + +############################################################################### + +View(tradeStats(portfolio.st, 'GBPUSD')) + +############################################################################### + +# save the strategy in an .RData object for later retrieval + +save.strategy(strategy.st) + +##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### +# book = getOrderBook(port) +# stats = tradeStats(port) +# rets = PortfReturns(acct) +################################################################ Added: pkg/quantstrat/demo/luxor.2.add.paramsets.R =================================================================== --- pkg/quantstrat/demo/luxor.2.add.paramsets.R (rev 0) +++ pkg/quantstrat/demo/luxor.2.add.paramsets.R 2013-04-18 20:08:22 UTC (rev 1437) @@ -0,0 +1,147 @@ +#!/usr/bin/Rscript --vanilla +# +# Jan Humme (@opentrades) - August 2012, revised April 2013 +# +# Tested and found to work correctly using blotter r1420 + +require(quantstrat) + +##### PLACE DEMO AND TEST DATES HERE ################# +# +#if(isTRUE(options('in_test')$in_test)) +# # use test dates +# {initDate="2011-01-01" +# endDate="2012-12-31" +# } else +# # use demo defaults +# {initDate="1999-12-31" +# endDate=Sys.Date()} + +### + +.FastSMA = (1:20) +.SlowSMA = (30:80) + +.StopLoss = seq(0.1, 2.0, length.out=20)/100 +.StopTrailing = seq(0.1, 2.0, length.out=20)/100 +.TakeProfit = seq(0.1, 2.0, length.out=20)/100 + +strategy.st <- 'luxor' + +### + +load.strategy(strategy.st) + +### SMA paramset + +add.distribution(strategy.st, + paramset.label = 'SMA', + component.type = 'indicator', + component.label = 'nFast', + variable = list(n = .FastSMA), + label = 'nFAST' +) + +add.distribution(strategy.st, + paramset.label = 'SMA', + component.type = 'indicator', + component.label = 'nSlow', + variable = list(n = .SlowSMA), + label = 'nSLOW' +) + +add.constraint(strategy.st, + paramset.label = 'SMA', + distribution.label.1 = 'nFAST', + distribution.label.2 = 'nSLOW', + operator = '<', + label = 'SMA' +) + +### Stop Loss paramset + +add.distribution(strategy.st, + paramset.label = 'StopLoss', + component.type = 'chain', + component.label = 'StopLossLONG', + variable = list(threshold = .StopLoss), + label = 'StopLossLONG' +) + +add.distribution(strategy.st, + paramset.label = 'StopLoss', + component.type = 'chain', + component.label = 'StopLossSHORT', + variable = list(threshold = .StopLoss), + label = 'StopLossSHORT' +) + +add.constraint(strategy.st, + paramset.label = 'StopLoss', + distribution.label.1 = 'StopLossLONG', + distribution.label.2 = 'StopLossSHORT', + operator = '==', + label = 'StopLoss' +) + +### Stop Trailing paramset + +add.distribution(strategy.st, + paramset.label = 'StopTrailing', + component.type = 'chain', + component.label = 'StopTrailingLONG', + variable = list(threshold = .StopTrailing), + label = 'StopTrailingLONG' +) + +add.distribution(strategy.st, + paramset.label = 'StopTrailing', + component.type = 'chain', + component.label = 'StopTrailingSHORT', + variable = list(threshold = .StopTrailing), + label = 'StopTrailingSHORT' +) + +add.constraint(strategy.st, + paramset.label = 'StopTrailing', + distribution.label.1 = 'StopTrailingLONG', + distribution.label.2 = 'StopTrailingSHORT', + operator = '==', + label = 'StopTrailing' +) + +### Take Profit paramset + +add.distribution(strategy.st, + paramset.label = 'TakeProfit', + component.type = 'chain', + component.label = 'TakeProfitLONG', + variable = list(threshold = .TakeProfit), + label = 'TakeProfitLONG' +) + +add.distribution(strategy.st, + paramset.label = 'TakeProfit', + component.type = 'chain', + component.label = 'TakeProfitSHORT', + variable = list(threshold = .TakeProfit), + label = 'TakeProfitSHORT' +) + +add.constraint(strategy.st, + paramset.label = 'TakeProfit', + distribution.label.1 = 'TakeProfitLONG', + distribution.label.2 = 'TakeProfitSHORT', + operator = '==', + label = 'TakeProfit' +) + +### + +save.strategy(strategy.st) + +##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### +# book = getOrderBook(port) +# stats = tradeStats(port) +# rets = PortfReturns(acct) +################################################################ Property changes on: pkg/quantstrat/demo/luxor.2.add.paramsets.R ___________________________________________________________________ Added: svn:executable + * Modified: pkg/quantstrat/demo/luxor.3.Parameters.R =================================================================== --- pkg/quantstrat/demo/luxor.3.Parameters.R 2013-04-17 11:01:33 UTC (rev 1436) +++ pkg/quantstrat/demo/luxor.3.Parameters.R 2013-04-18 20:08:22 UTC (rev 1437) @@ -25,7 +25,7 @@ ############################################################################### require(foreach,quietly=TRUE) -require(doMC) +#require(doMC) # example parallel initialization for doParallel. this or doMC, or doRedis are # most probably preferable to doSMP #require(doParallel) Deleted: pkg/quantstrat/demo/luxor.strategy.R =================================================================== --- pkg/quantstrat/demo/luxor.strategy.R 2013-04-17 11:01:33 UTC (rev 1436) +++ pkg/quantstrat/demo/luxor.strategy.R 2013-04-18 20:08:22 UTC (rev 1437) @@ -1,198 +0,0 @@ -#!/usr/bin/Rscript --vanilla -# -# Jan Humme (@opentrades) - August 2012, revised April 2013 -# -# Tested and found to work correctly using blotter r1420 -# -# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) -# -# Paragraph 3.2: luxor with $30 slippage and transaction costs - -options(width = 240) -Sys.setenv(TZ="UTC") - -### - -.fast = 10 -.slow = 30 - -.orderqty = 100000 -.threshold = 0.0005 -.txn.fees = -30 - -##### PLACE DEMO AND TEST DATES HERE ################# -# -#if(isTRUE(options('in_test')$in_test)) -# # use test dates -# {initDate="2011-01-01" -# endDate="2012-12-31" -# } else -# # use demo defaults -# {initDate="1999-12-31" -# endDate=Sys.Date()} - -initDate = '2002-10-21' - -.from='2002-10-21' -#.to='2008-07-04' -.to='2002-10-31' - -#### - -strategy.st = 'luxor' -portfolio.st = 'forex' -account.st = 'IB1' - -### packages -# -# quantstrat package will pull in some other packages: -# FinancialInstrument, quantmod, blotter, xts - -require(quantstrat) - -### FinancialInstrument - -currency(c('GBP', 'USD')) - -exchange_rate('GBPUSD', tick_size=0.0001) - -### quantmod - -getSymbols.FI(Symbols='GBPUSD', - dir=system.file('extdata',package='quantstrat'), - from=.from, to=.to -) - -# ALTERNATIVE WAY TO FETCH SYMBOL DATA -#setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') -#getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) - -### xts - -GBPUSD = to.minutes30(GBPUSD) -GBPUSD = align.time(to.minutes30(GBPUSD), 1800) - -### blotter - -initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') -initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') - -### quantstrat - -initOrders(portfolio.st, initDate=initDate) - -### define strategy - -strategy(strategy.st, store=TRUE) - -### indicators - -add.indicator(strategy.st, name = "SMA", - arguments = list( - x = quote(Cl(mktdata)[,1]), - n = .fast - ), - label="nFast" -) - -add.indicator(strategy.st, name="SMA", - arguments = list( - x = quote(Cl(mktdata)[,1]), - n = .slow - ), - label="nSlow" -) - -### signals - -add.signal(strategy.st, name='sigCrossover', - arguments = list( - columns=c("nFast","nSlow"), - relationship="gte" - ), - label='long' -) - -add.signal(strategy.st, name='sigCrossover', - arguments = list( - columns=c("nFast","nSlow"), - relationship="lt" - ), - label='short' -) - -### rules - -add.rule(strategy.st, name='ruleSignal', - arguments=list(sigcol='long' , sigval=TRUE, - orderside='short', - ordertype='market', - orderqty='all', - TxnFees=.txn.fees, - replace=TRUE - ), - type='exit', - label='Exit2LONG' -) - -add.rule(strategy.st, name='ruleSignal', - arguments=list(sigcol='short', sigval=TRUE, - orderside='long' , - ordertype='market', - orderqty='all', - TxnFees=.txn.fees, - replace=TRUE - ), - type='exit', - label='Exit2SHORT' -) - -add.rule(strategy.st, name='ruleSignal', - arguments=list(sigcol='long' , sigval=TRUE, - orderside='long' , - ordertype='stoplimit', prefer='High', threshold=.threshold, - orderqty=+.orderqty, - replace=FALSE - ), - type='enter', - label='EnterLONG' -) - -add.rule(strategy.st, name='ruleSignal', - arguments=list(sigcol='short', sigval=TRUE, - orderside='short', - ordertype='stoplimit', prefer='Low', threshold=-.threshold, - orderqty=-.orderqty, - replace=FALSE - ), - type='enter', - label='EnterSHORT' -) - -############################################################################### - -applyStrategy(strategy.st, portfolio.st, verbose = FALSE) - -View(getOrderBook(portfolio.st)[[portfolio.st]]$GBPUSD) - -############################################################################### - -updatePortf(portfolio.st, Symbols='GBPUSD', Dates=paste('::',as.Date(Sys.time()),sep='')) - -chart.Posn(portfolio.st, "GBPUSD") - -############################################################################### - -View(tradeStats(portfolio.st, 'GBPUSD')) - -############################################################################### - -# save the strategy in an .RData object for later retrieval - -save.strategy(strategy.st) - -##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### -# book = getOrderBook(port) -# stats = tradeStats(port) -# rets = PortfReturns(acct) -################################################################ From noreply at r-forge.r-project.org Thu Apr 18 22:26:38 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Thu, 18 Apr 2013 22:26:38 +0200 (CEST) Subject: [Blotter-commits] r1438 - pkg/quantstrat/demo Message-ID: <20130418202638.D0AA71847B8@r-forge.r-project.org> Author: opentrades Date: 2013-04-18 22:26:38 +0200 (Thu, 18 Apr 2013) New Revision: 1438 Added: pkg/quantstrat/demo/luxor.3.optimize.sma.R pkg/quantstrat/demo/luxor.symbols.R Removed: pkg/quantstrat/demo/luxor.3.Parameters.R pkg/quantstrat/demo/luxor.3.R Modified: pkg/quantstrat/demo/luxor.1.strategy.R Log: - added luxor.3.optimize.sma.R to apply.paramset() on SMA, using new apply.paramset() instead of old applyParameters() - removed old luxor.3.Parameters.R and luxor.3.R - introduced luxor.symbols.R to fetch symbol data - adjusted luxor.1.strategy.R and luxor.3.optimize.sma.R accordingly Modified: pkg/quantstrat/demo/luxor.1.strategy.R =================================================================== --- pkg/quantstrat/demo/luxor.1.strategy.R 2013-04-18 20:08:22 UTC (rev 1437) +++ pkg/quantstrat/demo/luxor.1.strategy.R 2013-04-18 20:26:38 UTC (rev 1438) @@ -33,45 +33,14 @@ initDate = '2002-10-21' -.from='2002-10-21' -#.to='2008-07-04' -.to='2002-10-31' - #### strategy.st = 'luxor' portfolio.st = 'forex' account.st = 'IB1' -### packages -# -# quantstrat package will pull in some other packages: -# FinancialInstrument, quantmod, blotter, xts +source('luxor.symbols.R') -require(quantstrat) - -### FinancialInstrument - -currency(c('GBP', 'USD')) - -exchange_rate('GBPUSD', tick_size=0.0001) - -### quantmod - -getSymbols.FI(Symbols='GBPUSD', - dir=system.file('extdata',package='quantstrat'), - from=.from, to=.to -) - -# ALTERNATIVE WAY TO FETCH SYMBOL DATA -#setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') -#getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) - -### xts - -GBPUSD = to.minutes30(GBPUSD) -GBPUSD = align.time(to.minutes30(GBPUSD), 1800) - ### blotter initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') Deleted: pkg/quantstrat/demo/luxor.3.Parameters.R =================================================================== --- pkg/quantstrat/demo/luxor.3.Parameters.R 2013-04-18 20:08:22 UTC (rev 1437) +++ pkg/quantstrat/demo/luxor.3.Parameters.R 2013-04-18 20:26:38 UTC (rev 1438) @@ -1,104 +0,0 @@ -#!/usr/bin/Rscript --vanilla -# -# Jan Humme (@opentrades) - August 2012 -# -# Tested and found to work correctly using blotter r1123 -# -# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) -# -# Paragraph 3.3 Variation of the input parameters: optimisation and stability diagrams -# uses luxor.3.R - -#verbose = 0 -verbose = 1 - -method='expand' -#method='random' -#.sampleSize=8 - -#.fastRange=(1:20) -#.slowRange=(21:80) - -.fastRange=(41:45) -.slowRange=(41:45) - -############################################################################### - -require(foreach,quietly=TRUE) -#require(doMC) -# example parallel initialization for doParallel. this or doMC, or doRedis are -# most probably preferable to doSMP -#require(doParallel) -#registerDoParallel() # by default number of physical cores -1 - -require(quantstrat) - -portfolio.st = 'forex' - -source('luxor.3.R') - -s<-getStrategy('luxor') - -#parameterTable<-getParameterTable(s) -#parameterTable -#stop() - -tPD2<-setParameterDistribution(strategy=s, component.type='indicator', component.label='nFast', distribution = list(nFast = .fastRange), label = 'nFast') -tPD2<-setParameterDistribution(tPD2, strategy=s, component.type='indicator', component.label='nSlow', distribution = list(nSlow = .slowRange), label = 'nSlow') - -pConstraint2<-setParameterConstraint(constraintLabel='luxorPC',paramList=c('nFast','nSlow'),relationship='lt') - -registerDoMC(cores=2) - -if(method == 'random') -{ - laststpar.rnd<-system.time( - scan.results<-applyParameter( - strategy=s, - portfolios=portfolio.st, - parameterPool=tPD2, - method='random', - sampleSize=.sampleSize, - parameterConstraints=pConstraint2 - ) - ) - if(verbose >=1) laststpar.rnd -} - -if(method == 'expand') -{ - laststpar.exp<-system.time( - scan.results<-applyParameter( - strategy=s, - portfolios=portfolio.st, - parameterPool=tPD2, - method='expand', - parameterConstraints=pConstraint2 - ) - ) - if(verbose >=1) print(laststpar.exp) -} - -#examine the stats from this parameter run: -if(verbose >=1) print(scan.results$statsTable) - -stats <- scan.results$statsTable -save(stats, file="luxor.parameters.RData") - - -##### PLACE DEMO AND TEST DATES HERE ################# -# -#if(isTRUE(options('in_test')$in_test)) -# # use test dates -# {initDate="2011-01-01" -# endDate="2012-12-31" -# } else -# # use demo defaults -# {initDate="1999-12-31" -# endDate=Sys.Date()} - -##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### -# book = getOrderBook(port) -# stats = tradeStats(port) -# rets = PortfReturns(acct) -################################################################ Deleted: pkg/quantstrat/demo/luxor.3.R =================================================================== --- pkg/quantstrat/demo/luxor.3.R 2013-04-18 20:08:22 UTC (rev 1437) +++ pkg/quantstrat/demo/luxor.3.R 2013-04-18 20:26:38 UTC (rev 1438) @@ -1,195 +0,0 @@ -#!/usr/bin/Rscript --vanilla -# -# Jan Humme (@opentrades) - August 2012 -# -# Tested and found to work correctly using blotter r1123 -# -# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) -# -# Paragraph 3.3 Variation of the input parameters: optimisation and stability diagrams - -options(width = 240) -#Sys.setenv(TZ="GMT") - -.fast = 1 -.slow = 44 - -.qty=100000 -.th=0.0005 -.txn=-30 - -##### PLACE DEMO AND TEST DATES HERE ################# -# -#if(isTRUE(options('in_test')$in_test)) -# # use test dates -# {initDate="2011-01-01" -# endDate="2012-12-31" -# } else -# # use demo defaults -# {initDate="1999-12-31" -# endDate=Sys.Date()} - -initDate = '2002-10-21' -.from='2002-10-21' -#.to='2008-07-04' -#.to='2003-12-31' -.to='2002-10-31' -#.to='2002-12-31' - -#### - -s = 'luxor' -p = 'forex' -a = 'IB1' - -### - -require(quantstrat) - -currency(c('GBP', 'USD')) - -exchange_rate(c('GBPUSD'), tick_size=0.0001) - -setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') - -### - -getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) -GBPUSD = to.minutes30(GBPUSD) -GBPUSD = align.time(to.minutes30(GBPUSD), 1800) - -### - -initPortf(p, symbols='GBPUSD', initDate=initDate, currency='USD') -initAcct(a, portfolios=p, initDate=initDate, currency='USD') - -### - -initOrders(p, initDate=initDate) - -### strategy ###################################################################### - -strategy(s, store=TRUE) - -### indicators - -add.indicator(s, name = "SMA", - arguments = list( - x = quote(Cl(mktdata)), - n = .fast - ), - label="nFast" -) - -add.indicator(s, name="SMA", - arguments = list( - x = quote(Cl(mktdata)), - n = .slow - ), - label="nSlow" -) - -### signals - -add.signal(s, 'sigCrossover', - arguments = list( - columns=c("nFast","nSlow"), - relationship="gte" - ), - label='long' -) - -add.signal(s, 'sigCrossover', - arguments = list( - columns=c("nFast","nSlow"), - relationship="lt" - ), - label='short' -) - -### rules - -add.rule(s, 'ruleSignal', - arguments=list(sigcol='long' , sigval=TRUE, - replace=TRUE, - orderside='short', - ordertype='market', - TxnFees=.txn, - orderqty='all', - orderset='ocoshort' - ), - type='exit', - label='Exit2LONG' -) - -add.rule(s, 'ruleSignal', - arguments=list(sigcol='short', sigval=TRUE, - replace=TRUE, - orderside='long' , - ordertype='market', - TxnFees=.txn, - orderqty='all', - orderset='ocolong' - ), - type='exit', - label='Exit2SHORT') - -add.rule(s, 'ruleSignal', - arguments=list(sigcol='long' , sigval=TRUE, - replace=FALSE, - orderside='long' , - ordertype='stoplimit', - prefer='High', - threshold=.th, - TxnFees=0, - orderqty=+.qty, - orderset='ocolong' - ), - type='enter', - label='EnterLONG' -) - -add.rule(s, 'ruleSignal', - arguments=list(sigcol='short', sigval=TRUE, - replace=FALSE, - orderside='short', - ordertype='stoplimit', - prefer='Low', - threshold=-.th, - TxnFees=0, - orderqty=-.qty, - orderset='ocoshort' - ), - type='enter', - label='EnterSHORT' -) - -# - -############################################################################### - -applyStrategy(s, p, verbose = FALSE) -#applyStrategy(s, p, prefer='Open', verbose = FALSE) - -updatePortf(p, Symbols='GBPUSD', ,Dates=paste('::',as.Date(Sys.time()),sep='')) - -############################################################################### - -chart.Posn(p, "GBPUSD") -add_SMA(n=.slow,col='darkblue',on=1) -add_SMA(n=.fast,col='lightblue',on=1) - -View(getOrderBook(p)$forex$GBPUSD) - -#txns <- getTxns(p, 'GBPUSD') -#txns -###txns$Net -#cat('Net profit:', sum(txns$Net.Txn.Realized.PL), '\n') - -View(tradeStats(p, 'GBPUSD')) - -##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### -# book = getOrderBook(port) -# stats = tradeStats(port) -# rets = PortfReturns(acct) -################################################################ Added: pkg/quantstrat/demo/luxor.3.optimize.sma.R =================================================================== --- pkg/quantstrat/demo/luxor.3.optimize.sma.R (rev 0) +++ pkg/quantstrat/demo/luxor.3.optimize.sma.R 2013-04-18 20:26:38 UTC (rev 1438) @@ -0,0 +1,56 @@ +#!/usr/bin/Rscript --vanilla +# +# Jan Humme (@opentrades) - August 2012, revised April 2013 +# +# Tested and found to work correctly using blotter r1420 +# +# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) +# +# Paragraph 3.2: luxor with $30 slippage and transaction costs + +options(width = 240) +Sys.setenv(TZ='UTC') + +.nsamples=80 + +### + +initDate = '2002-10-21' + +#### + +strategy.st = 'luxor' +portfolio.st = 'forex' +account.st = 'IB1' + +source('luxor.symbols.R') + +### blotter + +initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') +initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') + +### quantstrat + +initOrders(portfolio.st, initDate=initDate) + +load.strategy(strategy.st) + +### doMC + +require(doMC) + +registerDoMC(cores=8) + +### apply.paramset() + +results <- apply.paramset(strategy.st, paramset.label='SMA', portfolio.st=portfolio.st, account.st=account.st, nsamples=.nsamples, verbose=TRUE) + +### + +stats <- results$tradeStats + +save(stats, file='luxor.3.optimize.sma.RData') + +print(results$tradeStats) + Property changes on: pkg/quantstrat/demo/luxor.3.optimize.sma.R ___________________________________________________________________ Added: svn:executable + * Added: pkg/quantstrat/demo/luxor.symbols.R =================================================================== --- pkg/quantstrat/demo/luxor.symbols.R (rev 0) +++ pkg/quantstrat/demo/luxor.symbols.R 2013-04-18 20:26:38 UTC (rev 1438) @@ -0,0 +1,45 @@ +#!/usr/bin/Rscript --vanilla +# +# Jan Humme (@opentrades) - August 2012, revised April 2013 +# +# Tested and found to work correctly using blotter r1420 +# +# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) +# +# Paragraph 3.2: luxor with $30 slippage and transaction costs + +Sys.setenv(TZ="UTC") + +.from='2002-10-21' +#.to='2008-07-04' +.to='2002-10-31' + +### packages +# +# quantstrat package will pull in some other packages: +# FinancialInstrument, quantmod, blotter, xts + +require(quantstrat) + +### FinancialInstrument + +currency(c('GBP', 'USD')) + +exchange_rate('GBPUSD', tick_size=0.0001) + +### quantmod + +getSymbols.FI(Symbols='GBPUSD', + dir=system.file('extdata',package='quantstrat'), + from=.from, to=.to +) + +# ALTERNATIVE WAY TO FETCH SYMBOL DATA +#setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') +#getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) + +### xts + +GBPUSD = to.minutes30(GBPUSD) +GBPUSD = align.time(to.minutes30(GBPUSD), 1800) + From noreply at r-forge.r-project.org Thu Apr 18 22:34:28 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Thu, 18 Apr 2013 22:34:28 +0200 (CEST) Subject: [Blotter-commits] r1439 - pkg/quantstrat/demo Message-ID: <20130418203428.2AE021847B8@r-forge.r-project.org> Author: opentrades Date: 2013-04-18 22:34:27 +0200 (Thu, 18 Apr 2013) New Revision: 1439 Added: pkg/quantstrat/demo/luxor.3.sma.optimize.R pkg/quantstrat/demo/luxor.3.sma.tradegraphs.R Removed: pkg/quantstrat/demo/luxor.3.Parameters.tradegraphs.R pkg/quantstrat/demo/luxor.3.optimize.sma.R pkg/quantstrat/demo/luxor.4.R Log: - adjusted more luxor demo code Deleted: pkg/quantstrat/demo/luxor.3.Parameters.tradegraphs.R =================================================================== --- pkg/quantstrat/demo/luxor.3.Parameters.tradegraphs.R 2013-04-18 20:26:38 UTC (rev 1438) +++ pkg/quantstrat/demo/luxor.3.Parameters.tradegraphs.R 2013-04-18 20:34:27 UTC (rev 1439) @@ -1,29 +0,0 @@ -#!/usr/bin/Rscript --vanilla - -require(quantstrat) - -load('../data/luxor.parameters.1-10.30-55.RData') - -tradeGraphs ( - stats = stats, - free.params = c("Param.indicator.1.nFast", "Param.indicator.2.nSlow"), - statistics = c("Net.Trading.PL", "maxDrawdown", "Avg.Trade.PL", "Num.Trades", "Profit.Factor"), - title = 'Luxor SMA Parameter Scan' -) - -##### PLACE DEMO AND TEST DATES HERE ################# -# -#if(isTRUE(options('in_test')$in_test)) -# # use test dates -# {initDate="2011-01-01" -# endDate="2012-12-31" -# } else -# # use demo defaults -# {initDate="1999-12-31" -# endDate=Sys.Date()} - -##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### -# book = getOrderBook(port) -# stats = tradeStats(port) -# rets = PortfReturns(acct) -################################################################ Deleted: pkg/quantstrat/demo/luxor.3.optimize.sma.R =================================================================== --- pkg/quantstrat/demo/luxor.3.optimize.sma.R 2013-04-18 20:26:38 UTC (rev 1438) +++ pkg/quantstrat/demo/luxor.3.optimize.sma.R 2013-04-18 20:34:27 UTC (rev 1439) @@ -1,56 +0,0 @@ -#!/usr/bin/Rscript --vanilla -# -# Jan Humme (@opentrades) - August 2012, revised April 2013 -# -# Tested and found to work correctly using blotter r1420 -# -# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) -# -# Paragraph 3.2: luxor with $30 slippage and transaction costs - -options(width = 240) -Sys.setenv(TZ='UTC') - -.nsamples=80 - -### - -initDate = '2002-10-21' - -#### - -strategy.st = 'luxor' -portfolio.st = 'forex' -account.st = 'IB1' - -source('luxor.symbols.R') - -### blotter - -initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') -initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') - -### quantstrat - -initOrders(portfolio.st, initDate=initDate) - -load.strategy(strategy.st) - -### doMC - -require(doMC) - -registerDoMC(cores=8) - -### apply.paramset() - -results <- apply.paramset(strategy.st, paramset.label='SMA', portfolio.st=portfolio.st, account.st=account.st, nsamples=.nsamples, verbose=TRUE) - -### - -stats <- results$tradeStats - -save(stats, file='luxor.3.optimize.sma.RData') - -print(results$tradeStats) - Copied: pkg/quantstrat/demo/luxor.3.sma.optimize.R (from rev 1438, pkg/quantstrat/demo/luxor.3.optimize.sma.R) =================================================================== --- pkg/quantstrat/demo/luxor.3.sma.optimize.R (rev 0) +++ pkg/quantstrat/demo/luxor.3.sma.optimize.R 2013-04-18 20:34:27 UTC (rev 1439) @@ -0,0 +1,56 @@ +#!/usr/bin/Rscript --vanilla +# +# Jan Humme (@opentrades) - August 2012, revised April 2013 +# +# Tested and found to work correctly using blotter r1420 +# +# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) +# +# Paragraph 3.2: luxor with $30 slippage and transaction costs + +options(width = 240) +Sys.setenv(TZ='UTC') + +.nsamples=80 + +### + +initDate = '2002-10-21' + +#### + +strategy.st = 'luxor' +portfolio.st = 'forex' +account.st = 'IB1' + +source('luxor.symbols.R') + +### blotter + +initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') +initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') + +### quantstrat + +initOrders(portfolio.st, initDate=initDate) + +load.strategy(strategy.st) + +### doMC + +require(doMC) + +registerDoMC(cores=8) + +### apply.paramset() + +results <- apply.paramset(strategy.st, paramset.label='SMA', portfolio.st=portfolio.st, account.st=account.st, nsamples=.nsamples, verbose=TRUE) + +### + +stats <- results$tradeStats + +save(stats, file='luxor.3.optimize.sma.RData') + +print(results$tradeStats) + Copied: pkg/quantstrat/demo/luxor.3.sma.tradegraphs.R (from rev 1436, pkg/quantstrat/demo/luxor.3.Parameters.tradegraphs.R) =================================================================== --- pkg/quantstrat/demo/luxor.3.sma.tradegraphs.R (rev 0) +++ pkg/quantstrat/demo/luxor.3.sma.tradegraphs.R 2013-04-18 20:34:27 UTC (rev 1439) @@ -0,0 +1,39 @@ +#!/usr/bin/Rscript --vanilla +# +# Jan Humme (@opentrades) - August 2012, revised April 2013 +# +# Tested and found to work correctly using blotter r1420 +# +# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) + +require(quantstrat) + +### load 'stats' back into .GlobalEnv + +load('../data/luxor.parameters.1-10.30-55.RData') + +### show trade graphs from stats + +tradeGraphs ( + stats = stats, + free.params = c("Param.indicator.1.nFast", "Param.indicator.2.nSlow"), + statistics = c("Net.Trading.PL", "maxDrawdown", "Avg.Trade.PL", "Num.Trades", "Profit.Factor"), + title = 'Luxor SMA Parameter Scan' +) + +##### PLACE DEMO AND TEST DATES HERE ################# +# +#if(isTRUE(options('in_test')$in_test)) +# # use test dates +# {initDate="2011-01-01" +# endDate="2012-12-31" +# } else +# # use demo defaults +# {initDate="1999-12-31" +# endDate=Sys.Date()} + +##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### +# book = getOrderBook(port) +# stats = tradeStats(port) +# rets = PortfReturns(acct) +################################################################ Deleted: pkg/quantstrat/demo/luxor.4.R =================================================================== --- pkg/quantstrat/demo/luxor.4.R 2013-04-18 20:26:38 UTC (rev 1438) +++ pkg/quantstrat/demo/luxor.4.R 2013-04-18 20:34:27 UTC (rev 1439) @@ -1,210 +0,0 @@ -#!/usr/bin/Rscript --vanilla -# -# Jan Humme (@opentrades) - August 2012 -# -# Tested and found to work correctly using blotter r1123 -# -# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) -# -# Paragraph 3.4: inserting an intraday time filter - -options(width = 240) -#Sys.setenv(TZ="GMT") - -.fast = 1 -.slow = 44 - -.qty=100000 -.th=0.0005 -.txn=-30 -.timespan = 'T08:00/T12:00' - -##### PLACE DEMO AND TEST DATES HERE ################# -# -#if(isTRUE(options('in_test')$in_test)) -# # use test dates -# {initDate="2011-01-01" -# endDate="2012-12-31" -# } else -# # use demo defaults -# {initDate="1999-12-31" -# endDate=Sys.Date()} - -initDate = '2002-10-21' -.from='2002-10-21' -#.to='2008-07-04' -#.to='2003-12-31' -.to='2002-10-31' -#.to='2002-12-31' -#.from='2006-01-01' -#.to='2006-12-31' -#.from='2007-01-01' -#.to='2007-12-31' - -#### - -s = 'luxor' -p = 'forex' -a = 'IB1' - -### - -require(quantstrat) - -currency(c('GBP', 'USD')) - -exchange_rate(c('GBPUSD'), tick_size=0.0001) - -setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') - -### - -getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) -GBPUSD = to.minutes30(GBPUSD) -GBPUSD = align.time(to.minutes30(GBPUSD), 1800) - -### - -initPortf(p, symbols='GBPUSD', initDate=initDate, currency='USD') -initAcct(a, portfolios=p, initDate=initDate, currency='USD') - -### - -initOrders(p, initDate=initDate) - -### strategy ###################################################################### - -addPosLimit( - portfolio=p, - symbol='GBPUSD', - timestamp=initDate, - maxpos=.qty) - -strategy(s, store=TRUE) - -### indicators - -add.indicator(s, name = "SMA", - arguments = list( - x = quote(Cl(mktdata)), - n = .fast - ), - label="nFast" -) - -add.indicator(s, name="SMA", - arguments = list( - x = quote(Cl(mktdata)), - n = .slow - ), - label="nSlow" -) - -### signals - -add.signal(s, name = 'sigCrossover', - arguments = list( - columns=c("nFast","nSlow"), - relationship="gte" - ), - label='long' -) - -add.signal(s, name = 'sigCrossover', - arguments = list( - columns=c("nFast","nSlow"), - relationship="lt" - ), - label='short' -) - -### rules - -add.rule(s, name = 'ruleSignal', - arguments=list(sigcol='long' , sigval=TRUE, - replace=TRUE, - orderside='short', - ordertype='market', - TxnFees=.txn, - orderqty='all', - orderset='ocoshort' - ), - type='exit', - timespan = .timespan, - label='Exit2LONG' -) - -add.rule(s, name = 'ruleSignal', - arguments=list(sigcol='short', sigval=TRUE, - replace=TRUE, - orderside='long' , - ordertype='market', - TxnFees=.txn, - orderqty='all', - orderset='ocolong' - ), - type='exit', - timespan = .timespan, - label='Exit2SHORT') - -add.rule(s, name = 'ruleSignal', - arguments=list(sigcol='long' , sigval=TRUE, - replace=FALSE, - orderside='long' , - ordertype='stoplimit', - prefer='High', - threshold=.th, - TxnFees=0, - orderqty=+.qty, - osFUN=osMaxPos, - orderset='ocolong' - ), - type='enter', - timespan = .timespan, - label='EnterLONG' -) - -add.rule(s, name = 'ruleSignal', - arguments=list(sigcol='short', sigval=TRUE, - replace=FALSE, - orderside='short', - ordertype='stoplimit', - prefer='Low', - threshold=-.th, - TxnFees=0, - orderqty=-.qty, - osFUN=osMaxPos, - orderset='ocoshort' - ), - type='enter', - timespan = .timespan, - label='EnterSHORT' -) - -# - -############################################################################### - -applyStrategy(s, p, verbose = FALSE) -#applyStrategy(s, p, prefer='Open', verbose = FALSE) - -updatePortf(p, Symbols='GBPUSD', ,Dates=paste('::',as.Date(Sys.time()),sep='')) - -############################################################################### - -chart.Posn(p, "GBPUSD") - -print(getOrderBook(p)) - -#txns <- getTxns(p, 'GBPUSD') -#txns -##txns$Net -#cat('Net profit:', sum(txns$Net.Txn.Realized.PL), '\n') - -print(tradeStats(p, 'GBPUSD')) - -##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### -# book = getOrderBook(port) -# stats = tradeStats(port) -# rets = PortfReturns(acct) -################################################################ From noreply at r-forge.r-project.org Thu Apr 18 23:01:16 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Thu, 18 Apr 2013 23:01:16 +0200 (CEST) Subject: [Blotter-commits] r1440 - pkg/quantstrat/demo Message-ID: <20130418210116.93E51184836@r-forge.r-project.org> Author: opentrades Date: 2013-04-18 23:01:16 +0200 (Thu, 18 Apr 2013) New Revision: 1440 Added: pkg/quantstrat/demo/luxor.3.paramset.sma.R pkg/quantstrat/demo/luxor.3.tradegraphs.sma.R pkg/quantstrat/demo/luxor.5.orderchains.R pkg/quantstrat/demo/luxor.6.paramset.stoploss.R pkg/quantstrat/demo/luxor.6.paramset.stoptrailing.R pkg/quantstrat/demo/luxor.6.paramset.takeprofit.R Removed: pkg/quantstrat/demo/luxor.3.sma.optimize.R pkg/quantstrat/demo/luxor.3.sma.tradegraphs.R pkg/quantstrat/demo/luxor.StopLoss.R pkg/quantstrat/demo/luxor.StopTrailing.R pkg/quantstrat/demo/luxor.TakeProfit.R pkg/quantstrat/demo/luxor.exits.R pkg/quantstrat/demo/luxor.orderchains.R Log: - more luxor demo reorganizing Copied: pkg/quantstrat/demo/luxor.3.paramset.sma.R (from rev 1439, pkg/quantstrat/demo/luxor.3.sma.optimize.R) =================================================================== --- pkg/quantstrat/demo/luxor.3.paramset.sma.R (rev 0) +++ pkg/quantstrat/demo/luxor.3.paramset.sma.R 2013-04-18 21:01:16 UTC (rev 1440) @@ -0,0 +1,59 @@ +#!/usr/bin/Rscript --vanilla +# +# Jan Humme (@opentrades) - August 2012, revised April 2013 +# +# Tested and found to work correctly using blotter r1420 +# +# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) +# +# Paragraph 3.2: luxor with $30 slippage and transaction costs + +options(width = 240) +Sys.setenv(TZ='UTC') + +.nsamples=80 + +### + +initDate = '2002-10-21' + +#### + +strategy.st = 'luxor' +portfolio.st = 'forex' +account.st = 'IB1' + +source('luxor.symbols.R') + +### blotter + +initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') +initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') + +### quantstrat + +initOrders(portfolio.st, initDate=initDate) + +load.strategy(strategy.st) + +### doMC + +require(doMC) +registerDoMC(cores=8) + +#require(doParallel) +#registerDoParallel(cores=2) + +#require(doRedis) +#registerDoRedis('jobs') + +results <- apply.paramset(strategy.st, paramset.label='SMA', portfolio.st=portfolio.st, account.st=account.st, nsamples=.nsamples, verbose=TRUE) + +### + +stats <- results$tradeStats + +save(stats, file='luxor.3.optimize.sma.RData') + +print(results$tradeStats) + Deleted: pkg/quantstrat/demo/luxor.3.sma.optimize.R =================================================================== --- pkg/quantstrat/demo/luxor.3.sma.optimize.R 2013-04-18 20:34:27 UTC (rev 1439) +++ pkg/quantstrat/demo/luxor.3.sma.optimize.R 2013-04-18 21:01:16 UTC (rev 1440) @@ -1,56 +0,0 @@ -#!/usr/bin/Rscript --vanilla -# -# Jan Humme (@opentrades) - August 2012, revised April 2013 -# -# Tested and found to work correctly using blotter r1420 -# -# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) -# -# Paragraph 3.2: luxor with $30 slippage and transaction costs - -options(width = 240) -Sys.setenv(TZ='UTC') - -.nsamples=80 - -### - -initDate = '2002-10-21' - -#### - -strategy.st = 'luxor' -portfolio.st = 'forex' -account.st = 'IB1' - -source('luxor.symbols.R') - -### blotter - -initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') -initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') - -### quantstrat - -initOrders(portfolio.st, initDate=initDate) - -load.strategy(strategy.st) - -### doMC - -require(doMC) - -registerDoMC(cores=8) - -### apply.paramset() - -results <- apply.paramset(strategy.st, paramset.label='SMA', portfolio.st=portfolio.st, account.st=account.st, nsamples=.nsamples, verbose=TRUE) - -### - -stats <- results$tradeStats - -save(stats, file='luxor.3.optimize.sma.RData') - -print(results$tradeStats) - Deleted: pkg/quantstrat/demo/luxor.3.sma.tradegraphs.R =================================================================== --- pkg/quantstrat/demo/luxor.3.sma.tradegraphs.R 2013-04-18 20:34:27 UTC (rev 1439) +++ pkg/quantstrat/demo/luxor.3.sma.tradegraphs.R 2013-04-18 21:01:16 UTC (rev 1440) @@ -1,39 +0,0 @@ -#!/usr/bin/Rscript --vanilla -# -# Jan Humme (@opentrades) - August 2012, revised April 2013 -# -# Tested and found to work correctly using blotter r1420 -# -# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) - -require(quantstrat) - -### load 'stats' back into .GlobalEnv - -load('../data/luxor.parameters.1-10.30-55.RData') - -### show trade graphs from stats - -tradeGraphs ( - stats = stats, - free.params = c("Param.indicator.1.nFast", "Param.indicator.2.nSlow"), - statistics = c("Net.Trading.PL", "maxDrawdown", "Avg.Trade.PL", "Num.Trades", "Profit.Factor"), - title = 'Luxor SMA Parameter Scan' -) - -##### PLACE DEMO AND TEST DATES HERE ################# -# -#if(isTRUE(options('in_test')$in_test)) -# # use test dates -# {initDate="2011-01-01" -# endDate="2012-12-31" -# } else -# # use demo defaults -# {initDate="1999-12-31" -# endDate=Sys.Date()} - -##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### -# book = getOrderBook(port) -# stats = tradeStats(port) -# rets = PortfReturns(acct) -################################################################ Copied: pkg/quantstrat/demo/luxor.3.tradegraphs.sma.R (from rev 1439, pkg/quantstrat/demo/luxor.3.sma.tradegraphs.R) =================================================================== --- pkg/quantstrat/demo/luxor.3.tradegraphs.sma.R (rev 0) +++ pkg/quantstrat/demo/luxor.3.tradegraphs.sma.R 2013-04-18 21:01:16 UTC (rev 1440) @@ -0,0 +1,39 @@ +#!/usr/bin/Rscript --vanilla +# +# Jan Humme (@opentrades) - August 2012, revised April 2013 +# +# Tested and found to work correctly using blotter r1420 +# +# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) + +require(quantstrat) + +### load 'stats' back into .GlobalEnv + +load('../data/luxor.parameters.1-10.30-55.RData') + +### show trade graphs from stats + +tradeGraphs ( + stats = stats, + free.params = c("Param.indicator.1.nFast", "Param.indicator.2.nSlow"), + statistics = c("Net.Trading.PL", "maxDrawdown", "Avg.Trade.PL", "Num.Trades", "Profit.Factor"), + title = 'Luxor SMA Parameter Scan' +) + +##### PLACE DEMO AND TEST DATES HERE ################# +# +#if(isTRUE(options('in_test')$in_test)) +# # use test dates +# {initDate="2011-01-01" +# endDate="2012-12-31" +# } else +# # use demo defaults +# {initDate="1999-12-31" +# endDate=Sys.Date()} + +##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### +# book = getOrderBook(port) +# stats = tradeStats(port) +# rets = PortfReturns(acct) +################################################################ Copied: pkg/quantstrat/demo/luxor.5.orderchains.R (from rev 1430, pkg/quantstrat/demo/luxor.orderchains.R) =================================================================== --- pkg/quantstrat/demo/luxor.5.orderchains.R (rev 0) +++ pkg/quantstrat/demo/luxor.5.orderchains.R 2013-04-18 21:01:16 UTC (rev 1440) @@ -0,0 +1,332 @@ +#!/usr/bin/Rscript --vanilla +# +# Jan Humme (@opentrades) - August 2012 +# +# Tested and found to work correctly using blotter r1230 +# +# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) +# + +options(width = 240) +#Sys.setenv(TZ="GMT") + +.fast = 1 +.slow = 44 + +.qty=100000 +.th=0.0005 +.txn=-30 +.timespan = 'T08:00/T12:00' +.timespan = 'T00:00/T23:59' + +.stoploss=0.001 +.stoptrailing=0.0015 +.takeprofit=0.003 + +##### PLACE DEMO AND TEST DATES HERE ################# +# +#if(isTRUE(options('in_test')$in_test)) +# # use test dates +# {initDate="2011-01-01" +# endDate="2012-12-31" +# } else +# # use demo defaults +# {initDate="1999-12-31" +# endDate=Sys.Date()} + +initDate = '2002-10-21' +.from='2002-10-21' +#.to='2008-07-04' +.to='2002-10-31' +#.to='2002-12-31' +#.to='2003-12-31' +#.from='2006-01-01' +#.to='2006-12-31' +#.from='2007-01-01' +#.to='2007-12-31' + +#### + +s = 'luxor' +p = 'forex' +a = 'IB1' + +### + +require(quantstrat) + +currency(c('GBP', 'USD')) + +exchange_rate(c('GBPUSD'), tick_size=0.0001) + +setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') + +### + +getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) +GBPUSD = to.minutes30(GBPUSD) +GBPUSD = align.time(to.minutes30(GBPUSD), 1800) + +### + +initPortf(p, symbols='GBPUSD', initDate=initDate, currency='USD') +initAcct(a, portfolios=p, initDate=initDate, currency='USD') + +### + +initOrders(p, initDate=initDate) + +### strategy ###################################################################### + +addPosLimit( + portfolio=p, + symbol='GBPUSD', + timestamp=initDate, + maxpos=.qty) + +strategy(s, store=TRUE) + +### indicators + +add.indicator(s, name = "SMA", + arguments = list( + x = quote(Cl(mktdata)), + n = .fast + ), + label="nFast" +) + +add.indicator(s, name="SMA", + arguments = list( + x = quote(Cl(mktdata)), + n = .slow + ), + label="nSlow" +) + +### signals + +add.signal(s, name = 'sigCrossover', + arguments = list( + columns=c("nFast","nSlow"), + relationship="gte" + ), + label='long' +) + +add.signal(s, name = 'sigCrossover', + arguments = list( + columns=c("nFast","nSlow"), + relationship="lt" + ), + label='short' +) + +### rules ############ + +### stop-loss + +add.rule(s, name = 'ruleSignal', + arguments=list(sigcol='long' , sigval=TRUE, + replace=FALSE, + orderside='long', + ordertype='stoplimit', + tmult=TRUE, + threshold=.stoploss, + TxnFees=.txn, + orderqty='all', + orderset='ocolong' + ), + type='chain', + parent='EnterLONG', + label='StopLossLONG', + storefun=FALSE +) + +add.rule(s, name = 'ruleSignal', + arguments=list(sigcol='short' , sigval=TRUE, + replace=FALSE, + orderside='short', + ordertype='stoplimit', + tmult=TRUE, + threshold=.stoploss, + TxnFees=.txn, + orderqty='all', + orderset='ocoshort' + ), + type='chain', + parent='EnterSHORT', + label='StopLossSHORT', + storefun=FALSE +) + +### stop-trailing + +if(TRUE) +{ +add.rule(s, name = 'ruleSignal', + arguments=list(sigcol='long' , sigval=TRUE, + replace=FALSE, + orderside='long', + ordertype='stoptrailing', + tmult=TRUE, + threshold=.stoptrailing, + TxnFees=.txn, + orderqty='all', + orderset='ocolong' + ), + type='chain', + parent='EnterLONG', + label='StopTrailingLONG', + storefun=FALSE +) + +add.rule(s, name = 'ruleSignal', + arguments=list(sigcol='short' , sigval=TRUE, + replace=FALSE, + orderside='short', + ordertype='stoptrailing', + tmult=TRUE, + threshold=.stoptrailing, + TxnFees=.txn, + orderqty='all', + orderset='ocoshort' + ), + type='chain', + parent='EnterSHORT', + label='StopTrailingSHORT', + storefun=FALSE +) +} + +### take-profit + +add.rule(s, name = 'ruleSignal', + arguments=list(sigcol='long' , sigval=TRUE, + replace=FALSE, + orderside='long', + ordertype='limit', + tmult=TRUE, + threshold=.takeprofit, + TxnFees=.txn, + orderqty='all', + orderset='ocolong' + ), + type='chain', + parent='EnterLONG', + label='TakeProfitLONG', + storefun=FALSE +) + +add.rule(s, name = 'ruleSignal', + arguments=list(sigcol='short' , sigval=TRUE, + replace=FALSE, + orderside='short', + ordertype='limit', + tmult=TRUE, + threshold=.takeprofit, + TxnFees=.txn, + orderqty='all', + orderset='ocoshort' + ), + type='chain', + parent='EnterSHORT', + label='TakeProfitSHORT', + storefun=FALSE +) + +### + +add.rule(s, name = 'ruleSignal', + arguments=list(sigcol='long' , sigval=TRUE, + replace=TRUE, + orderside='short', + ordertype='market', + TxnFees=.txn, + orderqty='all', + orderset='ocoshort' + ), + type='exit', + timespan = .timespan, + label='Exit2LONG', + storefun=FALSE +) + +add.rule(s, name = 'ruleSignal', + arguments=list(sigcol='short', sigval=TRUE, + replace=TRUE, + orderside='long' , + ordertype='market', + TxnFees=.txn, + orderqty='all', + orderset='ocolong' + ), + type='exit', + timespan = .timespan, + label='Exit2SHORT', + storefun=FALSE +) + +add.rule(s, name = 'ruleSignal', + arguments=list(sigcol='long' , sigval=TRUE, + replace=FALSE, + orderside='long' , + ordertype='stoplimit', + prefer='High', + threshold=.th, + TxnFees=0, + orderqty=+.qty, + osFUN=osMaxPos, + orderset='ocolong' + ), + type='enter', + timespan = .timespan, + label='EnterLONG', + storefun=FALSE +) + +add.rule(s, name = 'ruleSignal', + arguments=list(sigcol='short', sigval=TRUE, + replace=FALSE, + orderside='short', + ordertype='stoplimit', + prefer='Low', + threshold=.th, + TxnFees=0, + orderqty=-.qty, + osFUN=osMaxPos, + orderset='ocoshort' + ), + type='enter', + timespan = .timespan, + label='EnterSHORT', + storefun=FALSE +) + +# + +############################################################################### + +applyStrategy(s, p, verbose = FALSE) +#applyStrategy(s, p, prefer='Open', verbose = FALSE) + +updatePortf(p, Symbols='GBPUSD', ,Dates=paste('::',as.Date(Sys.time()),sep='')) + +############################################################################### + +chart.Posn(p, "GBPUSD") + +print(getOrderBook(p)) + +#txns <- getTxns(p, 'GBPUSD') +#txns +##txns$Net +#cat('Net profit:', sum(txns$Net.Txn.Realized.PL), '\n') + +print(tradeStats(p, 'GBPUSD')) + +##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### +# book = getOrderBook(port) +# stats = tradeStats(port) +# rets = PortfReturns(acct) +################################################################ Copied: pkg/quantstrat/demo/luxor.6.paramset.stoploss.R (from rev 1430, pkg/quantstrat/demo/luxor.StopLoss.R) =================================================================== --- pkg/quantstrat/demo/luxor.6.paramset.stoploss.R (rev 0) +++ pkg/quantstrat/demo/luxor.6.paramset.stoploss.R 2013-04-18 21:01:16 UTC (rev 1440) @@ -0,0 +1,87 @@ +#!/usr/bin/Rscript --vanilla +# +# Jan Humme (@opentrades) - August 2012 +# +# Tested and found to work correctly using blotter r1230 +# +# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) +# +# compute StopLoss percentage for various paramsets + +require(quantstrat) + +options(width = 240) +#Sys.setenv(TZ="GMT") + +.qty=100000 + +.fast = 10 +.slow = 30 + +.qty=100000 +.th=0.0005 +.txn=0 + +##### PLACE DEMO AND TEST DATES HERE ################# +# +#if(isTRUE(options('in_test')$in_test)) +# # use test dates +# {initDate="2011-01-01" +# endDate="2012-12-31" +# } else +# # use demo defaults +# {initDate="1999-12-31" +# endDate=Sys.Date()} + +initDate = '2002-10-21' + +source('luxor.symbols.R') + +### + +strategy.st = 'luxor' +portfolio.st = 'forex' +account.st = 'IB1' + +source('luxor.symbols.R') + +initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') +addPosLimit( + portfolio=portfolio.st, + symbol='GBPUSD', + timestamp=initDate, + maxpos=.qty) + +initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') + +### + +initOrders(portfolio.st, initDate=initDate) + +load.strategy(strategy.st) + +############################ + +require(foreach) +#registerDoSEQ() + +require(doMC) +registerDoMC(cores=8) + +#require(doParallel) +#registerDoParallel(cores=2) + +#require(doRedis) +#registerDoRedis('jobs') + +############################ + +results <- apply.paramset(strategy.st, paramset.label='StopLoss', portfolio.st=portfolio.st, account.st=account.st, nsamples=80, verbose=TRUE) + +print(results$tradeStats) + +##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### +# book = getOrderBook(port) +# stats = tradeStats(port) +# rets = PortfReturns(acct) +################################################################ Copied: pkg/quantstrat/demo/luxor.6.paramset.stoptrailing.R (from rev 1430, pkg/quantstrat/demo/luxor.StopTrailing.R) =================================================================== --- pkg/quantstrat/demo/luxor.6.paramset.stoptrailing.R (rev 0) +++ pkg/quantstrat/demo/luxor.6.paramset.stoptrailing.R 2013-04-18 21:01:16 UTC (rev 1440) @@ -0,0 +1,85 @@ +#!/usr/bin/Rscript --vanilla +# +# Jan Humme (@opentrades) - August 2012 +# +# Tested and found to work correctly using blotter r1230 +# +# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) +# +# compute StopTrailing percentage for various paramsets + +require(quantstrat) + +options(width = 240) +Sys.setenv(TZ='UTC') + +.qty=100000 + +.fast = 10 +.slow = 30 + +.qty=100000 +.th=0.0005 +.txn=0 + +##### PLACE DEMO AND TEST DATES HERE ################# +# +#if(isTRUE(options('in_test')$in_test)) +# # use test dates +# {initDate="2011-01-01" +# endDate="2012-12-31" +# } else +# # use demo defaults +# {initDate="1999-12-31" +# endDate=Sys.Date()} + +initDate = '2002-10-21' + +source('luxor.symbols.R') + +### + +strategy.st = 'luxor' +portfolio.st = 'forex' +account.st = 'IB1' + +initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') +addPosLimit( + portfolio=portfolio.st, + symbol='GBPUSD', + timestamp=initDate, + maxpos=.qty) + +initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') + +### + +initOrders(portfolio.st, initDate=initDate) + +load.strategy(strategy.st) + +############################ + +require(foreach) +#registerDoSEQ() + +require(doMC) +registerDoMC(cores=2) + +#require(doParallel) +#registerDoParallel(cores=2) + +#require(doRedis) +#registerDoRedis('jobs') + +############################ + +results <- apply.paramset(strategy.st, paramset.label='StopTrailing', portfolio.st=portfolio.st, account.st=account.st, nsamples=80, verbose=TRUE) + +print(results$tradeStats) + +##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### +# book = getOrderBook(port) +# stats = tradeStats(port) +# rets = PortfReturns(acct) +################################################################ Copied: pkg/quantstrat/demo/luxor.6.paramset.takeprofit.R (from rev 1430, pkg/quantstrat/demo/luxor.TakeProfit.R) =================================================================== --- pkg/quantstrat/demo/luxor.6.paramset.takeprofit.R (rev 0) +++ pkg/quantstrat/demo/luxor.6.paramset.takeprofit.R 2013-04-18 21:01:16 UTC (rev 1440) @@ -0,0 +1,85 @@ +#!/usr/bin/Rscript --vanilla +# +# Jan Humme (@opentrades) - August 2012 +# +# Tested and found to work correctly using blotter r1230 +# +# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) +# +# compute TakeProfit percentage for various paramsets + +require(quantstrat) + +options(width = 240) +Sys.setenv(TZ='UTC') + +.qty=100000 + +.fast = 10 +.slow = 30 + +.qty=100000 +.th=0.0005 +.txn=0 + +##### PLACE DEMO AND TEST DATES HERE ################# +# +#if(isTRUE(options('in_test')$in_test)) +# # use test dates +# {initDate="2011-01-01" +# endDate="2012-12-31" +# } else +# # use demo defaults +# {initDate="1999-12-31" +# endDate=Sys.Date()} + +initDate = '2002-10-21' + +source('luxor.symbols.R') + +### + +strategy.st = 'luxor' +portfolio.st = 'forex' +account.st = 'IB1' + +initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') +addPosLimit( + portfolio=portfolio.st, + symbol='GBPUSD', + timestamp=initDate, + maxpos=.qty) + +initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') + +### + +initOrders(portfolio.st, initDate=initDate) + +load.strategy(strategy.st) + +############################ + +require(foreach) +#registerDoSEQ() + +require(doMC) +registerDoMC(cores=8) + +#require(doParallel) +#registerDoParallel(cores=2) + +#require(doRedis) +#registerDoRedis('jobs') + +############################ + +results <- apply.paramset(strategy.st, paramset.label='TakeProfit', portfolio.st=portfolio.st, account.st=account.st, nsamples=80, verbose=TRUE) + +print(results$tradeStats) + +##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### +# book = getOrderBook(port) +# stats = tradeStats(port) +# rets = PortfReturns(acct) +################################################################ Deleted: pkg/quantstrat/demo/luxor.StopLoss.R =================================================================== --- pkg/quantstrat/demo/luxor.StopLoss.R 2013-04-18 20:34:27 UTC (rev 1439) +++ pkg/quantstrat/demo/luxor.StopLoss.R 2013-04-18 21:01:16 UTC (rev 1440) @@ -1,103 +0,0 @@ -#!/usr/bin/Rscript --vanilla -# -# Jan Humme (@opentrades) - August 2012 -# -# Tested and found to work correctly using blotter r1230 -# -# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) -# -# compute StopLoss percentage for various paramsets - -require(quantstrat) - -options(width = 240) -#Sys.setenv(TZ="GMT") - -.qty=100000 - -.fast = 10 -.slow = 30 - -.qty=100000 -.th=0.0005 -.txn=0 - - -##### PLACE DEMO AND TEST DATES HERE ################# -# -#if(isTRUE(options('in_test')$in_test)) -# # use test dates -# {initDate="2011-01-01" -# endDate="2012-12-31" -# } else -# # use demo defaults -# {initDate="1999-12-31" -# endDate=Sys.Date()} - -initDate = '2002-10-21' -.from='2002-10-21' -#.to='2008-07-04' -#.to='2003-12-31' -.to='2002-10-31' - -### - -currency(c('GBP', 'USD')) - -exchange_rate(c('GBPUSD'), tick_size=0.0001) - -### - -setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') - -getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) -GBPUSD = to.minutes30(GBPUSD) -GBPUSD = align.time(to.minutes30(GBPUSD), 1800) - -### - -strategy.st = 'luxor' -portfolio.st = 'forex' -account.st = 'IB1' - -initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') -addPosLimit( - portfolio=portfolio.st, - symbol='GBPUSD', - timestamp=initDate, - maxpos=.qty) - -initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') - -### - -initOrders(portfolio.st, initDate=initDate) - -load.strategy(strategy.st) - -############################ - -require(foreach) - -#registerDoSEQ() - -require(doMC) -registerDoMC(cores=2) - -#require(doParallel) -#registerDoParallel(cores=2) - -#require(doRedis) -#registerDoRedis('jobs') - -############################ - -results <- apply.paramset(strategy.st, paramset.label='StopLoss', portfolio.st=portfolio.st, verbose=TRUE) - -print(results$tradeStats) - -##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### -# book = getOrderBook(port) -# stats = tradeStats(port) -# rets = PortfReturns(acct) -################################################################ Deleted: pkg/quantstrat/demo/luxor.StopTrailing.R =================================================================== --- pkg/quantstrat/demo/luxor.StopTrailing.R 2013-04-18 20:34:27 UTC (rev 1439) +++ pkg/quantstrat/demo/luxor.StopTrailing.R 2013-04-18 21:01:16 UTC (rev 1440) @@ -1,102 +0,0 @@ -#!/usr/bin/Rscript --vanilla -# -# Jan Humme (@opentrades) - August 2012 -# -# Tested and found to work correctly using blotter r1230 -# -# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) -# -# compute StopTrailing percentage for various paramsets - -require(quantstrat) - -options(width = 240) -#Sys.setenv(TZ="GMT") - -.qty=100000 - -.fast = 10 -.slow = 30 - -.qty=100000 -.th=0.0005 -.txn=0 - -##### PLACE DEMO AND TEST DATES HERE ################# -# -#if(isTRUE(options('in_test')$in_test)) -# # use test dates -# {initDate="2011-01-01" -# endDate="2012-12-31" -# } else -# # use demo defaults -# {initDate="1999-12-31" -# endDate=Sys.Date()} - -initDate = '2002-10-21' -.from='2002-10-21' -#.to='2008-07-04' -#.to='2003-12-31' -.to='2002-10-31' - -### - -currency(c('GBP', 'USD')) - -exchange_rate(c('GBPUSD'), tick_size=0.0001) - -### - -setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') - -getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) -GBPUSD = to.minutes30(GBPUSD) -GBPUSD = align.time(to.minutes30(GBPUSD), 1800) - -### - -strategy.st = 'luxor' -portfolio.st = 'forex' -account.st = 'IB1' - -initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') -addPosLimit( - portfolio=portfolio.st, - symbol='GBPUSD', - timestamp=initDate, - maxpos=.qty) - -initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') - -### - -initOrders(portfolio.st, initDate=initDate) - -load.strategy(strategy.st) - -############################ - -require(foreach) - -registerDoSEQ() - -#require(doMC) -#registerDoMC(cores=2) - -#require(doParallel) -#registerDoParallel(cores=2) - -#require(doRedis) -#registerDoRedis('jobs') - -############################ - -results <- apply.paramset(strategy.st, paramset.label='StopTrailing', portfolio.st=portfolio.st, verbose=TRUE) - -print(results$tradeStats) - -##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### -# book = getOrderBook(port) -# stats = tradeStats(port) -# rets = PortfReturns(acct) -################################################################ Deleted: pkg/quantstrat/demo/luxor.TakeProfit.R =================================================================== --- pkg/quantstrat/demo/luxor.TakeProfit.R 2013-04-18 20:34:27 UTC (rev 1439) +++ pkg/quantstrat/demo/luxor.TakeProfit.R 2013-04-18 21:01:16 UTC (rev 1440) @@ -1,102 +0,0 @@ -#!/usr/bin/Rscript --vanilla -# -# Jan Humme (@opentrades) - August 2012 -# -# Tested and found to work correctly using blotter r1230 -# -# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) -# -# compute TakeProfit percentage for various paramsets - -require(quantstrat) - -options(width = 240) -#Sys.setenv(TZ="GMT") - -.qty=100000 - -.fast = 10 -.slow = 30 - -.qty=100000 -.th=0.0005 -.txn=0 - -##### PLACE DEMO AND TEST DATES HERE ################# -# -#if(isTRUE(options('in_test')$in_test)) -# # use test dates -# {initDate="2011-01-01" -# endDate="2012-12-31" -# } else -# # use demo defaults -# {initDate="1999-12-31" -# endDate=Sys.Date()} - -initDate = '2002-10-21' -.from='2002-10-21' -#.to='2008-07-04' -#.to='2003-12-31' -.to='2002-10-31' - -### - -currency(c('GBP', 'USD')) - -exchange_rate(c('GBPUSD'), tick_size=0.0001) - -### - -setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') - -getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) -GBPUSD = to.minutes30(GBPUSD) -GBPUSD = align.time(to.minutes30(GBPUSD), 1800) - -### - -strategy.st = 'luxor' -portfolio.st = 'forex' -account.st = 'IB1' - -initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') -addPosLimit( - portfolio=portfolio.st, - symbol='GBPUSD', - timestamp=initDate, - maxpos=.qty) - -initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') - -### - -initOrders(portfolio.st, initDate=initDate) - -load.strategy(strategy.st) - -############################ - -require(foreach) - -registerDoSEQ() - -#require(doMC) -#registerDoMC(cores=2) - -#require(doParallel) -#registerDoParallel(cores=2) - -#require(doRedis) -#registerDoRedis('jobs') - -############################ - -results <- apply.paramset(strategy.st, paramset.label='TakeProfit', portfolio.st=portfolio.st, verbose=TRUE) - -print(results$tradeStats) - -##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### -# book = getOrderBook(port) -# stats = tradeStats(port) -# rets = PortfReturns(acct) -################################################################ Deleted: pkg/quantstrat/demo/luxor.exits.R =================================================================== --- pkg/quantstrat/demo/luxor.exits.R 2013-04-18 20:34:27 UTC (rev 1439) +++ pkg/quantstrat/demo/luxor.exits.R 2013-04-18 21:01:16 UTC (rev 1440) @@ -1,140 +0,0 @@ -#!/usr/bin/Rscript --vanilla - -require(quantstrat) - -source('luxor.strategy.R') - -##### PLACE DEMO AND TEST DATES HERE ################# -# -#if(isTRUE(options('in_test')$in_test)) -# # use test dates -# {initDate="2011-01-01" -# endDate="2012-12-31" -# } else -# # use demo defaults -# {initDate="1999-12-31" -# endDate=Sys.Date()} - -.FastSMA = (1:20) -.SlowSMA = (30:80) - -.StopLoss = seq(0.1, 2.0, length.out=20)/100 -.StopTrailing = seq(0.1, 2.0, length.out=20)/100 -.TakeProfit = seq(0.1, 2.0, length.out=20)/100 - -#s<-getStrategy('luxor') -s <- 'luxor' - -### SMA paramset - -add.distribution(s, - paramset.label = 'SMA', - component.type = 'indicator', - component.label = 'nFast', - variable = list(n = .FastSMA), - label = 'nFAST' -) - -add.distribution(s, - paramset.label = 'SMA', - component.type = 'indicator', - component.label = 'nSlow', - variable = list(n = .SlowSMA), - label = 'nSLOW' -) - -add.constraint(s, - paramset.label = 'SMA', - distribution.label.1 = 'nFAST', - distribution.label.2 = 'nSLOW', - operator = '<', - label = 'SMA' -) - -### Stop Loss paramset - -add.distribution(s, - paramset.label = 'StopLoss', - component.type = 'chain', - component.label = 'StopLossLONG', - variable = list(threshold = .StopLoss), - label = 'StopLossLONG' -) - -add.distribution(s, - paramset.label = 'StopLoss', - component.type = 'chain', - component.label = 'StopLossSHORT', - variable = list(threshold = .StopLoss), - label = 'StopLossSHORT' -) - -add.constraint(s, - paramset.label = 'StopLoss', - distribution.label.1 = 'StopLossLONG', - distribution.label.2 = 'StopLossSHORT', - operator = '==', - label = 'StopLoss' -) - -### Stop Trailing paramset - -add.distribution(s, - paramset.label = 'StopTrailing', - component.type = 'chain', - component.label = 'StopTrailingLONG', - variable = list(threshold = .StopTrailing), - label = 'StopTrailingLONG' -) - -add.distribution(s, - paramset.label = 'StopTrailing', - component.type = 'chain', - component.label = 'StopTrailingSHORT', - variable = list(threshold = .StopTrailing), - label = 'StopTrailingSHORT' -) - -add.constraint(s, - paramset.label = 'StopTrailing', - distribution.label.1 = 'StopTrailingLONG', - distribution.label.2 = 'StopTrailingSHORT', - operator = '==', - label = 'StopTrailing' -) - -### Take Profit paramset - -add.distribution(s, - paramset.label = 'TakeProfit', - component.type = 'chain', - component.label = 'TakeProfitLONG', - variable = list(threshold = .TakeProfit), - label = 'TakeProfitLONG' -) - -add.distribution(s, - paramset.label = 'TakeProfit', - component.type = 'chain', - component.label = 'TakeProfitSHORT', - variable = list(threshold = .TakeProfit), - label = 'TakeProfitSHORT' -) - -add.constraint(s, - paramset.label = 'TakeProfit', - distribution.label.1 = 'TakeProfitLONG', - distribution.label.2 = 'TakeProfitSHORT', - operator = '==', - label = 'TakeProfit' -) - -### - -save.strategy('luxor') - -##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### -# book = getOrderBook(port) -# stats = tradeStats(port) -# rets = PortfReturns(acct) -################################################################ Deleted: pkg/quantstrat/demo/luxor.orderchains.R =================================================================== --- pkg/quantstrat/demo/luxor.orderchains.R 2013-04-18 20:34:27 UTC (rev 1439) +++ pkg/quantstrat/demo/luxor.orderchains.R 2013-04-18 21:01:16 UTC (rev 1440) @@ -1,332 +0,0 @@ -#!/usr/bin/Rscript --vanilla -# -# Jan Humme (@opentrades) - August 2012 -# -# Tested and found to work correctly using blotter r1230 -# -# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) -# - -options(width = 240) -#Sys.setenv(TZ="GMT") - -.fast = 1 -.slow = 44 - -.qty=100000 -.th=0.0005 -.txn=-30 -.timespan = 'T08:00/T12:00' -.timespan = 'T00:00/T23:59' - -.stoploss=0.001 -.stoptrailing=0.0015 -.takeprofit=0.003 - -##### PLACE DEMO AND TEST DATES HERE ################# -# -#if(isTRUE(options('in_test')$in_test)) -# # use test dates -# {initDate="2011-01-01" -# endDate="2012-12-31" -# } else -# # use demo defaults -# {initDate="1999-12-31" -# endDate=Sys.Date()} - -initDate = '2002-10-21' -.from='2002-10-21' -#.to='2008-07-04' -.to='2002-10-31' -#.to='2002-12-31' -#.to='2003-12-31' -#.from='2006-01-01' -#.to='2006-12-31' -#.from='2007-01-01' -#.to='2007-12-31' - -#### - -s = 'luxor' -p = 'forex' -a = 'IB1' - -### - -require(quantstrat) - -currency(c('GBP', 'USD')) - -exchange_rate(c('GBPUSD'), tick_size=0.0001) - -setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') - -### - -getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) -GBPUSD = to.minutes30(GBPUSD) -GBPUSD = align.time(to.minutes30(GBPUSD), 1800) - -### - -initPortf(p, symbols='GBPUSD', initDate=initDate, currency='USD') -initAcct(a, portfolios=p, initDate=initDate, currency='USD') - -### - -initOrders(p, initDate=initDate) - -### strategy ###################################################################### - -addPosLimit( - portfolio=p, - symbol='GBPUSD', - timestamp=initDate, - maxpos=.qty) - -strategy(s, store=TRUE) - -### indicators - -add.indicator(s, name = "SMA", - arguments = list( - x = quote(Cl(mktdata)), - n = .fast - ), - label="nFast" -) - -add.indicator(s, name="SMA", - arguments = list( - x = quote(Cl(mktdata)), - n = .slow - ), - label="nSlow" -) - -### signals - -add.signal(s, name = 'sigCrossover', - arguments = list( - columns=c("nFast","nSlow"), - relationship="gte" - ), - label='long' -) - -add.signal(s, name = 'sigCrossover', - arguments = list( - columns=c("nFast","nSlow"), - relationship="lt" - ), - label='short' -) - -### rules ############ - -### stop-loss - -add.rule(s, name = 'ruleSignal', - arguments=list(sigcol='long' , sigval=TRUE, - replace=FALSE, - orderside='long', - ordertype='stoplimit', - tmult=TRUE, - threshold=.stoploss, - TxnFees=.txn, - orderqty='all', - orderset='ocolong' - ), - type='chain', - parent='EnterLONG', - label='StopLossLONG', - storefun=FALSE -) - -add.rule(s, name = 'ruleSignal', - arguments=list(sigcol='short' , sigval=TRUE, - replace=FALSE, - orderside='short', - ordertype='stoplimit', - tmult=TRUE, - threshold=.stoploss, - TxnFees=.txn, - orderqty='all', - orderset='ocoshort' - ), - type='chain', - parent='EnterSHORT', - label='StopLossSHORT', - storefun=FALSE -) - -### stop-trailing - -if(TRUE) -{ -add.rule(s, name = 'ruleSignal', - arguments=list(sigcol='long' , sigval=TRUE, - replace=FALSE, - orderside='long', - ordertype='stoptrailing', - tmult=TRUE, - threshold=.stoptrailing, - TxnFees=.txn, - orderqty='all', - orderset='ocolong' - ), - type='chain', - parent='EnterLONG', [TRUNCATED] To get the complete diff run: svnlook diff /svnroot/blotter -r 1440 From noreply at r-forge.r-project.org Fri Apr 19 16:04:05 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Fri, 19 Apr 2013 16:04:05 +0200 (CEST) Subject: [Blotter-commits] r1441 - pkg/quantstrat/R Message-ID: <20130419140405.DE6D418529A@r-forge.r-project.org> Author: bodanker Date: 2013-04-19 16:04:05 +0200 (Fri, 19 Apr 2013) New Revision: 1441 Modified: pkg/quantstrat/R/rules.R Log: - check for open stoplimit orders before moving to next index Modified: pkg/quantstrat/R/rules.R =================================================================== --- pkg/quantstrat/R/rules.R 2013-04-18 21:01:16 UTC (rev 1440) +++ pkg/quantstrat/R/rules.R 2013-04-19 14:04:05 UTC (rev 1441) @@ -325,7 +325,9 @@ isBBOmktdata <- is.BBO(mktdata) #check for open orders at curIndex timespan<-paste(timestamp,"::",sep='') #no check to see if timestamp came through dots? Does it come from the search path? -gsee - if(nrow(ordersubset[oo.idx,][timespan])==0){ + if(nrow(ordersubset[oo.idx,][timespan])==0 && # prior open orders already in dindex; no need to recheck + !any(ordersubset$Order.Type[oo.idx]=="stoptrailing")) # ... but stoptrailing may need to move + { # no open orders between now and the next index nidx=FALSE } else { From noreply at r-forge.r-project.org Sat Apr 20 13:45:09 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Sat, 20 Apr 2013 13:45:09 +0200 (CEST) Subject: [Blotter-commits] r1442 - pkg/quantstrat/R Message-ID: <20130420114509.93903180983@r-forge.r-project.org> Author: bodanker Date: 2013-04-20 13:45:09 +0200 (Sat, 20 Apr 2013) New Revision: 1442 Modified: pkg/quantstrat/R/rules.R Log: - fix to update dindex if stoplimit crosses but any(move_order) is FALSE Modified: pkg/quantstrat/R/rules.R =================================================================== --- pkg/quantstrat/R/rules.R 2013-04-19 14:04:05 UTC (rev 1441) +++ pkg/quantstrat/R/rules.R 2013-04-20 11:45:09 UTC (rev 1442) @@ -500,6 +500,7 @@ mkt_price_series <-getPrice(mktdata[timespan],prefer=prefer)[-1] # don't look for crosses on curIndex col<-first(colnames(mkt_price_series)) + # check if order needs to be moved if(tmpqty > 0){ # positive quantity 'buy' move_order <- tmpprice - abs(orderThreshold) > mkt_price_series relationship="gte" @@ -507,28 +508,14 @@ move_order <- tmpprice + abs(orderThreshold) < mkt_price_series relationship="lte" } + # check if order will be filled + cross <- sigThreshold(data=mkt_price_series, label='tmptrail',column=col,threshold=tmpprice,relationship=relationship) tmpidx<-NULL - if(any(move_order)){ - #print(firsttime) - # find first index where we would move an order - orderidx<-first(which(move_order)) - tmpidx <- format(index(move_order[orderidx,]), "%Y-%m-%d %H:%M:%OS6") - trailspan <- paste(format(firsttime, "%Y-%m-%d %H:%M:%OS6"),"::",tmpidx,sep='') - #make sure we don't cross before then - # use sigThreshold - cross<-sigThreshold(data=mkt_price_series, label='tmptrail',column=col,threshold=tmpprice,relationship=relationship) - cross <- cross[trailspan] # don't look for crosses on curIndex (curIndex is removed from mkt_price_series) - # find first index that would cross after this index - if (any(cross)){ - newidx <- curIndex + index(mktdata[index(which(cross)[1]),which.i=TRUE]) - # insert that into dindex - assign.dindex(c(get.dindex(),newidx)) - } else { - #if we don't cross, do this - moveidx <- curIndex + orderidx - assign.dindex(c(get.dindex(),moveidx)) - } - } # end any(move_order) check + # update dindex if order is moved or filled + if(any(move_order) || any(cross)){ + moveidx <- curIndex + min(which(move_order)[1], which(cross)[1], na.rm=TRUE) + assign.dindex(c(get.dindex(), moveidx)) + } } # end loop over open trailing orders } # end else clause for any open orders in this timespan } # end any open orders closure From noreply at r-forge.r-project.org Sat Apr 20 14:10:27 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Sat, 20 Apr 2013 14:10:27 +0200 (CEST) Subject: [Blotter-commits] r1443 - pkg/quantstrat/R Message-ID: <20130420121027.EDFC618504E@r-forge.r-project.org> Author: bodanker Date: 2013-04-20 14:10:27 +0200 (Sat, 20 Apr 2013) New Revision: 1443 Modified: pkg/quantstrat/R/rules.R Log: - clean up stoptrailing code (s/stoplimit/stoptrailing in last commit) Modified: pkg/quantstrat/R/rules.R =================================================================== --- pkg/quantstrat/R/rules.R 2013-04-20 11:45:09 UTC (rev 1442) +++ pkg/quantstrat/R/rules.R 2013-04-20 12:10:27 UTC (rev 1443) @@ -460,8 +460,6 @@ trailorders <- which('stoptrailing'==ordersubset.oo.idx[,'Order.Type']) for(torder in trailorders) { - firsttime<-NULL - neworders<-NULL onum<-oo.idx[torder] orderThreshold <- as.numeric(ordersubset[onum,'Order.Threshold']) tmpqty<-ordersubset[onum,'Order.Qty'] @@ -474,8 +472,7 @@ } tmpqty<-as.numeric(tmpqty) tmpprice<-as.numeric(ordersubset[onum,'Order.Price']) - tmpidx <- format(index(ordersubset[onum,]), "%Y-%m-%d %H:%M:%OS6") #this is the time the order was entered - #print(tmpidx) + if(isBBOmktdata) { if(tmpqty > 0){ # positive quantity 'buy' prefer='offer' @@ -485,16 +482,15 @@ } else if (isOHLCmktdata) { prefer='close' } - dindex<-get.dindex() - if(is.null(firsttime)) firsttime<-timestamp + dindex<-get.dindex() ddindex <- dindex[dindex>curIndex] if(length(ddindex) == 0) return(FALSE) nextidx <- min(ddindex) nextstamp <- format(index(mktdata[nextidx,]), "%Y-%m-%d %H:%M:%OS6") - timespan <- paste(format(firsttime, "%Y-%m-%d %H:%M:%OS6"),"::",nextstamp,sep='') + timespan <- paste(format(timestamp, "%Y-%m-%d %H:%M:%OS6"),"::",nextstamp,sep='') #get the subset of prices mkt_price_series <-getPrice(mktdata[timespan],prefer=prefer)[-1] # don't look for crosses on curIndex @@ -510,7 +506,7 @@ } # check if order will be filled cross <- sigThreshold(data=mkt_price_series, label='tmptrail',column=col,threshold=tmpprice,relationship=relationship) - tmpidx<-NULL + # update dindex if order is moved or filled if(any(move_order) || any(cross)){ moveidx <- curIndex + min(which(move_order)[1], which(cross)[1], na.rm=TRUE) From noreply at r-forge.r-project.org Mon Apr 22 03:34:04 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Mon, 22 Apr 2013 03:34:04 +0200 (CEST) Subject: [Blotter-commits] r1444 - pkg/quantstrat/R Message-ID: <20130422013404.CCC101812ED@r-forge.r-project.org> Author: bodanker Date: 2013-04-22 03:34:03 +0200 (Mon, 22 Apr 2013) New Revision: 1444 Modified: pkg/quantstrat/R/rules.R Log: - fix chain rule execution logic (only first order of chain was executed) Modified: pkg/quantstrat/R/rules.R =================================================================== --- pkg/quantstrat/R/rules.R 2013-04-20 12:10:27 UTC (rev 1443) +++ pkg/quantstrat/R/rules.R 2013-04-22 01:34:03 UTC (rev 1444) @@ -592,13 +592,14 @@ # determine which closed orders are chained to an entry chain.rules <- strategy$rules[[type]] chain.rule.names <- sapply(chain.rules, '[[', 'parent') - # put rules/prices in same order - rules <- chain.rules[match(closed.orders$Rule, chain.rule.names, nomatch=0L)] - chain.price <- closed.orders$Order.Price[closed.orders$Rule %in% chain.rule.names] - # loop over each rule and call ruleProc() - for(i in seq_along(rules)) { - # call ruleProc in a loop, since it doesn't look like chain.price would be subset correctly - ruleProc(rules[i], timestamp=timestamp, path.dep=path.dep, mktdata=mktdata, portfolio=portfolio, symbol=symbol, ruletype=type, mktinstr=mktinstr, parameters=list(chain.price=as.numeric(chain.price[i]), ...)) + closed.chain <- closed.orders[closed.orders$Rule %in% chain.rule.names] + # loop over each closed order and call ruleProc() on each rule + for(i in seq_len(nrow(closed.chain))) { + rules <- chain.rules[chain.rule.names %in% closed.chain$Rule[i]] + for(j in seq_along(rules)) { + # call ruleProc in a loop, since it doesn't look like chain.price would be subset correctly + ruleProc(rules[j], timestamp=timestamp, path.dep=path.dep, mktdata=mktdata, portfolio=portfolio, symbol=symbol, ruletype=type, mktinstr=mktinstr, parameters=list(chain.price=as.numeric(closed.chain$Order.Price[i]), ...)) + } } } }, From noreply at r-forge.r-project.org Wed Apr 24 00:23:04 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Wed, 24 Apr 2013 00:23:04 +0200 (CEST) Subject: [Blotter-commits] r1445 - in pkg/quantstrat: . R demo man Message-ID: <20130423222304.DC24218102E@r-forge.r-project.org> Author: braverock Date: 2013-04-24 00:23:04 +0200 (Wed, 24 Apr 2013) New Revision: 1445 Added: pkg/quantstrat/R/tradeOrderStats.R pkg/quantstrat/man/tradeOrderStats.Rd Modified: pkg/quantstrat/DESCRIPTION pkg/quantstrat/NAMESPACE pkg/quantstrat/R/orders.R pkg/quantstrat/R/paramsets.R pkg/quantstrat/R/ruleRevoke.R pkg/quantstrat/R/tradeGraphs.R pkg/quantstrat/R/walk.forward.R pkg/quantstrat/demo/maCross.R pkg/quantstrat/man/addOrder.Rd pkg/quantstrat/man/getOrderBook.Rd pkg/quantstrat/man/ruleRevoke.Rd pkg/quantstrat/man/ruleSignal.Rd Log: - add tradeOrderStats - update roxygen docs - update NAMESPACE Modified: pkg/quantstrat/DESCRIPTION =================================================================== --- pkg/quantstrat/DESCRIPTION 2013-04-22 01:34:03 UTC (rev 1444) +++ pkg/quantstrat/DESCRIPTION 2013-04-23 22:23:04 UTC (rev 1445) @@ -1,7 +1,7 @@ Package: quantstrat Type: Package Title: Quantitative Strategy Model Framework -Version: 0.7.7 +Version: 0.7.8 Date: $Date$ Author: Peter Carl, Brian G. Peterson, Joshua Ulrich, Jan Humme Depends: @@ -42,3 +42,4 @@ 'utils.R' 'walk.forward.R' 'wrapup.R' + 'tradeOrderStats.R' Modified: pkg/quantstrat/NAMESPACE =================================================================== --- pkg/quantstrat/NAMESPACE 2013-04-22 01:34:03 UTC (rev 1444) +++ pkg/quantstrat/NAMESPACE 2013-04-23 22:23:04 UTC (rev 1445) @@ -1,3 +1,5 @@ +export(actually) +export(add) export(add.constraint) export(add.distribution) export(add.indicator) @@ -13,25 +15,36 @@ export(applySignals) export(applyStrategy) export(applyStrategy.rebalancing) +export(are) export(chart.forward.testing) export(chart.forward.training) +export(closing) +export(columns) +export(decide) export(delete.paramset) +export("for") export(getOrderBook) export(getOrders) export(getParameterTable) export(getPosLimit) export(getStrategy) +export(important) export(initOrders) export(initStrategy) export(is.strategy) export(load.strategy) export(match.names) +export(of) +export(opening) +export(option) +export("order/trade") export(osMaxPos) export(osNoOp) +export(pairing) export(put.orderbook) export(put.strategy) +export(rather) export(rm.strat) -export(ruleCancel) export(ruleOrderProc) export(rulePctEquity) export(ruleRevoke) @@ -45,7 +58,11 @@ export(sigPeak) export(sigThreshold) export(strategy) +export(than) +export(these) +export("TODO:") export(tradeGraphs) export(updateOrders) export(updateStrategy) export(walk.forward) +export(which) Modified: pkg/quantstrat/R/orders.R =================================================================== --- pkg/quantstrat/R/orders.R 2013-04-22 01:34:03 UTC (rev 1444) +++ pkg/quantstrat/R/orders.R 2013-04-23 22:23:04 UTC (rev 1445) @@ -1,12 +1,26 @@ #' get the order book object #' -#' I don't think this should be exported, but it is for now while we're in test mode. -#' #' @param portfolio text name of the portfolio the order book is associated with #' @param envir the environment to retrieve the orderbook object from, defaults to .strategy #' @seealso addOrder #' @seealso getOrders #' @concept order book +#' @return +#' A \code{data.frame} containing: +#' +#' \describe{ +#' \item{Order.Qty}{} +#' \item{Order.Price}{} +#' \item{Order.Type}{} +#' \item{Order.Side}{} +#' \item{Order.Threshold}{} +#' \item{Order.Status}{} +#' \item{Order.StatusTime}{} +#' \item{Prefer}{} +#' \item{Order.Set}{} +#' \item{Txn.Fees}{} +#' \item{Rule}{} +#' } #' @export getOrderBook <- function(portfolio, envir=.strategy) #should symbol subsets be supported too? probably not. { Modified: pkg/quantstrat/R/paramsets.R =================================================================== --- pkg/quantstrat/R/paramsets.R 2013-04-22 01:34:03 UTC (rev 1444) +++ pkg/quantstrat/R/paramsets.R 2013-04-23 22:23:04 UTC (rev 1445) @@ -7,7 +7,7 @@ # This library is distributed under the terms of the GNU Public License (GPL) # for full details see the file COPYING # -# $Id: parameters.R 1218 2012-10-11 20:47:44Z opentrades $ +# $Id$ # ############################################################################### # Property changes on: pkg/quantstrat/R/paramsets.R ___________________________________________________________________ Added: svn:keywords + Id Date Author Modified: pkg/quantstrat/R/ruleRevoke.R =================================================================== --- pkg/quantstrat/R/ruleRevoke.R 2013-04-22 01:34:03 UTC (rev 1444) +++ pkg/quantstrat/R/ruleRevoke.R 2013-04-23 22:23:04 UTC (rev 1445) @@ -2,11 +2,11 @@ #' #' As described elsewhere in the documentation, quantstrat models #' \emph{orders}. All orders in quantstrat are GTC orders, which means that -#' unfilled limit orders have to be revokeled manually or replaced by other orders. +#' unfilled limit orders have to be canceled manually or replaced by other orders. #' #' This function is used for revoking or canceling the orders based on a signal. #' Order status will be changed to 'revoked', to separate it from cancelations or -#' replacements from other causes. THis may make it easier it decipher the order book +#' replacements from other causes. This may make it easier it decipher the order book #' to figure out what the strategy ewas doing. #' #' @param data an xts object containing market data. depending on rules, may need to be in OHLCV or BBO formats, and may include indicator and signal information Modified: pkg/quantstrat/R/tradeGraphs.R =================================================================== --- pkg/quantstrat/R/tradeGraphs.R 2013-04-22 01:34:03 UTC (rev 1444) +++ pkg/quantstrat/R/tradeGraphs.R 2013-04-23 22:23:04 UTC (rev 1445) @@ -69,6 +69,6 @@ # This library is distributed under the terms of the GNU Public License (GPL) # for full details see the file COPYING # -# $Id: wrapup.R 849 2011-11-16 17:47:25Z gsee $ +# $Id$ # ############################################################################### Property changes on: pkg/quantstrat/R/tradeGraphs.R ___________________________________________________________________ Added: svn:keywords + Id Date Author Added: pkg/quantstrat/R/tradeOrderStats.R =================================================================== --- pkg/quantstrat/R/tradeOrderStats.R (rev 0) +++ pkg/quantstrat/R/tradeOrderStats.R 2013-04-23 22:23:04 UTC (rev 1445) @@ -0,0 +1,64 @@ +#' get order information associated with closing positions +#' +#' +#' @param portfolio text name of the portfolio the order book is associated with +#' @param symbol text string defining the symbol to get trades and orders for +#' @param ... any other passthrough parameters +#' @return +#' A \code{xts} object containing: +#' +#' \describe{ +#' \item{Order.Qty}{} +#' \item{Order.Price}{} +#' \item{Order.Type}{} +#' \item{Order.Side}{} +#' \item{Order.Threshold}{} +#' \item{Order.Status}should be 'closed' only{} +#' \item{Order.StatusTime}{time of the closing trade, should match 'End' column} +#' \item{Prefer}{prefer argument for \code{getPrice}} +#' \item{Order.Set}{order set of the closing trade} +#' \item{Txn.Fees}{and fees applied to the closing trade} +#' \item{Rule}{the name of the rule that generated the order which closed the position} +#' \item{Start}{the \code{POSIXct} timestamp of the start of the trade} +#' \item{Init.Pos}{the initial position on opening the trade} +#' \item{Max.Pos}{the maximum (largest) position held during the open trade} +#' \item{Num.Txns}{ the number of transactions included in this trade} +#' \item{Max.Notional.Cost}{ the largest notional investment cost of this trade} +#' \item{Net.Trading.PL}{ net trading P&L in the currency of \code{Symbol}} +#' \item{MAE}{ Maximum Adverse Excursion (MAE), in the currency of \code{Symbol}} +#' \item{MFE}{ Maximum Favorable Excursion (MFE), in the currency of \code{Symbol}} +#' \item{Pct.Net.Trading.PL}{ net trading P&L in percent of invested \code{Symbol} price gained or lost} +#' \item{Pct.MAE}{ Maximum Adverse Excursion (MAE), in percent} +#' \item{Pct.MFE}{ Maximum Favorable Excursion (MFE), in percent} +#' \item{tick.Net.Trading.PL}{ net trading P&L in ticks} +#' \item{tick.MAE}{ Maximum Adverse Excursion (MAE) in ticks} +#' \item{tick.MFE}{ Maximum Favorable Excursion (MFE) in ticks} +#' } +#' @export +#' TODO: decide which of these columns are actually important +#' TODO: add option for opening order/trade pairing rather than closing +tradeOrderStats <- function(portfolio, symbol, ...) { + stats.table <- perTradeStats(Portfolio=portfolio,Symbol=symbol,...) + stats.xts <- as.xts(stats_table, order.by=stats.table$End) + orderbook <- getOrderBook(portfolio=Portfolio)[[Portfolio]][[symbol]] + closed <- orderbook[which(orderbook$Order.Status=='closed'),] + closed.xts <- xts(closed, as.POSIXct(as.vector(closed$Order.StatusTime), format='%Y-%m-%d %H:%M:%OS')) + merged.table <- merge(closed.xts,stats.xts) + merged.closed <- merged.table[index(stats.xts)] + return(merged.closed) +} + + +############################################################################### +# R (http://r-project.org/) Quantitative Strategy Model Framework +# +# Copyright (c) 2009-2012 +# Peter Carl, Dirk Eddelbuettel, Brian G. Peterson, +# Jeffrey Ryan, Joshua Ulrich, and Garrett See +# +# This library is distributed under the terms of the GNU Public License (GPL) +# for full details see the file COPYING +# +# $Id: ruleOrderProc.R 1435 2013-04-16 15:23:34Z bodanker $ +# +############################################################################### Property changes on: pkg/quantstrat/R/tradeOrderStats.R ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: pkg/quantstrat/R/walk.forward.R =================================================================== --- pkg/quantstrat/R/walk.forward.R 2013-04-22 01:34:03 UTC (rev 1444) +++ pkg/quantstrat/R/walk.forward.R 2013-04-23 22:23:04 UTC (rev 1445) @@ -7,7 +7,7 @@ # This library is distributed under the terms of the GNU Public License (GPL) # for full details see the file COPYING # -# $Id: parameters.R 1218 2012-10-11 20:47:44Z opentrades $ +# $Id$ # ############################################################################### # Property changes on: pkg/quantstrat/R/walk.forward.R ___________________________________________________________________ Added: svn:keywords + Id Date Author Modified: pkg/quantstrat/demo/maCross.R =================================================================== --- pkg/quantstrat/demo/maCross.R 2013-04-22 01:34:03 UTC (rev 1444) +++ pkg/quantstrat/demo/maCross.R 2013-04-23 22:23:04 UTC (rev 1445) @@ -22,11 +22,11 @@ ##### PLACE DEMO AND TEST DATES HERE ################# # -if(isTRUE(options('in_test')$in_test)) +if(isTRUE(options('in_test')$in_test)){ # use test dates - {initDate="2011-01-01" + initDate="2011-01-01" endDate="2012-12-31" - } else { +} else { # use demo defaults initDate="1999-12-31" endDate=Sys.Date() @@ -36,7 +36,7 @@ portfolio.st='macross' account.st='macross' initPortf(portfolio.st,symbols=stock.str, initDate=initDate) -initAcct(account.st,portfolios=portfolio.st, initDate=initDate) +initAcct(account.st,portfolios=portfolio.st, initDate=initDate,initEq=initEq) initOrders(portfolio=portfolio.st,initDate=initDate) stratMACROSS<- strategy(portfolio.st) @@ -74,6 +74,12 @@ add_SMA(n=50 , on=1,col='blue') add_SMA(n=200, on=1) +book = getOrderBook('macross') +stats = tradeStats('macross') +ptstats = perTradeStats('macross') +rets = PortfReturns('macross') +txns = getTxns('macross', stock.str) + #Date workaround, remove later Sys.setenv(TZ=ttz) Modified: pkg/quantstrat/man/addOrder.Rd =================================================================== --- pkg/quantstrat/man/addOrder.Rd 2013-04-22 01:34:03 UTC (rev 1444) +++ pkg/quantstrat/man/addOrder.Rd 2013-04-23 22:23:04 UTC (rev 1445) @@ -48,8 +48,10 @@ \item{tmult}{if TRUE, threshold is a percent multiplier for \code{price}, not a scalar. Threshold is converted to - a scalar by multiplying it with the price, then added to - the price just like a scalar threshold.} + a scalar by multiplying it with the price at the time of + order entry (i.e. the scalar will not change if the order + is updated, as in the case of a trailing stop), then it + is added to the price just like a scalar threshold.} \item{replace}{TRUE/FALSE, whether to replace any other open order(s) on this symbol with the same properties as @@ -145,10 +147,15 @@ order types are the only order types that make use of the order \code{threshold}. Thresholds may be specified in one of 2 ways: as a scalar (\code{tmult=FALSE}) or as a - multiplier for the current price (\code{tmult=TRUE}). The - threshold is then added to the prefered order price upon - order entry. The correct sign for the threshold (pos or - neg, ie. add or subtract) is automagically figured out + multiplier for the current price (\code{tmult=TRUE}). If + \code{tmult=TRUE}, \code{threshold} is converted to a + scalar by multiplying it with the price at the time of + order entry, and the scalar will not change if the order + is updated. + + The threshold is then added to the prefered order price + upon order entry. The correct sign for the threshold (pos + or neg, ie. add or subtract) is automagically figured out from the order side and the order quantity (buy or sell); if the user provides the wrong sign for the threshold, then it will be reversed. In other words, the user may Modified: pkg/quantstrat/man/getOrderBook.Rd =================================================================== --- pkg/quantstrat/man/getOrderBook.Rd 2013-04-22 01:34:03 UTC (rev 1444) +++ pkg/quantstrat/man/getOrderBook.Rd 2013-04-23 22:23:04 UTC (rev 1445) @@ -11,9 +11,17 @@ \item{envir}{the environment to retrieve the orderbook object from, defaults to .strategy} } +\value{ + A \code{data.frame} containing: + + \describe{ \item{Order.Qty}{} \item{Order.Price}{} + \item{Order.Type}{} \item{Order.Side}{} + \item{Order.Threshold}{} \item{Order.Status}{} + \item{Order.StatusTime}{} \item{Prefer}{} + \item{Order.Set}{} \item{Txn.Fees}{} \item{Rule}{} } +} \description{ - I don't think this should be exported, but it is for now - while we're in test mode. + get the order book object } \seealso{ addOrder Modified: pkg/quantstrat/man/ruleRevoke.Rd =================================================================== --- pkg/quantstrat/man/ruleRevoke.Rd 2013-04-22 01:34:03 UTC (rev 1444) +++ pkg/quantstrat/man/ruleRevoke.Rd 2013-04-23 22:23:04 UTC (rev 1445) @@ -37,13 +37,13 @@ As described elsewhere in the documentation, quantstrat models \emph{orders}. All orders in quantstrat are GTC orders, which means that unfilled limit orders have to be - revokeled manually or replaced by other orders. + canceled manually or replaced by other orders. } \details{ This function is used for revoking or canceling the orders based on a signal. Order status will be changed to 'revoked', to separate it from cancelations or - replacements from other causes. THis may make it easier + replacements from other causes. This may make it easier it decipher the order book to figure out what the strategy ewas doing. } Modified: pkg/quantstrat/man/ruleSignal.Rd =================================================================== --- pkg/quantstrat/man/ruleSignal.Rd 2013-04-22 01:34:03 UTC (rev 1444) +++ pkg/quantstrat/man/ruleSignal.Rd 2013-04-23 22:23:04 UTC (rev 1445) @@ -40,9 +40,11 @@ mktdata, default NULL, see Details} \item{tmult}{if TRUE, threshold is a percent multiplier - for \code{price}, not a scalar to be added/subtracted - from price. threshold will be dynamically converted to a - scalar at time of order entry} + for \code{price}, not a scalar. Threshold is converted to + a scalar by multiplying it with the price at the time of + order entry (i.e. the scalar will not change if the order + is updated, as in the case of a trailing stop), then it + is added to the price just like a scalar threshold.} \item{replace}{TRUE/FALSE, whether to replace any other open order(s) on this portfolio symbol, default TRUE} Added: pkg/quantstrat/man/tradeOrderStats.Rd =================================================================== --- pkg/quantstrat/man/tradeOrderStats.Rd (rev 0) +++ pkg/quantstrat/man/tradeOrderStats.Rd 2013-04-23 22:23:04 UTC (rev 1445) @@ -0,0 +1,52 @@ +\name{tradeOrderStats} +\alias{tradeOrderStats} +\title{get order information associated with closing positions} +\usage{ + tradeOrderStats(portfolio, symbol, ...) +} +\arguments{ + \item{portfolio}{text name of the portfolio the order + book is associated with} + + \item{symbol}{text string defining the symbol to get + trades and orders for} + + \item{...}{any other passthrough parameters} +} +\value{ + A \code{xts} object containing: + + \describe{ \item{Order.Qty}{} \item{Order.Price}{} + \item{Order.Type}{} \item{Order.Side}{} + \item{Order.Threshold}{} \item{Order.Status}should be + 'closed' only{} \item{Order.StatusTime}{time of the + closing trade, should match 'End' column} + \item{Prefer}{prefer argument for \code{getPrice}} + \item{Order.Set}{order set of the closing trade} + \item{Txn.Fees}{and fees applied to the closing trade} + \item{Rule}{the name of the rule that generated the order + which closed the position} \item{Start}{the + \code{POSIXct} timestamp of the start of the trade} + \item{Init.Pos}{the initial position on opening the + trade} \item{Max.Pos}{the maximum (largest) position held + during the open trade} \item{Num.Txns}{ the number of + transactions included in this trade} + \item{Max.Notional.Cost}{ the largest notional investment + cost of this trade} \item{Net.Trading.PL}{ net trading + P&L in the currency of \code{Symbol}} \item{MAE}{ Maximum + Adverse Excursion (MAE), in the currency of + \code{Symbol}} \item{MFE}{ Maximum Favorable Excursion + (MFE), in the currency of \code{Symbol}} + \item{Pct.Net.Trading.PL}{ net trading P&L in percent of + invested \code{Symbol} price gained or lost} + \item{Pct.MAE}{ Maximum Adverse Excursion (MAE), in + percent} \item{Pct.MFE}{ Maximum Favorable Excursion + (MFE), in percent} \item{tick.Net.Trading.PL}{ net + trading P&L in ticks} \item{tick.MAE}{ Maximum Adverse + Excursion (MAE) in ticks} \item{tick.MFE}{ Maximum + Favorable Excursion (MFE) in ticks} } +} +\description{ + get order information associated with closing positions +} + From noreply at r-forge.r-project.org Wed Apr 24 00:40:04 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Wed, 24 Apr 2013 00:40:04 +0200 (CEST) Subject: [Blotter-commits] r1446 - in pkg/quantstrat: . R man Message-ID: <20130423224004.1380E184D4F@r-forge.r-project.org> Author: braverock Date: 2013-04-24 00:40:03 +0200 (Wed, 24 Apr 2013) New Revision: 1446 Modified: pkg/quantstrat/NAMESPACE pkg/quantstrat/R/tradeOrderStats.R pkg/quantstrat/man/tradeOrderStats.Rd Log: - fix roxygen comment mixup Modified: pkg/quantstrat/NAMESPACE =================================================================== --- pkg/quantstrat/NAMESPACE 2013-04-23 22:23:04 UTC (rev 1445) +++ pkg/quantstrat/NAMESPACE 2013-04-23 22:40:03 UTC (rev 1446) @@ -1,5 +1,3 @@ -export(actually) -export(add) export(add.constraint) export(add.distribution) export(add.indicator) @@ -15,35 +13,23 @@ export(applySignals) export(applyStrategy) export(applyStrategy.rebalancing) -export(are) export(chart.forward.testing) export(chart.forward.training) -export(closing) -export(columns) -export(decide) export(delete.paramset) -export("for") export(getOrderBook) export(getOrders) export(getParameterTable) export(getPosLimit) export(getStrategy) -export(important) export(initOrders) export(initStrategy) export(is.strategy) export(load.strategy) export(match.names) -export(of) -export(opening) -export(option) -export("order/trade") export(osMaxPos) export(osNoOp) -export(pairing) export(put.orderbook) export(put.strategy) -export(rather) export(rm.strat) export(ruleOrderProc) export(rulePctEquity) @@ -58,11 +44,8 @@ export(sigPeak) export(sigThreshold) export(strategy) -export(than) -export(these) -export("TODO:") export(tradeGraphs) +export(tradeOrderStats) export(updateOrders) export(updateStrategy) export(walk.forward) -export(which) Modified: pkg/quantstrat/R/tradeOrderStats.R =================================================================== --- pkg/quantstrat/R/tradeOrderStats.R 2013-04-23 22:23:04 UTC (rev 1445) +++ pkg/quantstrat/R/tradeOrderStats.R 2013-04-23 22:40:03 UTC (rev 1446) @@ -1,5 +1,9 @@ #' get order information associated with closing positions #' +#' +#' +#' TODO: decide which of these columns are actually important +#' TODO: add option for opening order/trade pairing rather than closing #' #' @param portfolio text name of the portfolio the order book is associated with #' @param symbol text string defining the symbol to get trades and orders for @@ -35,8 +39,6 @@ #' \item{tick.MFE}{ Maximum Favorable Excursion (MFE) in ticks} #' } #' @export -#' TODO: decide which of these columns are actually important -#' TODO: add option for opening order/trade pairing rather than closing tradeOrderStats <- function(portfolio, symbol, ...) { stats.table <- perTradeStats(Portfolio=portfolio,Symbol=symbol,...) stats.xts <- as.xts(stats_table, order.by=stats.table$End) Modified: pkg/quantstrat/man/tradeOrderStats.Rd =================================================================== --- pkg/quantstrat/man/tradeOrderStats.Rd 2013-04-23 22:23:04 UTC (rev 1445) +++ pkg/quantstrat/man/tradeOrderStats.Rd 2013-04-23 22:40:03 UTC (rev 1446) @@ -47,6 +47,11 @@ Favorable Excursion (MFE) in ticks} } } \description{ - get order information associated with closing positions + } +\details{ + TODO: decide which of these columns are actually + important TODO: add option for opening order/trade + pairing rather than closing +} From noreply at r-forge.r-project.org Wed Apr 24 18:00:40 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Wed, 24 Apr 2013 18:00:40 +0200 (CEST) Subject: [Blotter-commits] r1447 - pkg/quantstrat/R Message-ID: <20130424160040.1F40E185134@r-forge.r-project.org> Author: braverock Date: 2013-04-24 18:00:39 +0200 (Wed, 24 Apr 2013) New Revision: 1447 Modified: pkg/quantstrat/R/tradeOrderStats.R Log: - fix variable names after changing punctuation. thanks to Scott Schmidt for pointing out. Modified: pkg/quantstrat/R/tradeOrderStats.R =================================================================== --- pkg/quantstrat/R/tradeOrderStats.R 2013-04-23 22:40:03 UTC (rev 1446) +++ pkg/quantstrat/R/tradeOrderStats.R 2013-04-24 16:00:39 UTC (rev 1447) @@ -41,8 +41,8 @@ #' @export tradeOrderStats <- function(portfolio, symbol, ...) { stats.table <- perTradeStats(Portfolio=portfolio,Symbol=symbol,...) - stats.xts <- as.xts(stats_table, order.by=stats.table$End) - orderbook <- getOrderBook(portfolio=Portfolio)[[Portfolio]][[symbol]] + stats.xts <- as.xts(stats.table, order.by=stats.table$End) + orderbook <- getOrderBook(portfolio=portfolio)[[portfolio]][[symbol]] closed <- orderbook[which(orderbook$Order.Status=='closed'),] closed.xts <- xts(closed, as.POSIXct(as.vector(closed$Order.StatusTime), format='%Y-%m-%d %H:%M:%OS')) merged.table <- merge(closed.xts,stats.xts) From noreply at r-forge.r-project.org Wed Apr 24 21:52:23 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Wed, 24 Apr 2013 21:52:23 +0200 (CEST) Subject: [Blotter-commits] r1448 - pkg/quantstrat/demo Message-ID: <20130424195224.091E718502F@r-forge.r-project.org> Author: opentrades Date: 2013-04-24 21:52:23 +0200 (Wed, 24 Apr 2013) New Revision: 1448 Added: pkg/quantstrat/demo/luxor.7.MAE.stoploss.R pkg/quantstrat/demo/luxor.7.MAE.stoptrailing.R pkg/quantstrat/demo/luxor.7.MFE.takeprofit.R pkg/quantstrat/demo/luxor.getSymbols.R pkg/quantstrat/demo/luxor.include.R Removed: pkg/quantstrat/demo/luxor-3.11.R pkg/quantstrat/demo/luxor-3.12.R pkg/quantstrat/demo/luxor-3.16.R pkg/quantstrat/demo/luxor.symbols.R Modified: pkg/quantstrat/demo/luxor.1.strategy.R pkg/quantstrat/demo/luxor.3.paramset.sma.R pkg/quantstrat/demo/luxor.5.orderchains.R pkg/quantstrat/demo/luxor.6.paramset.stoploss.R pkg/quantstrat/demo/luxor.6.paramset.stoptrailing.R pkg/quantstrat/demo/luxor.6.paramset.takeprofit.R Log: - various improvements to luxor demos Deleted: pkg/quantstrat/demo/luxor-3.11.R =================================================================== --- pkg/quantstrat/demo/luxor-3.11.R 2013-04-24 16:00:39 UTC (rev 1447) +++ pkg/quantstrat/demo/luxor-3.11.R 2013-04-24 19:52:23 UTC (rev 1448) @@ -1,35 +0,0 @@ -#!/usr/bin/Rscript --vanilla -# -# Jan Humme (@opentrades) - August 2012 -# -# Tested and found to work correctly using blotter r1143 -# -# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) -# -# Figure 3.11: MAE graph of Luxor system - -require('blotter') - -data('luxor-p066', package='quantstrat', envir=.blotter) - -currency(c('GBP', 'USD')) -exchange_rate(c('GBPUSD'), tick_size=0.0001) - -chart.ME('luxor', 'GBPUSD', type='MAE', scale='cash') - -##### PLACE DEMO AND TEST DATES HERE ################# -# -#if(isTRUE(options('in_test')$in_test)) -# # use test dates -# {initDate="2011-01-01" -# endDate="2012-12-31" -# } else -# # use demo defaults -# {initDate="1999-12-31" -# endDate=Sys.Date()} - -##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### -# book = getOrderBook(port) -# stats = tradeStats(port) -# rets = PortfReturns(acct) -################################################################ Deleted: pkg/quantstrat/demo/luxor-3.12.R =================================================================== --- pkg/quantstrat/demo/luxor-3.12.R 2013-04-24 16:00:39 UTC (rev 1447) +++ pkg/quantstrat/demo/luxor-3.12.R 2013-04-24 19:52:23 UTC (rev 1448) @@ -1,35 +0,0 @@ -#!/usr/bin/Rscript --vanilla -# -# Jan Humme (@opentrades) - August 2012 -# -# Tested and found to work correctly using blotter r1143 -# -# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) -# -# Figure 3.12: MAE graph in percentage terms - -require('blotter') - -data('luxor-p066', package='quantstrat', envir=.blotter) - -currency(c('GBP', 'USD')) -exchange_rate(c('GBPUSD'), tick_size=0.0001) - -chart.ME('luxor', type='MAE', scale='percent') - -##### PLACE DEMO AND TEST DATES HERE ################# -# -#if(isTRUE(options('in_test')$in_test)) -# # use test dates -# {initDate="2011-01-01" -# endDate="2012-12-31" -# } else -# # use demo defaults -# {initDate="1999-12-31" -# endDate=Sys.Date()} - -##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### -# book = getOrderBook(port) -# stats = tradeStats(port) -# rets = PortfReturns(acct) -################################################################ Deleted: pkg/quantstrat/demo/luxor-3.16.R =================================================================== --- pkg/quantstrat/demo/luxor-3.16.R 2013-04-24 16:00:39 UTC (rev 1447) +++ pkg/quantstrat/demo/luxor-3.16.R 2013-04-24 19:52:23 UTC (rev 1448) @@ -1,35 +0,0 @@ -#!/usr/bin/Rscript --vanilla -# -# Jan Humme (@opentrades) - August 2012 -# -# Tested and found to work correctly using blotter r1143 -# -# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) -# -# Figure 3.16: MFE graph in percentage terms - -require('blotter') - -data('luxor-p066', package='quantstrat', envir=.blotter) - -currency(c('GBP', 'USD')) -exchange_rate(c('GBPUSD'), tick_size=0.0001) - -chart.ME('luxor', type='MFE', scale='percent') - -##### PLACE DEMO AND TEST DATES HERE ################# -# -#if(isTRUE(options('in_test')$in_test)) -# # use test dates -# {initDate="2011-01-01" -# endDate="2012-12-31" -# } else -# # use demo defaults -# {initDate="1999-12-31" -# endDate=Sys.Date()} - -##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### -# book = getOrderBook(port) -# stats = tradeStats(port) -# rets = PortfReturns(acct) -################################################################ Modified: pkg/quantstrat/demo/luxor.1.strategy.R =================================================================== --- pkg/quantstrat/demo/luxor.1.strategy.R 2013-04-24 16:00:39 UTC (rev 1447) +++ pkg/quantstrat/demo/luxor.1.strategy.R 2013-04-24 19:52:23 UTC (rev 1448) @@ -16,10 +16,6 @@ .fast = 10 .slow = 30 -.orderqty = 100000 -.threshold = 0.0005 -.txn.fees = -30 - ##### PLACE DEMO AND TEST DATES HERE ################# # #if(isTRUE(options('in_test')$in_test)) @@ -31,16 +27,9 @@ # {initDate="1999-12-31" # endDate=Sys.Date()} -initDate = '2002-10-21' +source('luxor.include.R') +source('luxor.getSymbols.R') -#### - -strategy.st = 'luxor' -portfolio.st = 'forex' -account.st = 'IB1' - -source('luxor.symbols.R') - ### blotter initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') @@ -97,7 +86,7 @@ orderside='short', ordertype='market', orderqty='all', - TxnFees=.txn.fees, + TxnFees=.txnfees, replace=TRUE ), type='exit', @@ -109,7 +98,7 @@ orderside='long' , ordertype='market', orderqty='all', - TxnFees=.txn.fees, + TxnFees=.txnfees, replace=TRUE ), type='exit', Modified: pkg/quantstrat/demo/luxor.3.paramset.sma.R =================================================================== --- pkg/quantstrat/demo/luxor.3.paramset.sma.R 2013-04-24 16:00:39 UTC (rev 1447) +++ pkg/quantstrat/demo/luxor.3.paramset.sma.R 2013-04-24 19:52:23 UTC (rev 1448) @@ -15,16 +15,9 @@ ### -initDate = '2002-10-21' +source('luxor.include.R') +source('luxor.getSymbols.R') -#### - -strategy.st = 'luxor' -portfolio.st = 'forex' -account.st = 'IB1' - -source('luxor.symbols.R') - ### blotter initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') Modified: pkg/quantstrat/demo/luxor.5.orderchains.R =================================================================== --- pkg/quantstrat/demo/luxor.5.orderchains.R 2013-04-24 16:00:39 UTC (rev 1447) +++ pkg/quantstrat/demo/luxor.5.orderchains.R 2013-04-24 19:52:23 UTC (rev 1448) @@ -10,19 +10,6 @@ options(width = 240) #Sys.setenv(TZ="GMT") -.fast = 1 -.slow = 44 - -.qty=100000 -.th=0.0005 -.txn=-30 -.timespan = 'T08:00/T12:00' -.timespan = 'T00:00/T23:59' - -.stoploss=0.001 -.stoptrailing=0.0015 -.takeprofit=0.003 - ##### PLACE DEMO AND TEST DATES HERE ################# # #if(isTRUE(options('in_test')$in_test)) @@ -34,71 +21,47 @@ # {initDate="1999-12-31" # endDate=Sys.Date()} -initDate = '2002-10-21' .from='2002-10-21' #.to='2008-07-04' .to='2002-10-31' -#.to='2002-12-31' -#.to='2003-12-31' -#.from='2006-01-01' -#.to='2006-12-31' -#.from='2007-01-01' -#.to='2007-12-31' -#### - -s = 'luxor' -p = 'forex' -a = 'IB1' - ### -require(quantstrat) +source('luxor.include.R') +source('luxor.getSymbols.R') -currency(c('GBP', 'USD')) +### blotter -exchange_rate(c('GBPUSD'), tick_size=0.0001) +initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') +initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') -setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') +### quantstrat -### +initOrders(portfolio.st, initDate=initDate) -getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) -GBPUSD = to.minutes30(GBPUSD) -GBPUSD = align.time(to.minutes30(GBPUSD), 1800) +### define strategy -### - -initPortf(p, symbols='GBPUSD', initDate=initDate, currency='USD') -initAcct(a, portfolios=p, initDate=initDate, currency='USD') - -### - -initOrders(p, initDate=initDate) - -### strategy ###################################################################### - addPosLimit( - portfolio=p, + portfolio=portfolio.st, symbol='GBPUSD', timestamp=initDate, - maxpos=.qty) + maxpos=.orderqty) -strategy(s, store=TRUE) +strategy(strategy.st, store=TRUE) ### indicators -add.indicator(s, name = "SMA", +add.indicator(strategy.st, name = "SMA", arguments = list( - x = quote(Cl(mktdata)), + x = quote(Cl(mktdata)[,1]), n = .fast ), label="nFast" ) -add.indicator(s, name="SMA", +add.indicator(strategy.st, name="SMA", arguments = list( - x = quote(Cl(mktdata)), + x = quote(Cl(mktdata)[,1]), n = .slow ), label="nSlow" @@ -106,7 +69,7 @@ ### signals -add.signal(s, name = 'sigCrossover', +add.signal(strategy.st, name='sigCrossover', arguments = list( columns=c("nFast","nSlow"), relationship="gte" @@ -114,7 +77,7 @@ label='long' ) -add.signal(s, name = 'sigCrossover', +add.signal(strategy.st, name='sigCrossover', arguments = list( columns=c("nFast","nSlow"), relationship="lt" @@ -126,36 +89,34 @@ ### stop-loss -add.rule(s, name = 'ruleSignal', +add.rule(strategy.st, name = 'ruleSignal', arguments=list(sigcol='long' , sigval=TRUE, replace=FALSE, orderside='long', ordertype='stoplimit', tmult=TRUE, threshold=.stoploss, - TxnFees=.txn, + TxnFees=.txnfees, orderqty='all', orderset='ocolong' ), - type='chain', - parent='EnterLONG', + type='chain', parent='EnterLONG', label='StopLossLONG', storefun=FALSE ) -add.rule(s, name = 'ruleSignal', +add.rule(strategy.st, name = 'ruleSignal', arguments=list(sigcol='short' , sigval=TRUE, replace=FALSE, orderside='short', ordertype='stoplimit', tmult=TRUE, threshold=.stoploss, - TxnFees=.txn, + TxnFees=.txnfees, orderqty='all', orderset='ocoshort' ), - type='chain', - parent='EnterSHORT', + type='chain', parent='EnterSHORT', label='StopLossSHORT', storefun=FALSE ) @@ -164,36 +125,34 @@ if(TRUE) { -add.rule(s, name = 'ruleSignal', +add.rule(strategy.st, name = 'ruleSignal', arguments=list(sigcol='long' , sigval=TRUE, replace=FALSE, orderside='long', ordertype='stoptrailing', tmult=TRUE, threshold=.stoptrailing, - TxnFees=.txn, + TxnFees=.txnfees, orderqty='all', orderset='ocolong' ), - type='chain', - parent='EnterLONG', + type='chain', parent='EnterLONG', label='StopTrailingLONG', storefun=FALSE ) -add.rule(s, name = 'ruleSignal', +add.rule(strategy.st, name = 'ruleSignal', arguments=list(sigcol='short' , sigval=TRUE, replace=FALSE, orderside='short', ordertype='stoptrailing', tmult=TRUE, threshold=.stoptrailing, - TxnFees=.txn, + TxnFees=.txnfees, orderqty='all', orderset='ocoshort' ), - type='chain', - parent='EnterSHORT', + type='chain', parent='EnterSHORT', label='StopTrailingSHORT', storefun=FALSE ) @@ -201,48 +160,46 @@ ### take-profit -add.rule(s, name = 'ruleSignal', +add.rule(strategy.st, name = 'ruleSignal', arguments=list(sigcol='long' , sigval=TRUE, replace=FALSE, orderside='long', ordertype='limit', tmult=TRUE, threshold=.takeprofit, - TxnFees=.txn, + TxnFees=.txnfees, orderqty='all', orderset='ocolong' ), - type='chain', - parent='EnterLONG', + type='chain', parent='EnterLONG', label='TakeProfitLONG', storefun=FALSE ) -add.rule(s, name = 'ruleSignal', +add.rule(strategy.st, name = 'ruleSignal', arguments=list(sigcol='short' , sigval=TRUE, replace=FALSE, orderside='short', ordertype='limit', tmult=TRUE, threshold=.takeprofit, - TxnFees=.txn, + TxnFees=.txnfees, orderqty='all', orderset='ocoshort' ), - type='chain', - parent='EnterSHORT', + type='chain', parent='EnterSHORT', label='TakeProfitSHORT', storefun=FALSE ) ### -add.rule(s, name = 'ruleSignal', +add.rule(strategy.st, name = 'ruleSignal', arguments=list(sigcol='long' , sigval=TRUE, replace=TRUE, orderside='short', ordertype='market', - TxnFees=.txn, + TxnFees=.txnfees, orderqty='all', orderset='ocoshort' ), @@ -252,12 +209,12 @@ storefun=FALSE ) -add.rule(s, name = 'ruleSignal', +add.rule(strategy.st, name = 'ruleSignal', arguments=list(sigcol='short', sigval=TRUE, replace=TRUE, orderside='long' , ordertype='market', - TxnFees=.txn, + TxnFees=.txnfees, orderqty='all', orderset='ocolong' ), @@ -267,15 +224,15 @@ storefun=FALSE ) -add.rule(s, name = 'ruleSignal', +add.rule(strategy.st, name = 'ruleSignal', arguments=list(sigcol='long' , sigval=TRUE, replace=FALSE, orderside='long' , ordertype='stoplimit', prefer='High', - threshold=.th, + threshold=.threshold, TxnFees=0, - orderqty=+.qty, + orderqty=+.orderqty, osFUN=osMaxPos, orderset='ocolong' ), @@ -285,15 +242,15 @@ storefun=FALSE ) -add.rule(s, name = 'ruleSignal', +add.rule(strategy.st, name = 'ruleSignal', arguments=list(sigcol='short', sigval=TRUE, replace=FALSE, orderside='short', ordertype='stoplimit', prefer='Low', - threshold=.th, + threshold=.threshold, TxnFees=0, - orderqty=-.qty, + orderqty=-.orderqty, osFUN=osMaxPos, orderset='ocoshort' ), @@ -307,24 +264,26 @@ ############################################################################### -applyStrategy(s, p, verbose = FALSE) -#applyStrategy(s, p, prefer='Open', verbose = FALSE) +applyStrategy(strategy.st, portfolio.st, verbose = FALSE) +#applyStrategy(strategy.st, p, prefer='Open', verbose = FALSE) -updatePortf(p, Symbols='GBPUSD', ,Dates=paste('::',as.Date(Sys.time()),sep='')) +updatePortf(portfolio.st, Symbols='GBPUSD', ,Dates=paste('::',as.Date(Sys.time()),sep='')) ############################################################################### -chart.Posn(p, "GBPUSD") +chart.Posn(portfolio.st, "GBPUSD") -print(getOrderBook(p)) +print(getOrderBook(portfolio.st)) -#txns <- getTxns(p, 'GBPUSD') +#txns <- getTxns(portfolio.st, 'GBPUSD') #txns ##txns$Net #cat('Net profit:', sum(txns$Net.Txn.Realized.PL), '\n') -print(tradeStats(p, 'GBPUSD')) +print(tradeStats(portfolio.st, 'GBPUSD')) +save.strategy(strategy.st) + ##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### # book = getOrderBook(port) # stats = tradeStats(port) Modified: pkg/quantstrat/demo/luxor.6.paramset.stoploss.R =================================================================== --- pkg/quantstrat/demo/luxor.6.paramset.stoploss.R 2013-04-24 16:00:39 UTC (rev 1447) +++ pkg/quantstrat/demo/luxor.6.paramset.stoploss.R 2013-04-24 19:52:23 UTC (rev 1448) @@ -13,15 +13,6 @@ options(width = 240) #Sys.setenv(TZ="GMT") -.qty=100000 - -.fast = 10 -.slow = 30 - -.qty=100000 -.th=0.0005 -.txn=0 - ##### PLACE DEMO AND TEST DATES HERE ################# # #if(isTRUE(options('in_test')$in_test)) @@ -33,24 +24,17 @@ # {initDate="1999-12-31" # endDate=Sys.Date()} -initDate = '2002-10-21' +source('luxor.include.R') +source('luxor.getSymbols.R') -source('luxor.symbols.R') - ### -strategy.st = 'luxor' -portfolio.st = 'forex' -account.st = 'IB1' - -source('luxor.symbols.R') - initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') addPosLimit( portfolio=portfolio.st, symbol='GBPUSD', timestamp=initDate, - maxpos=.qty) + maxpos=.orderqty) initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') Modified: pkg/quantstrat/demo/luxor.6.paramset.stoptrailing.R =================================================================== --- pkg/quantstrat/demo/luxor.6.paramset.stoptrailing.R 2013-04-24 16:00:39 UTC (rev 1447) +++ pkg/quantstrat/demo/luxor.6.paramset.stoptrailing.R 2013-04-24 19:52:23 UTC (rev 1448) @@ -13,15 +13,6 @@ options(width = 240) Sys.setenv(TZ='UTC') -.qty=100000 - -.fast = 10 -.slow = 30 - -.qty=100000 -.th=0.0005 -.txn=0 - ##### PLACE DEMO AND TEST DATES HERE ################# # #if(isTRUE(options('in_test')$in_test)) @@ -33,22 +24,17 @@ # {initDate="1999-12-31" # endDate=Sys.Date()} -initDate = '2002-10-21' +source('luxor.include.R') +source('luxor.getSymbols.R') -source('luxor.symbols.R') - ### -strategy.st = 'luxor' -portfolio.st = 'forex' -account.st = 'IB1' - initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') addPosLimit( portfolio=portfolio.st, symbol='GBPUSD', timestamp=initDate, - maxpos=.qty) + maxpos=.orderqty) initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') Modified: pkg/quantstrat/demo/luxor.6.paramset.takeprofit.R =================================================================== --- pkg/quantstrat/demo/luxor.6.paramset.takeprofit.R 2013-04-24 16:00:39 UTC (rev 1447) +++ pkg/quantstrat/demo/luxor.6.paramset.takeprofit.R 2013-04-24 19:52:23 UTC (rev 1448) @@ -13,15 +13,6 @@ options(width = 240) Sys.setenv(TZ='UTC') -.qty=100000 - -.fast = 10 -.slow = 30 - -.qty=100000 -.th=0.0005 -.txn=0 - ##### PLACE DEMO AND TEST DATES HERE ################# # #if(isTRUE(options('in_test')$in_test)) @@ -33,22 +24,17 @@ # {initDate="1999-12-31" # endDate=Sys.Date()} -initDate = '2002-10-21' +source('luxor.include.R') +source('luxor.getSymbols.R') -source('luxor.symbols.R') - ### -strategy.st = 'luxor' -portfolio.st = 'forex' -account.st = 'IB1' - initPortf(portfolio.st, symbols='GBPUSD', initDate=initDate, currency='USD') addPosLimit( portfolio=portfolio.st, symbol='GBPUSD', timestamp=initDate, - maxpos=.qty) + maxpos=.orderqty) initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD') Copied: pkg/quantstrat/demo/luxor.7.MAE.stoploss.R (from rev 1447, pkg/quantstrat/demo/luxor-3.11.R) =================================================================== --- pkg/quantstrat/demo/luxor.7.MAE.stoploss.R (rev 0) +++ pkg/quantstrat/demo/luxor.7.MAE.stoploss.R 2013-04-24 19:52:23 UTC (rev 1448) @@ -0,0 +1,35 @@ +#!/usr/bin/Rscript --vanilla +# +# Jan Humme (@opentrades) - August 2012 +# +# Tested and found to work correctly using blotter r1143 +# +# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) +# +# Figure 3.11: MAE graph of Luxor system + +require('blotter') + +data('luxor-p066', package='quantstrat', envir=.blotter) + +currency(c('GBP', 'USD')) +exchange_rate(c('GBPUSD'), tick_size=0.0001) + +chart.ME('luxor', 'GBPUSD', type='MAE', scale='cash') + +##### PLACE DEMO AND TEST DATES HERE ################# +# +#if(isTRUE(options('in_test')$in_test)) +# # use test dates +# {initDate="2011-01-01" +# endDate="2012-12-31" +# } else +# # use demo defaults +# {initDate="1999-12-31" +# endDate=Sys.Date()} + +##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### +# book = getOrderBook(port) +# stats = tradeStats(port) +# rets = PortfReturns(acct) +################################################################ Copied: pkg/quantstrat/demo/luxor.7.MAE.stoptrailing.R (from rev 1447, pkg/quantstrat/demo/luxor-3.12.R) =================================================================== --- pkg/quantstrat/demo/luxor.7.MAE.stoptrailing.R (rev 0) +++ pkg/quantstrat/demo/luxor.7.MAE.stoptrailing.R 2013-04-24 19:52:23 UTC (rev 1448) @@ -0,0 +1,35 @@ +#!/usr/bin/Rscript --vanilla +# +# Jan Humme (@opentrades) - August 2012 +# +# Tested and found to work correctly using blotter r1143 +# +# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) +# +# Figure 3.12: MAE graph in percentage terms + +require('blotter') + +data('luxor-p066', package='quantstrat', envir=.blotter) + +currency(c('GBP', 'USD')) +exchange_rate(c('GBPUSD'), tick_size=0.0001) + +chart.ME('luxor', type='MAE', scale='percent') + +##### PLACE DEMO AND TEST DATES HERE ################# +# +#if(isTRUE(options('in_test')$in_test)) +# # use test dates +# {initDate="2011-01-01" +# endDate="2012-12-31" +# } else +# # use demo defaults +# {initDate="1999-12-31" +# endDate=Sys.Date()} + +##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### +# book = getOrderBook(port) +# stats = tradeStats(port) +# rets = PortfReturns(acct) +################################################################ Copied: pkg/quantstrat/demo/luxor.7.MFE.takeprofit.R (from rev 1447, pkg/quantstrat/demo/luxor-3.16.R) =================================================================== --- pkg/quantstrat/demo/luxor.7.MFE.takeprofit.R (rev 0) +++ pkg/quantstrat/demo/luxor.7.MFE.takeprofit.R 2013-04-24 19:52:23 UTC (rev 1448) @@ -0,0 +1,35 @@ +#!/usr/bin/Rscript --vanilla +# +# Jan Humme (@opentrades) - August 2012 +# +# Tested and found to work correctly using blotter r1143 +# +# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) +# +# Figure 3.16: MFE graph in percentage terms + +require('blotter') + +data('luxor-p066', package='quantstrat', envir=.blotter) + +currency(c('GBP', 'USD')) +exchange_rate(c('GBPUSD'), tick_size=0.0001) + +chart.ME('luxor', type='MFE', scale='percent') + +##### PLACE DEMO AND TEST DATES HERE ################# +# +#if(isTRUE(options('in_test')$in_test)) +# # use test dates +# {initDate="2011-01-01" +# endDate="2012-12-31" +# } else +# # use demo defaults +# {initDate="1999-12-31" +# endDate=Sys.Date()} + +##### PLACE THIS BLOCK AT END OF DEMO SCRIPT ################### +# book = getOrderBook(port) +# stats = tradeStats(port) +# rets = PortfReturns(acct) +################################################################ Copied: pkg/quantstrat/demo/luxor.getSymbols.R (from rev 1447, pkg/quantstrat/demo/luxor.symbols.R) =================================================================== --- pkg/quantstrat/demo/luxor.getSymbols.R (rev 0) +++ pkg/quantstrat/demo/luxor.getSymbols.R 2013-04-24 19:52:23 UTC (rev 1448) @@ -0,0 +1,45 @@ +#!/usr/bin/Rscript --vanilla +# +# Jan Humme (@opentrades) - August 2012, revised April 2013 +# +# Tested and found to work correctly using blotter r1420 +# +# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) +# +# Paragraph 3.2: luxor with $30 slippage and transaction costs + +Sys.setenv(TZ="UTC") + +.from='2002-10-21' +#.to='2008-07-04' +.to='2002-10-31' + +### packages +# +# quantstrat package will pull in some other packages: +# FinancialInstrument, quantmod, blotter, xts + +require(quantstrat) + +### FinancialInstrument + +currency(c('GBP', 'USD')) + +exchange_rate('GBPUSD', tick_size=0.0001) + +### quantmod + +getSymbols.FI(Symbols='GBPUSD', + dir=system.file('extdata',package='quantstrat'), + from=.from, to=.to +) + +# ALTERNATIVE WAY TO FETCH SYMBOL DATA +#setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') +#getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) + +### xts + +GBPUSD = to.minutes30(GBPUSD) +GBPUSD = align.time(to.minutes30(GBPUSD), 1800) + Added: pkg/quantstrat/demo/luxor.include.R =================================================================== --- pkg/quantstrat/demo/luxor.include.R (rev 0) +++ pkg/quantstrat/demo/luxor.include.R 2013-04-24 19:52:23 UTC (rev 1448) @@ -0,0 +1,27 @@ +### + +initDate = '2002-10-21' + +strategy.st = 'luxor' +portfolio.st = 'forex' +account.st = 'IB1' + +### + +.fast = 1 +.slow = 44 + +.timespan = 'T08:00/T12:00' +.timespan = 'T00:00/T23:59' + +.stoploss = 0.001 +.stoptrailing = 0.0015 +.takeprofit = 0.003 + +### + +.orderqty = 100000 +.threshold = 0.0005 +.txnfees = -30 + +### Deleted: pkg/quantstrat/demo/luxor.symbols.R =================================================================== --- pkg/quantstrat/demo/luxor.symbols.R 2013-04-24 16:00:39 UTC (rev 1447) +++ pkg/quantstrat/demo/luxor.symbols.R 2013-04-24 19:52:23 UTC (rev 1448) @@ -1,45 +0,0 @@ -#!/usr/bin/Rscript --vanilla -# -# Jan Humme (@opentrades) - August 2012, revised April 2013 -# -# Tested and found to work correctly using blotter r1420 -# -# From Jaekle & Tamasini: A new approach to system development and portfolio optimisation (ISBN 978-1-905641-79-6) -# -# Paragraph 3.2: luxor with $30 slippage and transaction costs - -Sys.setenv(TZ="UTC") - -.from='2002-10-21' -#.to='2008-07-04' -.to='2002-10-31' - -### packages -# -# quantstrat package will pull in some other packages: -# FinancialInstrument, quantmod, blotter, xts - -require(quantstrat) - -### FinancialInstrument - -currency(c('GBP', 'USD')) - -exchange_rate('GBPUSD', tick_size=0.0001) - -### quantmod - -getSymbols.FI(Symbols='GBPUSD', - dir=system.file('extdata',package='quantstrat'), - from=.from, to=.to -) - -# ALTERNATIVE WAY TO FETCH SYMBOL DATA -#setSymbolLookup.FI(system.file('extdata',package='quantstrat'), 'GBPUSD') -#getSymbols('GBPUSD', from=.from, to=.to, verbose=FALSE) - -### xts - -GBPUSD = to.minutes30(GBPUSD) -GBPUSD = align.time(to.minutes30(GBPUSD), 1800) - From noreply at r-forge.r-project.org Thu Apr 25 12:43:22 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Thu, 25 Apr 2013 12:43:22 +0200 (CEST) Subject: [Blotter-commits] r1449 - in pkg/quantstrat: R man Message-ID: <20130425104322.CDA6E183ECB@r-forge.r-project.org> Author: bodanker Date: 2013-04-25 12:43:22 +0200 (Thu, 25 Apr 2013) New Revision: 1449 Modified: pkg/quantstrat/R/tradeOrderStats.R pkg/quantstrat/man/tradeOrderStats.Rd Log: - small patch to tradeOrderStats docs Modified: pkg/quantstrat/R/tradeOrderStats.R =================================================================== --- pkg/quantstrat/R/tradeOrderStats.R 2013-04-24 19:52:23 UTC (rev 1448) +++ pkg/quantstrat/R/tradeOrderStats.R 2013-04-25 10:43:22 UTC (rev 1449) @@ -17,7 +17,7 @@ #' \item{Order.Type}{} #' \item{Order.Side}{} #' \item{Order.Threshold}{} -#' \item{Order.Status}should be 'closed' only{} +#' \item{Order.Status}{should be 'closed' only} #' \item{Order.StatusTime}{time of the closing trade, should match 'End' column} #' \item{Prefer}{prefer argument for \code{getPrice}} #' \item{Order.Set}{order set of the closing trade} Modified: pkg/quantstrat/man/tradeOrderStats.Rd =================================================================== --- pkg/quantstrat/man/tradeOrderStats.Rd 2013-04-24 19:52:23 UTC (rev 1448) +++ pkg/quantstrat/man/tradeOrderStats.Rd 2013-04-25 10:43:22 UTC (rev 1449) @@ -18,8 +18,8 @@ \describe{ \item{Order.Qty}{} \item{Order.Price}{} \item{Order.Type}{} \item{Order.Side}{} - \item{Order.Threshold}{} \item{Order.Status}should be - 'closed' only{} \item{Order.StatusTime}{time of the + \item{Order.Threshold}{} \item{Order.Status}{should be + 'closed' only} \item{Order.StatusTime}{time of the closing trade, should match 'End' column} \item{Prefer}{prefer argument for \code{getPrice}} \item{Order.Set}{order set of the closing trade} From noreply at r-forge.r-project.org Thu Apr 25 15:50:15 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Thu, 25 Apr 2013 15:50:15 +0200 (CEST) Subject: [Blotter-commits] r1450 - pkg/quantstrat/R Message-ID: <20130425135015.6089F18514F@r-forge.r-project.org> Author: opentrades Date: 2013-04-25 15:50:15 +0200 (Thu, 25 Apr 2013) New Revision: 1450 Modified: pkg/quantstrat/R/rules.R Log: - chain orders now use transaction price instead of order price as price reference Modified: pkg/quantstrat/R/rules.R =================================================================== --- pkg/quantstrat/R/rules.R 2013-04-25 10:43:22 UTC (rev 1449) +++ pkg/quantstrat/R/rules.R 2013-04-25 13:50:15 UTC (rev 1450) @@ -598,7 +598,12 @@ rules <- chain.rules[chain.rule.names %in% closed.chain$Rule[i]] for(j in seq_along(rules)) { # call ruleProc in a loop, since it doesn't look like chain.price would be subset correctly - ruleProc(rules[j], timestamp=timestamp, path.dep=path.dep, mktdata=mktdata, portfolio=portfolio, symbol=symbol, ruletype=type, mktinstr=mktinstr, parameters=list(chain.price=as.numeric(closed.chain$Order.Price[i]), ...)) + + txns <- getTxns(Portfolio=portfolio, Symbol=symbol, Dates=timestamp) + txn.price <- last(txns$Txn.Price) # last() because there may be more than one txn at this timestamp + + #ruleProc(rules[j], timestamp=timestamp, path.dep=path.dep, mktdata=mktdata, portfolio=portfolio, symbol=symbol, ruletype=type, mktinstr=mktinstr, parameters=list(chain.price=as.numeric(closed.chain$Order.Price[i]), ...)) + ruleProc(rules[j], timestamp=timestamp, path.dep=path.dep, mktdata=mktdata, portfolio=portfolio, symbol=symbol, ruletype=type, mktinstr=mktinstr, parameters=list(chain.price=txn.price)) } } } From noreply at r-forge.r-project.org Mon Apr 29 13:48:31 2013 From: noreply at r-forge.r-project.org (noreply at r-forge.r-project.org) Date: Mon, 29 Apr 2013 13:48:31 +0200 (CEST) Subject: [Blotter-commits] r1451 - pkg/quantstrat/R Message-ID: <20130429114831.4E4C6184817@r-forge.r-project.org> Author: opentrades Date: 2013-04-29 13:48:30 +0200 (Mon, 29 Apr 2013) New Revision: 1451 Modified: pkg/quantstrat/R/rules.R Log: - fixed test for curIndex going over boundary in nextIndex() Modified: pkg/quantstrat/R/rules.R =================================================================== --- pkg/quantstrat/R/rules.R 2013-04-25 13:50:15 UTC (rev 1450) +++ pkg/quantstrat/R/rules.R 2013-04-29 11:48:30 UTC (rev 1451) @@ -527,7 +527,7 @@ } } - if (is.na(curIndex) || curIndex > length(index(mktdata))) curIndex=FALSE + if (is.na(curIndex) || curIndex > length(Dates)) curIndex=FALSE #debug line #print(paste('curIndex ==', curIndex))