La mia strategia di quanstrat restituisce un errore che non ho ancora trovato in discussione.Strategia di Quanstrat - errore
La strategia è molto semplice: calcola il riepilogo in un determinato periodo di tempo. Se il rullaggio supera una certa soglia, immettere long e inviare siultanesouly due ordini oco, take-profit e stop loss alla distanza di +/- 5%.
Il codice è:
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)
struttura dati è la seguente:
> 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")))
Si tratta di un XTS oggetto mostrando bid/ask volume/frekvency degli scambi in un secondo e l'errore citato dice :
[1] "2014-09-24 22:00:17 data 1 @ 407"
Error in dindexOrderProc(openOrderSubset[i, ], mktPrices, curIndex) :
no price discernable for limit in applyRules
ci ha colpiti particolarmente sembrano essere un problema con l'ordine-catena come portafoglio ordini contiene tutti e tre ordine s con prezzi corretti:
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"
Qualche idea?
ho qualche trovato specificando il prezzo ordine limite come:
order.price=quote(data$ask.price[timestamp])
ma non ha funzionato.
Hi Steef, non hanno avuto modo di fondo di esso ancora, ma sperando che questo vi aiuterà. Il messaggio di errore generato viene attivato da if (is.na (mktPrice) || is.null (mktPrice)) stop ("nessun prezzo rilevabile per", orderType, "in applyRules") L'errore si presenta su applyStrategy right ? – OliE
Ciao Olie, ho rintracciato anche l'errore e sì, hai ragione. L'errore deriva da applyStrategy, gli indicatori e i segnali sono corretti. Penso che l'errore derivi dall'ordine order.price nella regola di ordine limite dato che i miei dati non sono (e non possono essere) in formato OHLC, quindi l'ordine di limitazione non sa da dove prendere il prezzo. Ho provato qualcosa come order.price = quote (data $ ask.price [timestamp]) ma non ha funzionato. –
riorganizza i tuoi dati in modo che i prezzi vengano prima di tutto. se non specifichi la colonna del prezzo, ad es. tramite l'argomento 'preferred', quantstrat chiamerà' getPrice' e prova a indovinare. Dovrebbe essere in grado di rilevare i dati bid/ask, ma si aspetterà che i prezzi vengano prima dei dati supplementari nei set di dati BBO. –