O sistema de backtesting da FMZ Quant Trading Platform suporta fontes de dados personalizadas, o sistema de backtesting utiliza oGET
método para solicitar uma URL personalizada (URL acessível ao público) para obter uma fonte de dados externa para backtest. Os parâmetros de solicitação adicionais são os seguintes:
Parâmetro | Significado | Explicação |
---|---|---|
símbolo | Nome do símbolo | Dados do mercado à vista, tais como:BTC_USDT , dados do mercado de futuros, tais como:BTC_USDT.swap , dados da taxa de financiamento de contratos perpétuos de futuros, tais como:BTC_USDT.funding , dados do índice de preços de contratos futuros perpétuos, tais como:BTC_USDT.index |
eid | Intercâmbio | Os valores da posição em risco são os valores da posição em risco, incluindo os valores da posição em risco. |
redondo | Exatidão dos dados | True significa que a precisão específica é definida nos dados fornecidos pela fonte de dados personalizada.round=true |
período | Período de dados de linha K (milissegundos) | tais como:60000 é um período de 1 minuto |
profundidade | Níveis de profundidade | 1-20 |
negócios | Se os dados precisam ser divididos | Verdadeiro (1) / Falso (2) |
de | Horário de início | carimbo de tempo unix |
para | Tempo do Fim | carimbo de tempo unix |
detalhe | Dados solicitados para os detalhes do símbolo | O pedido enviado pelo FMZ Quant Trading Platform Backtesting System para a fonte de dados personalizada é fixado como:detail=true |
costume | – | Este parâmetro pode ser ignorado |
Quando a fonte de dados dos objetos de câmbio spot e de câmbio de futuros for definida como uma fonte de dados personalizada (feeder), o sistema de backtesting envia um pedido ao serviço de fonte de dados personalizada:
http://customserver:9090/data?custom=0&depth=20&detail=true&eid=Bitget&from=1351641600&period=86400000&round=true&symbol=BTC_USDT&to=1611244800&trades=1
http://customserver:9090/data?custom=0&depth=20&detail=true&eid=Futures_OKX&from=1351641600&period=86400000&round=true&symbol=BTC_USDT.swap&to=1611244800&trades=1
O formato devolvido deve ser um dos dois seguintes formatos (que serão reconhecidos automaticamente pelo sistema):
Nível de simulação Tick, o seguinte é um exemplo de dados JSON:
{
"detail": {
"eid": "Binance",
"symbol": "BTC_USDT",
"alias": "BTCUSDT",
"baseCurrency": "BTC",
"quoteCurrency": "USDT",
"marginCurrency": "USDT",
"basePrecision": 5,
"quotePrecision": 2,
"minQty": 0.00001,
"maxQty": 9000,
"minNotional": 5,
"maxNotional": 9000000,
"priceTick": 0.01,
"volumeTick": 0.00001,
"marginLevel": 10
},
"schema":["time", "open", "high", "low", "close", "vol"],
"data":[
[1564315200000, 9531300, 9531300, 9497060, 9497060, 787],
[1564316100000, 9495160, 9495160, 9474260, 9489460, 338]
]
}
Marque o nível do bot, o seguinte é um exemplo de dados JSON:
Os dados de backtest de nível Tick (contém informações sobre a profundidade do mercado, e o formato de profundidade é uma matriz de[price, volume]
Pode ter vários níveis de profundidade,asks
para a ordem ascendente de preços,bids
para ordem decrescente de preços).
{
"detail": {
"eid": "Binance",
"symbol": "BTC_USDT",
"alias": "BTCUSDT",
"baseCurrency": "BTC",
"quoteCurrency": "USDT",
"marginCurrency": "USDT",
"basePrecision": 5,
"quotePrecision": 2,
"minQty": 0.00001,
"maxQty": 9000,
"minNotional": 5,
"maxNotional": 9000000,
"priceTick": 0.01,
"volumeTick": 0.00001,
"marginLevel": 10
},
"schema":["time", "asks", "bids", "trades", "close", "vol"],
"data":[
[1564315200000, [[9531300, 10]], [[9531300, 10]], [[1564315200000, 0, 9531300, 10]], 9497060, 787],
[1564316100000, [[9531300, 10]], [[9531300, 10]], [[1564316100000, 0, 9531300, 10]], 9497060, 787]
]
}
Campo | Descrição |
---|---|
detalhe | Informações pormenorizadas sobre o tipo de dados solicitado, |
Incluindo o nome da moeda denominada, o nome da A moeda de negociação, a precisão, a quantidade mínima de encomenda, etc. Especifica os atributos das colunas nos dados matriz, que é sensível a minúsculas e é limitada apenas ao tempo, aberta, alto, baixo, fechado, vol, pede, oferece, negociações dados. A estrutura da coluna, dados gravados de acordo com o esquema Configurações.
campo de detalhes
Campo | Descrição |
---|---|
eid | Exchange Id, por favor, note que o local e futuros de um |
Certas trocas têm diferentes eids. | |
símbolo | Código do produto de negociação |
alias | O símbolo no intercâmbio correspondente ao corrente |
Código do produto comercial | |
baseMudança | Moeda de negociação |
CitaçãoMoeda | Moeda denominada |
MargemCurrency | Moeda de margem |
BasePrecisione | Precisão da moeda da transacção |
CitaçãoPrecisione | Preço da moeda exacta |
MinQty | Quantidade mínima de encomenda |
MaxQty | Quantidade máxima de encomenda |
Min Nocional | Montante mínimo da encomenda |
Max Nocional | Montante máximo da encomenda |
preçoTick | Salto de preços |
volumeMarque | Valor mínimo de alteração da quantidade de encomenda (um salto |
quantidade da encomenda) | |
Margem Nível | Valor de alavancagem de futuros |
Contrato Tipo | Para contratos perpétuos definidos para:swap , o |
sistema backtest continuará a enviar taxa de financiamento e índice de preços pedidos.
Atributos especiais de colunaasks
, bids
, trades
:
Campo | Descrição | Observações |
---|---|---|
pedidos / propostas | [preço, volume],...] | Por exemplo, os dados |
OLive Trading Level Tick
Exemplo de dados:[[9531300, 10]]
- Sim, sim.
O tempo, a direcção, o preço, o volume,...
Por exemplo, os dados noLive Trading Level Tick
Exemplo de dados:[[1564315200000, 0, 9531300, 10]]
|
Ao fazer backtesting de contratos perpétuos nas bolsas de futuros, custom
As fontes de dados também exigem dados adicionais sobre taxas de financiamento e preços
O sistema de backtesting continuará a enviar solicitações
para as taxas de financiamento apenas quando os dados de mercado solicitados são devolvidos
e o campo de detalhes na estrutura devolvida contém o"contractType": "swap"
Pares chave-valor.
Quando o sistema de backtesting recebe dados da taxa de financiamento, ele irá Continuar a enviar pedidos de dados do índice de preços.
A estrutura dos dados da taxa de financiamento é a seguinte:
{
"detail": {
"eid": "Futures_Binance",
"symbol": "BTC_USDT.funding",
"alias": "BTC_USDT.funding",
"baseCurrency": "BTC",
"quoteCurrency": "USDT",
"marginCurrency": "",
"basePrecision": 8,
"quotePrecision": 8,
"minQty": 1,
"maxQty": 10000,
"minNotional": 1,
"maxNotional": 100000000,
"priceTick": 1e-8,
"volumeTick": 1e-8,
"marginLevel": 10
},
"schema": [
"time",
"open",
"high",
"low",
"close",
"vol"
],
"data": [
[
1584921600000,
-16795,
-16795,
-16795,
-16795,
0
],
[
1584950400000,
-16294,
-16294,
-16294,
-16294,
0
]
// ...
]
}
Exemplo de pedido de dados de taxa de financiamento a partir do backtesting O sistema é:
http://customserver:9090/data?custom=0&depth=20&detail=true&eid=Futures_Binance&from=1351641600&period=86400000&round=true&symbol=BTC_USDT.funding&to=1611244800&trades=0
A estrutura dos dados do índice de preços é a seguinte:
{
"detail": {
"eid": "Futures_Binance",
"symbol": "BTC_USDT.index",
"alias": "BTCUSDT",
"baseCurrency": "BTC",
"quoteCurrency": "USDT",
"contractType": "index",
"marginCurrency": "USDT",
"basePrecision": 3,
"quotePrecision": 1,
"minQty": 0.001,
"maxQty": 1000,
"minNotional": 0,
"maxNotional": 1.7976931348623157e+308,
"priceTick": 0.1,
"volumeTick": 0.001,
"marginLevel": 10,
"volumeMultiple": 1
},
"schema": [
"time",
"open",
"high",
"low",
"close",
"vol"
],
"data": [
[1584921600000, 58172, 59167, 56902, 58962, 0],
[1584922500000, 58975, 59428, 58581, 59154, 0],
// ...
]
}
Exemplo de pedido de dados do índice de preços enviado pelo backtesting O sistema é:
http://customserver:9090/data?custom=0&depth=20&detail=true&eid=Futures_Binance&from=1351641600&period=86400000&round=true&symbol=BTC_USDT.index&to=1611244800&trades=0
Especificar o endereço da fonte de dados, por exemplo:http://120.24.2.20:9090/data
O programa de serviço de fonte de dados personalizado é escrito usandoGolang
:
package main
import (
"fmt"
"net/http"
"encoding/json"
)
func Handle (w http.ResponseWriter, r *http.Request) {
// e.g. set on backtest DataSourse: http://xxx.xx.x.xx:9090/data
// request: GET http://xxx.xx.x.xx:9090/data?custom=0&depth=20&detail=true&eid=OKX&from=1584921600&period=86400000&round=true&symbol=BTC_USDT&to=1611244800&trades=1
// http://xxx.xx.x.xx:9090/data?custom=0&depth=20&detail=true&eid=Futures_Binance&from=1599958800&period=3600000&round=true&symbol=BTC_USDT.swap&to=1611244800&trades=0
fmt.Println("request:", r)
// response
defer func() {
// response data
/* e.g. data
{
"detail": {
"eid": "Binance",
"symbol": "BTC_USDT",
"alias": "BTCUSDT",
"baseCurrency": "BTC",
"quoteCurrency": "USDT",
"marginCurrency": "USDT",
"basePrecision": 5,
"quotePrecision": 2,
"minQty": 0.00001,
"maxQty": 9000,
"minNotional": 5,
"maxNotional": 9000000,
"priceTick": 0.01,
"volumeTick": 0.00001,
"marginLevel": 10
},
"schema": [
"time",
"open",
"high",
"low",
"close",
"vol"
],
"data": [
[1610755200000, 3673743, 3795000, 3535780, 3599498, 8634843151],
[1610841600000, 3599498, 3685250, 3385000, 3582861, 8015772738],
[1610928000000, 3582499, 3746983, 3480000, 3663127, 7069811875],
[1611014400000, 3662246, 3785000, 3584406, 3589149, 7961130777],
[1611100800000, 3590194, 3641531, 3340000, 3546823, 8936842292],
[1611187200000, 3546823, 3560000, 3007100, 3085013, 13500407666],
[1611273600000, 3085199, 3382653, 2885000, 3294517, 14297168405],
[1611360000000, 3295000, 3345600, 3139016, 3207800, 6459528768],
[1611446400000, 3207800, 3307100, 3090000, 3225990, 5797803797],
[1611532800000, 3225945, 3487500, 3191000, 3225420, 8849922692]
]
}
*/
// /* Simulation level Tick
ret := map[string]interface{}{
"detail": map[string]interface{}{
"eid": "Binance",
"symbol": "BTC_USDT",
"alias": "BTCUSDT",
"baseCurrency": "BTC",
"quoteCurrency": "USDT",
"marginCurrency": "USDT",
"basePrecision": 5,
"quotePrecision": 2,
"minQty": 0.00001,
"maxQty": 9000,
"minNotional": 5,
"maxNotional": 9000000,
"priceTick": 0.01,
"volumeTick": 0.00001,
"marginLevel": 10,
},
"schema": []string{"time","open","high","low","close","vol"},
"data": []interface{}{
[]int64{1610755200000, 3673743, 3795000, 3535780, 3599498, 8634843151}, // 1610755200000 : 2021-01-16 08:00:00
[]int64{1610841600000, 3599498, 3685250, 3385000, 3582861, 8015772738}, // 1610841600000 : 2021-01-17 08:00:00
[]int64{1610928000000, 3582499, 3746983, 3480000, 3663127, 7069811875},
[]int64{1611014400000, 3662246, 3785000, 3584406, 3589149, 7961130777},
[]int64{1611100800000, 3590194, 3641531, 3340000, 3546823, 8936842292},
[]int64{1611187200000, 3546823, 3560000, 3007100, 3085013, 13500407666},
[]int64{1611273600000, 3085199, 3382653, 2885000, 3294517, 14297168405},
[]int64{1611360000000, 3295000, 3345600, 3139016, 3207800, 6459528768},
[]int64{1611446400000, 3207800, 3307100, 3090000, 3225990, 5797803797},
[]int64{1611532800000, 3225945, 3487500, 3191000, 3225420, 8849922692},
},
}
// */
/* Bot level Tick
ret := map[string]interface{}{
"detail": map[string]interface{}{
"eid": "Binance",
"symbol": "BTC_USDT",
"alias": "BTCUSDT",
"baseCurrency": "BTC",
"quoteCurrency": "USDT",
"marginCurrency": "USDT",
"basePrecision": 5,
"quotePrecision": 2,
"minQty": 0.00001,
"maxQty": 9000,
"minNotional": 5,
"maxNotional": 9000000,
"priceTick": 0.01,
"volumeTick": 0.00001,
"marginLevel": 10,
},
"schema": []string{"time", "asks", "bids", "trades", "close", "vol"},
"data": []interface{}{
[]interface{}{1610755200000, []interface{}{[]int64{9531300, 10}}, []interface{}{[]int64{9531300, 10}}, []interface{}{[]int64{1610755200000, 0, 9531300, 10}}, 9497060, 787},
[]interface{}{1610841600000, []interface{}{[]int64{9531300, 15}}, []interface{}{[]int64{9531300, 15}}, []interface{}{[]int64{1610841600000, 0, 9531300, 11}}, 9497061, 789},
},
}
*/
b, _ := json.Marshal(ret)
w.Write(b)
}()
}
func main () {
fmt.Println("listen http://localhost:9090")
http.HandleFunc("/data", Handle)
http.ListenAndServe(":9090", nil)
}
Estratégia de ensaio,JavaScript
Exemplo:
/*backtest
start: 2021-01-16 08:00:00
end: 2021-01-22 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"OKX","currency":"BTC_USDT","feeder":"http://120.24.2.20:9090/data"}]
args: [["number",2]]
*/
function main() {
var ticker = exchange.GetTicker()
var records = exchange.GetRecords()
Log(exchange.GetName(), exchange.GetCurrency())
Log(ticker)
Log(records)
}
Salvar configurações de teste de retorno
Motor de backtest local