संसाधन लोड हो रहा है... लोड करना...

"ट्रेडिंग व्यू" संकेतक का उपयोग करके एफएमजेड रोबोट के साथ इंटरफेस करना

लेखक:अच्छाई, बनाया गयाः 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अगले, हम कैसे बोट मिलता है?

मुझे नहीं पता कि क्या आपने नीचे एफएमजेड के इंटरफ़ेस एपीआई दस्तावेज़ पर ध्यान दिया हैः

img

हम एपीआई के माध्यम से हमारे छोटे से बॉट के लिए कुछ आदेश पारित कर सकते हैं! विशिष्ट अनुरोध उदाहरण यहाँ है, लाल बॉक्स अनुरोध हम की जरूरत है।

img

यहां भी कुछ तैयारी की जरूरत है। एफएमजेड एपीआई (अवतार->खाता सेटिंग्स->एपीआई इंटरफ़ेस), एक बॉट जो शुरू किया गया है (हम इसकी आईडी प्राप्त करना चाहते हैं, इसलिए हम पहले एक नई आईडी बनाते हैं), एक सामान्य रोबोट के यूआरएल में संख्या आईडी है।

img

इसके बाद, हम वेबहुक सेवा को बदलते हैं ताकि संदेश प्राप्त करने के बाद, यह स्वचालित रूप से एफएमजेड बॉट को अग्रेषित किया जाएगा।

अंत में, भरा हुआ फॉर्म भरना न भूलेंwebhookट्रेडिंग व्यू अलर्ट में पता ((फॉर्मेटः 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;
         }
     }
}

यह लेख समाप्त हो गया है, आशा है कि यह आपकी मदद कर सकता है!


संबंधित

अधिक