[R-SIG-Finance] Specify time segment to calculate indicator and trade ?

Joshua Ulrich josh.m.ulrich at gmail.com
Sat Apr 18 19:05:27 CEST 2015


On Wed, Apr 8, 2015 at 10:17 PM, domodo <1111938 at qq.com> wrote:
> hi,guys.
> quantstrat is very powerful and convient when coding strategy and backtest
> it with indicator and pre-define price pattern.but i'm not familiar with
> specify the strategy to trade in a segment of trading-time,below are two
> cases:
> 1)establish position from 10:00 to 14:00 only,and close position with
> technical exits

Using quantstrat, you can limit rule execution to a specific time of
day via add.rule's timespan argument.  In this case you would set it
to timepan="T10:00/T14:00".

> 2)get the highest and lowest price of the first hour of a day
>
You can also do this with time-of-day subsetting.  For example:
apply.daily(xtsData["T09:30/T10:30", "Close"], range)

> for example,the strategy below is about price and single sma cross over.
> for case 1,i should store price series' date&time in varible 'datetime' as:
> [code]
> datetime <- as.POSIXlt(index(C))
> [/code]
>
> set entry time segment as:
> [code]
> entrytime1 <- 10
> entrytime2 <- 14
> [/code]
>
> and add some code below to judge whether the entry signal is in trading time
> :
> [code]
> signal <- ifelse(lag(C)>lag(MA) & lag(C,2)<lag(MA,2),1,
>                  ifelse(lag(C)<lag(MA) & lag(C,2)>lag(MA,2),-1,0))
>
> signal <- ifelse(signal>0 & datetime$hour>entrytime1 &
> datetime$hour<entrytime2,1,0)
> signal <- ifelse(signal<0 & datetime$hour>entrytime1 &
> datetime$hour<entrytime2,-1,0)
> [/code]
>
> but the code above is not so elegant at all,and low-efficient.
>
> for the case 2,i should code a function to calculate the first hour's
> highest & lowest price of each day,my idea in this function is similiar
> to code for case 1,that's, store price series's date&time as a POSIXlt
> variable 'datetime',and judge whether hour == 10,min == 15,sec==0,but this
> idea is also rough and low-efficient.
>
> any help or tips please ?
>
> below is the example strategy
>
> [code]
> library(blotter)
> library(quantstrat)
>
> #initialize environtments
> currency("USD")
> startdate <- '2012-01-18 09:14:00'
> finaldate <- '2012-01-19 15:14:00'
>
> future("if2", currency = "USD", multiplier = 300,
> tick_size = 0.2)
> Sys.setenv(TZ = "UTC")
> rm(list=ls(envir=.blotter),envir=.blotter)
> b.strategy <- "strategy"
>
> try(rm(list=ls(pos=.blotter),pos=.blotter),silent=TRUE)
> initPortf(b.strategy, "if2", initDate = startdate)
> initAcct(b.strategy, portfolios = b.strategy, initDate = startdate, initEq =
> 1000000)
>
> ifBAC2 <- read.table("C:/ifBAC2.csv", head = F, sep =
> ",")
> coredata <- ifBAC2[3:6]
> rownames(coredata) <- as.POSIXlt(paste(ifBAC2[,1],ifBAC2[,2]))
> ifxts <- as.xts(coredata)
> colnames(ifxts) <-
> c("open","high","low","close")
> if2 <- ifxts['2012-01-18 09:15:00/2012-01-19 15:14:00']
> if2$SMA15 <- SMA(Cl(if2),15)
>
> #custom theme
> myTheme <- chart_theme()
> myTheme$col$dn.col <- "lightgreen"
> myTheme$col$up.col <- "red"
> myTheme$col$dn.border <- "grey"
> myTheme$col$up.border <- "grey"
>
> MA <- if2$SMA15
> C <- Cl(if2)
> O <- Op(if2)
>
> #trading signal judgement
> signal <- ifelse(lag(C)>lag(MA) & lag(C,2)<lag(MA,2),1,
>                  ifelse(lag(C)<lag(MA) & lag(C,2)>lag(MA,2),-1,0))
> signal[is.na(signal)] <- 0
>
> #Bar-by-bar treatment
> for( i in 1:nrow(if2) )
> {
>   currentDate <- time(if2)[i]
>
>   equity<-getEndEq(b.strategy, currentDate)
>   Posn <- getPosQty(b.strategy, Symbol='if2', Date=currentDate)
>   #cat(as.character(i),"position on current bar is ",Posn, append = FALSE)
>
>   if(!is.na(MA[i]))
>   {
>     if( Posn == 0 & signal[i] == 1 ) { #no marketposition, and long signal
> occurs
>       #long entry
>       openprice <- as.double((Op(if2[currentDate])))
>       unitsize <- abs(as.numeric(trunc(equity/(openprice*300*0.15))))
>       addTxn(b.strategy, Symbol='if2', TxnDate=currentDate,
>              TxnPrice=openprice, TxnQty = unitsize ,
> TxnFees=-openprice*300*0.00005*unitsize, verbose = F)
>     }
>     else if( Posn != 0 & signal[i] == -1 ) {
>       #exit position
>       openprice <- as.double((Op(if2[currentDate])))
>       unitsize  <- abs(getPosQty(b.strategy, Symbol='if2',
> Date=currentDate))
>       addTxn(b.strategy, Symbol='if2', TxnDate=currentDate,
>              TxnPrice=openprice, TxnQty = -unitsize ,
> TxnFees=-openprice*300*0.00005*unitsize, verbose = F)
>     }
>   }
>
>   updatePortf(b.strategy, Dates = currentDate)
>   updateAcct(b.strategy, Dates = currentDate)
>   updateEndEq(b.strategy, Dates = currentDate)
> }
>
> chart.Posn(b.strategy, Symbol = "if2", theme = myTheme, TA =
> "add_SMA(n=15,col=4)")
>
> txns <- getTxns(Portfolio = b.strategy, Symbol = "if2")
> tstats <- tradeStats(Portfolio = b.strategy, Symbol = "if2")
> [/code]
>
> data format is as below
>
> [code]
>
> 2012/1/18       9:15:00 2577.6  2580.6  2573.6  2577.2
> 2012/1/18       9:16:00 2577.2  2583.6  2577    2583.2
> 2012/1/18       9:17:00 2583.4  2583.8  2580.6  2580.8
> 2012/1/18       9:18:00 2580.8  2581.4  2576.4  2577
> 2012/1/18       9:19:00 2577    2582    2576.6  2580.4
> 2012/1/18       9:20:00 2580.4  2581.4  2578.2  2581
> 2012/1/18       9:21:00 2580.8  2580.8  2578.8  2580
> 2012/1/18       9:22:00 2580.2  2581    2579.4  2579.8
> 2012/1/18       9:23:00 2580    2584.4  2579.8  2583.6
> 2012/1/18       9:24:00 2583.8  2585.2  2576    2576.2
> 2012/1/18       9:25:00 2577    2579.8  2576.8  2579
> 2012/1/18       9:26:00 2578.8  2584.2  2578.8  2581.2
> 2012/1/18       9:27:00 2581    2582.2  2580.6  2581.6
> 2012/1/18       9:28:00 2581.6  2581.6  2578.8  2579.4
> 2012/1/18       9:29:00 2580    2583    2579.8  2581.4
>
> [/code]
>
>
>
> --
> View this message in context: http://r.789695.n4.nabble.com/Specify-time-segment-to-calculate-indicator-and-trade-tp4705639.html
> Sent from the Rmetrics mailing list archive at Nabble.com.
>
> _______________________________________________
> R-SIG-Finance at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-sig-finance
> -- Subscriber-posting only. If you want to post, subscribe first.
> -- Also note that this is not the r-help list where general R questions should go.



-- 
Joshua Ulrich  |  about.me/joshuaulrich
FOSS Trading  |  www.fosstrading.com
R/Finance 2015 | www.rinfinance.com



More information about the R-SIG-Finance mailing list