
디지털 통화 양적 거래 로봇을 사용할 경우, 여러 로봇이 서버에서 실행되고 다양한 거래소에 접속하는 경우 큰 문제는 발생하지 않으며 API 요청 빈도 문제도 발생하지 않습니다. 동시에 여러 로봇을 실행해야 하고, 이들 모두가 동일한 거래소와 동일한 거래 쌍에 대해 양적 거래 전략을 수행하는 경우가 있습니다. 현재 API 요청 빈도 제한 문제가 있습니다. 그러면 최소한의 서버만을 사용하여 여러 로봇이 인터페이스에 접근하는 문제를 어떻게 해결할 수 있을까요?
이 하나의 로봇만을 사용하여 거래소 인터페이스에 접근하여 시장 정보와 기타 데이터를 얻을 수 있는 시장 전달 로봇을 구현할 수 있습니다. 다른 거래 전략 로봇은 이 시장 전달 로봇에게 간단히 데이터를 요청할 수 있습니다.
로봇은 거래소 견적 인터페이스에 접근하여 데이터를 얻고 다른 로봇에게 견적 정보를 제공하는 역할만 담당합니다. 사용Python이 예에서 우리는 K-라인 데이터만 얻고 공유를 제공합니다. 우리는 그것을 확장하여 심도 데이터, 집계 시장 데이터 등을 추가할 수 있습니다.
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)
데이터를 요청하는 로봇은 트레이딩 전략 로봇입니다. 하지만 테스트 목적으로, 우리는 요청된 데이터(K-라인 데이터)만 쓰고 데이터를 그립니다.JavaScript그림을 그리려면 “선 그리기 라이브러리”를 확인해야 합니다. 이 라이브러리는 Strategy Square에서 검색하여 복사할 수 있습니다. 복사한 후 Strategy 편집 페이지에서 템플릿 참조 열을 확인할 수 있습니다.
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)
}
}
마켓 포워딩 로봇을 시작하세요

테스트 로봇을 시작하세요. ID: 206353

테스트 로봇을 시작하세요. ID: 206359

테스트 로봇을 시작하세요. ID: 206360

이런 방식으로 3개 또는 N개의 로봇이 특정 거래 쌍의 K-라인 데이터를 공유할 수 있습니다. 이것은 단지 시작점일 뿐입니다. 메시지를 남겨 주시면 감사하겠습니다.