En la carga de los recursos... Cargando...

Alarma TradingViewWebHook conectada directamente al robot FMZ

El autor:La bondad, Creado: 2020-08-07 10:44:17, Actualizado: 2023-10-10 21:09:42

img

Recientemente, cada vez más usuarios de TradingView han conectado la señal de gráfico de TradingView a la plataforma FMZ (FMZ.COMEn la actualidad, la mayoría de las operaciones de trading automático se realizan en el mercado de divisas, donde el robot estratégico ejecuta la transacción de acuerdo con la señal del gráfico, lo que ahorra mucho trabajo de redacción de código y diseño.TradingViewWebHook.

La solución anterior:https://www.fmz.com/digest-topic/5533.

El plan anterior era extender la interfaz API de la plataforma FMZ para enviar instrucciones al robot. Hoy, echemos un vistazo a otra solución. Dejemos que la solicitud WebHook de alarma de TradingView se envíe directamente al robot de la plataforma FMZ, para que pueda enviar directamente instrucciones y ordenar transacciones del robot.

Código fuente de la estrategia del robot

La estrategia está escrita en Python. Después de que el robot se crea y comienza a usar esta estrategia, el robot creará un hilo, que iniciará un servicio para monitorear el puerto establecido. Esperando solicitudes externas y procesamiento. Cuando lo probé, fue probado por el host en el servidor, y el dispositivo donde se encuentra el host debe ser accesible desde el exterior. Cuando el robot ejecuta la transacción, utiliza la interfaz de orden de mercado. Además, esta estrategia también se puede modificar para implementar ellimit orderPara que sea fácil de entender y simplificar, el orden del mercado se utiliza aquí, por lo que el intercambio debe apoyar el orden del mercado.

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

Parámetros de la estrategia:

img

Solicitud de alarma de TradingView para WebHook

La configuración de la solicitud de alarma es:

http://xxx.xxx.xxx.xxx:80/data?access_key=e3809e173e23004821a9bfb6a468e308&secret_key=45a811e0009d91ad21154e79d4074bc6&type=sell&amount=0.1

Desde que TradingView envíaPOSTEn el caso de las solicitudes, el servicio de seguimiento debe supervisarPOSTlas solicitudes, y TradingView sólo permite el puerto 80 para elhttp protocol.

  • xxx.xxx.xxx.xxxEs la dirección IP del dispositivo del host donde se encuentra el robot.

  • Elaccess_keyysecret_keyLas empresas de telecomunicaciones pueden generarse por sí mismas, siempre y cuando lasaccess_keyysecret_keyEn elWebHookLa solicitud de alarma es la misma que la configurada en los parámetros del robot.

  • Type, dirección de negociación, compra o venta, apertura o cierre, tenga en cuenta que se distinguen los spot y los futuros.

  • amount, el número de transacciones.

Prueba de ejecución

UtilizaciónwexApppara simular la prueba de mercado real.

img img

Enlace a la sección

Dirección completa de la estrategia:https://www.fmz.com/strategy/221850

Elaccess_keyysecret_keyen el régimen son sólo para la identificación, y no hay garantía para el usohttpEn el caso de las aplicaciones prácticas, se deben añadir consideraciones dehttpsla comunicación debe utilizarse.


Más.