O recurso está a ser carregado... Carregamento...

Fonte de dados personalizada

O sistema de backtesting da FMZ Quant Trading Platform suporta fontes de dados personalizadas, o sistema de backtesting utiliza oGETmé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

Formato de dados

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,askspara a ordem ascendente de preços,bidspara 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 TickExemplo de dados:[[9531300, 10]]- Sim, sim. O tempo, a direcção, o preço, o volume,... Por exemplo, os dados noLive Trading Level TickExemplo 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
        ]
        // ...
    ]
}
  • O intervalo entre períodos adjacentes é de 8 horas
  • Por exemplo, a taxa de financiamento da Binance é atualizada a cada 8 horas. Os dados da taxa de financiamento são -16795? Porque, como os dados de linha K, a fim de evitar a perda de precisão de ponto flutuante durante a transmissão de rede, os dados usam o tipo inteiro; os dados da taxa de financiamento também podem ser negativos.

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

Exemplo de fonte de dados personalizada

Especificar o endereço da fonte de dados, por exemplo:http://120.24.2.20:9090/dataO 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,JavaScriptExemplo:

/*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