Je vous apprends étape par étape à mettre en place un collecteur de marché

Créé le: 2020-04-16 12:44:03, Mis à jour le: 2024-12-12 20:55:38
comments   7
hits   3429

Je vous apprends étape par étape à mettre en place un collecteur de marché

Dans le trading programmatique et le trading quantitatif, la recherche de stratégies, la conception de stratégies et l’analyse de backtesting sont indissociables du support des données de marché. Il n’est pas réaliste de collecter toutes les données du marché, après tout, la quantité de données est trop importante. Pour le marché des devises numériques, la plateforme de trading quantitatif Inventor prend en charge les données de backtesting pour des échanges et des paires de trading limités. Si vous souhaitez tester certaines bourses et paires de trading qui ne prennent actuellement pas en charge les données. Vous pouvez utiliser des sources de données personnalisées pour le backtesting, mais cela nécessite que vous disposiez de vos propres données. Il existe donc un besoin urgent d’un programme de collecte d’informations sur le marché qui puisse être stocké de manière persistante et, de préférence, obtenu en temps réel.

Cela résout plusieurs exigences, telles que :

  • Les sources de données peuvent être fournies à plusieurs robots, ce qui peut réduire la fréquence d’accès de chaque robot à l’interface d’échange.
  • Lorsque le robot démarre, il peut obtenir des données de ligne K avec un nombre suffisant de BARS de ligne K, vous n’avez donc plus à vous soucier du nombre insuffisant de BARS de ligne K lorsque le robot démarre.
  • Il peut collecter des données de marché de petites devises pour fournir une source de données personnalisée pour le système de backtesting de la plateforme de trading quantitatif Inventor, afin d’utiliser le système de backtesting pour tester les stratégies.
  • etc..

Vous envisagez d’utiliser Python pour l’implémenter, pourquoi ? Parce que c’est pratique :) Si vous avez un besoin, agissez !

Préparer

  • Bibliothèque Pymongo de Python

Parce qu’une base de données est nécessaire pour le stockage persistant. Utilisation de la sélection des donnéesMongoDB, utilisez le langage Python pour écrire le programme de collecte, la bibliothèque de pilotes de cette base de données est donc nécessaire. Installation sur PythonpymongoC’est ça.

  • Installer MongoDB sur la machine hôte

Par exemple : installer MongoDB sur MAC. Bien entendu, l’installation de MongoDB sur WIN est similaire. Il existe de nombreux tutoriels en ligne. Prenons l’exemple de l’installation sur un Mac d’Apple :

  • 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écompressez-le dans le répertoire :/usr/local

  • Configuration des variables d’environnement Entrée du terminal :open -e .bash_profile, après avoir ouvert le fichier, écrivez :export PATH=${PATH}:/usr/local/MongoDB/bin Après avoir enregistré, utilisez le terminalsource .bash_profileFaites en sorte que les modifications prennent effet.

  • Configurer manuellement le répertoire des fichiers de base de données et le répertoire des journaux Créer un répertoire/usr/local/data/dbLe dossier correspondant dans . Créer un répertoire/usr/local/data/logsLe dossier correspondant dans .

  • Modification du fichier de configurationmongo.conf

  #bind_ip_all = true                        # 任何机器可以连接
  bind_ip = 127.0.0.1                        # 本机可以访问
  port = 27017                               # 实例运行在27017端口(默认)
  dbpath = /usr/local/data/db                # 数据文件夹存放地址(db要预先创建)
  logpath = /usr/local/data/logs/mongodb.log # 日志文件地址
  logappend = false                          # 启动时 添加还是重写日志文件
  fork = false                               # 是否后台运行
  auth = false                               # 开启校验用户
  • Exécuter le service MongoDB

Commande:

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

Mise en œuvre du programme Collector

Le collecteur fonctionne comme une stratégie de robot Python sur la plateforme de trading quantitatif Inventor. En raison de ma maîtrise limitée de Python, je n’ai implémenté qu’un exemple simple pour démontrer les idées de cet article.

Code de stratégie du collectionneur :

import pymongo
import json

def main():
    Log("测试数据收集")
    
    # 连接数据库服务
    myDBClient = pymongo.MongoClient("mongodb://localhost:27017")   # mongodb://127.0.0.1:27017
    # 创建数据库
    huobi_DB = myDBClient["huobi"]
    
    # 打印目前数据库表
    collist = huobi_DB.list_collection_names()
    Log("collist:", collist)
    
    # 检测是否删除表
    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, "删除:", dropName)
                ret = tab.drop()
                collist = huobi_DB.list_collection_names()
                if dropName in collist:
                    Log(dropName, "删除失败")
                else :
                    Log(dropName, "删除成功")
    
    # 创建records表
    huobi_DB_Records = huobi_DB["records"]
    
    # 请求数据
    preBarTime = 0
    index = 1
    while True:
        r = _C(exchange.GetRecords)
        if len(r) < 2:
            Sleep(1000)
            continue
        if preBarTime == 0:
            # 首次写入所有BAR数据
            for i in range(len(r) - 1):
                # 逐根写入
                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 politique :Lien

Données d’utilisation

Créez des robots stratégiques qui utilisent les données. Remarque : vous devez vérifierBibliothèque de dessins au traitSi vous ne l’avez pas, vous pouvez en copier un dans votre propre bibliothèque de stratégies. Je vous apprends étape par étape à mettre en place un collecteur de marché

import pymongo
import json

def main():
    Log("测试使用数据库数据")
    
    # 连接数据库服务
    myDBClient = pymongo.MongoClient("mongodb://localhost:27017")   # mongodb://127.0.0.1:27017
    # 创建数据库
    huobi_DB = myDBClient["huobi"]
    
    # 打印目前数据库表
    collist = huobi_DB.list_collection_names()
    Log("collist:", collist)
    
    # 查询数据打印
    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)
        
        # 使用画线类库,把取到的K线数据画出来
        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 des données n’accède à aucune interface d’échange. Il obtient des données en accédant à la base de données. Le programme de collecte de marché n’enregistre pas les données de la BAR actuelle. Il collecte la BAR K-line dans le état terminé. Si la BAR actuelle doit être mise à jour en temps réel, les données peuvent être légèrement modifiées. L’exemple de code actuel est uniquement destiné à la démonstration. Lors de l’accès aux enregistrements de données dans la table de la base de données, tous les enregistrements de données sont obtenus. Au fur et à mesure que le temps de collecte des données augmente, de plus en plus de données sont collectées. L’interrogation de toutes les données affectera les performances dans une certaine mesure. Vous pouvez concevoir uniquement des requêtes sur les données plus récentes que les données actuelles et les ajouter aux données actuelles.

courir

Exécuter le programme hôte Je vous apprends étape par étape à mettre en place un collecteur de marché

Sur l’appareil de l’hôte, exécutezMongoDBServices de base de données ./mongod -f mongo.conf Je vous apprends étape par étape à mettre en place un collecteur de marché

Le collectionneur court récupérer les disques simulés de la plateforme de trading quantitative de l’inventeurwexAppdeBTC_USDTPaires de trading : adresse:wexApp Je vous apprends étape par étape à mettre en place un collecteur de marché

Robot A utilisant les données de la base de données : Je vous apprends étape par étape à mettre en place un collecteur de marché

Robot B utilisant les données de la base de données : Je vous apprends étape par étape à mettre en place un collecteur de marché

wexApppage: Je vous apprends étape par étape à mettre en place un collecteur de marché

Comme on peut le voir sur la figure, les robots avec des identifiants différents partagent les données K-line provenant de la même source de données.

Collecter des données K-line de n’importe quelle période

En nous appuyant sur les puissantes fonctions de la plateforme de trading quantitative de l’inventeur, nous pouvons facilement collecter des données K-line de n’importe quelle période. Par exemple, je souhaite collecter des K-line de 3 minutes, que dois-je faire si la bourse n’a pas de K-line de 3 minutes ? Ce n’est pas grave, cela peut être facilement réalisé.

Nous modifions la configuration du robot collecteur et fixons la période de la ligne K à 3 minutes. La plateforme de trading quantitative Inventor synthétise automatiquement une ligne K de 3 minutes pour le programme collecteur. Je vous apprends étape par étape à mettre en place un collecteur de marché

Nous utilisons le paramètre删除表的名称,installation:["records"]Supprimez le tableau de données K-line d’une minute précédemment collecté. Préparez-vous à collecter des données de ligne K de 3 minutes.

démarrer收集器程序, redémarrage使用数据的策略机器人

Je vous apprends étape par étape à mettre en place un collecteur de marché

Je vous apprends étape par étape à mettre en place un collecteur de marché

À partir du graphique K-line dessiné, vous pouvez voir que l’intervalle entre les BARS est de 3 minutes et que chaque BAR est une colonne K-line avec une période de 3 minutes.

Dans le prochain numéro, nous essaierons de mettre en œuvre les exigences des sources de données personnalisées. Merci d’avoir lu