TradingView là một công cụ vẽ báo giá thị trường tốt.
Cácpine
kịch bản cũng là một sự tồn tại mạnh mẽ!
Kiểm tra lại, báo động, và nhiều cách khác nhau là một công cụ tài chính rất hoàn chỉnh.
Nhưng có hai vấn đề đã làm chúng ta đau khổ...
Hôm nay bài viết của chúng tôi là để đưa bạn để giải quyết vấn đề của các vấn đề giao dịch.
Ý tưởng tổng thể là như thế này:
TV ((TradingView)pine
script -> báo hiệu báo độngwebhook
-> địa phươngwebhook server
yêu cầu chuyển tiếp -> FMZ bot nhận được yêu cầu để hoạt động
Hãy đi từng bước một.
Đi đến trang web TradingView:
Tiếp theo, chúng ta tạo ra mộtAlert
, xem hình dưới đây để biết chi tiết
Một số khía cạnh trong bức tranh cần phải chú ý, khi tạo raAlert
.
Thời gian hiệu lực,webhook
địa chỉ, vàmessage
nội dung phải được thực hiện tốt.
Ngày hết hạn, cái này sẽ biết ngay, và nó sẽ không hợp lệ khi hết hạn...
Webhook
URL, hãy giữ nó trống trước, chúng ta sẽ điền vào nó khi địa phươngwebhook
Dịch vụ đã hoàn tất.
Message
ở đây, nó là tốt nhất chúng ta có một lời giải thích rõ ràng, để chobot
phân biệt vớiAlert
messages.
Tôi thường đặt nó như thế này: chiến lược XXX, số lượng lệnh và hướng giao dịch
Cho đến nay, phần TradingView về cơ bản đã hoàn thành!
Tiếp theo, chúng ta hãy tìm người địa phươngwebhook
Công việc đã hoàn thành!
Công việc này, Google nó sẽ cho bạn thấy rất nhiều kết quả. bài viết này sẽ bỏ qua phần này, bạn có thể tự làm nó.
đây là một framework đơn giản cho Python:
GitHub: https://github.com/shawn-sterling/gitlab-webhook-receiver
An toàn, không lo lắng và thuận tiện, nhưng cũng có những vấn đề.
Cái khung nhỏ này, nó sẽ!! tự sát!! Xin hãy chú ý đến vấn đề này!
Vì vậy, tôi đã viết một kịch bản khác trên máy chủ, khi
Ngoài ra, TradingView chỉ nhận ra cổng 80, vì vậy đừng làm hỏng cổng dịch vụ.
Cho đến nay, chúng tôi đã thực hiệnMessage
từAlert
Tiếp theo, làm sao lấy được Bot?
Tôi không biết nếu bạn đã chú ý đến các giao diện API tài liệu của FMZ ở phía dưới:
Chúng ta có thể truyền một vài lệnh cho robot nhỏ của chúng ta qua API! Ví dụ yêu cầu cụ thể là ở đây, hộp màu đỏ là yêu cầu chúng tôi cần.
Ở đây cũng cần một số công việc chuẩn bị. FMZ API (avatar-> cài đặt tài khoản-> giao diện API), Một bot đã được khởi động (chúng tôi muốn có được ID của nó, vì vậy chúng tôi tạo ra một ID mới đầu tiên), số trong URL của một robot chung là ID.
Tiếp theo, chúng tôi chuyển đổi dịch vụ webhook để sau khi nhận được tin nhắn, nó sẽ tự động được chuyển tiếp đến FMZ Bot.
Cuối cùng, đừng quên điwebhook
Địa chỉ trong thông báo TradingView (( định dạng: http://xx.xx.xx.xx:80)
Sau đây làservice
Mã tôi đã thay đổi, bạn có thể sử dụng nó như một tài liệu tham khảo:
#!/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()
Tất cả những điều trên đã mô tả việc thực hiện giao tiếp, chiến lược giao dịch Bot của chúng tôi cũng cần được xử lý phù hợp, để chúng tôi có thể sửa chữa quá trình nhận tín hiệu của chúng tôi.
Ví dụ, thông báo cảnh báo được thiết kế ngay từ đầu, bạn có thể chơi nó theo sở thích và nhu cầu cụ thể của bạn.
Mã là như sau, lấy thông tin, lọc chúng, thực hiện hoạt động, và kết thúc.
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;
}
}
}
Bài viết này đã kết thúc, hy vọng nó có thể giúp bạn!