1 votos

Indicador de fractales (Bill Williams) R Quantstrat

Hola ¿alguien ha visto o sabe cómo crear un indicador de fractales en quantstrat?

los fractales explicados http://forex-indicators.net/bill-williams/fractals

código de ejemplo (sólo me interesa el fractal de tipo 1) http://forexsb.com/forum/topic/68/fractals/

2voto

Toby Allen Puntos 260

La mayoría de los indicadores técnicos deben estar disponibles en el paquete TTR. Sin embargo, si no lo están, puede escribir un indicador personalizado para utilizarlo en quantstrat de la siguiente manera.

fractalindicator.up <- function(x) {

  High <- Hi(x); Bars <- nrow(x)
  afFrUp <- rep(NA, Bars)

  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];
    }
  }

  names(afFrDn) <- "F.Up"
}

fractalindicator.dn <- function(x) {

  Low <- Lo(x); Bars <- nrow(x)
  afFrDn <- rep(NA, Bars)

  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];
    }
  }

  names(afFrDn) <- "F.Down"
}

#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")

Aquí he definido dos, fractalindicator.up y fractalindicator.dn. Usted puede trabajar con estos al igual que lo hace en una estrategia quantstrat regular. Puede que me equivoque al construir el indicador, así que comprueba la lógica. También es posible combinar las dos funciones en una sola con un parámetro adicional.

Además, las preguntas relacionadas con quantstrat es mejor hacerlas en la lista de correo r-sig-finance. Los autores de quantstrat y muchos más entusiastas de R son muy activos en esa lista de correo.

0voto

michael Puntos 21

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)

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X