Récemment, de plus en plus d'utilisateurs de TradingView ont connecté le signal graphique de TradingView à la plateforme FMZ (FMZ.COMIl existe plusieurs schémas de conception pour réaliser le trading automatique sur les machines à sous.TradingViewWebHook
.
La solution précédente:https://www.fmz.com/digest-topic/5533.
Le plan précédent était d'étendre l'interface API de la plate-forme FMZ pour envoyer des instructions au robot. Aujourd'hui, jetons un coup d'œil à une autre solution. Laissez la demande WebHook d'alarme de TradingView être envoyée directement au robot de la plate-forme FMZ, afin qu'il puisse directement envoyer des instructions et commander des transactions de robot.
La stratégie est écrite en Python. Après que le robot a été créé et a commencé à utiliser cette stratégie, le robot va créer un thread, qui va démarrer un service pour surveiller le port défini. En attendant les demandes externes et le traitement. Lorsque je l'ai testé, il a été testé par l'hôte sur le serveur, et le dispositif où l'hôte est situé doit être accessible de l'extérieur. Lorsque le robot exécute la transaction, il utilise l'interface d'ordre de marché. en outre, cette stratégie peut également être modifiée pour mettre en œuvre lelimit order
Pour être facile à comprendre et rationalisé, l'ordre de marché est utilisé ici, donc l'échange doit soutenir l'ordre de marché.
'''
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)
Une demande d'alarme WebHook de TradingView
Le réglage de la demande d'alarme est le suivant:
http://xxx.xxx.xxx.xxx:80/data?access_key=e3809e173e23004821a9bfb6a468e308&secret_key=45a811e0009d91ad21154e79d4074bc6&type=sell&amount=0.1
Depuis que TradingView envoiePOST
Le service de surveillance doit surveiller les demandes dePOST
La fonctionnalité TradingView n'autorise que le port 80 pour lehttp
protocol.
xxx.xxx.xxx.xxx
est l'adresse IP de l'appareil de l'hôte où se trouve le robot.
Leaccess_key
etsecret_key
La production d'électricité peut être générée par eux-mêmes, à condition que lesaccess_key
etsecret_key
dans leWebHook
Les demandes d'alarme sont les mêmes que celles configurées sur les paramètres du robot.
Type
, direction de négociation, achat ou vente, ouverture ou fermeture, notez que les spots et les contrats à terme sont distingués.
amount
, le nombre de transactions.
UtilisationwexApp
pour simuler le test réel du marché.
Adresse complète de la stratégie:https://www.fmz.com/strategy/221850
Leaccess_key
etsecret_key
dans le régime sont uniquement destinés à l'identification, et il n'y a pas de garantie pour l'utilisationhttp
Cette solution n'est qu'une idée et une introduction.https
La communication doit être utilisée.