রিসোর্স লোড হচ্ছে... লোডিং...

নতুনদের জন্য ক্রিপ্টোকারেন্সি পরিমাণগত ট্রেডিং - আপনাকে ক্রিপ্টোকারেন্সি পরিমাণগতের আরও কাছাকাছি নিয়ে যাওয়া (6)

লেখক:এফএমজেড-লিডিয়া, সৃষ্টিঃ ২০২২-০৮-০৫ ১৭ঃ১৩ঃ২৬, আপডেটঃ ২০২৩-০৯-২১ ২১ঃ০২ঃ১৭

img

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

কৌশলগত প্রয়োজনের উপর ভিত্তি করে ডিজাইন চিন্তাভাবনা

এই নিবন্ধটি, আগের মত, এখনও FMZ Quant (FMZ.COM).

  • বহুপ্রজাতি আমি মনে করি, এই গ্রিড কৌশলটি শুধুBTC_USDT, কিন্তু এছাড়াওLTC_USDT/EOS_USDT/DOGE_USDT/ETC_USDT/ETH_USDTযাইহোক, স্পট ট্রেডিং জোড়া এবং বিভিন্ন যে চালাতে চান সব একই সময়ে গ্রিড ট্রেড করা হয়।

    অনেক প্রজাতির বাজারের অস্থিরতা ধরে রাখা ভালো। এই প্রয়োজনীয়তা খুব সহজ মনে হচ্ছে, এবং সমস্যা আসে ডিজাইন করার সময়।

      1. প্রথমত, একাধিক জাতের বাজার কোট পাওয়া যায়। এটি সমাধান করা প্রথম সমস্যা। এক্সচেঞ্জের এপিআই ডকুমেন্টেশন পরিদর্শন করার পরে, আমি খুঁজে পেয়েছি যে বেশিরভাগ এক্সচেঞ্জ সমষ্টিগত বাজার ইন্টারফেস সরবরাহ করে। ঠিক আছে, সমষ্টিগত বাজার ইন্টারফেস ব্যবহার করে তথ্য সংগ্রহ করুন।
      1. দ্বিতীয় সমস্যাটি হ'ল অ্যাকাউন্টের সম্পদ। কারণ এটি একটি মাল্টি-প্রজাতির কৌশল, প্রতিটি ট্রেডিং জোড়া সম্পদের ব্যবস্থাপনা আলাদাভাবে বিবেচনা করা প্রয়োজন। এবং আমাদের একবারে সমস্ত সম্পদের জন্য ডেটা পেতে হবে এবং সেগুলি রেকর্ড করতে হবে। কেন আমাদের অ্যাকাউন্টের সম্পদ ডেটা পেতে হবে? কেন আমাদের প্রতিটি জোড়ার রেকর্ড আলাদা করতে হবে? কারণ অর্ডার দেওয়ার সময় আপনার উপলব্ধ সম্পদগুলি বিচার করতে হবে। এটি বিচার করার আগে এটি অর্জন করা কি প্রয়োজনীয়? এবং আপনি মুনাফা হিসাব করতে হবে, এটাও কি প্রয়োজনীয় একটি প্রাথমিক অ্যাকাউন্ট সম্পদ তথ্য রেকর্ড প্রথম, তারপর বর্তমান অ্যাকাউন্ট সম্পদ তথ্য পেতে এবং মুনাফা এবং ক্ষতি গণনা করার জন্য প্রাথমিক এক সঙ্গে তুলনা? ভাগ্যক্রমে, এক্সচেঞ্জের সম্পদ অ্যাকাউন্ট ইন্টারফেস সাধারণত সমস্ত মুদ্রা সম্পদ তথ্য ফেরত দেয়, আমরা শুধুমাত্র একবার এটি পেতে প্রয়োজন, এবং তারপর তথ্য প্রক্রিয়া।
      1. কৌশল পরামিতি নকশা। মাল্টি প্রজাতির পরামিতি নকশা একক-বৈচিত্র্যের পরামিতি নকশার থেকে বেশ আলাদা, যদিও মাল্টি-বৈচিত্র্যের প্রতিটি বৈচিত্র্যের ট্রেডিং লজিক একই, এটি সম্ভব যে ট্রেডিংয়ের সময় পরামিতিগুলি আলাদা। উদাহরণস্বরূপ, গ্রিড কৌশলতে, আপনি বিটিসি_ইউএসডিটি ট্রেডিং জোড়া করার সময় প্রতিবার 0.01 বিটিসি ট্রেড করতে চাইতে পারেন, তবে এটি স্পষ্টতই অনুপযুক্ত এই পরামিতিটি (0.01 মুদ্রা ট্রেডিং) ব্যবহার করা DOGE_USDT করার সময়। অবশ্যই, আপনি ইউএসডিটি পরিমাণের সাথেও আচরণ করতে পারেন। তবে এখনও সমস্যা থাকবে। আপনি যদি BTC_USDT এর জন্য 1000U এবং DOGE_USDT এর জন্য 10U ট্রেড করতে চান তবে কী হবে? চাহিদা কখনই সন্তুষ্ট হতে পারে না। হয়তো কেউ এই সমস্যাটি নিয়ে ভাববে এবং তারপর জিজ্ঞাসা করবেঃ আমি বিভিন্ন ট্রেডিং জোড়ার পরামিতিগুলি পৃথকভাবে নিয়ন্ত্রণ করার জন্য পরামিতিগুলির বেশ কয়েকটি সেট সেট করতে পারি। এটি এখনও প্রয়োজনীয়তা পূরণের জন্য যথেষ্ট নমনীয় নয়, কত সেট পরামিতি সেট করা ভাল? পরামিতির তিনটি সেট সেট করা হয়, যদি আমি 4 জাত করতে চাই? আমাকে কৌশলটি সংশোধন করতে হবে এবং পরামিতিগুলি বাড়াতে হবে? অতএব, মাল্টি-প্রজাতির কৌশলটির পরামিতিগুলি ডিজাইন করার সময়, এই জাতীয় বৈচিত্র্যময় পরামিতিগুলির প্রয়োজনীয়তাগুলি পুরোপুরি বিবেচনা করা প্রয়োজন। একটি সমাধান হ'ল পরামিতিগুলিকে সাধারণ স্ট্রিং বা জেএসওএন স্ট্রিং হিসাবে ডিজাইন করা। উদাহরণস্বরূপঃ
      ETHUSDT:100:0.002|LTCUSDT:20:0.1
      

      তাদের মধ্যে, gaman প্রতিটি প্রজাতির তথ্য ভাগ করে দেয়, যার অর্থ হল যেETHUSDT:100:0.002ETH_USDT ট্রেডিং জোড়া নিয়ন্ত্রণ করে এবংLTCUSDT:20:0.1LTC_USDT ট্রেডিং জোড়া নিয়ন্ত্রণ করে। মধ্যম ভাগ করতে ব্যবহৃত হয়।ETHUSDT:100:0.002, যেখানে ETHUSDT ইঙ্গিত করে যে আপনি কি ট্রেডিং জোড়া করতে চান, 100 হল গ্রিড স্পেসিং, 0.002 হল প্রতিটি গ্রিডে ট্রেড করা ETH মুদ্রার সংখ্যা, এবং : হল এই ডেটা ভাগ করা (অবশ্যই, এই প্যারামিটার নিয়মগুলি কৌশল ডিজাইনার দ্বারা তৈরি করা হয়, আপনি আপনার প্রয়োজন অনুযায়ী কিছু ডিজাইন করতে পারেন) । এই স্ট্রিংগুলিতে আপনি যা করতে চান তার প্রতিটি প্রজাতির প্যারামিটার তথ্য রয়েছে। কৌশলটিতে এই স্ট্রিংগুলি বিশ্লেষণ করুন এবং প্রতিটি প্রজাতির ট্রেডিং লজিক নিয়ন্ত্রণ করতে কৌশলটির ভেরিয়েবলগুলিতে মান নির্ধারণ করুন। কীভাবে এটি বিশ্লেষণ করবেন? এখনও উপরের উদাহরণটি ব্যবহার করুন।

      function main() {
          var net = []  // The recorded grid parameters, use the data when running to the grid trading logic
          var params = "ETHUSDT:100:0.002|LTCUSDT:20:0.1"
          var arrPair = params.split("|")
          _.each(arrPair, function(pair) {
              var arr = pair.split(":")
              var symbol = arr[0]              // Trading pair name
              var diff = parseFloat(arr[1])    // Grid spacing
              var amount = parseFloat(arr[2])  // Grid order volume
              net.push({symbol : symbol, diff : diff, amount : amount})
          })
          Log("Grid parameter data:", net)
      }
      

      img

      এখানে, প্যারামিটারগুলো বিশ্লেষণ করা হয়েছে। অবশ্যই, আপনি সরাসরি JSON স্ট্রিং ব্যবহার করতে পারেন, যা সহজ।

      function main() {        
          var params = '[{"symbol":"ETHUSDT","diff":100,"amount":0.002},{"symbol":"LTCUSDT","diff":20,"amount":0.1}]'
          var net = JSON.parse(params)  // The recorded grid parameters, use the data when running to the grid trading logic        
          _.each(net, function(pair) {
              Log("Trading pairs:", pair.symbol, pair)
          })
      }
      

      img

      1. তথ্যের স্থায়িত্ব বাস্তবে প্রয়োগ করা যেতে পারে এমন কৌশল এবং টিউটোরিয়াল কৌশলগুলির মধ্যেও একটি বড় পার্থক্য রয়েছে। পূর্ববর্তী নিবন্ধে টিউটোরিয়াল কৌশলগুলি কেবল কৌশল যুক্তি এবং নকশার প্রাথমিক পরীক্ষা এবং বাস্তব জগতে আসার সময় আরও বিষয় বিবেচনা করা দরকার। বাস্তব বটে, বাস্তব ট্রেডিং শুরু এবং বন্ধ করা সম্ভব। এই সময়ে, বাস্তব বট অপারেশনের সময় সমস্ত ডেটা হারিয়ে যাবে। সুতরাং এটি বন্ধ হওয়ার পরেও আসল বটকে আগের অবস্থায় চালিয়ে যেতে কীভাবে পুনরায় চালু করা যায়? এখানে, আসল বট চলার সময় কী ডেটা ধারাবাহিকভাবে সংরক্ষণ করা প্রয়োজন, যাতে এটি পুনরায় চালু হলে ডেটা পড়তে এবং চালিয়ে যেতে পারে। আপনি ব্যবহার করতে পারেন_G()FMZ Quantitative Trading Platform-এ ফাংশন বা ডাটাবেস অপারেশন ফাংশন ব্যবহার করুনDBExec(), এবং বিস্তারিত জানার জন্য আপনি FMZ API ডকুমেন্টেশন চেক করতে পারেন।

      উদাহরণস্বরূপ, আমরা একটি লেজ সুইপ ফাংশন ডিজাইন এবং ব্যবহার_G()গ্রিড ডেটা সংরক্ষণ করার ফাংশন।

      var net = null 
      function main() {  // Strategy main functions
          // Read the stored net first
          net = _G("net")
          
          // ...
      }
      
      function onExit() {
          _G("net", net)
          Log("Perform tail-sweeping processing and save data", "#FF0000")
      }
      
      function onexit() {    // The exit sweep function defined by the platform system, triggered the execution when the real bot is clicked to stop
          onExit()
      }
      
      function onerror() {   // The abnormal exit function defined by the platform system, triggered the execution when the program is abnormal
          onExit()
      }
      
      1. অর্ডার পরিমাণের নির্ভুলতা, অর্ডার মূল্যের নির্ভুলতা, ন্যূনতম অর্ডার পরিমাণ এবং ন্যূনতম অর্ডার পরিমাণ ইত্যাদি সীমাবদ্ধতা

      ব্যাকটেস্টিং সিস্টেম অর্ডার পরিমাণ এবং অর্ডার নির্ভুলতার উপর যেমন কঠোর বিধিনিষেধ আরোপ করে না, তবে প্রতিটি এক্সচেঞ্জে আসল বটে অর্ডার দেওয়ার সময় দাম এবং অর্ডার পরিমাণের জন্য কঠোর মান থাকতে পারে এবং এই বিধিনিষেধগুলি বিভিন্ন এক্সচেঞ্জে একই নয়। অতএব, এমন নতুনরা রয়েছে যারা ব্যাকটেস্টিং সিস্টেমে সমস্যা ছাড়াই পরীক্ষা করে। একবার আসল বট চালু হয়ে গেলে, ট্রেডিং ট্রিগার হওয়ার সময় বিভিন্ন সমস্যা হয়, এবং তারপরে ত্রুটি বার্তার সামগ্রী পড়া হয় না এবং বিভিন্ন পাগল ঘটনা উপস্থিত হয়।

      মাল্টি-প্রজাতির ক্ষেত্রে, এই প্রয়োজনীয়তা আরও জটিল। একটি একক প্রজাতির কৌশল জন্য, আপনি নির্ভুলতা মত তথ্য নির্দিষ্ট করার জন্য একটি পরামিতি ডিজাইন করতে পারেন, কিন্তু যখন একটি মাল্টি-প্রজাতির কৌশল ডিজাইন, এটা স্পষ্ট যে পরামিতি মধ্যে এই তথ্য লেখার পরামিতি খুব bloated করা হবে।

      এই সময়ে, এক্সচেঞ্জ ডকুমেন্টেশনে ট্রেডিং জোড়াগুলির সাথে সম্পর্কিত কোনও ইন্টারফেস তথ্য আছে কিনা তা দেখার জন্য আপনাকে এক্সচেঞ্জের এপিআই ডকুমেন্টেশনটি পরীক্ষা করতে হবে। যদি থাকে তবে আপনি নির্ভুলতার মতো তথ্য পেতে কৌশলটিতে একটি স্বয়ংক্রিয় অ্যাক্সেস ইন্টারফেস ডিজাইন করতে পারেন এবং এটি ট্রেডিংয়ে জড়িত ট্রেডিং জোড়ার তথ্যে কনফিগার করতে পারেন (সংক্ষেপে, নির্ভুলতা বা কিছু স্বয়ংক্রিয়ভাবে এক্সচেঞ্জ থেকে প্রাপ্ত হয় এবং তারপরে কৌশল পরামিতিগুলির সাথে সম্পর্কিত ভেরিয়েবলগুলিতে অভিযোজিত হয়) ।

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

একটি টেমপ্লেট ক্লাস লাইব্রেরি ডিজাইন করুন

উপরের বিশ্লেষণের ভিত্তিতে, কৌশল এবং বিনিময় প্রক্রিয়া এবং ইন্টারফেসের মধ্যে সংযোগ হ্রাস করার জন্য একটি টেমপ্লেট ক্লাস লাইব্রেরি ডিজাইন করা হয়েছে।

আমরা এই টেমপ্লেট ক্লাস লাইব্রেরিটি এভাবে ডিজাইন করতে পারি (কোডের একটি অংশ বাদ দেওয়া হয়েছে):

function createBaseEx(e, funcConfigure) {
    var self = {}
    self.e = e 
    
    self.funcConfigure = funcConfigure
    self.name = e.GetName()
    self.type = self.name.includes("Futures_") ? "Futures" : "Spot"
    self.label = e.GetLabel()
    
    // Interfaces to be implemented
    self.interfaceGetTickers = null   // Create a function to asynchronously obtain a thread of aggregated market data
    self.interfaceGetAcc = null       // Create a function that asynchronously obtains account data thread
    self.interfaceGetPos = null       // Get a position
    self.interfaceTrade = null        // Create concurrent orders
    self.waitTickers = null           // Waiting for concurrent market data 
    self.waitAcc = null               // Waiting for account concurrent data
    self.waitTrade = null             // Waiting for order concurrent data
    self.calcAmount = null            // Calculate the order volume based on data such as trading pair accuracy
    self.init = null                  // Initialization work, obtaining data such as accuracy
    
    // Execute the configuration function to configure the object
    funcConfigure(self)

    // Check whether the interfaces agreed by configList are implemented
    _.each(configList, function(funcName) {
        if (!self[funcName]) {
            throw "interface" + funcName + "unimplemented"
        }
    })
    
    return self
}

$.createBaseEx = createBaseEx
$.getConfigureFunc = function(exName) {
    dicRegister = {
        "Futures_OKCoin" : funcConfigure_Futures_OKCoin,    // Implementation of OK futures
        "Huobi" : funcConfigure_Huobi,
        "Futures_Binance" : funcConfigure_Futures_Binance,
        "Binance" : funcConfigure_Binance,
        "WexApp" : funcConfigure_WexApp,                    // Implementation of wexApp
    }
    return dicRegister
}

টেমপ্লেটে, এটি নির্দিষ্ট এক্সচেঞ্জের জন্য লেখা আছে, উদাহরণস্বরূপ FMZ এর সিমুলেটেড বট WexApp নিনঃ

function funcConfigure_WexApp(self) {
    var formatSymbol = function(originalSymbol) {
        // BTC_USDT
        var arr = originalSymbol.split("_")
        var baseCurrency = arr[0]
        var quoteCurrency = arr[1]
        return [originalSymbol, baseCurrency, quoteCurrency]
    }

    self.interfaceGetTickers = function interfaceGetTickers() {
        self.routineGetTicker = HttpQuery_Go("https://api.wex.app/api/v1/public/tickers")
    }

    self.waitTickers = function waitTickers() {
        var ret = []
        var arr = JSON.parse(self.routineGetTicker.wait()).data
        _.each(arr, function(ele) {
            ret.push({
                bid1: parseFloat(ele.buy), 
                bid1Vol: parseFloat(-1),
                ask1: parseFloat(ele.sell), 
                ask1Vol: parseFloat(-1),
                symbol: formatSymbol(ele.market)[0],
                type: "Spot", 
                originalSymbol: ele.market
            })
        })
        return ret 
    }

    self.interfaceGetAcc = function interfaceGetAcc(symbol, updateTS) {
        if (self.updateAccsTS != updateTS) {
            self.routineGetAcc = self.e.Go("GetAccount")
        }
    }

    self.waitAcc = function waitAcc(symbol, updateTS) {
        var arr = formatSymbol(symbol)
        var ret = null 
        if (self.updateAccsTS != updateTS) {
            ret = self.routineGetAcc.wait().Info
            self.bufferGetAccRet = ret 
        } else {
            ret = self.bufferGetAccRet
        }
        if (!ret) {
            return null 
        }        
        var acc = {symbol: symbol, Stocks: 0, FrozenStocks: 0, Balance: 0, FrozenBalance: 0, originalInfo: ret}
        _.each(ret.exchange, function(ele) {
            if (ele.currency == arr[1]) {
                // baseCurrency
                acc.Stocks = parseFloat(ele.free)
                acc.FrozenStocks = parseFloat(ele.frozen)
            } else if (ele.currency == arr[2]) {
                // quoteCurrency
                acc.Balance = parseFloat(ele.free)
                acc.FrozenBalance = parseFloat(ele.frozen)
            }
        })
        return acc
    }

    self.interfaceGetPos = function interfaceGetPos(symbol, price, initSpAcc, nowSpAcc) {
        var symbolInfo = self.getSymbolInfo(symbol)
        var sumInitStocks = initSpAcc.Stocks + initSpAcc.FrozenStocks
        var sumNowStocks = nowSpAcc.Stocks + nowSpAcc.FrozenStocks
        var diffStocks = _N(sumNowStocks - sumInitStocks, symbolInfo.amountPrecision)
        if (Math.abs(diffStocks) < symbolInfo.min / price) {
            return []
        }
        return [{symbol: symbol, amount: diffStocks, price: null, originalInfo: {}}]
    }

    self.interfaceTrade = function interfaceTrade(symbol, type, price, amount) {
        var tradeType = ""
        if (type == self.OPEN_LONG || type == self.COVER_SHORT) {
            tradeType = "bid"
        } else {
            tradeType = "ask"
        }
        var params = {
            "market": symbol,
            "side": tradeType,
            "amount": String(amount),
            "price" : String(-1),
            "type" : "market"
        }
        self.routineTrade = self.e.Go("IO", "api", "POST", "/api/v1/private/order", self.encodeParams(params))
    }

    self.waitTrade = function waitTrade() {
        return self.routineTrade.wait()
    }

    self.calcAmount = function calcAmount(symbol, type, price, amount) {
        // Obtain trading pair information
        var symbolInfo = self.getSymbolInfo(symbol)
        if (!symbol) {
            throw symbol + ", the trading pair information cannot be checked"
        }
        var tradeAmount = null 
        var equalAmount = null  // Number of coins recorded
        if (type == self.OPEN_LONG || type == self.COVER_SHORT) {
            tradeAmount = _N(amount * price, parseFloat(symbolInfo.pricePrecision))
            // Check the minimum trading volume
            if (tradeAmount < symbolInfo.min) {
                Log(self.name, " tradeAmount:", tradeAmount, "less than", symbolInfo.min)
                return false 
            }
            equalAmount = tradeAmount / price
        } else {
            tradeAmount = _N(amount, parseFloat(symbolInfo.amountPrecision))
            // Check the minimum trading volume
            if (tradeAmount < symbolInfo.min / price) {
                Log(self.name, " tradeAmount:", tradeAmount, "less than", symbolInfo.min / price)
                return false 
            }
            equalAmount = tradeAmount
        }
        return [tradeAmount, equalAmount]
    }

    self.init = function init() {   // Functions that deal with conditions such as accuracy automatically
        var ret = JSON.parse(HttpQuery("https://api.wex.app/api/v1/public/markets"))
        _.each(ret.data, function(symbolInfo) {
            self.symbolsInfo.push({
                symbol: symbolInfo.pair,
                amountPrecision: parseFloat(symbolInfo.basePrecision),
                pricePrecision: parseFloat(symbolInfo.quotePrecision),
                multiplier: 1,
                min: parseFloat(symbolInfo.minQty),
                originalInfo: symbolInfo
            })
        })        
    }
}

তাহলে কৌশলতে এই টেমপ্লেটটি ব্যবহার করা সহজঃ

function main() {
    var fuExName = exchange.GetName()
    var fuConfigureFunc = $.getConfigureFunc()[fuExName]
    var ex = $.createBaseEx(exchange, fuConfigureFunc)

    var arrTestSymbol = ["LTC_USDT", "ETH_USDT", "EOS_USDT"]
    var ts = new Date().getTime()
    
    // Test to get tickers
    ex.goGetTickers()
    var tickers = ex.getTickers()
    Log("tickers:", tickers)
    
    // Test to obtain account information
    ex.goGetAcc(symbol, ts)
    
    _.each(arrTestSymbol, function(symbol) {        
        _.each(tickers, function(ticker) {
            if (symbol == ticker.originalSymbol) {
                // print ticker data
                Log(symbol, ticker)
            }
        })

        // print asset data
        var acc = ex.getAcc(symbol, ts)
        Log("acc:", acc.symbol, acc)
    })
}

কৌশল বাস্তব বট

উপরের টেমপ্লেটের উপর ভিত্তি করে একটি কৌশল ডিজাইন এবং লিখতে খুব সহজ। পুরো কৌশলটি প্রায় 300+ লাইন এবং একটি ডিজিটাল মুদ্রা স্পট মাল্টি-প্রজাতি গ্রিড কৌশল বাস্তবায়ন করে।

img

img

এটা বর্তমানে অর্থ হারাচ্ছেT_T, সোর্স কোডটি এখনই প্রকাশ করা হবে না।

এখানে কিছু রেজিস্ট্রেশন কোড আছে, যদি আপনি আগ্রহী হন, আপনি চেষ্টা করার জন্য wexApp ব্যবহার করতে পারেনঃ

Buy address: https://www.fmz.com/m/s/284507
Registration code: 
adc7a2e0a2cfde542e3ace405d216731
f5db29d05f57266165ce92dc18fd0a30
1735dca92794943ddaf277828ee04c27
0281ea107935015491cda2b372a0997d
1d0d8ef1ea0ea1415eeee40404ed09cc

আমি যখন দৌড়াতে শুরু করি, তখন আমি একটি বড় একতরফা বাজারের মুখোমুখি হয়েছিলাম, তবে আমি ধীরে ধীরে পুনরুদ্ধার করেছি। স্পট গ্রিডগুলির সবচেয়ে বড় সুবিধাটি হ'লঃ আমি ঘুমিয়ে পড়তে পারি! স্থিতিশীলতা খারাপ নয়, এটা ২৭ মে থেকে পরিবর্তিত হয়নি, এবং ফিউচার গ্রিড সাময়িকভাবে চেষ্টা করার সাহস করেনি।


সম্পর্কিত

আরো