L'alarme TradingViewWebHook est directement connectée au robot FMZ

Auteur:La bonté, Créé: 2020-08-07 10:44:17, Mis à jour: 2023-10-10 21:09:42

img

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.

Code source de la stratégie 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 orderPour ê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)

Paramètres de stratégie:

img

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 envoiePOSTLe service de surveillance doit surveiller les demandes dePOSTLa fonctionnalité TradingView n'autorise que le port 80 pour lehttp protocol.

  • xxx.xxx.xxx.xxxest l'adresse IP de l'appareil de l'hôte où se trouve le robot.

  • Leaccess_keyetsecret_keyLa production d'électricité peut être générée par eux-mêmes, à condition que lesaccess_keyetsecret_keydans leWebHookLes 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.

Test en cours d' exécution

UtilisationwexApppour simuler le test réel du marché.

img img

Résultats

Adresse complète de la stratégie:https://www.fmz.com/strategy/221850

Leaccess_keyetsecret_keydans le régime sont uniquement destinés à l'identification, et il n'y a pas de garantie pour l'utilisationhttpCette solution n'est qu'une idée et une introduction.httpsLa communication doit être utilisée.


Plus de