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 lesGET
mé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:60000 est 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
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,asks
pour l'ordre croissant des prix,bids
pour 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 Tick
Exemple 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 Tick
Exemple 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
]
// ...
]
}
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
Indiquer l'adresse de la source de données, par exemple:http://120.24.2.20:9090/data
Le 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,JavaScript
Exemple:
/*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