En la carga de los recursos... Cargando...

Fuente de datos personalizada

El sistema de backtesting de la Plataforma de Comercio Cuántico FMZ admite fuentes de datos personalizadas, el sistema de backtesting utiliza elGETmétodo para solicitar una URL personalizada (URL accesible públicamente) para obtener una fuente de datos externa para backtest.

Parámetro Significado Explicación
el símbolo Nombre del símbolo Datos del mercado al contado, tales como:BTC_USDT, datos del mercado de futuros, tales como:BTC_USDT.swap, datos de las tasas de financiación de contratos perpetuos de futuros, tales como:BTC_USDT.funding, los datos del índice de precios de los contratos perpetuos de futuros, tales como:BTC_USDT.index
el día Los intercambios En el caso de las entidades de garantía, el valor de la garantía será el valor de la garantía.
redondo Precisión de los datos True significa que la precisión específica se define en los datos suministrados por la fuente de datos personalizada.round=true
el período Período de datos de línea K (millisegundos) como por ejemplo:60000es un período de 1 minuto
profundidad Niveles de profundidad 1-20
las operaciones Si es necesario dividir datos verdadero (y) / falso (y)
desde Tiempo de inicio el tiempo de unix
En el El tiempo del fin el tiempo de unix
Detalle Datos solicitados para los detalles del símbolo La solicitud enviada por el sistema de pruebas de retroceso de la plataforma de negociación cuántica FMZ al origen de datos personalizado se fija como:detail=true
de costumbre Este parámetro puede ignorarse

Cuando la fuente de datos de los objetos de intercambio al contado y de intercambio de futuros esté configurada en una fuente de datos personalizada (feeder), el sistema de backtesting envía una solicitud al servicio de fuente de datos 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 datos

El formato devuelto debe ser uno de los dos formatos siguientes (que serán reconocidos automáticamente por el sistema):

  • Nivel de simulación Tick, el siguiente es un ejemplo de datos 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 el nivel de bot, el siguiente es un ejemplo de datos JSON: Los datos de backtest a nivel de tick (contienen información sobre la profundidad del mercado, y el formato de profundidad es una matriz de[price, volume]Puede tener múltiples niveles de profundidad,askspara el orden ascendente de precios,bidspara el orden decreciente de precios).

    {
        "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]
        ]
    }
    
El campo Descripción
Detalle Información detallada sobre el tipo de datos solicitado.

incluido el nombre de la moneda denominada, el nombre de la moneda de comercio, la precisión, la cantidad mínima de pedido, etc. Esquema especifica los atributos de las columnas en los datos matriz, que es sensible a mayúsculas y está limitada sólo al tiempo, abierto, alto, bajo, cerrado, vol, pide, ofrece, negociaciones Datos La estructura de columnas, datos registrados de acuerdo con el esquema Configuración.

campo de detalles

El campo Descripción
el día Exchange Id, tenga en cuenta que el spot y los futuros de un
Ciertos intercambios tienen diferentes efectos.
el símbolo Código del producto de negociación
Alias El símbolo en el intercambio correspondiente al actual
Código del producto de comercio
Cuota de mercado Moneda de negociación
cotizaciónMoneda Moneda denominada
MargenValuta Moneda de margen
basePrecisión Precisión de la moneda de la transacción
Citación Precisión Precisión de las monedas
el número de Cantidad mínima de pedido
Cuota máxima Cantidad máxima de pedido
Min Nocional Número mínimo de pedido
max Nocional Cuota máxima de la orden
precioTick Salto de precios
volumenMarcar Valor mínimo de cambio de la cantidad de pedido (un salto en
cantidad de pedido)
Margen y nivel Valor de apalancamiento de los futuros
ContratoTipo En el caso de los contratos perpetuos:swap, el

el sistema de backtest continuará enviando tasa de financiación e índice de precios las peticiones.

Atributos especiales de columnaasks, bids, trades:

El campo Descripción Las observaciones
Pide / ofrece [precio, volumen],...] Por ejemplo, los datos en

ElLive Trading Level TickEjemplo de datos:[[9531300, 10]]¿Qué es eso? Las operaciones. El tiempo, la dirección, el precio, el volumen... Por ejemplo, los datos en elLive Trading Level TickEjemplo de datos:[[1564315200000, 0, 9531300, 10]] |

Cuando se realizan pruebas de retroceso de contratos perpetuos en las bolsas de futuros, las Las fuentes de datos también requieren datos adicionales sobre la tasa de financiación y el precio El sistema de backtesting continuará enviando las solicitudes para las tasas de financiación únicamente cuando se devuelvan los datos de mercado solicitados y el campo de detalles en la estructura devuelta contiene el"contractType": "swap"el par clave-valor.

Cuando el sistema de backtesting reciba datos sobre las tasas de financiación, seguir enviando solicitudes de datos sobre el índice de precios.

La estructura de los datos de las tasas de financiación es la siguiente:

{
    "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
        ]
        // ...
    ]
}
  • El intervalo entre los períodos contiguos es de 8 horas
  • Por ejemplo, la tasa de financiación de Binance se actualiza cada 8 horas. ¿Son los datos de la tasa de financiación -16795? Debido a que al igual que los datos de línea K, para evitar la pérdida de precisión de punto flotante durante la transmisión de la red, los datos utilizan el tipo entero; los datos de la tasa de financiación también pueden ser negativos.

Ejemplo de solicitud de datos de tasas de financiación de las pruebas de retroceso el sistema es:

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

La estructura de los datos del índice de precios es la siguiente:


{
    "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],
        // ...
    ]
}

Ejemplo de solicitud de datos de índice de precios enviada por el backtesting el sistema es:

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

Ejemplo de fuente de datos personalizada

Especificar la dirección de la fuente de datos, por ejemplo,http://120.24.2.20:9090/dataEl programa de servicio de fuente de datos personalizado está 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)
}

Estrategia de ensayoJavaScriptEjemplo:

/*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)
}
Guardar las configuraciones de prueba de retroceso Motor de pruebas de retroceso local