Giải pháp chia sẻ báo giá thị trường đa robot

Tác giả:Tốt, Tạo: 2020-07-25 09:24:50, Cập nhật: 2023-10-25 19:55:50

img

Khi sử dụng robot giao dịch định lượng tiền kỹ thuật số, khi có nhiều robot chạy trên một máy chủ, nếu bạn truy cập các sàn giao dịch khác nhau, vấn đề sẽ không nghiêm trọng tại thời điểm này, và sẽ không có vấn đề tần suất yêu cầu API. Nếu bạn cần có nhiều robot chạy cùng một lúc, và tất cả họ đều truy cập cùng một sàn giao dịch với cùng một chiến lược giao dịch cặp định lượng. Tại thời điểm này, sẽ có một số vấn đề về hạn chế tần suất yêu cầu API. Vậy làm thế nào để giải quyết vấn đề giao diện truy cập đa robot với số lượng máy chủ ít nhất?

Chúng ta có thể triển khai một robot chuyển tiếp báo giá thị trường, và truy cập giao diện trao đổi để có được báo giá thị trường và các dữ liệu khác chỉ có thể được hoàn thành bởi robot này.

Ví dụ về robot chuyển tiếp trích dẫn

Nó chỉ chịu trách nhiệm truy cập giao diện báo giá thị trường trao đổi để lấy dữ liệu và cung cấp báo giá thị trường cho các robot khác.

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("The service receives the request, self.path:", self.path, "query parameter:", dictParam)
            lock.acquire()
            # Recording
            if dictParam["robotId"] not in Counter:
                Counter[dictParam["robotId"]] = {"NumberOfRequests" : 0}
            Counter[dictParam["robotId"]]["NumberOfRequests"] += 1
            lock.release()
            
            # Write data response
            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), ))         # local computer test
        _thread.start_new_thread(createServer, (("0.0.0.0", 9090), ))             # Test on VPS server
        Log("Start service", "#FF0000")
    except BaseException as e:
        Log("Failed to start service!")
        Log("Error message:", e)
        raise Exception("stop")
    while True:
        r = exchange.GetRecords()
        if not r :
            Log("K-line market quotation failed", "#FF0000")
            continue
        else :
            Records = r
        # Counter
        tbl = {
            "type" : "table", 
            "title" : "Statistics", 
            "cols" : ["ID of the robot requesting data", "Number of requests"], 
            "rows" : [], 
        }
        for k in Counter:
            tbl["rows"].append([k, Counter[k]["NumberOfRequests"]])
        LogStatus(_D(), "Data collection!", "\n", "`" + json.dumps(tbl) + "`")
        Sleep(500)

Yêu cầu dữ liệu mã chiến lược robot

Robot yêu cầu dữ liệu là robot chiến lược giao dịch, nhưng chúng tôi sử dụng nó để thử nghiệm. Chúng tôi chỉ viết dữ liệu được yêu cầu (dữ liệu đường K) và vẽ dữ liệu. Bạn có thể viết nó bằng JavaScript. Để vẽ một bức tranh, bạn cần kiểm tra thư viện vẽ đường. Tìm kiếm và sao chép thư viện lớp này trong Quảng trường Chiến lược. Sau khi sao chép, bạn có thể chọn nó trong cột tham chiếu mẫu trên trang chỉnh sửa chiến lược.

var FuncGetRecords = exchange.GetRecords
exchange.GetRecords = function() {
    // You can fill in the IP address of the device where the "quote forwarding robot" is located 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(), "Robot ID:", _G())
        if (!records) {
            Log("Failed to get data!", "#FF0000")
            Sleep(1000)
            continue
        }
        Log(records)
        $.PlotRecords(records, "K")
        Sleep(1000)
    }
}

Hoạt động thực tế

Khởi động robot chuyển giao thị trường

img

Bắt đầu thử nghiệm robot, ID: 206353

img

Bắt đầu thử nghiệm robot, ID: 206359

img

Bằng cách này, ba hoặc thậm chí N robot có thể chia sẻ dữ liệu đường K của một cặp giao dịch nhất định.


Có liên quan

Thêm nữa