Estratégia Quanstrat - erro

9

Minha estratégia quanstrat retorna um erro que ainda não encontrei sendo discutido.

A estratégia é muito simples: calcular a soma progressiva em determinado período de tempo. Se a soma progressiva estiver acima de algum limiar, insira o comprimento e submeta apenas duas ordens oco, take-profit e stop loss na distância de +/- 5%.

O código é:

require("quantstrat")
from <- "2014-09-25"
to <- "2014-10-01"

rm(strategy.st)
try(rm("account.st","portfolio.st"),silent=TRUE)  

.blotter <- new.env()
.strategy <- new.env()

initDate <- as.character(as.Date(from) - 1)
currency("USD")
Sys.setenv(TZ = "UTC")   
symbols <- "data"
stock(symbols, currency = "USD", multiplier = 1)  # Initialisation of the instrument
tradeSize <- 1                                    # Initialisation of trade size
initEq <- 1000                                    # Initialisation of initial equity

strategy.st <- "btc"                              # Initialisation of the strategy
portfolio.st <- "btc"                             # Initialisation of the strategy, must be after strategy
account.st <- "btc"                               # Initialisation of the strategy, must be after strategy and portolio


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)  

### Parametres
lookBackVol <- 5
thresholdVol <- 20
stopLoss <- -0.05
profitTarget <- 0.05

### Indicators
add.indicator(strategy.st, name = "runSum", arguments = list(x = quote(data$ask.vol), n = lookBackVol), label = "volRunSum")

### Signals
add.signal(strategy.st, name = "sigThreshold", arguments = list(column = "volRunSum", threshold = thresholdVol, relationship = "gte", cross = TRUE), label = "longSig")

### Rules
add.rule(strategy = strategy.st, name = "ruleSignal",
         arguments = list(sigcol = "longSig", sigval = 1,
                          orderqty = tradeSize,
                          ordertype = "market",
                          orderside = "long",
                          replace = FALSE,
                          orderset = "ocolong"
                          ),
         type = "enter",
         label = "enterLong"
        )


add.rule(strategy.st, name = "ruleSignal",
         arguments = list(sigcol = "longSig", sigval = 1,
                          orderqty = "all",
                          ordertype = "stoplimit",
                          orderside = "long",
                          replace = FALSE,
                          tmult = TRUE,
                          threshold = stopLoss,
                          orderset = "ocolong"
           ),
         type = "chain",
         parent = "enterLong",
         label = "stopLossLong",
  )


add.rule(portfolio.st, name = "ruleSignal",
         arguments = list(sigcol = "longSig", sigval = 1,
                          orderqty = "all",
                          ordertype = "limit",
                          orderside = "long",
                          replace = FALSE,
                          tmult = TRUE,
                          threshold = profitTarget,
                          orderset = "ocolong"
           ),
         type = "chain",
         parent = "enterLong",
         label = "profitTargetLong",
  )

 ### Results
results <- applyStrategy(strategy.st, portfolio.st)
View(getOrderBook(portfolio.st)$btc$data)

A estrutura de dados é a seguinte:

> dput(head(data))
structure(c(0, 0.0423759, 0.0299792, 0, 0, 0, 0.0722401, 0.0430572, 
0.1648549, 2.9369966, 0, 0, 0.0722401, 0.0854331, 0.1948341, 
2.9369966, 0, 0, 0, 1, 1, 0, 0, 0, 1, 2, 4, 9, 0, 0, 1, 3, 5, 
9, 0, 0, NA, 408.11, 408.106, 408.106, 408.106, 408.106, 408.11, 
408.111, 408.112, 407.5, 407.5, 407.5, 408.11, 408.111, 408.112, 
407.5, 407.5, 407.5), class = c("xts", "zoo"), .indexCLASS = c("POSIXct", 
"POSIXt"), .indexTZ = structure("UTC", .Names = "TZ"), tclass = c("POSIXct", 
"POSIXt"), tzone = structure("UTC", .Names = "TZ"), index = structure(c(1411596001, 
1411596002, 1411596003, 1411596004, 1411596005, 1411596006), tzone = structure("UTC", .Names = "TZ"), tclass = c("POSIXct", 
"POSIXt")), .Dim = c(6L, 9L), .Dimnames = list(NULL, c("bid.vol", 
"ask.vol", "vol", "bid.freq", "ask.freq", "freq", "bid.price", 
"ask.price", "price")))

É um objeto xts mostrando volume de compra / venda / quantidade de negócios em um segundo e o erro mencionado diz:

[1] "2014-09-24 22:00:17 data 1 @ 407"
Error in dindexOrderProc(openOrderSubset[i, ], mktPrices, curIndex) : 
  no price discernable for limit in applyRules

Não parece haver um problema com a cadeia de pedidos, pois o livro de pedidos contém todos os três pedidos com preços corretos:

                    Order.Qty Order.Price Order.Type  Order.Side Order.Threshold Order.Status Order.StatusTime      Prefer Order.Set Txn.Fees
2014-09-24 22:00:16 "1"       "407"       "market"    "long"     NA              "closed"     "2014-09-24 22:00:17" "ask"  "ocolong" "0"     
2014-09-24 22:00:17 "all"     "386.65"    "stoplimit" "long"     "-20.35"        "open"       NA                    ""     "ocolong" "0"     
2014-09-24 22:00:17 "all"     "427.35"    "limit"     "long"     "20.35"         "open"       NA                    ""     "ocolong" "0"  

Alguma idéia?

Eu encontrei um lugar especificando o preço do pedido de limite como:

order.price=quote(data$ask.price[timestamp])

mas não deu certo.

    
por Steef Gregor 24.11.2014 в 00:29
fonte

2 respostas

1

Remover algumas colunas do mktdata e mover a coluna de preços para a esquerda resolveu o problema.

    
por Steef Gregor 27.01.2015 / 00:10
fonte
1

Eu tive o mesmo problema, eu descobri que eu tinha alguns N / A's na minha coluna "Ask".

removendo os N / A's corrigiram o problema na.locf ()

    
por GeV 126 10.08.2015 / 09:25
fonte