avatar of 发明者量化-小小梦 发明者量化-小小梦
Seguir Mensajes Privados
4
Seguir
1271
Seguidores

Solución de compartición de mercado entre múltiples robots

Creado el: 2020-07-15 16:25:20, Actualizado el: 2024-12-10 10:11:04
comments   4
hits   2306

Solución de compartición de mercado entre múltiples robots

Solución de compartición de mercado entre múltiples robots

Al utilizar robots de comercio cuantitativo de moneda digital, cuando varios robots se ejecutan en un servidor y acceden a diferentes intercambios, no hay ningún problema mayor y no habrá problemas de frecuencia de solicitud de API. Si necesita tener varios robots funcionando al mismo tiempo y todos ellos realizando estrategias comerciales cuantitativas para el mismo intercambio y el mismo par comercial. En este momento, existe un problema de límite de frecuencia de solicitud de API. ¿Entonces, cómo resolvemos el problema de que varios robots accedan a la interfaz mientras utilizan la menor cantidad de servidores?

Podemos implementar un robot de reenvío de mercado, que puede acceder a la interfaz de intercambio para obtener información del mercado y otros datos utilizando solo este robot. Otros robots de estrategia comercial pueden simplemente solicitar datos a este robot de reenvío de mercado.

Ejemplo de un robot de reenvío de mercado

Solo es responsable de acceder a la interfaz de cotización de intercambio para obtener datos y proporcionar información de cotización a otros robots. usarPythonEn este ejemplo, solo obtenemos datos de la línea K y los compartimos. Podemos ampliarlos para agregar datos de profundidad, datos agregados del mercado, etc.

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)
        

Solicitar código de estrategia de robot de datos

El robot que solicita los datos es el robot de estrategia comercial. Sin embargo, para fines de prueba, solo escribimos los datos solicitados (datos de la línea K) y dibujamos los datos.JavaScriptPara dibujar una imagen, debes consultar la “Biblioteca de dibujos de líneas”. Puedes buscar y copiar esta biblioteca en Strategy Square. Después de copiar, puedes consultar la columna de referencia de la plantilla en la página de edición de estrategias.

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

Operación actual

  • Iniciar el robot de reenvío de mercado Solución de compartición de mercado entre múltiples robots

  • Iniciar el robot de prueba, ID: 206353 Solución de compartición de mercado entre múltiples robots

  • Iniciar el robot de prueba, ID: 206359 Solución de compartición de mercado entre múltiples robots

  • Iniciar el robot de prueba, ID: 206360 Solución de compartición de mercado entre múltiples robots

De esta manera, tres o incluso N robots pueden compartir los datos de la línea K de un determinado par comercial. Este es solo un punto de partida, bienvenido a dejar un mensaje.