Solución de intercambio de cotizaciones de mercado multi-robot

El autor:La bondad, Creado: 2020-07-25 09:24:50, Actualizado: 2023-10-25 19:55:50

img

Cuando se utilizan robots de comercio cuantitativo de moneda digital, cuando hay varios robots que se ejecutan en un servidor, si visita diferentes intercambios, el problema no es grave en este momento, y no habrá ningún problema de frecuencia de solicitud de API. Si necesita tener varios robots que se ejecutan al mismo tiempo, y todos visitan el mismo intercambio con la misma estrategia de comercio de pares cuantitativos. En este momento, habrá algunos problemas de limitación de frecuencia de solicitud de API. Entonces, ¿cómo resolver el problema de interfaz de acceso multi-robot con el menor número de servidores?

Podemos implementar un robot de envío de cotizaciones de mercado, y acceder a la interfaz de intercambio para obtener cotizaciones de mercado y otros datos sólo pueden ser completados por este robot.

Ejemplo de robot de reenvío de citas

Es solo responsable de acceder a la interfaz de cotización del mercado de divisas para obtener datos y proporcionar cotizaciones de mercado a otros robots.

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)

Pedir el código de la estrategia del robot de datos

El robot que solicita datos es un robot de estrategia comercial, pero lo usamos para pruebas. Solo escribimos los datos solicitados (datos de línea K) y dibujamos los datos. Puede escribirlo en JavaScript. Para dibujar una imagen, debe consultar la biblioteca de dibujo de líneas. Busque y copie esta biblioteca de clases en Strategy Square. Después de copiar, puede seleccionarlo en la columna de referencia de la plantilla en la página de edición de estrategias.

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

Funcionamiento real

Comience el robot de envío del mercado

img

Comience el robot de prueba, ID: 206353

img

Comience el robot de prueba, ID: 206359

img

De esta manera, tres o incluso N robots pueden compartir los datos de la línea K de un determinado par de operaciones.


Relacionados

Más.