avatar of 发明者量化-小小梦 发明者量化-小小梦
focar em Mensagem privada
4
focar em
1271
Seguidores

Solução de compartilhamento de mercado multi-robô

Criado em: 2020-07-15 16:25:20, atualizado em: 2024-12-10 10:11:04
comments   4
hits   2306

Solução de compartilhamento de mercado multi-robô

Solução de compartilhamento de mercado multi-robô

Ao usar robôs de negociação quantitativa de moeda digital, quando vários robôs estão em execução em um servidor e acessando diferentes bolsas, não há grandes problemas e não haverá problemas de frequência de solicitação de API. Se você precisa ter vários robôs em execução ao mesmo tempo, e todos eles estão fazendo estratégias de negociação quantitativa para a mesma bolsa e o mesmo par de negociação. Neste momento, há um problema de limite de frequência de solicitações de API. Então, como resolvemos o problema de vários robôs acessando a interface usando o menor número de servidores?

Podemos implementar um robô de encaminhamento de mercado, que pode acessar a interface de câmbio para obter informações de mercado e outros dados usando apenas este robô. Outros robôs de estratégia de negociação podem simplesmente solicitar dados deste robô de encaminhamento de mercado.

Exemplo de um robô de encaminhamento de mercado

Ele é responsável apenas por acessar a interface de cotação da bolsa para obter dados e fornecer informações de cotação para outros robôs. usarPythonNeste exemplo, obtemos apenas dados da linha K e fornecemos compartilhamento. Podemos expandi-lo para adicionar dados de profundidade, dados de mercado agregados, 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 estratégia do robô de dados

O robô que solicita dados é o robô de estratégia de negociação. No entanto, para fins de teste, apenas escrevemos os dados solicitados (dados da linha K) e desenhamos os dados.JavaScriptPara desenhar uma figura, você precisa verificar a “Line Drawing Library”. Você pode pesquisar e copiar esta biblioteca no Strategy Square. Após copiar, você pode verificar a coluna de referência do modelo na página de edição de estratégia.

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

Operação real

  • Inicie o robô de encaminhamento de mercado Solução de compartilhamento de mercado multi-robô

  • Inicie o robô de teste, ID: 206353 Solução de compartilhamento de mercado multi-robô

  • Inicie o robô de teste, ID: 206359 Solução de compartilhamento de mercado multi-robô

  • Inicie o robô de teste, ID: 206360 Solução de compartilhamento de mercado multi-robô

Dessa forma, três ou até N robôs podem compartilhar os dados da linha K de um determinado par de negociação. Este é apenas um ponto de partida, fique à vontade para deixar uma mensagem.