Penyelesaian perkongsian sebut harga pasaran pelbagai robot

Penulis:Kebaikan, Dicipta: 2020-07-25 09:24:50, Dikemas kini: 2023-10-25 19:55:50

img

Apabila menggunakan robot perdagangan kuantitatif mata wang digital, apabila terdapat beberapa robot yang berjalan pada pelayan, jika anda melawat bursa yang berbeza, isu itu tidak serius pada masa ini, dan tidak akan ada masalah kekerapan permintaan API. Jika anda perlu mempunyai beberapa robot yang berjalan pada masa yang sama, dan mereka semua melawat bursa yang sama dengan strategi perdagangan pasangan kuantitatif yang sama. Pada masa ini, akan ada beberapa isu batasan kekerapan permintaan API. Jadi bagaimana untuk menyelesaikan masalah antara muka akses pelbagai robot dengan bilangan pelayan yang paling sedikit?

Kita boleh melaksanakan robot penyampaian kutipan pasaran, dan mengakses antara muka pertukaran untuk mendapatkan kutipan pasaran dan data lain hanya boleh diisi oleh robot ini. robot strategi perdagangan lain boleh meminta data dari robot penyampaian pasaran ini.

Contoh robot penyampaian petikan

Ia hanya bertanggungjawab untuk mengakses antara muka sebut harga pasaran bursa untuk mendapatkan data dan menyediakan sebut harga pasaran kepada 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)

Minta kod strategi robot data

Robot yang meminta data adalah robot strategi perdagangan, tetapi kami menggunakannya untuk ujian. Kami hanya menulis data yang diminta (data K-line) dan menggambar data. Anda boleh menulisnya dalam JavaScript. Untuk menggambar gambar, anda perlu menyemak perpustakaan lukisan garis. Cari dan salin perpustakaan kelas ini di Strategy Square. Selepas menyalin, anda boleh memilihnya dalam lajur rujukan templat di halaman penyuntingan 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 sebenar

Mulakan robot penghantaran pasaran

img

Mulakan robot ujian, ID: 206353

img

Mulakan robot ujian, ID: 206359

img

Dengan cara ini, tiga atau N robot boleh berkongsi data K-line dari pasangan perdagangan tertentu.


Berkaitan

Lebih lanjut