TradingView es una buena herramienta de dibujo de cotizaciones de mercado.
Elpine
¡El guión también es una existencia poderosa!
Las pruebas de retroceso, las alarmas y varios atraques son una herramienta financiera muy completa.
Pero hay dos problemas que nos han estado atormentando...
Hoy nuestro artículo es llevar a resolver el problema de intercambio de los problemas de acoplamiento.
La idea general es la siguiente:
TV ((TradingView)pine
guión -> alarma de señalwebhook
-> localwebhook server
petición de reenvío -> FMZ bot recibe la solicitud para operar
Vamos paso a paso.
Ve al sitio web de TradingView:
A continuación, primero creamos unAlert
, véase la figura siguiente para más detalles
Algunos aspectos de la imagen deben tenerse en cuenta al generarAlert
.
el período de validez,webhook
dirección, ymessage
El contenido debe estar bien hecho.
La fecha de caducidad, esta lo sabrá de un vistazo, y será inválida cuando expire...
```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:
En 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 -t
desde BaseHTTPServer importar BaseHTTPRequestHandler, HTTPServer Importar json registro de importación Importar registros. manejadores Importación Importación Importación subproceso de importación tiempo de importación Importar ssl Se puede utilizar el código de código de código de código de código de código de código.
Prueba: importar md5 Importación de urllib2 desde urllib importar urlencode excepto: Importar hashlib como md5 Importar urllib.request como urllib2 desde urllib.parse importar urlencode
############################################################
Log_file =
accesoClé =
log_max_size = 25165824 # 24 MB Log_level = registro.INFO #log_level = logging.DEBUG # DEBUG es bastante verbosidad
Escuchar_puerto = 80
##############################################################################
log = logging.getLogger ((
clase webhookReceptor ((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
Definición principal:
si esnombre == ‘el 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.
función get_Command() { // Función responsable de la interacción, actualiza de forma interactiva los valores relevantes en el tiempo, los usuarios pueden expandir por sí mismos Variación de la dirección = nula; // ruta var cmd = GetCommand(); // Obtener una API de comandos interactivos el valor de las emisiones de gases de efecto invernadero es el valor de las emisiones de gases de efecto invernadero.
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 artículo ha terminado, espero que pueda ayudarle!