Solusi berbagi penawaran pasar multi-robot

Penulis:Kebaikan, Dibuat: 2020-07-25 09:24:50, Diperbarui: 2023-10-25 19:55:50

img

Ketika menggunakan robot perdagangan kuantitatif mata uang digital, ketika ada beberapa robot yang berjalan di server, jika Anda mengunjungi bursa yang berbeda, masalahnya tidak serius pada saat ini, dan tidak akan ada masalah frekuensi permintaan API. Jika Anda perlu memiliki beberapa robot yang berjalan pada saat yang sama, dan mereka semua mengunjungi bursa yang sama dengan strategi perdagangan kuantitatif pasangan yang sama. Pada saat ini, akan ada beberapa masalah pembatasan frekuensi permintaan API. Jadi bagaimana memecahkan masalah antarmuka akses multi-robot dengan jumlah server yang paling sedikit?

Kami dapat menerapkan robot penyampaian penawaran pasar, dan mengakses antarmuka pertukaran untuk mendapatkan penawaran pasar dan data lain hanya dapat diisi oleh robot ini. robot strategi perdagangan lainnya dapat meminta data dari robot penyampaian pasar ini.

Contoh robot pengiriman kutipan

Ini hanya bertanggung jawab untuk mengakses antarmuka kutipan pasar bursa untuk mendapatkan data dan memberikan kutipan pasar ke robot lain.

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)

Permintaan kode strategi robot data

Robot yang meminta data adalah robot strategi trading, tetapi kami menggunakannya untuk pengujian. Kami hanya menulis data yang diminta (data K-line) dan menggambar data. Anda dapat menulisnya dalam JavaScript. Untuk menggambar gambar, Anda perlu memeriksa perpustakaan gambar garis. Cari dan salin perpustakaan kelas ini di Strategy Square. Setelah menyalin, Anda dapat memilihnya di kolom referensi template di halaman pengeditan strategi.

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

Operasi yang sebenarnya

Mulai pasar robot pengiriman

img

Mulai robot uji, ID: 206353

img

Mulai robot uji, ID: 206359

img

Dengan cara ini, tiga atau bahkan N robot dapat berbagi data K-line dari pasangan perdagangan tertentu.


Berkaitan

Lebih banyak