TradingView es una buena herramienta de dibujo de cotizaciones de mercado.
Elpine
¡El guión también es una existencia poderosa!
Las pruebas de retroceso, las alarmas y varios atraques son una herramienta financiera muy completa.
Pero hay dos problemas que nos han estado atormentando...
Hoy nuestro artículo es llevar a resolver el problema de intercambio de los problemas de acoplamiento.
La idea general es la siguiente:
TV ((TradingView)pine
guión -> alarma de señalwebhook
-> localwebhook server
petición de reenvío -> FMZ bot recibe la solicitud para operar
Vamos paso a paso.
Ve al sitio web de TradingView:
A continuación, primero creamos unAlert
, véase la figura siguiente para más detalles
Algunos aspectos de la imagen deben tenerse en cuenta al generarAlert
.
el período de validez,webhook
dirección, ymessage
El contenido debe estar bien hecho.
La fecha de caducidad, esta lo sabrá de un vistazo, y será inválida cuando expire...
Webhook
URL, vamos a mantenerlo vacío primero, lo llenaremos cuando el localwebhook
El servicio está hecho.
Message
En este caso, es mejor que tengamos una explicación clara, para que elbot
distinguir deAlert
messages.
Generalmente lo establezco así: estrategia XXX, cantidad de orden y dirección comercial
Hasta ahora, la parte de TradingView está básicamente terminada!
A continuación, vamos a conseguir el localwebhook
¡Trabajo de servicio hecho!
Este tipo de trabajo, Google le mostrará muchos resultados. este artículo se saltará esta parte, usted puede hacerlo usted mismo.
Aquí hay un marco simple para Python:
GitHub: https://github.com/shawn-sterling/gitlab-webhook-receiver
Seguro, sin preocupaciones y conveniente, pero también hay problemas.
¡Este pequeño marco, lo hará!! ¡Suicidio! ¡Por favor, presten atención a este tema!
Así que, escribí otro script en el servidor, cuando
Además, TradingView sólo reconoce el puerto 80, así que no estropees el puerto de servicio.
Hasta ahora, hemos hecho elMessage
desdeAlert
Ahora, ¿cómo conseguimos a Bot?
No sé si has prestado atención al documento de la interfaz API de FMZ en la parte inferior:
Podemos pasar algunas órdenes a nuestro pequeño bot a través de la API! El ejemplo de solicitud específica está aquí, la caja roja es la solicitud que necesitamos.
Aquí también se necesita un poco de trabajo de preparación. FMZ API (avatar->configuración de cuenta->interfaz API), Un bot que ha sido iniciado (queremos obtener su ID, por lo que creamos un nuevo ID primero), el número en la URL de un robot general es el ID.
A continuación, transformamos el servicio webhook para que después de recibir el mensaje, se reenvíe automáticamente al bot FMZ.
Por último, no se olvide de rellenar el formulariowebhook
Dirección en la alerta TradingView ((formato: http://xx.xx.xx.xx:80)
El siguiente es elservice
Código que cambié, puede usarlo como referencia:
#!/usr/bin/python -tt
# -*- coding: UTF-8 -*-
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import json
import logging
import logging.handlers
import os
import re
import shutil
import subprocess
import time
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
try:
import md5
import urllib2
from urllib import urlencode
except:
import hashlib as md5
import urllib.request as urllib2
from urllib.parse import urlencode
############################################################
##### You will likely need to change some of the below #####
# log file for this script
log_file = '/root/webhook/VMA/webhook.log'
# Bot api licence
accessKey = ''
secretKey = ''
# HTTP config
log_max_size = 25165824 # 24 MB
log_level = logging.INFO
#log_level = logging.DEBUG # DEBUG is quite verbose
listen_port = 80
##### You should stop changing things unless you know what you are doing #####
##############################################################################
log = logging.getLogger('log')
log.setLevel(log_level)
log_handler = logging.handlers.RotatingFileHandler(log_file,
maxBytes=log_max_size,
backupCount=4)
f = logging.Formatter("%(asctime)s %(filename)s %(levelname)s %(message)s",
"%B %d %H:%M:%S")
log_handler.setFormatter(f)
log.addHandler(log_handler)
class webhookReceiver(BaseHTTPRequestHandler):
def run_it(self, cmd):
"""
runs a command
"""
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
log.debug('running:%s' % cmd)
p.wait()
if p.returncode != 0:
log.critical("Non zero exit code:%s executing: %s" % (p.returncode,
cmd))
return p.stdout
def bot_conmand(self, method, *args):
"""
send conmand request to bot api
"""
d = {
'version': '1.0',
'access_key': accessKey,
'method': method,
'args': json.dumps(list(args)),
'nonce': int(time.time() * 1000),
}
d['sign'] = md5.md5(('%s|%s|%s|%d|%s' % (d['version'], d['method'], d['args'], d['nonce'], secretKey)).encode('utf-8')).hexdigest()
return json.loads(urllib2.urlopen('https://www.fmz.com/api/v1', urlencode(d).encode('utf-8')).read().decode('utf-8'))
def do_POST(self):
"""
receives post, handles it
"""
log.debug('got post')
message = 'OK'
self.rfile._sock.settimeout(5)
data_string = self.rfile.read(int(self.headers['Content-Length']))
log.info(data_string)
self.send_response(200)
self.send_header("Content-type", "text")
self.send_header("Content-length", str(len(message)))
self.end_headers()
self.wfile.write(message)
log.debug('TV connection should be closed now.')
#log.info(self.bot_conmand('GetRobotList', -1, -1, -1)) # GetRobotList(offset, length, robotStatus int)Pass -1 to get all
log.info(self.bot_conmand('CommandRobot', 169788, data_string)) # CommandRobot(robotId int64, cmd string)Send commands to the robot
def log_message(self, formate, *args):
"""
disable printing to stdout/stderr for every post
"""
return
def main():
"""
the main event.
"""
try:
server = HTTPServer(('', listen_port), webhookReceiver)
log.info('started web server...')
server.serve_forever()
except KeyboardInterrupt:
log.info('ctrl-c pressed, shutting down.')
server.socket.close()
if __name__ == '__main__':
main()
Todo lo anterior describió la implementación de la comunicación, nuestra estrategia de negociación Bot también necesita ser procesada en consecuencia, con el fin de que podamos fijar nuestro proceso de recepción de señales.
Por ejemplo, el Mensaje de Alerta diseñado al principio, se puede reproducir de acuerdo a sus preferencias y necesidades específicas.
El código es el siguiente: obtenga la información, filtrela, haga la operación y termine.
function get_Command() { //Responsible function for interaction, interactively update relevant values in time, users can expand by themselves
var way = null; //route
var cmd = GetCommand(); // Get interactive command API
var cmd_arr = cmd.split(",");
if (cmd) {
// Define the route
if (cmd.indexOf("BUY,1") != -1) {
way = 1;
}
if (cmd.indexOf("SELL,1") != -1) {
way = 2;
}
if (cmd.indexOf("BUY,2") != -1) {
way = 3;
}
if (cmd.indexOf("SELL,2") != -1) {
way = 4;
}
// Branch selection operation
switch (way) {
case 1:
xxx
break;
case 2:
xxx
break;
case 3:
xxx
break;
case 4:
xxx
break;
default:
break;
}
}
}
¡Este artículo ha terminado, espero que pueda ayudarle!