Soluciones compartidas para el mercado de múltiples robots

El autor:Un sueño pequeño., Creado: 2020-07-15 16:25:20, Actualizado: 2023-09-27 19:36:39

img

Soluciones compartidas para el mercado de múltiples robots

Cuando se utiliza un robot de transacción cuantitativa de moneda digital, cuando hay que ejecutar varios robots en un servidor, si se accede a diferentes intercambios, este momento no es un gran problema, no se presentan problemas de frecuencia de solicitud de API. Si se necesita que varios robots se ejecuten al mismo tiempo y se realizan las mismas transacciones en el mismo intercambio, la misma estrategia de transacción cuantitativa. En este momento hay un problema de restricción de frecuencia de solicitud de API.

Podemos implementar un bot de transferencia de mercado, acceder a la interfaz de intercambio para obtener datos de mercado, etc. con solo este robot.

Ejemplos de robótica de transferencia de transacciones

Solo se encarga de acceder a la interfaz de mercado de la bolsa para obtener datos y proporcionar el mercado a otros robots.PythonEn el ejemplo anterior, solo obtenemos datos de la línea K, y ofrecemos el intercambio, que se puede ampliar para agregar datos de profundidad, agrupar datos de 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 el código de la estrategia del robot de datos

El robot que solicita datos es un robot de estrategia de transacción, sólo que lo probamos, solo escribimos datos de la solicitud (datos de la línea K) y dibujamos los datos, que se pueden usar.JavaScriptPara escribir, para dibujar, se requiere seleccionar "Drawline Class Library". Se puede copiar esta biblioteca en la búsqueda de la plaza de la política, y luego se puede seleccionar una referencia a la plantilla en la página de edición de la política.

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

Funcionamiento real

  • Inicio del mercado de robots de envíoimg

  • Inicio del robot de prueba, ID:206353img

  • Inicio del robot de prueba, ID:206359img

  • Inicio del robot de prueba, ID:206360img

Esto permite que tres o incluso N robots compartan los datos de K-line de una transacción. Los bloggers de la red social se han mostrado muy interesados en este tema.


Relacionados

Más.

Las estrategias de venta a alto precio de las líneas cortasQué bien.

¿Qué es esto? 666