Les ressources ont été chargées... Je charge...

Source de données personnalisée

Le système de backtesting de la plateforme de trading quantitatif FMZ prend en charge les sources de données personnalisées, le système de backtesting utilise lesGETméthode pour demander une URL personnalisée (URL accessible au public) afin d'obtenir une source de données externe pour le backtest.

Paramètre Signification Expliquer
le symbole Nom du symbole Données du marché au comptant, telles que:BTC_USDT, les données du marché à terme, telles que:BTC_USDT.swap, données sur les taux de financement des contrats perpétuels à terme, telles que:BTC_USDT.funding, les données relatives à l'indice des prix des contrats à terme perpétuels, telles que:BTC_USDT.index
- Je vous en prie. Les échanges Les éléments suivants doivent être pris en considération:
ronde La précision des données True signifie que la précision spécifique est définie dans les données transmises par la source de données personnalisée.round=true
période Période de données en ligne K (millièmes de seconde) par exemple:60000est une période de 1 minute
profondeur Niveaux de profondeur 1-20
commerces Si les données doivent être scindées vrai (1) / faux (2)
de Heure de début Le timestamp est unix
à Le temps de la fin Le timestamp est unix
détails Données demandées pour les détails du symbole True signifie qu'il doit être fourni par une source de données personnalisée.detail=true
personnalisation Ce paramètre peut être ignoré.

Lorsque la source de données des objets d'échange au comptant et des objets d'échange à terme est définie sur une source de données personnalisée (feeder), le système de backtesting envoie une demande au service de source de données personnalisée:

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

Format des données

Le format retourné doit être l'un des deux formats suivants (qui seront automatiquement reconnues par le système):

  • Niveau de simulation Tick, voici un exemple de données 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]
        ]
    }
    
  • Cochez le niveau de bot, voici un exemple de données JSON: Les données de backtest au niveau du tick (contiennent des informations sur la profondeur du marché, et le format de profondeur est un tableau de[price, volume]Il peut avoir plusieurs niveaux de profondeur,askspour l'ordre croissant des prix,bidspour l' ordre décroissant des prix).

    {
        "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]
        ]
    }
    
Le champ Définition
détails Informations détaillées sur le type de données demandé,

le nom de la monnaie libellée, le nom de la la précision, la quantité de commande minimale, etc. Il spécifie les attributs des colonnes dans les données array, qui est sensible aux petites lettres et est limité au temps, ouvert, haut, bas, fermé, vol, demande, offre, négocie Les données La structure des colonnes, les données enregistrées selon le schéma réglages.

champ de détail

Le champ Définition
- Je vous en prie. Exchange Id, veuillez noter que le spot et les contrats à terme d'un
Certains échanges ont des effets différents.
le symbole Code du produit de négociation
alias Le symbole de l'échange correspondant au courant
code du produit commercial
Monnaie de base Monnaie de négociation
CitéMonnaie Monnaies libellées
MargeMonnaie Monnaie de marge
basePrécision Vérité de la monnaie de la transaction
Citation précise Précision de la devise de prix
MinQty Quantité minimale de commande
Le nombre maximal Quantité maximale de commande
Le projet de Montant minimum de la commande
maxNotif Montant maximal de la commande
prixTick Saut de prix
Le volume Valeur minimale de modification de la quantité d'ordre (un saut dans la quantité)
quantité de commande)
MargeLe niveau Valeur de l'effet de levier des contrats à terme
type de contrat Pour les contrats perpétuels fixés à:swap, le

Le système de backtest continuera à envoyer des indices de taux de financement et de prix Les demandes.

Attributs de colonne spéciauxasks, bids, trades:

Le champ Définition Les commentaires
demande / offre [prix, volume],...] Par exemple, les données

LeLive Trading Level TickExemple de données:[[9531300, 10]]Je ne sais pas. Les échanges, le temps, la direction, le prix, le volume... Par exemple, les donnéesLive Trading Level TickExemple de données:[[1564315200000, 0, 9531300, 10]] |

Lors du backtesting des contrats perpétuels sur les bourses à terme, les Les sources de données nécessitent également des données supplémentaires sur le taux de financement et le prix Le système de backtesting continuera d'envoyer des requêtes pour les taux de financement uniquement lorsque les données de marché demandées sont renvoyées et le champ de détail dans la structure retournée contient le"contractType": "swap"une paire clé-valeur.

Lorsque le système de backtesting reçoit des données sur le taux de financement, il continuer d'envoyer des demandes de données sur l'indice des prix.

La structure des données sur le taux de financement est la suivante:

{
    "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
        ]
        // ...
    ]
}
  • L'intervalle entre les périodes adjacentes est de 8 heures.
  • Par exemple, le taux de financement de Binance est mis à jour toutes les 8 heures. Les données relatives au taux de financement sont-elles -16795? Parce que, comme les données de ligne K, afin d'éviter la perte de précision en virgule flottante pendant la transmission réseau, les données utilisent le type entier; les données de taux de financement peuvent également être négatives.

Exemple de demande de données sur le taux de financement à partir du backtesting Le système est le suivant:

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 structure des données relatives à l'indice des prix est la suivante:


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

Exemple de demande de données sur l'indice des prix envoyée par le backtesting Le système est le suivant:

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

Exemple de source de données personnalisée

Indiquer l'adresse de la source de données, par exemple:http://120.24.2.20:9090/dataLe programme de service de source de données personnalisé est écrit en utilisantGolang:

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

stratégie de test,JavaScriptExemple:

/*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)
}
Enregistrer les paramètres de test arrière Moteur de test de retour local