Die Ressourcen sind geladen. Beförderung...

Schnittstelle mit dem FMZ-Roboter mit dem Indikator "Tradingview"

Schriftsteller:Gutes, Erstellt: 2020-06-19 11:08:22, Aktualisiert: 2023-10-31 21:03:33

img

Einführung

TradingView ist ein gutes Market Quotations-Zeichnungswerkzeug.

DiepineDas Skript ist auch ein mächtiges Dasein!

Backtesting, Alarmierung und verschiedene Anschlüsse sind ein sehr vollständiges Finanzinstrument.

Aber es gibt zwei Probleme, die uns plagen...

  • Einer ist das teure Mitgliedschaftssystem.
  • Die zweite ist, dass es nur sehr wenige Börsen gibt, an denen Signale direkt gehandelt werden können, es scheinen zwei oder drei zu sein.

Heute ist unser Artikel, um Sie zu nehmen, um das Problem der Austausch Docking Probleme zu lösen.

Durchsetzung

Die allgemeine Idee lautet:

Fernsehen (TradingView)pineSkript -> Alarmsignalwebhook-> lokalwebhook serverWeiterleitung -> FMZ-Bot erhält die Anfrage zum Betrieb

Lasst uns Schritt für Schritt gehen.

Gehen Sie auf die Website von TradingView:

https://www.tradingview.com/

Als nächstes erstellen wir zunächst eineAlert, siehe nachstehende Abbildung

img

Einige Aspekte des Bildes müssen bei der Erzeugung vonAlert.

Gültigkeitsdauer,webhookAnschrift undmessageInhalte müssen gut geschrieben sein.

Das Verfallsdatum, dieses hier, wird auf einen Blick erkannt, und es wird ungültig sein, wenn es abläuft...

WebhookURL, lassen Sie es erst leer halten, wir werden es ausfüllen, wenn die lokalewebhookDer Dienst ist erledigt.

MessageDie Kommission ist der Ansicht, daß die Kommission in diesem Bereich eine wichtige Rolle spielen sollte.botUnterscheidung vonAlert messages.

Ich setze es im Allgemeinen so: XXX Strategie, Ordermenge und Handelsrichtung

Bis jetzt ist der TradingView Teil praktisch fertig!

Dann holen wir den lokalen.webhookDer Dienst ist erledigt!

Diese Art von Arbeit, Google es wird Ihnen viele Ergebnisse zeigen. Dieser Artikel wird diesen Teil überspringen, können Sie es selbst tun.

Hier ist ein einfaches Framework für Python:

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

Sicher, sorgenfrei und bequem, aber es gibt auch Probleme.

Dieser kleine Rahmen, er wird!! Selbstmord!! Bitte achten Sie auf diese Ausgabe!

Also schrieb ich ein anderes Skript auf dem Server, wenn die oder offline im Protokoll erscheint, werde ich es neu starten. Später fühle ich mich immer noch nicht sicher, also setze ich es regelmäßig neu zu starten. Finde eine unwichtige Zeit jede Stunde... Gib es ein Neustart, es läuft jetzt seit zwei Monaten sicher und es gibt keine Signalverluste mehr.

Darüber hinaus erkennt TradingView nur den Port 80, also vermasseln Sie nicht den Serviceport.

Bis jetzt haben wirMessagevonAlertWie kriegen wir Bot?

Ich weiß nicht, ob Sie die Schnittstellen-API-Dokument von FMZ unten beachtet haben:

img

Wir können einige Befehle an unseren kleinen Bot über die API geben! Das spezifische Anforderungsbeispiel ist hier, das rote Feld ist die Anfrage, die wir brauchen.

img

Auch hier braucht es Vorbereitungsarbeiten. FMZ-API (Avatar->Kontoeinstellungen->API-Schnittstelle), Ein Bot, der gestartet wurde (wir wollen seine ID erhalten, also erstellen wir zuerst eine neue ID), die Nummer in der URL eines allgemeinen Roboters ist die ID.

img

Als nächstes transformieren wir den Webhook-Dienst, sodass die Nachricht automatisch an den FMZ-Bot weitergeleitet wird.

Schließlich vergessen Sie nicht, das ausgefülltewebhookAdresse in der TradingView Alert ((Format: http://xx.xx.xx.xx:80)

Die folgendenserviceCode, den ich geändert habe, kannst du als Referenz verwenden:

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

Umsetzung innerhalb der FMZ-Handelsstrategie

All das oben beschriebene Kommunikationsimplementierung, unsere Bot-Handelsstrategie muss auch entsprechend verarbeitet werden, damit wir unseren Empfangssignalprozess beheben können.

Zum Beispiel, die Warnmeldung am Anfang entworfen, können Sie es nach Ihren Vorlieben und spezifischen Bedürfnissen spielen.

Der Code lautet folgendermaßen: Holen Sie sich die Informationen, filtern Sie sie, führen Sie die Operation durch und beenden Sie.

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;
         }
     }
}

Dieser Artikel ist zu Ende, hoffentlich hilft er Ihnen!


Verwandt

Mehr