In jüngster Zeit haben immer mehr TradingView-Nutzer das TradingView-Diagrammsignal mit der FMZ-Plattform verbunden (FMZ.COM) und lassen die Roboterstrategie auf FMZ die Transaktion nach dem Chartsignal ausführen, was eine Menge Code-Schreib- und Designarbeit spart. Direkt können Indikatoren für programmatischen und automatisierten Handel verwendet werden, was die Barrieren für viele programmatische und quantitative Handelsentwicklung reduziert.TradingViewWebHook
.
Die vorherige Lösung:https://www.fmz.com/digest-topic/5533.
Der vorherige Plan bestand darin, die API-Schnittstelle der FMZ-Plattform zu erweitern, um Anweisungen an den Roboter zu senden. Heute werfen wir einen Blick auf eine andere Lösung.
Die Strategie ist in Python geschrieben. Nachdem der Roboter erstellt und mit dieser Strategie begonnen hat, erstellt der Roboter einen Thread, der einen Dienst zur Überwachung des festgelegten Ports startet. Warten auf externe Anfragen und Verarbeitung. Als ich ihn getestet habe, wurde er vom Host auf dem Server getestet, und das Gerät, auf dem sich der Host befindet, muss von außen zugänglich sein. Wenn der Roboter die Transaktion ausführt, verwendet er die Market Order-Schnittstelle. Außerdem kann diese Strategie auch modifiziert werden, um dielimit order
Um leicht verständlich und optimiert zu sein, wird hier die Marktordnung verwendet, so dass die Börse die Marktordnung unterstützen muss.
'''
Request format: http://x.x.x.x:xxxx/data?access_key=xxx&secret_key=yyy&type=buy&amount=0.001
Strategy robot parameters:
- Type: Encrypted string, AccessKey, SecretKey, you can use the low-privileged API KEY of the FMZ platform, or you can generate the KEY yourself.
- Type: string, contract ID, ContractType
- Type: numeric value, port number, Port
'''
import _thread
import json
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import parse_qs, urlparse
def url2Dict(url):
query = urlparse(url).query
params = parse_qs(query)
result = {key: params[key][0] for key in params}
return result
class Executor(BaseHTTPRequestHandler):
def do_POST(self):
try:
self.send_response(200)
self.send_header("Content-type", "application/json")
self.end_headers()
dictParam = url2Dict(self.path)
# check
if len(dictParam) == 4 and dictParam["access_key"] == AccessKey and dictParam["secret_key"] == SecretKey:
del dictParam["access_key"]
del dictParam["secret_key"]
Log("Request received", "parameter:", dictParam, "#FF0000")
'''
map[access_key:xxx amount:0.001 secret_key:yyy type:buy]
'''
isSpot = True
if exchange.GetName().find("Futures") != -1:
if ContractType != "":
exchange.SetContractType(ContractType)
isSpot = False
else :
raise "No futures contract set"
if isSpot and dictParam["type"] == "buy":
exchange.Buy(-1, float(dictParam["amount"]))
Log(exchange.GetAccount())
elif isSpot and dictParam["type"] == "sell":
exchange.Sell(-1, float(dictParam["amount"]))
Log(exchange.GetAccount())
elif not isSpot and dictParam["type"] == "long":
exchange.SetDirection("buy")
exchange.Buy(-1, float(dictParam["amount"]))
Log("Holding Position:", exchange.GetPosition())
elif not isSpot and dictParam["type"] == "short":
exchange.SetDirection("sell")
exchange.Sell(-1, float(dictParam["amount"]))
Log("Holding Position:", exchange.GetPosition())
elif not isSpot and dictParam["type"] == "cover_long":
exchange.SetDirection("closebuy")
exchange.Sell(-1, float(dictParam["amount"]))
Log("Holding Position:", exchange.GetPosition())
elif not isSpot and dictParam["type"] == "cover_short":
exchange.SetDirection("closesell")
exchange.Buy(-1, float(dictParam["amount"]))
Log("Holding Position:", exchange.GetPosition())
# Write data response
self.wfile.write(json.dumps({"state": "ok"}).encode())
except Exception as e:
Log("Provider do_POST error, e:", e)
def createServer(host):
try:
server = HTTPServer(host, Executor)
Log("Starting server, listen at: %s:%s" % host)
server.serve_forever()
except Exception as e:
Log("createServer error, e:", e)
raise Exception("stop")
def main():
# Start a thread
try:
_thread.start_new_thread(createServer, (("0.0.0.0", Port), )) # Test on VPS server
except Exception as e:
Log("Error message:", e)
raise Exception("stop")
Log("Account asset information:", _C(exchange.GetAccount))
while True:
LogStatus(_D())
Sleep(2000)
TradingView's WebHook-Alarmbedarf
Die Einstellung der Alarmanforderung lautet:
http://xxx.xxx.xxx.xxx:80/data?access_key=e3809e173e23004821a9bfb6a468e308&secret_key=45a811e0009d91ad21154e79d4074bc6&type=sell&amount=0.1
Da TradingView sendetPOST
Erfordernisse, muss der ÜberwachungsdienstPOST
Anfragen, und TradingView erlaubt nur Port 80 für diehttp
protocol.
xxx.xxx.xxx.xxx
ist die IP-Adresse des Geräts des Hosts, auf dem sich der Roboter befindet.
Dieaccess_key
undsecret_key
Die Ergebnisse der Studie zeigen, daß dieaccess_key
undsecret_key
in derWebHook
Die Alarmanforderung ist die gleiche wie die auf den Parametern des Roboters.
Type
, Handelsrichtung, Kauf oder Verkauf, Eröffnung oder Schließung, beachten Sie, dass Spots und Futures unterschieden werden. Wenn es sich um eine Futures handelt, beachten Sie, dass der Futures-Kontraktcode auf die Parameter des Roboters gesetzt werden muss und das konfigurierte Tauschobjekt eine Futures-Börse sein muss.
amount
, die Anzahl der Transaktionen.
VerwendungwexApp
Um den tatsächlichen Markttest zu simulieren.
Vollständige Strategieadresse:https://www.fmz.com/strategy/221850
Dieaccess_key
undsecret_key
in der Regelung nur zur Identifizierung dienen und es gibt keine Sicherheit für die Verwendunghttp
Diese Lösung ist nur eine Idee und eine Einführung.https
die Kommunikation zu nutzen.