0
Attention
72
Les personnes concernées

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

Créé le 19 juin 2020 à 11:08:22, Mis à jour le: Je vous en prie, faites-moi confiance.
comments   0
hits   1090

Interfacing with FMZ robot using “Tradingview” indicator

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

Interfacing with FMZ robot using “Tradingview” indicator

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


```Message``` here, it is best we have a clear explanation, in order to let the ```bot``` distinguish from ```Alert``` messages.

I generally set it like this: XXX strategy, order quantity and trading direction

So far, the TradingView part is basically done!

Next, let's get the local ```webhook``` service job done!

This kind of work, Google it will show you lots of results. this article will skip this part, you can do it by yourself.

here is a simple framework for python:

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


Safe, worry-free and convenient, but there are also issues.

This little frame, it will!! Suicide!! Please pay attention to this issue!

So, I wrote another script on the server, When "die" or "offline" appears in the log, I will restart it. later on, i still feel not safe, so i set it restart regularly. Find an unimportant time every hour... Give it a restart, it has been safely running for two months now and there is no more signal losses.

In addition, TradingView only recognizes the port 80, so don't mess up the service port.

So far, We have done the ```Message``` from ```Alert``` part. Next, how do we get Bot?

I don't know if you have paid attention to the interface API document of FMZ at the bottom:

 ![Interfacing with FMZ robot using "Tradingview" indicator](/upload/asset/6e82463afe0dfbc15d96.png) 

We can pass some commands to our little Bot through API!
The specific request example is here, the red box is the request we need.

 ![Interfacing with FMZ robot using "Tradingview" indicator](/upload/asset/6e8cc24e284428b14724.png) 

Here also needs some preparation work.
FMZ API (avatar->account settings->API interface),
A Bot that has been started (we want to get its ID, so we create a new ID first), the number in the URL of a general robot is the ID.

 ![Interfacing with FMZ robot using "Tradingview" indicator](/upload/asset/6e6055878d778eea6265.png) 

Next, we transform the webhook service so that after receiving the message, it will be automatically forwarded to the FMZ Bot.

Finally, don’t forget to fill in the completed ```webhook``` address in the TradingView Alert(format: http://xx.xx.xx.xx:80)

The following is the ```service``` code I changed, you can use it as a reference:

#!/usr/bin/python - tt est un jeu de mots.

-- le code: UTF-8-

depuis BaseHTTPServer importer BaseHTTPRequestHandler, HTTPServer Importer le fichier json l'enregistrement des importations importation de données.travailleurs Les importations importation importé shutil sous-processus d'importation Temps d'importation importation de données Le code de l'appareil est le même que celui de l'appareil.

Essayez ceci: importé md5 Importation de l'URLlib2 depuis urllib import urlencode à l'exception: Importer le hashlib en md5 Importer urllib.request comme urllib2 depuis urllib.parse import urlencode

############################################################

Il vous faudra probablement modifier certaines choses ci-dessous.

fichier journaux pour ce script

Logiciel d'exploitation du fichier

Licence de pilotage

accèsClé = secretClé =

Configuration HTTP

log_max_size = 25165824 # 24 Mo Logiciel d'information #log_level = logging.DEBUG # DEBUG est assez éloquent

écouter_port = 80

Tu devrais arrêter de changer les choses à moins de savoir ce que tu fais.

##############################################################################

log = logging.getLogger (en anglais seulement) Log.setLevel ((log_level) est le niveau de connexion de l'appareil Logiciel de traitement de fichiers maxBytes=log_max_size, le nombre de sauvegardes = 4) f = journalisation.Formatateur (% asctime) s (% nom de fichier) s (% nom de niveau) s (% message) s %B %d %H:%M:%S) Log_handler.setFormatter ((f) est un fichier Logiciel d'ajout (log_handler)

classe 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

Définition principale: l'événement principal. Essayez ceci: serveur = HTTPServer (((, écouter_port), webhookRecepteur) Log.info (démarré le serveur web... Serveur.serve_forever (en anglais seulement) à l'exception de KeyboardInterrupt: Log.info ((ctrl-c appuyé, éteint.) Le serveur.socket.close est fermé.

siNom == ‘le principal: Je suis désolé.


# Implementation within FMZ platform trading strategy

All the above described the communication implementation, our Bot trading strategy also needs to be processed accordingly, in order for us to fix our receiving signal process.

For example, the Alert Message designed at the beginning, You can play it according to your preferences and specific needs. 

The code is as follows, get the information, filter them, do the operation, and end.

fonction get_Command() { //Fonction responsable de l'interaction, mise à jour interactive des valeurs pertinentes dans le temps, les utilisateurs peuvent étendre par eux-mêmes Varié = nul; //route Var cmd = GetCommand ((); // Obtenez une API de commande interactive le nombre de fois où la valeur de l'élément est supérieure à 0,01

 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!

Recommandations à ce sujet
En savoir plus