TradingViewは良い市場コートを描くツールです.
についてpine
脚本も強力な存在です!
バックテスト,アラーム,様々なドッキングは 非常に完全な金融ツールです
しかし 2つの問題が私たちを悩ませています
交換ドッキングの問題を解決します.
概要はこうです
TV (TradingView)pine
スクリプト -> 信号アラームwebhook
-> 地元webhook server
転送要求 -> FMZボットが操作の要求を受け取る
ステップ・バイ・ステップを
TradingViewのウェブサイトへ
まず,この2つの要素を組み合わせますAlert
詳細については下図を参照してください.
画像のいくつかの側面に注意を払う必要があります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のドキュメントに注意を払ったか分かりません.
APIでボットにコマンドを送れる! 赤い箱は必要なリクエストです
準備作業も必要です FMZ API (avatar->アカウント設定->APIインターフェース) ロボットが起動したときに (IDを取得したいので,まず新しいIDを作成します) 一般的なロボットのURLの番号はIDです
次に 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()
私たちの受信信号プロセスを修正するために,私たちのボット取引戦略も相応に処理する必要があります.
例えば,最初から設計された 警告メッセージは, 好きなことや 特定のニーズに応じて再生できます.
コードは次のとおりです 情報を集め フィルタリングして 操作を完了します
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;
}
}
}
この記事は終わりです,役にたつことを願っています!