Les ressources ont été chargées... Je charge...

Solution de partage de marché multi-robots

Auteur:L'inventeur de la quantification - un petit rêve, Créé: 2020-07-15 16:25:20, Mis à jour: 2024-12-10 10:11:04

img

Solution de partage de marché multi-robots

Lors de l'utilisation d'un robot de transaction quantitative de crypto-monnaie, lorsque plusieurs robots doivent être exécutés sur un serveur, si vous accédez à différents échanges, le problème n'est pas grand, il n'y a pas de problème de fréquence des demandes d'API. Si vous avez besoin de plusieurs robots pour exécuter simultanément la même stratégie de transaction quantitative pour les mêmes échanges et les mêmes transactions, alors il y a un problème de limitation de la fréquence des demandes d'API.

Nous pouvons réaliser un robot de transfert de marché, accéder à l'interface de l'échange, obtenir des données sur le marché, etc. avec ce seul robot. D'autres stratégies de négociation permettent à un robot de transfert de marché de demander des données.

Exemple de robot de transfert

Il est responsable de l'accès à l'interface de transaction de l'échange uniquement pour obtenir des données et fournir des transactions à d'autres robots.PythonDans l'exemple précédent, nous n'avons obtenu que des données de ligne K, et nous avons fourni un partage, qui peut être étendu pour ajouter des données de profondeur, agrandir les données de marché, 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)
        

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

Le robot qui demande des données est un robot de stratégie de transaction, mais nous l'avons testé, nous avons juste écrit les données de la demande (les données de la ligne K) et nous avons dessiné les données, nous pouvons utiliserJavaScriptPour écrire, pour dessiner, vous devez cocher "Classe de lignes de dessin". Vous pouvez copier cette bibliothèque dans la recherche de la place de la stratégie, puis copier et cocher une référence au 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

  • Le déploiement d'un robot de livraisonimg

  • Début du robot de test, ID:206353img

  • Début du robot de test, ID:206359img

  • Début du robot de test, ID:206360img

Cela permet à trois ou même N robots de partager les données de la ligne K pour une transaction. Je vous souhaite la bienvenue à la page d'accueil de l'événement.


Relationnée

Plus de

Les courts-circuits de Wang Won vendent des stratégies à prix élevéBon appétit.

Je suis désolée. 666