avatar of 发明者量化-小小梦 发明者量化-小小梦
Suivre Messages privés
4
Suivre
1271
Abonnés

Solution de partage de marché multi-robots

Créé le: 2020-07-15 16:25:20, Mis à jour le: 2024-12-10 10:11:04
comments   4
hits   2306

Solution de partage de marché multi-robots

Solution de partage de marché multi-robots

Lors de l’utilisation de robots de trading quantitatif de devises numériques, lorsque plusieurs robots s’exécutent sur un serveur et accèdent à différents échanges, il n’y a pas de problème majeur et il n’y aura pas de problème de fréquence de demande d’API. Si vous avez besoin d’avoir plusieurs robots fonctionnant en même temps, et que tous exécutent des stratégies de trading quantitatives pour la même bourse et la même paire de trading. À l’heure actuelle, il existe un problème de limite de fréquence des requêtes API. Alors, comment résoudre le problème de plusieurs robots accédant à l’interface tout en utilisant le moins de serveurs ?

Nous pouvons mettre en œuvre un robot de transfert de marché, qui peut accéder à l’interface d’échange pour obtenir des informations sur le marché et d’autres données en utilisant uniquement ce robot. D’autres robots de stratégie de trading peuvent simplement demander des données à ce robot de transfert de marché.

Exemple d’un robot de transport de marché

Il est uniquement responsable de l’accès à l’interface de cotation des échanges pour obtenir des données et fournir des informations de cotation à d’autres robots. utiliserPythonDans cet exemple, nous obtenons uniquement des données K-line et proposons un partage. Nous pouvons l’étendre pour ajouter des données de profondeur, des données de marché agrégées, etc.

import _thread
import threading
import json
import math
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import parse_qs, urlparse

Records = None
lock = threading.RLock()
Counter = {}

def url2Dict(url):
    query = urlparse(url).query  
    params = parse_qs(query)  
    result = {key: params[key][0] for key in params}  
    return result

class Provider(BaseHTTPRequestHandler):
    def do_GET(self):
        global Records, lock, Counter
        try:
            self.send_response(200)
            self.send_header("Content-type", "application/json")
            self.end_headers()

            dictParam = url2Dict(self.path)
            # Log("服务接收到请求,self.path:", self.path, "query 参数:", dictParam)
            lock.acquire()
            # 记录
            if dictParam["robotId"] not in Counter:
                Counter[dictParam["robotId"]] = {"NumberOfRequests" : 0}
            Counter[dictParam["robotId"]]["NumberOfRequests"] += 1
            lock.release()
            
            # 写入数据应答
            self.wfile.write(json.dumps(Records).encode())
        except BaseException as e:
            Log("Provider do_GET error, e:", e)


def createServer(host):
    try:
        server = HTTPServer(host, Provider)
        Log("Starting server, listen at: %s:%s" % host)
        server.serve_forever()
    except BaseException as e:
        Log("createServer error, e:", e)
        raise Exception("stop")

def main():
    global Records, Counter
    LogReset(1)
    try:
        # _thread.start_new_thread(createServer, (("localhost", 9090), ))         # 本机测试
        _thread.start_new_thread(createServer, (("0.0.0.0", 9090), ))             # VPS服务器上测试
        Log("启动服务", "#FF0000")
    except BaseException as e:
        Log("启动服务失败!")
        Log("错误信息:", e)
        raise Exception("stop")
    while True:
        r = exchange.GetRecords()
        if not r :
            Log("K线行情获取失败", "#FF0000")
            continue
        else :
            Records = r
        # Counter
        tbl = {
            "type" : "table", 
            "title" : "统计信息", 
            "cols" : ["请求数据的机器人id", "请求次数"], 
            "rows" : [], 
        }
        for k in Counter:
            tbl["rows"].append([k, Counter[k]["NumberOfRequests"]])
        LogStatus(_D(), "数据收集中!", "\n", "`" + json.dumps(tbl) + "`")
        Sleep(500)
        

Demander le code de stratégie du robot de données

Le robot qui demande des données est le robot de stratégie de trading. Cependant, à des fins de test, nous écrivons uniquement les données demandées (données K-line) et dessinons les données.JavaScriptPour dessiner une image, vous devez consulter la « Bibliothèque de dessins au trait ». Vous pouvez rechercher et copier cette bibliothèque dans le carré stratégique. Après la copie, vous pouvez consulter la colonne de référence du modèle dans la page d’édition de la stratégie.

var FuncGetRecords = exchange.GetRecords
exchange.GetRecords = function() {
    // 可以填写「行情转发机器人」所在设备的IP地址xxx.xxx.xxx.xxx
    var ret = HttpQuery("http://xxx.xxx.xxx.xxx:9090?robotId=" + _G())  
    var records = null
    try {
        records = JSON.parse(ret)
    } catch(e) {
        Log(e)
        records = null
    }
    return records 
}

function main(){
    LogReset(1)
    while(1) {
        var records = exchange.GetRecords()
        LogStatus(_D(), "机器人ID:", _G())
        if (!records) {
            Log("获取数据失败!", "#FF0000")
            Sleep(1000)
            continue
        }
        Log(records)
        $.PlotRecords(records, "K")
        Sleep(1000)
    }
}

Fonctionnement réel

  • Démarrer le robot de transfert de marché Solution de partage de marché multi-robots

  • Démarrer le robot de test, ID : 206353 Solution de partage de marché multi-robots

  • Démarrer le robot de test, ID : 206359 Solution de partage de marché multi-robots

  • Démarrer le robot de test, ID : 206360 Solution de partage de marché multi-robots

De cette manière, trois ou même N robots peuvent partager les données K-line d’une certaine paire de trading. Ceci n’est qu’un point de départ, n’hésitez pas à laisser un message.