TradingViewWebHook Alarm direkt mit dem FMZ-Roboter verbunden

Schriftsteller:Gutes, Erstellt: 2020-08-07 10:44:17, Aktualisiert: 2023-10-10 21:09:42

img

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.

Roboterstrategie-Quellcode

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 orderUm 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)

Strategieparameter:

img

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 sendetPOSTErfordernisse, muss der ÜberwachungsdienstPOSTAnfragen, und TradingView erlaubt nur Port 80 für diehttp protocol.

  • xxx.xxx.xxx.xxxist die IP-Adresse des Geräts des Hosts, auf dem sich der Roboter befindet.

  • Dieaccess_keyundsecret_keyDie Ergebnisse der Studie zeigen, daß dieaccess_keyundsecret_keyin derWebHookDie 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.

Laufprüfung

VerwendungwexAppUm den tatsächlichen Markttest zu simulieren.

img img

Ende

Vollständige Strategieadresse:https://www.fmz.com/strategy/221850

Dieaccess_keyundsecret_keyin der Regelung nur zur Identifizierung dienen und es gibt keine Sicherheit für die VerwendunghttpDiese Lösung ist nur eine Idee und eine Einführung.httpsdie Kommunikation zu nutzen.


Mehr