Les ressources ont été chargées... Je charge...

Interface avec le robot FMZ à l'aide de l'indicateur "Tradingview"

Auteur:La bonté, Créé: 2020-06-19 11:08:22, Mis à jour: 2023-10-31 21:03:33

img

Introduction au contexte

TradingView est un bon outil de traçage de devis.

LepineLe scénario est aussi une existence puissante!

Le backtesting, l'alarme et les différents accrochages sont un outil financier très complet.

Mais il y a deux problèmes qui nous affligent...

  • L'un est le coûteux système de cotisation.
  • La deuxième est qu'il y a très peu d'échanges où les signaux sont directement négociables, il semble y en avoir deux ou trois.

Aujourd'hui, notre article est de vous emmener à résoudre le problème des problèmes d'échange d'amarrage.

Mise en œuvre

L'idée générale est la suivante:

TV ((TradingView)pinescénario -> alarme de signalwebhook-> locauxwebhook serverdemande de transfert -> FMZ bot reçoit la demande d'opérer

Allons pas à pas.

Allez sur le site de TradingView:

https://www.tradingview.com/

Ensuite, nous créons uneAlert, voir la figure ci-dessous pour plus de détails

img

Certains aspects de l'image doivent être pris en compte lors de la générationAlert.

la période de validité,webhookadresse, etmessageLe contenu doit être bien fait.

La date d'expiration, celui-ci le saura en un coup d'œil, et il sera invalide quand il expirera...

WebhookURL, laissons-le vide d'abord, nous allons le remplir quand le localwebhookLe service est terminé.

MessageIl est donc préférable que nous ayons une explication claire, afin de laisser lebotdistinguer deAlert messages.

Je l'ai généralement mis comme ceci: stratégie XXX, quantité d'ordre et la direction du commerce

Pour l'instant, la partie TradingView est pratiquement terminée!

Ensuite, on va chercher le local.webhookLe service est terminé!

Ce genre de travail, Google il vous montrera beaucoup de résultats. cet article sautera cette partie, vous pouvez le faire vous-même.

Voici un cadre simple pour Python:

GitHub: https://github.com/shawn-sterling/gitlab-webhook-receiver

Sûr, sans souci et pratique, mais il y a aussi des problèmes.

Ce petit cadre, il le fera!! suicide!! S'il vous plaît prêter attention à ce problème!

Alors, j'ai écrit un autre script sur le serveur, quand die ou offline apparaît dans le journal, je le redémarre. plus tard, je ne me sens toujours pas en sécurité, alors je le redémarre régulièrement. Trouvez un moment sans importance toutes les heures... redémarrez-le, il fonctionne en toute sécurité depuis deux mois maintenant et il n'y a plus de pertes de signal.

De plus, TradingView ne reconnaît que le port 80, alors ne gâchez pas le port de service.

Jusqu'à présent, nous avons fait leMessagedeAlertComment on fait pour avoir le Bot?

Je ne sais pas si vous avez prêté attention au document de l'interface API de FMZ en bas:

img

On peut passer des commandes à notre petit bot par l'intermédiaire de l'API! L'exemple de demande spécifique est ici, la boîte rouge est la demande dont nous avons besoin.

img

Il faut aussi faire des préparatifs. FMZ API (avatar->paramètres de compte->interface API), Un bot qui a été démarré (nous voulons obtenir son ID, donc nous créons un nouvel ID d'abord), le numéro dans l'URL d'un robot général est l'ID.

img

Ensuite, nous transformons le service webhook de sorte qu'après avoir reçu le message, il sera automatiquement transféré au bot FMZ.

Enfin, n'oubliez pas de remplir le formulairewebhookl'adresse dans l'alerte TradingView ((format: http://xx.xx.xx.xx:80)

Ce qui suit est leserviceLe code que j'ai changé, vous pouvez l'utiliser comme référence:

#!/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()

Mise en œuvre dans le cadre de la stratégie de négociation de la plateforme FMZ

Tout ce qui précède a décrit la mise en œuvre de la communication, notre stratégie de trading Bot doit également être traitée en conséquence, afin que nous puissions corriger notre processus de réception du signal.

Par exemple, le message d'alerte conçu au début, vous pouvez le jouer selon vos préférences et vos besoins spécifiques.

Le code est le suivant: obtenir les informations, les filtrer, effectuer l'opération, et terminer.

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;
         }
     }
}

Cet article est terminé, j'espère qu'il vous sera utile!


Relationnée

Plus de