
Khi sử dụng robot giao dịch định lượng tiền kỹ thuật số, khi nhiều robot chạy trên một máy chủ và truy cập vào các sàn giao dịch khác nhau, sẽ không có vấn đề lớn nào và sẽ không có vấn đề về tần suất yêu cầu API. Nếu bạn cần chạy nhiều robot cùng lúc và tất cả chúng đều thực hiện các chiến lược giao dịch định lượng cho cùng một sàn giao dịch và cùng một cặp giao dịch. Hiện tại, có vấn đề về giới hạn tần suất yêu cầu API. Vậy làm thế nào để giải quyết vấn đề nhiều robot truy cập vào giao diện trong khi sử dụng ít máy chủ nhất?
Chúng ta có thể triển khai một robot chuyển tiếp thị trường, có thể truy cập vào giao diện trao đổi để lấy thông tin thị trường và dữ liệu khác chỉ bằng một robot này. Các robot chiến lược giao dịch khác có thể chỉ cần yêu cầu dữ liệu từ robot chuyển tiếp thị trường này.
Robot này chỉ có trách nhiệm truy cập vào giao diện báo giá để lấy dữ liệu và cung cấp thông tin báo giá cho các robot khác. sử dụngPythonTrong ví dụ này, chúng tôi chỉ lấy dữ liệu K-line và cung cấp chia sẻ. Chúng tôi có thể mở rộng để thêm dữ liệu chiều sâu, dữ liệu thị trường tổng hợp, v.v.
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)
Robot yêu cầu dữ liệu là robot chiến lược giao dịch. Tuy nhiên, vì mục đích thử nghiệm, chúng tôi chỉ ghi dữ liệu được yêu cầu (dữ liệu K-line) và vẽ dữ liệu.JavaScriptĐể vẽ một bức tranh, bạn cần kiểm tra “Thư viện vẽ đường thẳng”. Bạn có thể tìm kiếm và sao chép thư viện này trong Strategy Square. Sau khi sao chép, bạn có thể kiểm tra cột tham chiếu mẫu trong trang chỉnh sửa chiến lược.
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)
}
}
Bắt đầu robot chuyển tiếp thị trường

Khởi động robot thử nghiệm, ID: 206353

Khởi động robot thử nghiệm, ID: 206359

Khởi động robot thử nghiệm, ID: 206360

Theo cách này, ba hoặc thậm chí N robot có thể chia sẻ dữ liệu dòng K của một cặp giao dịch nhất định. Đây chỉ là điểm khởi đầu, bạn có thể để lại tin nhắn.