ট্রেডিংভিউওয়েবহুক এলার্ম সরাসরি FMZ রোবটের সাথে সংযুক্ত

লেখক:ভাল, তৈরিঃ 2020-08-07 10:44:17, আপডেটঃ 2023-10-10 21:09:42

img

সাম্প্রতিককালে, ট্রেডিংভিউ ব্যবহারকারীরা ট্রেডিংভিউ চার্ট সিগন্যালকে এফএমজেড প্ল্যাটফর্মের সাথে সংযুক্ত করেছেন (FMZ.COM) এবং এফএমজেডের রোবট কৌশলটি চার্ট সংকেত অনুসারে লেনদেন সম্পাদন করতে দিন, যা প্রচুর কোড লেখার এবং নকশা কাজের সাশ্রয় করে। সরাসরি, সূচকগুলি প্রোগ্রাম্যাটিক এবং স্বয়ংক্রিয় ট্রেডিংয়ের জন্য ব্যবহার করা যেতে পারে, যা অনেক প্রোগ্রাম্যাটিক এবং পরিমাণগত ট্রেডিং বিকাশের জন্য বাধা হ্রাস করে।TradingViewWebHook.

পূর্ববর্তী সমাধানঃhttps://www.fmz.com/digest-topic/5533.

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

রোবট কৌশল উৎস কোড

কৌশলটি পাইথনে লেখা আছে। রোবটটি তৈরি হওয়ার পরে এবং এই কৌশলটি ব্যবহার শুরু করার পরে, রোবটটি একটি থ্রেড তৈরি করবে, যা সেট পোর্টটি পর্যবেক্ষণের জন্য একটি পরিষেবা শুরু করবে। বাহ্যিক অনুরোধ এবং প্রক্রিয়াকরণের জন্য অপেক্ষা করছে। যখন আমি এটি পরীক্ষা করেছি, এটি সার্ভারে হোস্ট দ্বারা পরীক্ষা করা হয়েছিল, এবং হোস্টটি যেখানে অবস্থিত ডিভাইসটি বাইরে থেকে অ্যাক্সেসযোগ্য হতে হবে। যখন রোবট লেনদেনটি সম্পাদন করে, তখন এটি বাজার অর্ডার ইন্টারফেস ব্যবহার করে। উপরন্তু, এই কৌশলটিও পরিবর্তন করা যেতে পারেlimit orderঅর্ডার লজিকঃ সহজেই বোঝার এবং সহজতর করার জন্য, বাজারের আদেশ এখানে ব্যবহৃত হয়, তাই এক্সচেঞ্জকে বাজারের আদেশকে সমর্থন করতে হবে।

'''
Request format: http://x.x.x.x:xxxx/data?access_key=xxx&secret_key=yyy&type=buy&amount=0.001
Strategy robot parameters:
- Type: Encrypted string, AccessKey, SecretKey, you can use the low-privileged API KEY of the FMZ platform, or you can generate the KEY yourself.
- Type: string, contract ID, ContractType
- Type: numeric value, port number, Port
'''

import _thread
import json
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import parse_qs, urlparse

def url2Dict(url):
    query = urlparse(url).query  
    params = parse_qs(query)  
    result = {key: params[key][0] for key in params}  
    return result

class Executor(BaseHTTPRequestHandler):
    def do_POST(self):
        try:
            self.send_response(200)
            self.send_header("Content-type", "application/json")
            self.end_headers()
            dictParam = url2Dict(self.path)
            
            # check
            if len(dictParam) == 4 and dictParam["access_key"] == AccessKey and dictParam["secret_key"] == SecretKey:
                del dictParam["access_key"]
                del dictParam["secret_key"]
                Log("Request received", "parameter:", dictParam, "#FF0000")
                '''
                map[access_key:xxx amount:0.001 secret_key:yyy type:buy]
                '''
                isSpot = True
                if exchange.GetName().find("Futures") != -1:
                    if ContractType != "":
                        exchange.SetContractType(ContractType)
                        isSpot = False 
                    else :
                        raise "No futures contract set"
                
                if isSpot and dictParam["type"] == "buy":
                    exchange.Buy(-1, float(dictParam["amount"]))
                    Log(exchange.GetAccount())
                elif isSpot and dictParam["type"] == "sell":
                    exchange.Sell(-1, float(dictParam["amount"]))
                    Log(exchange.GetAccount())
                elif not isSpot and dictParam["type"] == "long":
                    exchange.SetDirection("buy")
                    exchange.Buy(-1, float(dictParam["amount"]))
                    Log("Holding Position:", exchange.GetPosition())
                elif not isSpot and dictParam["type"] == "short":
                    exchange.SetDirection("sell")
                    exchange.Sell(-1, float(dictParam["amount"]))
                    Log("Holding Position:", exchange.GetPosition())
                elif not isSpot and dictParam["type"] == "cover_long":
                    exchange.SetDirection("closebuy")
                    exchange.Sell(-1, float(dictParam["amount"]))
                    Log("Holding Position:", exchange.GetPosition())
                elif not isSpot and dictParam["type"] == "cover_short":
                    exchange.SetDirection("closesell")
                    exchange.Buy(-1, float(dictParam["amount"]))
                    Log("Holding Position:", exchange.GetPosition())
            
            # Write data response
            self.wfile.write(json.dumps({"state": "ok"}).encode())
        except Exception as e:
            Log("Provider do_POST error, e:", e)


def createServer(host):
    try:
        server = HTTPServer(host, Executor)
        Log("Starting server, listen at: %s:%s" % host)
        server.serve_forever()
    except Exception as e:
        Log("createServer error, e:", e)
        raise Exception("stop")

def main():
    # Start a thread
    try:
        _thread.start_new_thread(createServer, (("0.0.0.0", Port), ))         # Test on VPS server        
    except Exception as e:        
        Log("Error message:", e)
        raise Exception("stop")    
    Log("Account asset information:", _C(exchange.GetAccount))
    while True:
        LogStatus(_D())
        Sleep(2000)

কৌশলগত পরামিতি:

img

ট্রেডিংভিউ এর ওয়েবহুক অ্যালার্মের অনুরোধ

অ্যালার্ম অনুরোধের সেটিং হলঃ

http://xxx.xxx.xxx.xxx:80/data?access_key=e3809e173e23004821a9bfb6a468e308&secret_key=45a811e0009d91ad21154e79d4074bc6&type=sell&amount=0.1

যেহেতু ট্রেডিংভিউ পাঠায়POSTঅনুরোধ, পর্যবেক্ষণ সেবা পর্যবেক্ষণ করতে হবেPOSTঅনুরোধ, এবং TradingView শুধুমাত্র পোর্ট 80http protocol.

  • xxx.xxx.xxx.xxxআপনার নিজের ডিভাইসের নির্দিষ্ট আইপি ঠিকানা পূরণ করুন, আপনাকে সচেতন হতে হবে যে এটি বহিরাগত নেটওয়ার্ক থেকে অ্যাক্সেসযোগ্য হতে হবে।

  • দ্যaccess_keyএবংsecret_keyতারা নিজেদের দ্বারা উত্পাদিত হতে পারে, যতক্ষণ নাaccess_keyএবংsecret_keyমধ্যেWebHookএলার্ম অনুরোধ রোবট পরামিতি উপর কনফিগার করা হয় যে একই।

  • Type, ট্রেডিং দিক, ক্রয় বা বিক্রয়, খোলার বা বন্ধ, মনে রাখবেন যে স্পট এবং ফিউচার পার্থক্য করা হয়। যদি এটি একটি ফিউচার হয়, মনে রাখবেন যে ফিউচার চুক্তি কোড রোবট পরামিতি সেট করা আবশ্যক, এবং কনফিগার করা বিনিময় বস্তু একটি ফিউচার বিনিময় হতে হবে।

  • amount, লেনদেনের সংখ্যা।

চলমান পরীক্ষা

ব্যবহারwexAppবাস্তব বাজারের পরীক্ষা সিমুলেট করার জন্য।

img img

END

সম্পূর্ণ কৌশল ঠিকানাঃhttps://www.fmz.com/strategy/221850

দ্যaccess_keyএবংsecret_keyএই স্কিমে শুধুমাত্র সনাক্তকরণের জন্য রয়েছে এবং ব্যবহারের জন্য কোন গ্যারান্টি নেই।http. এই সমাধানটি কেবল একটি ধারণা এবং একটি ভূমিকা।httpsযোগাযোগ ব্যবহার করা উচিত।


আরো