Así que tuve que hacer un par de cambios para conseguir que funcione completamente para mí, pero Rohit que más o menos lo consiguió cerca. De nuevo esto es lo que funcionó en mi entorno
fractalindicator.up <- function(x) {
x$FUp <- 0
High <- Hi(x); Bars <- nrow(x)
for(iBar in seq(8,Bars-2))
{
if(High[[iBar-1]]<High[[iBar-2]] && High[[iBar]]<High[[iBar-2]])
{
#Fractal type 1
if( High[[iBar-4]]<High[[iBar-2]] &&
High[[iBar-3]]<High[[iBar-2]] )
#afFrUp[iBar+1]=High[iBar-2];
x$FUp[iBar]= 1;
}
}
return(x$FUp)
}
fractalindicator.dn <- function(x) {
x$FDown <- 0
Low <- Lo(x); Bars <- nrow(x)
for(iBar in seq(8,Bars-2))
{
if(Low[[iBar-1]]>Low[[iBar-2]] && Low[[iBar]]>Low[[iBar-2]])
{
#Fractal type 1
if( Low[[iBar-4]]>Low[[iBar-2]] &&
Low[[iBar-3]]>Low[[iBar-2]] )
#afFrDn[iBar+1]=Low[iBar-2];
x$FDown[iBar]=1;
}
}
return(x$FDown)
}
Necesitaba devolver un objeto xts e incluir [[]] para acceder a los valores del dataframe
A continuación se pega el código completo (sin análisis), he utilizado el código de Ilya Kipnis así que el crédito completo va a él (por favor, la fuente del código desde el enlace y no copiar y pegar de esto) https://github.com/IlyaKipnis/DSTrading/blob/master/demo/TVI2.R
La estrategia simplemente compra tan pronto como obtiene un fractal alcista y sale en un fractal bajista, obviamente esta no es una estrategia que cualquier persona negociaría, esto es sólo un ejemplo de uso de fractales.
require(quantstrat)
require(IKTrading)
require(devtools)
require(DSTrading)
require(PerformanceAnalytics)
options("getSymbols.warning4.0"=FALSE)
rm(list=ls(.blotter), envir=.blotter)
currency('USD')
Sys.setenv(TZ="UTC")
symbols <- "SPY"
suppressMessages(getSymbols(symbols, from="1998-01-01", to="2015-05-15"))
stock(symbols, currency="USD", multiplier=1)
initDate="1990-01-01"
tradeSize <- 10000
initEq <- tradeSize*length(symbols)
account.st <- 0
strategy.st <- portfolio.st <- account.st <- "fractal"
rm.strat(portfolio.st)
rm.strat(strategy.st)
initPortf(portfolio.st, symbols=symbols, initDate=initDate, currency='USD')
initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD',initEq=initEq)
initOrders(portfolio.st, initDate=initDate)
strategy(strategy.st, store=TRUE)
#new
fractalindicator.up <- function(x) {
x$FUp <- 0
High <- Hi(x); Bars <- nrow(x)
for(iBar in seq(8,Bars-2))
{
if(High[[iBar-1]]<High[[iBar-2]] && High[[iBar]]<High[[iBar-2]])
{
#Fractal type 1
if( High[[iBar-4]]<High[[iBar-2]] &&
High[[iBar-3]]<High[[iBar-2]] )
#afFrUp[iBar+1]=High[iBar-2];
x$FUp[iBar]= 1;
}
}
return(x$FUp)
}
fractalindicator.dn <- function(x) {
x$FDown <- 0
Low <- Lo(x); Bars <- nrow(x)
for(iBar in seq(8,Bars-2))
{
if(Low[[iBar-1]]>Low[[iBar-2]] && Low[[iBar]]>Low[[iBar-2]])
{
#Fractal type 1
if( Low[[iBar-4]]>Low[[iBar-2]] &&
Low[[iBar-3]]>Low[[iBar-2]] )
#afFrDn[iBar+1]=Low[iBar-2];
x$FDown[iBar]=1;
}
}
return(x$FDown)
}
#Add indicators
add.indicator(strategy = "fractal", name = "fractalindicator.up",
arguments = list(x = quote(mktdata)), label="fractalup")
#Add indicators
add.indicator(strategy = "fractal", name = "fractalindicator.dn",
arguments = list(x = quote(mktdata)), label="fractaldn")
applyIndicators(strategy=strategy.st, mktdata)
#
# mktdata$FDown.FDownCompare <- 1
# mktdata$FUp.FUpCompare <- 1
add.signal(strategy.st, name = "sigComparison", arguments = list(columns=c("fractalup", "fractaldn"),
relationship="gt"), label="upFractal")
add.signal(strategy.st, name = "sigComparison", arguments = list(columns=c("fractaldn", "fractalup"),
relationship="gt"), label="downFractal")
applySignals(strategy=strategy.st,mktdata)
#enter rule
add.rule(strategy.st, name = "ruleSignal", arguments = list(sigcol="upFractal",
sigval=TRUE,
ordertype="market",
orderside=NULL,
replace=FALSE,
prefer="close",
orderqty=1),
type="enter",path.dep=TRUE,label="ruleUp")
#exit rule
add.rule(strategy.st, name = "ruleSignal", arguments = list(sigcol="downFractal",
sigval=TRUE,
orderqty="all",
orderqty=-1,
ordertype="market",
orderside=NULL,
replace=FALSE,
prefer="open"),
type="enter",path.dep=TRUE,label="ruleDown")
#apply strategy
t1 <- Sys.time()
out <- applyStrategy(strategy=strategy.st,portfolios=portfolio.st,debug=TRUE )
t2 <- Sys.time()
print(t2-t1)