Quando se usa um robô de negociação quantitativa de moeda digital, quando vários robôs devem ser executados em um servidor, se acessar diferentes exchanges, este não é um grande problema, não haverá problemas de frequência de solicitação de API. Se vários robôs forem necessários para ser executados simultaneamente e fazer a mesma troca, o mesmo par de transações.
Podemos implementar um robô de transferência de mercado, acessar a interface do exchange e obter dados sobre o mercado apenas com esse robô. Outras estratégias de negociação permitem que o robô encaminhe dados para o mercado.
O robot é responsável apenas por acessar a interface de mercado do mercado e obter dados e fornecer o mercado a outros robôs.Python
A partir daí, o que é mais importante é que você tenha acesso aos dados do K-Line, e que eles sejam compartilhados, ampliados para aumentar a profundidade dos dados, agregando dados 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)
O robô que solicita dados é um robô de estratégia de negociação, só que nós testamos, apenas escrevemos dados de solicitação (k-line data) e desenhamos dados, que podem ser usados.JavaScript
Para escrever, para desenhar, é necessário selecionar "Classe de linhas de desenho". Pode ser copiado na pesquisa da Praça da Estratégia, depois de copiado, pode ser selecionado uma referência ao modelo na página de edição da 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)
}
}
Robôs de transferência de mercado
Inicie o robô de teste, ID:206353
Inicie o robô de teste, ID:206359
Inicie o robô de teste, ID:206360
Isso permite que três ou até N robôs compartilhem dados da linha K de uma transação. A partir de agora, o blogueiro também pode se inscrever no site do blog.
A estratégia de venda de preços elevadosBoa noite.
Xunfeng91 666