2014-11-23 14 views
9

Moja strategia quanstrat zwraca błąd, którego nie znalazłem w trakcie dyskusji.Strategia Quanstrat - błąd

Strategia jest bardzo prosta: obliczyć sumę kroczącą w danym okresie. Jeśli suma krocząca przekracza pewien próg, wprowadź długi i zgłoś dwa razy dwa razy, przynieś zysk i zatrzymaj stratę w odległości +/- 5%.

Kod jest:

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) 

struktura danych jest następujący:

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

Jest XTS obiekt pokazując bid/ask głośności/frekvency z transakcji w ciągu jednej sekundy, a wspomniany błąd mówi :

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

Nie ma problemu z łańcuchem zamówień, ponieważ zamówienie zawiera wszystkie trzy zamówienia s z prawidłowymi cenami:

    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" 

Jakieś pomysły?

ja gdzieś znaleźć określając cenę zlecenia limitowanego jak:

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

ale nie wyszło.

+0

Hi Steef, nie mam do końca to jeszcze jednak nadzieję, że to pomoże. Wygenerowany komunikat o błędzie jest wywoływany przez , jeśli (is.na (mktPrice) || is.null (mktPrice)) stop ("brak ceny do rozpoznania", orderType, "w applyRules") Błąd pojawia się na prawo applyStrategy ? – OliE

+0

Cześć Olie, też wyśledziłem błąd i tak, masz rację. Błąd pochodzi od applyStrategy, wskaźniki i sygnały są poprawne. Myślę, że błąd pochodzi z instrukcji order.price w regule zamówienia limitów, ponieważ moje dane nie są (i nie mogą być) w formacie OHLC, więc to nie znaczy, skąd wziąć cenę. Próbowałem coś takiego jak order.price = quote (data $ ask.price [timestamp]), ale nie zadziałało. –

+0

zmień swoje dane, aby ceny były najwyższe. jeśli nie określisz kolumny ceny, np. za pomocą argumentu 'prefer', wtedy quantstrat wywoła' getPrice' i spróbuje zgadnąć. Powinien być w stanie wykryć dane kupna/sprzedaży, ale spodziewa się, że ceny pojawią się przed danymi uzupełniającymi w zestawach danych BBO. –

Odpowiedz

1

Usunięcie niektórych kolumn z mktdata i przesunięcie kolumny ceny w lewo rozwiązało problem.

1

Miałem ten sam problem, dowiedziałem się, że miałem pewne N/A w mojej kolumnie "Zapytaj".

usuwając stały się na.locf Wydaj n/a za()

Powiązane problemy