0
Preocupados
72
Observadores

Interface com o robô FMZ utilizando o indicador "Tradingview"

Criado em: 2020-06-19 11:08:22, Atualizado em: 2025-01-14 20:34:25
comments   0
hits   1090

Interfacing with FMZ robot using “Tradingview” indicator

Introdução

O TradingView é uma boa ferramenta de desenho de cotações de mercado.

OpineO roteiro também é uma existência poderosa!

O backtesting, o alarme e várias atrações são uma ferramenta financeira muito completa.

Mas há dois problemas que nos atormentam...

  • Um deles é o caro sistema de associação
  • O segundo é que há muito poucas bolsas onde os sinais são negociáveis diretamente, parece que são dois ou três.

Hoje o nosso artigo é para levá-lo a resolver o problema de trocas docking problemas.

Implementação

A ideia geral é a seguinte:

TV ((TradingView)pinescript -> sinal de alarmewebhook-> localwebhook serversolicitação de encaminhamento -> FMZ bot recebe a solicitação para operar

Vamos passo a passo.

Acesse o site TradingView:

https://www.tradingview.com/

Em seguida, primeiro criamos umAlert, ver figura abaixo para mais pormenores

Interfacing with FMZ robot using “Tradingview” indicator

Alguns aspectos do quadro precisam de ser considerados, ao gerarAlert.

Período de validade,webhookendereço, emessageO conteúdo deve ser bem feito.

A data de validade, esta vai saber num olhar, e será inválida quando expirar...


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

-- codificação: UTF-8 --

do BaseHTTPServer importar BaseHTTPRequestHandler, HTTPServer importar json Registo de importação importar registos.operadores Importação Importação importar shutil subprocesso de importação Tempo de importação importar ssl ssl._create_default_https_context = ssl._create_unverified_context

Tente: importar md5 importar urllib2 do urllib import urlencode Exceto: importar hashlib como md5 Importar urllib.request como urllib2 do urllib.parse importar urlencode

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

É provável que você precise mudar algumas das seguintes coisas:

arquivo de log para este script

log_file = /root/webhook/VMA/webhook.log

Licença de exploração

accessKey = secretKey =

Configuração HTTP

log_max_size = 25165824 # 24 MB log_level = logging.INFO #log_level = logging.DEBUG # DEBUG é bastante verboso

listen_port = 80

Devia parar de mudar as coisas a menos que saiba o que está a fazer.

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

log = logging.getLogger ((log) Log.setLevel (log_level) log_handler = logging.handlers.RotatingFileHandler(log_file, maxBytes=log_max_size, backupCount=4) f = logging.Formator ((%(asctime) s %(nome de arquivo) s %(nome de nível) s %(mensagem) s , %B %d %H:%M:%S) log_handler.setFormatter (f) Log.addHandler (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

def main ((): O evento principal. Tente: servidor = HTTPServer (((, listen_port), webhookReceptor) log.info (( iniciado servidor web...) servidor.serve_forever Exceto KeyboardInterrupt: Log.info ((ctrl-c pressionado, desligando.) servidor.socket.close (()

senome == ‘principal: principal ((()


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

função get_Command() { // Função responsável pela interação, atualizar interativamente os valores relevantes no tempo, os usuários podem expandir por si mesmos var way = null; //route var cmd = GetCommand(); // Obter API de comando interativo 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 artigo acabou, espero que possa ajudá-lo!

Recomendações
Mais informações