Bei der Verwendung von Quantitative-Trading-Robotern für digitale Währungen besteht ein Problem, wenn mehrere Roboter auf einem Server ausgeführt werden müssen, wenn verschiedene Börsen aufgerufen werden. Wenn mehrere Roboter gleichzeitig ausgeführt werden müssen und die gleiche Börse und das gleiche Transaktionspaar betreiben, gibt es ein Problem mit der Begrenzung der API-Anfragefrequenz. Wie löst man dann das Problem, dass mehrere Roboter auf die Schnittstelle zugreifen, wenn nur ein Minimum an Servern verwendet wird?
Wir können einen Marktforwarding-Roboter realisieren, der die Daten über den Markt abruft, die nur von diesem Roboter abgerufen werden.
Der Roboter ist nur für den Zugriff auf die Börsen-Interface verantwortlich, um Daten zu erhalten und anderen Robotern die Märkte zur Verfügung zu stellen.Python
In diesem Fall erhalten wir nur K-Line-Daten und bieten Sharing an, das erweitert werden kann, um die Tiefendaten zu erhöhen, Marktdaten zu aggregieren und so weiter.
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)
Der Roboter, der die Daten anfordert, ist ein Trading-Strategie-Roboter, aber wir testen ihn und schreiben nur die Request-Daten (K-Line-Daten) und zeichnen die Daten aus, die wir verwenden können.JavaScript
Die Art und Weise, in der Sie ein Modell anzeigen, ist sehr einfach zu erstellen. Sie können das Modell auf der Seite "Draw Line" auswählen.
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)
}
}
Start der Marktvermittlungsroboter
Start des Testrobot, ID:206353
Start des Testrobot, ID:206359
Start des Testrobot, ID:206360
Das ermöglicht es drei oder sogar N Roboter, die Daten über die K-Leitung einer Transaktion zu teilen. Ich möchte Ihnen sagen, dass ich das Gefühl habe, dass ich in der Lage bin, das zu tun.
Kurzfristig verkauft Wang Won seine Strategie für hohe PreiseDas ist ein guter Ort.
Zunfeng91 666