"ট্রেডিংভিউ" সূচক ব্যবহার করে FMZ রোবটের সাথে ইন্টারফেস

লেখক:ভাল, তৈরিঃ 2020-06-19 11:08:22, আপডেটঃ 2023-10-31 21:03:33

img

পটভূমি ভূমিকা

ট্রেডিংভিউ একটি ভাল মার্কেট কোটেশন অঙ্কন সরঞ্জাম।

দ্যpineস্ক্রিপ্টও একটি শক্তিশালী অস্তিত্ব!

ব্যাক টেস্টিং, উদ্বেগজনক, এবং বিভিন্ন ডকিং একটি সম্পূর্ণ আর্থিক সরঞ্জাম।

কিন্তু দুটি বিষয় আমাদের কষ্ট দিচ্ছে...

  • একটি হচ্ছে ব্যয়বহুল সদস্যপদ ব্যবস্থা
  • দ্বিতীয়ত, খুব কম এক্সচেঞ্জ আছে যেখানে সিগন্যাল সরাসরি ট্রেড করা যায়, মনে হয় দুই বা তিনটি।

আজ আমাদের নিবন্ধটি আপনাকে এক্সচেঞ্জ ডকিং সমস্যার সমাধান করতে নিয়ে যাবে।

বাস্তবায়ন

সাধারণ ধারণাটি এইরকমঃ

টিভি ((ট্রেডিংভিউ)pineস্ক্রিপ্ট -> সিগন্যাল অ্যালার্মwebhook-> স্থানীয়webhook serverপুনঃনির্দেশ অনুরোধ -> FMZ বট অপারেট করার অনুরোধ গ্রহণ করে

আসুন ধাপে ধাপে যাই।

ট্রেডিংভিউ ওয়েবসাইটে যানঃ

https://www.tradingview.com/

পরবর্তী, আমরা প্রথম একটি তৈরিAlertবিস্তারিত জানার জন্য নিচের চিত্রটি দেখুন

img

ছবির কিছু দিক মনোযোগ দিতে হবে, যখন উত্পাদনAlert.

বৈধতার সময়কাল,webhookঠিকানা, এবংmessageবিষয়বস্তু অবশ্যই ভালোভাবে তৈরি করতে হবে।

মেয়াদ শেষ হওয়ার তারিখ, এই এক এক নজরে জানতে হবে, এবং এটি অবৈধ হবে যখন এটি মেয়াদ শেষ...

Webhookইউআরএল, প্রথমে খালি রাখুন, আমরা এটি পূরণ করব যখন স্থানীয়webhookসার্ভিস শেষ।

Messageএখানে, এটা ভাল আমরা একটি পরিষ্কার ব্যাখ্যা আছে, যাতেbotথেকে আলাদা করাAlert messages.

আমি সাধারণত এটা এই মত সেটঃ XXX কৌশল, অর্ডার পরিমাণ এবং ট্রেডিং দিক

এখন পর্যন্ত, ট্রেডিং ভিউ অংশটি মূলত সম্পন্ন হয়েছে!

পরবর্তী, আসুন স্থানীয় পেতেwebhookসেবা কাজ সম্পন্ন!

এই ধরনের কাজ, গুগল এটা আপনাকে অনেক ফলাফল দেখাবে. এই নিবন্ধটি এই অংশটি এড়িয়ে যাবে, আপনি এটি নিজেরাই করতে পারেন.

এখানে পাইথনের জন্য একটি সহজ ফ্রেমওয়ার্ক রয়েছেঃ

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

নিরাপদ, উদ্বেগ মুক্ত এবং সুবিধাজনক, কিন্তু সমস্যাও আছে।

এই ছোট ফ্রেম, এটা হবে! আত্মহত্যা! দয়া করে এই ইস্যুতে মনোযোগ দিন!

তাই, আমি সার্ভারে আরেকটি স্ক্রিপ্ট লিখেছি, যখন die বা offline লগ প্রদর্শিত হবে, আমি এটি পুনরায় চালু করব। পরে, আমি এখনও নিরাপদ বোধ করি না, তাই আমি এটি নিয়মিত পুনরায় চালু করতে সেট করি। প্রতি ঘন্টায় একটি অপ্রয়োজনীয় সময় খুঁজুন... এটি পুনরায় চালু করুন, এটি এখন দুই মাস ধরে নিরাপদে চলছে এবং আর কোন সংকেত ক্ষতি নেই।

উপরন্তু, ট্রেডিংভিউ শুধুমাত্র পোর্ট 80 চিনতে পারে, তাই সার্ভিস পোর্ট নষ্ট করবেন না.

এখন পর্যন্ত, আমরাMessageথেকেAlertপরবর্তী, কিভাবে আমরা বট পেতে হবে?

আমি জানি না আপনি FMZ এর ইন্টারফেস এপিআই নথির নীচে মনোযোগ দিয়েছেন কিনাঃ

img

আমরা এপিআই এর মাধ্যমে আমাদের ছোট বোটকে কিছু কমান্ড দিতে পারি! নির্দিষ্ট অনুরোধের উদাহরণ এখানে, লাল বাক্সটি আমাদের প্রয়োজনীয় অনুরোধ।

img

এখানেও কিছু প্রস্তুতির কাজ দরকার। FMZ API (অ্যাভাটার->অ্যাকাউন্ট সেটিংস->API ইন্টারফেস), একটি বট যে শুরু করা হয়েছে (আমরা তার আইডি পেতে চান, তাই আমরা একটি নতুন আইডি তৈরি প্রথম), একটি সাধারণ রোবট URL এর সংখ্যা আইডি হয়.

img

এরপর, আমরা ওয়েবহুক সার্ভিসকে রূপান্তরিত করি যাতে বার্তাটি পাওয়ার পর তা স্বয়ংক্রিয়ভাবে এফএমজেড বটে পাঠানো হয়।

অবশেষে, পূরণ করতে ভুলবেন নাwebhookট্রেডিং ভিউ সতর্কতা (Format: 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;
         }
     }
}

এই নিবন্ধটি শেষ, আশা করি এটি আপনাকে সাহায্য করতে পারে!


সম্পর্কিত

আরো