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

Autora:Bem-estar, Criado: 2020-06-19 11:08:22, Atualizado: 2023-10-31 21:03:33

img

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

img

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

WebhookURL, vamos manter-lo vazio primeiro, vamos preenchê-lo quando o localwebhookO serviço está feito.

MessageO que é que se passa aqui? É melhor que tenhamos uma explicação clara, a fim de deixar obotdistinguir doAlert messages.

Eu geralmente define assim: XXX estratégia, quantidade de ordem e direção de negociação

Até agora, a parte do TradingView está praticamente terminada!

A seguir, vamos buscar o local.webhookTrabalho feito!

Este tipo de trabalho, o Google vai mostrar-lhe muitos resultados. este artigo vai ignorar esta parte, você pode fazê-lo sozinho.

Aqui está uma estrutura simples para Python:

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

Seguro, sem preocupações e conveniente, mas também há problemas.

Este pequeno quadro, ele vai!! suicídio!! Por favor, preste atenção a esta questão!

Então, eu escrevi outro script no servidor, quando die ou offline aparece no log, eu vou reiniciar. mais tarde, eu ainda não me sinto seguro, então eu o defino para reiniciar regularmente. encontrar uma hora sem importância a cada hora... Dê-lhe uma reinicialização, ele tem sido correndo com segurança há dois meses e não há mais perdas de sinal.

Além disso, o TradingView só reconhece a porta 80, por isso não estrague a porta de serviço.

Até agora, nós fizemos oMessagedeAlertA seguir, como é que apanhamos o Bot?

Eu não sei se você prestou atenção ao documento interface API de FMZ no fundo:

img

Podemos passar alguns comandos para o nosso pequeno bot através da API! O exemplo de solicitação específica está aqui, a caixa vermelha é a solicitação que precisamos.

img

Aqui também é preciso algum trabalho de preparação. FMZ API (avatar->configurações da conta->interface API), Um bot que foi iniciado (queremos obter sua ID, então criamos uma nova ID primeiro), o número no URL de um robô geral é a ID.

img

Em seguida, transformamos o serviço de webhook para que, após receber a mensagem, ela seja automaticamente encaminhada para o FMZ Bot.

Por último, não se esqueça de preencher o formulário preenchidowebhookEndereço no alerta TradingView ((formato: http://xx.xx.xx.xx:80)

A seguir estão osservicecódigo que mudei, você pode usá-lo como referência:

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

Implementação no âmbito da estratégia de negociação da plataforma FMZ

Tudo o acima descrito a implementação de comunicação, nossa estratégia de negociação Bot também precisa ser processada em conformidade, a fim de que possamos corrigir nosso processo de sinal de recepção.

Por exemplo, a mensagem de alerta projetado no início, você pode jogar de acordo com suas preferências e necessidades específicas.

O código é o seguinte, obtém a informação, filtra-a, faz a operação e termina.

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 artigo acabou, espero que possa ajudá-lo!


Relacionados

Mais.