
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.
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)
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)
}
}
Inicie o robô de encaminhamento de mercado

Inicie o robô de teste, ID: 206353

Inicie o robô de teste, ID: 206359

Inicie o robô de teste, ID: 206360

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.