Vous apprendre à mettre en œuvre un collecteur de cotations de marché

Auteur:La bonté, Créé: 2020-05-30 10:03:39, Mis à jour: 2023-11-02 19:52:02

img

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:

  • Plusieurs robots peuvent être dotés de sources de données, ce qui peut faciliter la fréquence d'accès de chaque robot à l'interface d'échange.
  • Vous pouvez obtenir des données K-line avec un nombre suffisant de K-line BARs lorsque le robot démarre, et vous n'avez plus à vous soucier du nombre insuffisant de K-line BARs lorsque le robot démarre.
  • Il peut recueillir des données de marché sur les devises rares et fournir une source de données personnalisée pour le système de backtest de la plateforme FMZ.

et bien d'autres encore...

Nous prévoyons d'utiliser Python pour y parvenir, pourquoi?

Je suis prête.

  • La bibliothèque Python Parce que vous avez besoin d'utiliser une base de données pour le stockage permanent.MongoDBet 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'installerpymongosur 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/binAprès le stockage, dans le terminal, utilisesource .bash_profilepour 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/dbJe 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
  • Exécuter le service MongoDB

Commande:

./mongod -f mongo.conf
  • Arrêter le service MongoDB
use admin;
db.shutdownServer();

Mettre en œuvre le programme de collecte

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

Données d'utilisation

Créez un robot stratégique qui utilise les données. Remarque: Vous devez vérifier le python PlotLine Template, si vous ne l'avez pas, vous pouvez en copier un du carré de stratégie dans votre bibliothèque de stratégie.

img

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.

On court!

exécuter le programme docker

img

Sur l'appareil où se trouve le docker, exécutez le service de base de données MongoDB

img

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

img

Le robot A utilise les données de la base de données:

img

Le robot B utilise les données de la base de données:

img

La page WexApp:

img

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.

Recueillir des données de ligne K de toute période

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.

img

On utilise le paramètre pour supprimerthe name of the table, réglage: [enregistrements] supprimer la table de données de ligne K de 1 minute collectée précédemment.

Commencez lecollector program, puis redémarrer lestrategy robot using the data.

img

img

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!


Relationnée

Plus de