নবাগত, এটি দেখুন আপনাকে ক্রিপ্টোকারেন্সি পরিমাণগত ট্রেডিংয়ে নিয়ে যান (6)

লেখক:নিনাবাদাস, তৈরিঃ ২০২২-০৪-২১ ১৮ঃ১৩ঃ০৩, আপডেটঃ ২০২২-০৪-২২ ১২ঃ০০ঃ০৫

নবাগত, এটি দেখুন আপনাকে ক্রিপ্টোকারেন্সি পরিমাণগত ট্রেডিংয়ে নিয়ে যান (6)

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

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

এই নিবন্ধে, আগের মতই, আমরা FMZ কোয়ান্ট ট্রেডিং প্ল্যাটফর্মের উপর ভিত্তি করে নকশা সম্পর্কে আলোচনা করি (FMZ.COM).

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

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

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

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

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

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

      function main() {
          var net = []  // the recorded grid parameters; when specifically running the grid trading logic, use the data from here 
          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 amount 
              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; when specifically running the grid trading logic, use the data from here         
          _.each(net, function(pair) {
              Log("Trading pair:", pair.symbol, pair)
          })
      }
      

      img

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

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

      var net = null 
      function main() {  // strategy main function 
          // first read the stored net 
          net = _G("net")
          
          // ...
      }
      
      function onExit() {
          _G("net", net)
          Log("Execute the clean-up processing, and save the data", "#FF0000")
      }
      
      function onexit() {    // the onexit function defined by the platform system, which will be triggered when clicking the bot to stop 
          onExit()
      }
      
      function onerror() {   // the onerror function defined by the platform system, which will be triggered when the program exception occurs 
          onExit()
      }
      
      1. অর্ডারের পরিমাণ, অর্ডারের দাম, ন্যূনতম অর্ডার পরিমাণ, ন্যূনতম অর্ডার পরিমাণ ইত্যাদির সীমা।

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

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

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

      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()
    
    // the interfaces that need to be implemented 
    self.interfaceGetTickers = null   // create a function that asynchronously obtains the aggregated market quote threads
    self.interfaceGetAcc = null       // create a function that asynchronously obtains the account data threads 
    self.interfaceGetPos = null       // obtain positions 
    self.interfaceTrade = null        // create concurrent orders 
    self.waitTickers = null           // wait for the concurrent market quote data  
    self.waitAcc = null               // wait for the account concurrent data 
    self.waitTrade = null             // wait for order concurrent data
    self.calcAmount = null            // calculate the order amount according to the trading pair precision and other data 
    self.init = null                  // initialization; obtain the precision and other data 
    
    // execute the configuration function, to configure objects 
    funcConfigure(self)

    // detect whether all the interfaces arranged by configList can be implemented 
    _.each(configList, function(funcName) {
        if (!self[funcName]) {
            throw "interface" + funcName + "not implemented"
        }
    })
    
    return self
}

$.createBaseEx = createBaseEx
$.getConfigureFunc = function(exName) {
    dicRegister = {
        "Futures_OKCoin" : funcConfigure_Futures_OKCoin,    //  the implementation of OKEX Futures 
        "Huobi" : funcConfigure_Huobi,
        "Futures_Binance" : funcConfigure_Futures_Binance,
        "Binance" : funcConfigure_Binance,
        "WexApp" : funcConfigure_WexApp,                    // the 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 the trading pair information 
        var symbolInfo = self.getSymbolInfo(symbol)
        if (!symbol) {
            throw symbol + ",trading pair information not found"
        }
        var tradeAmount = null 
        var equalAmount = null  // record the symbol amount  
        if (type == self.OPEN_LONG || type == self.COVER_SHORT) {
            tradeAmount = _N(amount * price, parseFloat(symbolInfo.pricePrecision))
            // detect the minimum trading amount 
            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))
            // detect the minimum trading amount 
            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() {   // the function that automatically processes conditions like precision, etc.  
        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 obtain the market quotes 
    ex.goGetTickers()
    var tickers = ex.getTickers()
    Log("tickers:", tickers)
    
    // test to obtain the account information 
    ex.goGetAcc(symbol, ts)
    
    _.each(arrTestSymbol, function(symbol) {        
        _.each(tickers, function(ticker) {
            if (symbol == ticker.originalSymbol) {
                // print the market quote data 
                Log(symbol, ticker)
            }
        })

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

কৌশল বট

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

img

img

এই মুহূর্তে, এর ক্ষতি হচ্ছেT_T, তাই সোর্স কোড দেওয়া হবে না।

নিবন্ধীকরণ কোডের সংখ্যা অনেক; আপনি যদি আগ্রহী হন, আপনি তাদের wexApp এ চেষ্টা করতে পারেনঃ

Purchase Address: https://www.fmz.com/m/s/284507
Registration Code:
adc7a2e0a2cfde542e3ace405d216731
f5db29d05f57266165ce92dc18fd0a30
1735dca92794943ddaf277828ee04c27
0281ea107935015491cda2b372a0997d
1d0d8ef1ea0ea1415eeee40404ed09cc

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


আরো