avatar of 发明者量化-小小梦 发明者量化-小小梦
konzentrieren Sie sich auf Private Nachricht
4
konzentrieren Sie sich auf
1271
Anhänger

Lösung zur Marktaufteilung mit mehreren Robotern

Erstellt in: 2020-07-15 16:25:20, aktualisiert am: 2024-12-10 10:11:04
comments   4
hits   2306

Lösung zur Marktaufteilung mit mehreren Robotern

Lösung zur Marktaufteilung mit mehreren Robotern

Wenn bei der Verwendung von quantitativen Handelsrobotern für digitale Währungen mehrere Roboter auf einem Server ausgeführt werden und auf unterschiedliche Börsen zugreifen, gibt es keine größeren Probleme und auch keine Probleme mit der Häufigkeit der API-Anfragen. Wenn Sie mehrere Roboter gleichzeitig laufen lassen müssen und alle quantitative Handelsstrategien für dieselbe Börse und dasselbe Handelspaar durchführen. Derzeit besteht ein Problem mit der Begrenzung der API-Anforderungshäufigkeit. Wie lösen wir also das Problem, dass mehrere Roboter auf die Schnittstelle zugreifen, und verwenden dabei möglichst wenige Server?

Wir können einen Marktweiterleitungsroboter implementieren, der mithilfe dieses einen Roboters auf die Börsenschnittstelle zugreifen kann, um Marktinformationen und andere Daten abzurufen. Andere Handelsstrategieroboter können einfach Daten von diesem Marktweiterleitungsroboter anfordern.

Beispiel eines Marktweiterleitungsroboters

Er ist lediglich für den Zugriff auf die Schnittstelle der Börsenkurse verantwortlich, um Daten abzurufen und Kursinformationen an andere Roboter weiterzugeben. verwendenPythonIn diesem Beispiel erhalten wir nur K-Line-Daten und stellen sie zum Teilen bereit. Wir können sie erweitern, um Tiefendaten, aggregierte Marktdaten usw. hinzuzufügen.

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)
        

Datenroboter-Strategiecode anfordern

Der Roboter, der Daten anfordert, ist der Handelsstrategieroboter. Zu Testzwecken schreiben wir jedoch nur die angeforderten Daten (K-Line-Daten) und zeichnen die Daten.JavaScriptUm ein Bild zu zeichnen, müssen Sie die „Bibliothek für Strichzeichnungen“ überprüfen. Sie können diese Bibliothek im Strategiequadrat suchen und kopieren. Nach dem Kopieren können Sie die Vorlagenreferenzspalte auf der Strategiebearbeitungsseite überprüfen.

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)
    }
}

Tatsächlicher Betrieb

  • Starten Sie den Marktweiterleitungsroboter Lösung zur Marktaufteilung mit mehreren Robotern

  • Starten Sie den Testroboter, ID: 206353 Lösung zur Marktaufteilung mit mehreren Robotern

  • Starten Sie den Testroboter, ID: 206359 Lösung zur Marktaufteilung mit mehreren Robotern

  • Starten Sie den Testroboter, ID: 206360 Lösung zur Marktaufteilung mit mehreren Robotern

Auf diese Weise können drei oder sogar N Roboter die K-Line-Daten eines bestimmten Handelspaares gemeinsam nutzen. Dies ist nur ein Ausgangspunkt. Sie können gerne eine Nachricht hinterlassen.