La prise en charge des données de devises de marché est indispensable lors de la recherche, de la conception et du backtest des stratégies de trading. Il n'est pas réaliste de collecter toutes les données de chaque marché, après tout, la quantité de données est trop importante. Pour le marché de la monnaie numérique, la plateforme FMZ prend en charge des données de backtest limitées pour les échanges et les paires de trading. Si vous souhaitez faire un backtest de certains échanges et paires de trading qui n'étaient pas temporairement pris en charge par la plateforme FMZ, vous pouvez utiliser une source de données personnalisée pour le backtest, mais cette prémisse exige que vous ayez des données. Par conséquent, il y a un besoin urgent d'un programme de collecte de devises de marché, qui peut être persistant et mieux obtenu en temps réel.
De cette façon, nous pouvons répondre à plusieurs besoins, tels que:
et bien d'autres encore...
Nous prévoyons d'utiliser Python pour y parvenir, pourquoi?
La bibliothèque Python
Parce que vous avez besoin d'utiliser une base de données pour le stockage permanent.MongoDB
et le langage Python est utilisé pour écrire le programme de collection, donc la bibliothèque de pilotes de cette base de données est nécessaire.
Il suffit d'installerpymongo
sur Python.
Installer MongoDB sur le périphérique d'hébergement Par exemple: MacOS installe MongoDB, également le même que le système Windows installe MongoDB. Il y a beaucoup de tutoriels en ligne. Prenez l'installation du système MacOS comme exemple:
Télécharger Lien de téléchargement:https://www.mongodb.com/download-center?jmp=nav#community
Décompresser
Après le téléchargement, décompresser dans le répertoire:/usr/local
Configurer les variables d'environnement
Entrée du terminal:open -e .bash_profile
, après ouverture du dossier, écrire:exportPATH=${PATH}:/usr/local/MongoDB/bin
Après le stockage, dans le terminal, utilisesource .bash_profile
pour que les changements prennent effet.
Configurer manuellement le répertoire de fichiers de base de données et le répertoire de journaux
Créer le dossier correspondant dans le répertoire/usr/local/data/db
Je suis désolée.
Créer le dossier correspondant dans le répertoire/usr/local/data/logs
.
Modifier le fichier de configurationmongo.conf
:
#bind_ip_all = true # Any computer can connect
bind_ip = 127.0.0.1 # Local computer can access
port = 27017 # The instance runs on port 27017 (default)
dbpath = /usr/local/data/db # data folder storage address (db need to be created in advance)
logpath = /usr/local/data/logs/mongodb.log # log file address
logappend = false # whether to add or rewrite the log file at startup
fork = false # Whether to run in the background
auth = false # Enable user verification
Commande:
./mongod -f mongo.conf
use admin;
db.shutdownServer();
Le collecteur fonctionne comme une stratégie de robot Python sur la plateforme FMZ.
Code du programme du collecteur:
import pymongo
import json
def main():
Log("Test data collection")
# Connect to the database service
myDBClient = pymongo.MongoClient("mongodb://localhost:27017") # mongodb://127.0.0.1:27017
# Create a database
huobi_DB = myDBClient["huobi"]
# Print the current database table
collist = huobi_DB.list_collection_names()
Log("collist:", collist)
# Check if the table is deleted
arrDropNames = json.loads(dropNames)
if isinstance(arrDropNames, list):
for i in range(len(arrDropNames)):
dropName = arrDropNames[i]
if isinstance(dropName, str):
if not dropName in collist:
continue
tab = huobi_DB[dropName]
Log("dropName:", dropName, "delete:", dropName)
ret = tab.drop()
collist = huobi_DB.list_collection_names()
if dropName in collist:
Log(dropName, "failed to delete")
else :
Log(dropName, "successfully deleted")
# Create the records table
huobi_DB_Records = huobi_DB["records"]
# Request data
preBarTime = 0
index = 1
while True:
r = _C(exchange.GetRecords)
if len(r) < 2:
Sleep(1000)
continue
if preBarTime == 0:
# Write all BAR data for the first time
for i in range(len(r) - 1):
# Write one by one
bar = r[i]
huobi_DB_Records.insert_one({"index": index, "High": bar["High"], "Low": bar["Low"], "Open": bar["Open"], "Close": bar["Close"], "Time": bar["Time"], "Volume": bar["Volume"]})
index += 1
preBarTime = r[-1]["Time"]
elif preBarTime != r[-1]["Time"]:
bar = r[-2]
huobi_DB_Records.insert_one({"index": index, "High": bar["High"], "Low": bar["Low"], "Open": bar["Open"], "Close": bar["Close"], "Time": bar["Time"], "Volume": bar["Volume"]})
index += 1
preBarTime = r[-1]["Time"]
LogStatus(_D(), "preBarTime:", preBarTime, "_D(preBarTime):", _D(preBarTime/1000), "index:", index)
Sleep(10000)
Adresse complète de la stratégie:https://www.fmz.com/strategy/199120
Créez un robot stratégique qui utilise les données.
Remarque: Vous devez vérifier le
Voici l'adresse:https://www.fmz.com/strategy/39066
import pymongo
import json
def main():
Log("Test using database data")
# Connect to the database service
myDBClient = pymongo.MongoClient("mongodb://localhost:27017") # mongodb://127.0.0.1:27017
# Create a database
huobi_DB = myDBClient["huobi"]
# Print the current database table
collist = huobi_DB.list_collection_names()
Log("collist:", collist)
# Query data printing
huobi_DB_Records = huobi_DB["records"]
while True:
arrRecords = []
for x in huobi_DB_Records.find():
bar = {
"High": x["High"],
"Low": x["Low"],
"Close": x["Close"],
"Open": x["Open"],
"Time": x["Time"],
"Volume": x["Volume"]
}
arrRecords.append(bar)
# Use the line drawing library to draw the obtained K-line data
ext.PlotRecords(arrRecords, "K")
LogStatus(_D(), "records length:", len(arrRecords))
Sleep(10000)
On peut voir que le code du robot de stratégie qui utilise les données n'accède à aucune interface d'échange. Les données sont obtenues en accédant à la base de données. Le programme de collecteur de marché n'enregistre pas les données BAR actuelles. Il collecte les données BAR en ligne K dans l'état terminé. Si les données BAR en temps réel actuelles sont nécessaires, elles peuvent être légèrement modifiées.
Le code d'exemple actuel est juste pour la démonstration. Lorsque vous accédez aux enregistrements de données dans la table dans la base de données, tous sont obtenus. De cette façon, à mesure que le temps de collecte des données augmente, de plus en plus de données sont collectées. Toutes les requêtes affecteront les performances dans une certaine mesure et peuvent être conçues. Seules les données plus récentes que les données actuelles sont interrogées et ajoutées aux données actuelles.
exécuter le programme docker
Sur l'appareil où se trouve le docker, exécutez le service de base de données MongoDB
Le collecteur court pour collecter les paires de trading BTC_USDT de la plateforme FMZ WexApp simulation échange marekt cotes: WexApp adresse: https://wex.app/trade?currency=BTC_USDT
Le robot A utilise les données de la base de données:
Le robot B utilise les données de la base de données:
La page WexApp:
Comme vous pouvez le voir sur la figure, les robots avec des identifiants différents partagent des données de ligne K en utilisant une source de données.
En s'appuyant sur les puissantes fonctions de la plateforme FMZ, nous pouvons facilement collecter des données de ligne K à tout cycle. Par exemple, je veux collecter une ligne K de 3 minutes, et si l'échange n'a pas de ligne K de 3 minutes?
Nous modifions la configuration du robot collecteur, la période de ligne K est réglée sur 3 minutes, et la plateforme FMZ synthétisera automatiquement une ligne K de 3 minutes au programme collecteur.
On utilise le paramètre pour supprimerthe name of the table
, réglage: [
Commencez lecollector program
, puis redémarrer lestrategy robot using the data
.
Vous pouvez voir le graphique des lignes K dessiné, l'intervalle entre les BAR est de 3 minutes, et chaque BAR est une barre de lignes K avec une période de 3 minutes.
Dans le prochain numéro, nous allons essayer de mettre en œuvre les exigences des sources de données personnalisées.
Merci d'avoir lu!