Giao diện với robot FMZ sử dụng chỉ số "Tradingview"

Tác giả:Tốt, Tạo: 2020-06-19 11:08:22, Cập nhật: 2023-10-31 21:03:33

img

Hướng dẫn nền tảng

TradingView là một công cụ vẽ báo giá thị trường tốt.

Cácpinekị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ổ...

  • Một là hệ thống thành viên đắt tiền.
  • Thứ hai là có rất ít sàn giao dịch mà tín hiệu có thể giao dịch trực tiếp, có vẻ như là hai hoặc ba.

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.

Thực hiện

Ý tưởng tổng thể là như thế này:

TV ((TradingView)pinescript -> báo hiệu báo độngwebhook-> địa phươngwebhook serveryê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:

https://www.tradingview.com/

Tiếp theo, chúng ta tạo ra mộtAlert, xem hình dưới đây để biết chi tiết

img

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àmessagenộ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...

WebhookURL, hãy giữ nó trống trước, chúng ta sẽ điền vào nó khi địa phươngwebhookDị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, để chobotphâ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ươngwebhookCô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 die hoặc offline xuất hiện trong nhật ký, tôi sẽ khởi động lại nó. sau đó, tôi vẫn cảm thấy không an toàn, vì vậy tôi thiết lập nó để khởi động lại thường xuyên. tìm một thời gian không quan trọng mỗi giờ... cho nó một khởi động lại, nó đã được chạy an toàn trong hai tháng bây giờ và không có mất tín hiệu nữa.

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ệnMessagetừAlertTiế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:

img

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.

img

Ở đâ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.

img

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àserviceMã 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()

Thực hiện trong chiến lược giao dịch trên nền tảng FMZ

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!


Có liên quan

Thêm nữa