Interfaz con el robot FMZ utilizando el indicador "Tradingview"

El autor:La bondad, Creado: 2020-06-19 11:08:22, Actualizado: 2023-10-31 21:03:33

img

Introducción de los antecedentes

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...

  • Uno es el costoso sistema de membresía
  • La segunda es que hay muy pocos intercambios donde las señales son directamente negociables, parece que son dos o tres.

Hoy nuestro artículo es llevar a resolver el problema de intercambio de los problemas de acoplamiento.

Aplicación

La idea general es la siguiente:

TV ((TradingView)pineguión -> alarma de señalwebhook-> localwebhook serverpetición de reenvío -> FMZ bot recibe la solicitud para operar

Vamos paso a paso.

Ve al sitio web de TradingView:

https://www.tradingview.com/

A continuación, primero creamos unAlert, véase la figura siguiente para más detalles

img

Algunos aspectos de la imagen deben tenerse en cuenta al generarAlert.

el período de validez,webhookdirección, ymessageEl contenido debe estar bien hecho.

La fecha de caducidad, esta lo sabrá de un vistazo, y será inválida cuando expire...

WebhookURL, vamos a mantenerlo vacío primero, lo llenaremos cuando el localwebhookEl servicio está hecho.

MessageEn este caso, es mejor que tengamos una explicación clara, para que elbotdistinguir 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 die o offline aparece en el registro, lo reinicio. más tarde, todavía no me siento seguro, así que lo reinicio regularmente.

Además, TradingView sólo reconoce el puerto 80, así que no estropees el puerto de servicio.

Hasta ahora, hemos hecho elMessagedesdeAlertAhora, ¿cómo conseguimos a Bot?

No sé si has prestado atención al documento de la interfaz API de FMZ en la parte inferior:

img

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.

img

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.

img

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 formulariowebhookDirección en la alerta TradingView ((formato: http://xx.xx.xx.xx:80)

El siguiente es elserviceCó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()

Implementación dentro de la estrategia de negociación de la plataforma FMZ

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!


Relacionados

Más.