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.
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 order
Para 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)
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íaPOST
En el caso de las solicitudes, el servicio de seguimiento debe supervisarPOST
las solicitudes, y TradingView sólo permite el puerto 80 para elhttp
protocol.
xxx.xxx.xxx.xxx
Es la dirección IP del dispositivo del host donde se encuentra el robot.
Elaccess_key
ysecret_key
Las empresas de telecomunicaciones pueden generarse por sí mismas, siempre y cuando lasaccess_key
ysecret_key
En elWebHook
La 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.
UtilizaciónwexApp
para simular la prueba de mercado real.
Dirección completa de la estrategia:https://www.fmz.com/strategy/221850
Elaccess_key
ysecret_key
en el régimen son sólo para la identificación, y no hay garantía para el usohttp
En el caso de las aplicaciones prácticas, se deben añadir consideraciones dehttps
la comunicación debe utilizarse.