Thanks for the suggestion. Now I'm getting interesting differences.

If I redefine my stopATR function (below) and use quote(mktdata$stopATR) as you suggest then I get an error message: 
Error in if (order.side == "long" && as.numeric(Lo(mktdataTimestamp)) <  : 
  missing value where TRUE/FALSE needed
This followed by two identical warnings : In max(i) : no non-missing arguments to max; returning -Inf
This is the same error as if I used quote(mktdata$stopATR.ind.atr) with my original function.
stopATR <- function(HLC, n=14, maType, noATR=2){
	stop.atr <- -noATR * ATR(HLC=HLC, n=n, maType=maType)$atr
	colnames(stop.atr) <- c("stopATR")
	stop.atr
}

If I'm lazy & use my original stopATR function then using quote(mktdata$atr) in the add.rule runs without any error messages. However the trailing stop doesn't seem to affect anything. Even using an ATR multiple of .1 (not realistic but gives a threshold of 2-3 points on the GSPC data) gives exactly the same transactions as with the add.rule for the stop commented out. Have checked the data and some should be affected but such a tight stop.
add.indicator(strat.st, name = "stopATR", arguments = list(HLC=quote(HLC(mktdata)), n=14, maType="SMA", noATR=.1) )
add.rule(strat.st,name='ruleSignal', arguments = list(sigcol="signal.gt.zero",sigval=TRUE, orderqty='all', ordertype='stoptrailing', orderside='long', threshold=quote(mktdata$atr), tmult=FALSE, orderset='exit2'), type='risk',label='trailingexit')

I've also tried the following definition for stopATR with quote(mktdata$atr) as in the second case and I get the same error as in the first example.
stopATR <- function(HLC, n=14, maType, noATR=2){
	stop.atr <- -noATR * ATR(HLC=HLC, n=n, maType=maType)$atr
}

Not sure if I'm missing something obvious or if there is something else going on.

Thanks

Brian

On 22 Sep 2012, at 03:00, Brian G. Peterson wrote:

> why not label your stopATR indicator ouput and set the threshold to that?
> 
> quote(mktdata$stopATR)
> 
> ?
> 
> 
> On 09/21/2012 02:07 PM, Brian Moretta wrote:
>> Hi
>> 
>> I've been trying to modify the MACD example with trailing stop so that it uses a 2ATR stop rather than a fixed value or proportion. Key seems to be the threshold value. Help says
>> 
>> If threshold is not numeric or NULL it should be the character string describing a function that can calculate a threshold. Ideally this will be a column lookup on a non-path-dependent indicator calculated in advance.
>> 
>> I keep getting errors with the threshold set to something that uses a vector whether text or not. The add.rule line is (full code at end)
>> add.rule(strat.st,name='ruleSignal', arguments = list(sigcol="signal.gt.zero",sigval=TRUE, orderqty='all', ordertype='stoptrailing', orderside='long', threshold=stopvalue, tmult=FALSE, orderset='exit2'), type='risk',label='trailing exit')
>> 
>> With stopvalue set to -20 it works fine. Tried stop.atr$atr, as a vector, inside quotes (help says character string) and inside quote() but to no avail. Tried similar for indicator mktdata$stopATR.ind.atr. Going through previous questions in this area I'm not sure if I'm just doing it wrong or pushing the limits of quanstrat's development, but any suggestions are welcome.
>> 
>> Thanks
>> 
>> Brian
>> 
>> require(quantstrat)
>> suppressWarnings(rm("order_book.macd",pos=.strategy))
>> suppressWarnings(rm("account.macd","portfolio.macd",pos=.blotter))
>> suppressWarnings(rm("account.st","portfolio.st","stock.str","stratMACD","initDate","initEq",'start_t','end_t'))
>> 
>> #stock.str='AAPL' # what are we trying it on
>> stock.str='GSPC'
>> getSymbols("^GSPC", src='yahoo', index.class=c("POSIXt","POSIXct"), from='2007-01-01')
>> 
>> stopATR <- function(HLC, n=14, maType, noATR=2){
>> 	stop.atr <- -noATR * ATR(HLC=HLC, n=n, maType=maType)
>> }
>> stop.atr <- -2 * ATR(HLC(get(stock.str)), n=14, maType='SMA')
>> stopvalue <- -20
>> 
>> #MA parameters for MACD
>> fastMA = 12
>> slowMA = 26
>> signalMA = 9
>> maType="EMA"
>> 
>> currency('USD')
>> stock(stock.str,currency='USD',multiplier=1)
>> 
>> initDate='2006-12-31'
>> initEq=1000000
>> portfolio.st='macd'
>> account.st='macd'
>> 
>> initPortf(portfolio.st,symbols=stock.str, initDate=initDate)
>> initAcct(account.st,portfolios=portfolio.st, initDate=initDate)
>> initOrders(portfolio=portfolio.st,initDate=initDate)
>> 
>> strat.st<-portfolio.st
>> # define the strategy
>> strategy(strat.st, store=TRUE)
>> 
>> #one indicator
>> add.indicator(strat.st, name = "MACD", arguments = list(x=quote(Cl(mktdata))) )
>> add.indicator(strat.st, name = "stopATR", arguments = list(HLC=quote(HLC(mktdata)), n=14, maType="SMA", noATR=2) )
>> 
>> #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 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)
>> 
>> #alternatives for risk stops:
>> # alternately, use a trailing order, with 2ATR stop
>> add.rule(strat.st,name='ruleSignal', arguments = list(sigcol="signal.gt.zero",sigval=TRUE, orderqty='all', ordertype='stoptrailing', orderside='long', threshold=stop.atr$atr, tmult=FALSE, orderset='exit2'), type='risk',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')
>> 
>> #end rules
>> ####
>> 
>> start_t<-Sys.time()
>> out<-try(applyStrategy(strat.st , portfolios=portfolio.st,parameters=list(nFast=fastMA, nSlow=slowMA, nSig=signalMA,maType=maType)))
>> end_t<-Sys.time()
>> print(end_t-start_t)
>> 
>> start_t<-Sys.time()
>> updatePortf(Portfolio=portfolio.st,Dates=paste('::',as.Date(Sys.time()),sep=''))
>> end_t<-Sys.time()
>> print("trade blotter portfolio update:")
>> print(end_t-start_t)
>> 
>> chart.Posn(Portfolio=portfolio.st,Symbol=stock.str)
>> plot(add_MACD(fast=fastMA, slow=slowMA, signal=signalMA,maType="EMA"))
>> 
>> 	[[alternative HTML version deleted]]
>> 
>> _______________________________________________
>> R-SIG-Finance@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.
>> 
> 
> 
> -- 
> Brian G. Peterson
> http://braverock.com/brian/
> Ph: 773-459-4973
> IM: bgpbraverock
> 
> _______________________________________________
> R-SIG-Finance@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.


	[[alternative HTML version deleted]]

