O TradingView é uma boa ferramenta de desenho de cotações de mercado.
Opine
O 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...
Hoje o nosso artigo é para levá-lo a resolver o problema de trocas docking problemas.
A ideia geral é a seguinte:
TV ((TradingView)pine
script -> sinal de alarmewebhook
-> localwebhook server
solicitação de encaminhamento -> FMZ bot recebe a solicitação para operar
Vamos passo a passo.
Acesse o site TradingView:
Em seguida, primeiro criamos umAlert
, ver figura abaixo para mais pormenores
Alguns aspectos do quadro precisam de ser considerados, ao gerarAlert
.
Período de validade,webhook
endereço, emessage
O conteúdo deve ser bem feito.
A data de validade, esta vai saber num olhar, e será inválida quando expirar...
Webhook
URL, vamos manter-lo vazio primeiro, vamos preenchê-lo quando o localwebhook
O serviço está feito.
Message
O que é que se passa aqui? É melhor que tenhamos uma explicação clara, a fim de deixar obot
distinguir 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.webhook
Trabalho 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
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 oMessage
deAlert
A seguir, como é que apanhamos o Bot?
Eu não sei se você prestou atenção ao documento interface API de FMZ no fundo:
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.
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.
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 preenchidowebhook
Endereço no alerta TradingView ((formato: http://xx.xx.xx.xx:80)
A seguir estão osservice
có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()
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!