"Tradingview"インジケーターを使用してFMZロボットとインタフェース

作者: リン・ハーン優しさ, 作成日: 2020-06-19 11:08:22, 更新日: 2023-10-31 21:03:33

img

背景紹介

TradingViewは良い市場コートを描くツールです.

についてpine脚本も強力な存在です!

バックテスト,アラーム,様々なドッキングは 非常に完全な金融ツールです

しかし 2つの問題が私たちを悩ませています

  • 一つは高価な会員制です
  • 2つ目は信号が直接取引できる取引所が ほとんどないことです 2つか3つあるようです

交換ドッキングの問題を解決します.

実施

概要はこうです

TV (TradingView)pineスクリプト -> 信号アラームwebhook-> 地元webhook server転送要求 -> FMZボットが操作の要求を受け取る

ステップ・バイ・ステップを

TradingViewのウェブサイトへ

https://www.tradingview.com/

まず,この2つの要素を組み合わせますAlert詳細については下図を参照してください.

img

画像のいくつかの側面に注意を払う必要がありますAlert.

効用期間webhook住所とmessageコンテンツはよく作らなければなりません

賞味期限は 一目でわかる 賞味期限が切れたら 無効になる

Webhookローカルで入力したら 埋めますwebhookサービス完了です

Message明確に説明すれば良いのですbot区別するAlert messages.

XXX戦略,注文量,取引方向

基本的には完了しました!

次は 地元からwebhookサービス完了!

この記事では,この部分を省きます. 自分でできます.

Python の簡単なフレームワークです

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

安全で安心して 便利ですが 問題もあります

この小さなフレーム,それは!!自殺!!この問題に注意してください!

サーバーに別のスクリプトを書いて,ログに"死去"または"オフライン"が表示されたら,再起動します. その後,私はまだ安全ではないと感じて,定期的に再起動します. 毎時間重要でない時間を見つけます. 再起動してください. もう2ヶ月も安全に動作しており,信号損失はありません.

また,TradingViewはポート80しか認識しませんので,サービスポートを乱しないでください.

今までのところ,我々はMessageからAlert次はボットをどうやって手に入れる?

FMZのインターフェースAPIのドキュメントに注意を払ったか分かりません.

img

APIでボットにコマンドを送れる! 赤い箱は必要なリクエストです

img

準備作業も必要です FMZ API (avatar->アカウント設定->APIインターフェース) ロボットが起動したときに (IDを取得したいので,まず新しいIDを作成します) 一般的なロボットのURLの番号はIDです

img

次に Webhook サービスを変換します メッセージを受け取った後 自動的に FMZ ボットに転送されます

記入してください.webhookトレーディングビューアラート (TradingView Alert) のアドレス (形式: http://xx.xx.xx.xx:80)

以下はservice参照として使用できます.

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

FMZプラットフォームの取引戦略の実施

私たちの受信信号プロセスを修正するために,私たちのボット取引戦略も相応に処理する必要があります.

例えば,最初から設計された 警告メッセージは, 好きなことや 特定のニーズに応じて再生できます.

コードは次のとおりです 情報を集め フィルタリングして 操作を完了します

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

この記事は終わりです,役にたつことを願っています!


関連性

もっと