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

মুনাফা সংগ্রহকারী কৌশল বিশ্লেষণ (2)

লেখক:নিনাবাদাস, সৃষ্টিঃ ২০২২-০৪-২৬ 15:57:০২, আপডেটঃ ২০২২-০৪-২৬ 15:57:53

মুনাফা সংগ্রহকারী কৌশল বিশ্লেষণ (2)

চলুন শুরু করা যাক।গতবারের বিষয়বস্তুব্যাখ্যা করার জন্য।

তৃতীয় যোগ করা ফাংশনঃ

    self.balanceAccount = function() {
        var account = exchange.GetAccount()
        if (!account) {
            return
        }
        self.account = account
        var now = new Date().getTime()
        if (self.orderBook.Bids.length > 0 && now - self.preCalc > (CalcNetInterval * 1000)) {
            self.preCalc = now
            var net = _N(account.Balance + account.FrozenBalance + self.orderBook.Bids[0].Price * (account.Stocks + account.FrozenStocks))
            if (net != self.preNet) {
                self.preNet = net
                LogProfit(net)
            }
        }
        self.btc = account.Stocks
        self.cny = account.Balance
        self.p = self.btc * self.prices[self.prices.length-1] / (self.btc * self.prices[self.prices.length-1] + self.cny)
        var balanced = false
        
        if (self.p < 0.48) {
            Log("start to balance", self.p)
            self.cny -= 300
            if (self.orderBook.Bids.length >0) {
                exchange.Buy(self.orderBook.Bids[0].Price + 0.00, 0.01)
                exchange.Buy(self.orderBook.Bids[0].Price + 0.01, 0.01)
                exchange.Buy(self.orderBook.Bids[0].Price + 0.02, 0.01)
            }
        } else if (self.p > 0.52) {
            Log("start to balance", self.p)
            self.btc -= 0.03
            if (self.orderBook.Asks.length >0) {
                exchange.Sell(self.orderBook.Asks[0].Price - 0.00, 0.01)
                exchange.Sell(self.orderBook.Asks[0].Price - 0.01, 0.01)
                exchange.Sell(self.orderBook.Asks[0].Price - 0.02, 0.01)
            }
        }
        Sleep(BalanceTimeout)
        var orders = exchange.GetOrders()
        if (orders) {
            for (var i = 0; i < orders.length; i++) {
                if (orders[i].Id != self.tradeOrderId) {
                    exchange.CancelOrder(orders[i].Id)
                }
            }
        }
    }

যখন কনস্ট্রাক্টরLeeksReaper()একটি বস্তু নির্মাণ করা হয়,balanceAccount()অ্যাকাউন্ট সম্পদ তথ্য আপডেট করার জন্য ব্যবহৃত হয়, যা অ্যাকাউন্টে সংরক্ষণ করা হয়self.account, অর্থাৎ, গঠন করার জন্য বৈশিষ্ট্যaccountঅবজেক্টের. গণনা করুন এবং নিয়মিত রিটার্ন মান মুদ্রণ করুন। তারপর, সর্বশেষ অ্যাকাউন্ট সম্পদ তথ্য অনুযায়ী, স্পট মুদ্রা প্রতীক (স্পট অবস্থান ভারসাম্য) এর ভারসাম্য অনুপাত গণনা করা হয়, এবং যখন অফসেট প্রান্তিক প্ররোচিত করা হয়, ছোট আদেশগুলি বন্ধ করা হয় যাতে প্রতীকগুলি (পজিশনগুলি) ভারসাম্যপূর্ণ অবস্থায় ফিরে আসে। ট্রেডিং কার্যকর করার জন্য একটি নির্দিষ্ট সময়ের জন্য অপেক্ষা করুন, এবং তারপরে সমস্ত মুলতুবি আদেশ বাতিল করুন, এবং পরবর্তী রাউন্ডে ফাংশনটি কার্যকর করুন, ভারসাম্য আবার সনাক্ত করা হবে এবং সংশ্লিষ্ট প্রক্রিয়াকরণ করা হবে।

আসুন এই ফাংশন স্ট্রিং এর কোডটি স্ট্রিং দ্বারা দেখিঃ প্রথমত, প্রথম বিবৃতিটিvar account = exchange.GetAccount()স্থানীয় পরিবর্তনশীল ঘোষণা করেaccount, ডাকেexchange.GetAccount()FMZ এপিআই ইন্টারফেসে ফাংশন, বর্তমান অ্যাকাউন্টের সর্বশেষ তথ্য পেতে এবং পরিবর্তনশীল এটি নির্ধারণaccount. তারপর, পরিবর্তনশীল বিচারaccountযদি ভেরিয়েবলের মান হয়:null(যেটা ঘটবে যখন এটি ভেরিয়েবল পেতে ব্যর্থ হয়, যেমন টাইমআউট, নেটওয়ার্ক, প্ল্যাটফর্ম ইন্টারফেস ব্যতিক্রম ইত্যাদি), এটি সরাসরি ফিরে আসবে (প্রতিশোধের সাথে মিলে যায়)if (!account ){...}এখানে) ।

বিবৃতিself.account = accountস্থানীয় পরিবর্তনশীল বরাদ্দ করা হয়accountঅ্যাট্রিবিউটaccountনির্মিত বস্তুর সর্বশেষ অ্যাকাউন্ট তথ্য রেকর্ড করার জন্য নির্মিত বস্তুর।

বিবৃতিvar now = new Date().getTime()স্থানীয় পরিবর্তনশীল ঘোষণা করেnow, এবং ডাকেgetTime()বর্তমান টাইমস্ট্যাম্প ফেরত দিতে জাভাস্ক্রিপ্ট ভাষার সময় ও তারিখ অবজেক্টের ফাংশন, এবং পরিবর্তনশীল টাইমস্ট্যাম্প বরাদ্দnow.

কোডঃif (self.orderBook.Bids.length > 0 && now - self.preCalc > (CalcNetInterval * 1000)) {...}বর্তমান টাইমস্ট্যাম্প এবং সর্বশেষ রেকর্ড টাইমস্ট্যাম্পের মধ্যে পার্থক্য বিচার করে; যদি মানটি পরামিতি অতিক্রম করেCalcNetInterval * 1000, এর মানে হল যে এটি অতিক্রম করেছেCalcNetInterval * 1000মিলিসেকেন্ড (CalcNetIntervalসেকেন্ড) শেষ আপডেট থেকে বর্তমান পর্যন্ত, যা নিয়মিত রিটার্ন মুদ্রণ ফাংশন উপলব্ধি করে। যেহেতু বাজারে কিনতে 1 মূল্য লাভ গণনা করার সময় ব্যবহার করা প্রয়োজন, শর্ত এছাড়াও শর্ত সীমাবদ্ধself.orderBook.Bids.length > 0(গভীরতার তথ্য, যা ক্রয় আদেশের তালিকায় স্তরের তথ্য হিসাবে বৈধ হতে হবে) ।

যখন if কমান্ডের শর্তটি ট্রিগার করা হয়, তখন এক্সিকিউট করুনself.preCalc = nowটাইমস্ট্যাম্প ভেরিয়েবল আপডেট করতেself.preCalcসর্বশেষ মুদ্রিত মুনাফা বর্তমান সময় স্ট্যাম্প পর্যন্তnowএখানে, মুনাফা পরিসংখ্যান নেট মূল্য গণনার পদ্ধতি ব্যবহার করে, কোডটি হলঃvar net = _N(account.Balance + account.FrozenBalance + self.orderBook.Bids[0].Price * (account.Stocks + account.FrozenStocks)), অর্থাৎ, বর্তমান ক্রয় 1 মূল্য অনুযায়ী মুদ্রাকে সম্পদ (উদ্ধৃতি মুদ্রা) তে রূপান্তর করা হয় এবং তারপরে এটি অ্যাকাউন্টে সম্পদ পরিমাণের সাথে যোগ করা হয় এবং এটি ঘোষিত স্থানীয় পরিবর্তনশীলকে নির্ধারণ করা হয়netবর্তমান মোট নেট মূল্য সর্বশেষ রেকর্ড করা মোট নেট মূল্যের সাথে সামঞ্জস্যপূর্ণ কিনা তা নির্ধারণ করুনঃ

            if (net != self.preNet) {
                self.preNet = net
                LogProfit(net)
            }

যদি অসঙ্গতি হয়, অর্থাৎnet != self.preNettrue হলে, বৈশিষ্ট্যটি আপডেট করুনself.preNetযা নেট মূল্য রেকর্ড করেnetতারপর, মোট নেট মূল্য তথ্য মুদ্রণnetএফএমজেড কোয়ান্ট ট্রেডিং প্ল্যাটফর্ম বটের মুনাফা কার্ভ চার্ট (আপনি অনুসন্ধান করতে পারেনLogProfitএফএমজেড এপিআই ডকুমেন্টেশনে।

যদি রিটার্নের নিয়মিত মুদ্রণ শুরু না হয়, তাহলে নিম্নলিখিত প্রক্রিয়া চালিয়ে যানঃ রেকর্ডaccount.Stocks(অ্যাকাউন্টে বর্তমানে উপলব্ধ মুদ্রার প্রতীক) এবংaccount.Balance(একাউন্টে বর্তমান উপলব্ধ সম্পদ)self.btcএবংself.cny. অফসেট অনুপাত গণনা করুন এবং এটি নির্ধারণ করুন, যা রেকর্ড করা হয়self.p.

self.p = self.btc * self.prices[self.prices.length-1] / (self.btc * self.prices[self.prices.length-1] + self.cny)

অ্যালগরিদমটিও খুব সহজ, যা অ্যাকাউন্টের মোট নেট মূল্যের বর্তমান মুদ্রার মূল্যের কত শতাংশ গণনা করে।

তাহলে আপনি কিভাবে বিচার করবেন যখন মুদ্রা (পজিশন) ব্যালেন্স ট্রিগার হয়? এখানে ডেভেলপার একটি বাফার হিসাবে 50% আপ এবং নিচে 2 শতাংশ পয়েন্ট ব্যবহার করে; যদি এটি বাফার অতিক্রম করে, ভারসাম্য কার্যকর, অর্থাৎ যখনself.p < 0.48, মুদ্রা ভারসাম্য অফসেট ট্রিগার করা হয়. যদি আপনি মনে করেন মুদ্রা পরিমাণ সামান্য, প্রতিবার মূল্য 0.01 দ্বারা বৃদ্ধি, তিনটি ছোট আদেশ স্থাপন. একইভাবে যদি মুদ্রা ভারসাম্য হয়self.p > 0.52, যদি আপনি মনে করেন মুদ্রা পরিমাণ বড়, বাজারে 1 মূল্য বিক্রি ছোট আদেশ অপেক্ষা করুন. অবশেষে, একটি নির্দিষ্ট সময়ের জন্য অপেক্ষা করুন, প্যারামিটার সেটিংস অনুযায়ীSleep(BalanceTimeout), এবং সব অর্ডার বাতিল.

        var orders = exchange.GetOrders()                  # obtain all the current pending orders, and save them in the variable orders"
        if (orders) {                                      # if the variable "orders", which obtains all the current pending orders, is not null
            for (var i = 0; i < orders.length; i++) {      # use the loop to traverse "orders", and cancel the orders one by one 
                if (orders[i].Id != self.tradeOrderId) {
                    exchange.CancelOrder(orders[i].Id)     # call "exchange.CancelOrder", and cancel orders by "orders[i].Id"
                }
            }
        }

চতুর্থ যোগ করা ফাংশনঃ

এখানে কৌশলটির মূল অংশ আসে, হাইলাইট।self.poll = function() {...}আমরা আগের নিবন্ধে এটি সম্পর্কেও কথা বলেছি।main( )ফাংশন, কার্যকর শুরু; প্রবেশ করার আগেwhileঅসীম লুপ, আমরা ব্যবহারvar reaper = LeeksReaper()মুনাফা ফসল কাটার বস্তু নির্মাণ করতে, এবং তারপরReaper.poll()চক্রীয়ভাবে বলা হয়main() function.

দ্যself.pollফাংশন চালানো শুরু করে, এবং প্রতিটি লুপের আগে কিছু প্রস্তুতি করে;self.numTick++সংখ্যা বাড়ায়;self.updateTrades()বাজারে সাম্প্রতিক ট্রেডিং রেকর্ড আপডেট করে এবং সংশ্লিষ্ট ব্যবহৃত ডেটা গণনা করে;self.updateOrderBook()বাজার (অর্ডার বুক) তথ্য আপডেট করে এবং প্রাসঙ্গিক তথ্য গণনা করে;self.balanceAccount()মুদ্রা (পজিশন) ব্যালেন্স পরীক্ষা করে।

        var burstPrice = self.prices[self.prices.length-1] * BurstThresholdPct   # calculate the burst price 
        var bull = false             # declare the variable marked by the bull market; the initial value is false
        var bear = false             # declare the variable marked by the bear market; the initial value is false
        var tradeAmount = 0          # declare the variable of trading amount; the initial value is 0

এরপর, আমাদের বিচার করতে হবে যে বর্তমান স্বল্পমেয়াদী বাজারটি শীর্ষ বা নিম্নমুখী কিনা।

        if (self.numTick > 2 && (
            self.prices[self.prices.length-1] - _.max(self.prices.slice(-6, -1)) > burstPrice ||
            self.prices[self.prices.length-1] - _.max(self.prices.slice(-6, -2)) > burstPrice && self.prices[self.prices.length-1] > self.prices[self.prices.length-2]
            )) {
            bull = true
            tradeAmount = self.cny / self.bidPrice * 0.99
        } else if (self.numTick > 2 && (
            self.prices[self.prices.length-1] - _.min(self.prices.slice(-6, -1)) < -burstPrice ||
            self.prices[self.prices.length-1] - _.min(self.prices.slice(-6, -2)) < -burstPrice && self.prices[self.prices.length-1] < self.prices[self.prices.length-2]
            )) {
            bear = true
            tradeAmount = self.btc
        }

মনে আছে কিself.updateOrderBook()পূর্ববর্তী নিবন্ধে ফাংশন, যেখানে আমরা একটি সময় সিরিজ নির্মাণের জন্য ওজন গড় অ্যালগরিদম ব্যবহারpricesএই কোড টুকরা তিনটি নতুন ফাংশন ব্যবহার করে, যথা_.min, _.max, sliceযা বোঝা খুবই সহজ।

  • _.min: ফাংশনটি হল প্যারামিটার অ্যারেতে সর্বনিম্ন খুঁজে পাওয়া।

  • _.max: ফাংশনটি হল প্যারামিটার অ্যারেতে সর্বাধিক খুঁজে পাওয়া।

  • slice: এই ফাংশনটি জাভাস্ক্রিপ্ট অ্যারে অবজেক্টের একটি সদস্য ফাংশন। এটি সূচক অনুযায়ী অ্যারের একটি অংশ আটকানো এবং ফেরত দেওয়া। উদাহরণস্বরূপঃ

    function main() {
        // index     .. -8 -7 -6 -5 -4 -3 -2 -1
        var arr = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
        Log(arr.slice(-5, -1))    // it will intercept several elements from 4 to 1, and return a new array: [4,3,2,1]
    }
    

এখানে, এটি একটি ষাঁড় বা ভালুকের বাজার কিনা তা বিচার করার শর্তগুলি হলঃ

  • self.numTick > 2অবশ্যই সত্য হতে হবে, অর্থাৎ, যদি নতুন এক রাউন্ডে দামের বিস্ফোরণ ঘটে, তবে এটি কমপক্ষে তিন রাউন্ডের সনাক্তকরণের পরে ট্রিগার করা উচিত এবং শুরুতে ট্রিগার এড়ানো উচিত।
  • দামের সিরিজের সর্বশেষ তথ্যself.prices, অর্থাৎ সর্বশেষ তথ্য এবং সর্বোচ্চ বা সর্বনিম্ন মূল্যের মধ্যে পার্থক্যself.pricesপূর্ববর্তী পরিসীমা মধ্যে অ্যারে মাধ্যমে বিরতি উচিতburstPrice .

যদি সব শর্ত সত্য হয়, চিহ্নিত করুনbullঅথবাbearযেমনtrue, এবং পরিবর্তনশীল একটি মান নির্ধারণtradeAmount, এবং একটি stud বিনিময় পরিকল্পনা.

তারপর, প্যারামিটার জন্যBurstThresholdVol, এর উপর ভিত্তি করেself.volআপডেট এবং পূর্ববর্তীself.updateTrades()ট্রেডিংয়ের তীব্রতা কমানোর বিষয়ে সিদ্ধান্ত নেওয়া হয় (পরিকল্পিত ট্রেডিংয়ের পরিমাণ কমানোর জন্য) ।

        if (self.vol < BurstThresholdVol) {
            tradeAmount *= self.vol / BurstThresholdVol   // reduce the planned trading volume, and reduce it to the previous volume multiplied by "self.vol / BurstThresholdVol" 
        }
        
        if (self.numTick < 5) {
            tradeAmount *= 0.8      // reduced to 80% of the plan 
        }
        
        if (self.numTick < 10) {    // reduced to 80% of the plan
            tradeAmount *= 0.8
        }

পরবর্তী, ট্রেডিং সিগন্যাল এবং ট্রেডিং ভলিউম প্রয়োজনীয়তা পূরণ করে কিনা তা বিচার করুনঃ

        if ((!bull && !bear) || tradeAmount < MinStock) {   # if it is not a bull market nor a bear market, or the planned trading volume "tradeAmount" is less than the minimum trading volume "MinStock" set by the parameter, the "poll" function returns directly without any trading operation
            return
        }

উপরের রায়ের পর, কার্যকর করুনvar tradePrice = bull ? self.bidPrice : self.askPrice. এটি একটি ভালুক বা একটি ষাঁড়ের বাজার কিনা তার উপর নির্ভর করে, ট্রেডিং মূল্য সেট করুন এবং মানটি সংশ্লিষ্ট ডেলিভারি অর্ডারের দামের সাথে সংযুক্ত করুন।

অবশেষে, একটি লিখুনwhileলুপ; লুপের একমাত্র স্টপ এবং ব্রেকআউট শর্ত হলtradeAmount >= MinStock, অর্থাৎ, পরিকল্পিত ট্রেডিং ভলিউম ন্যূনতম ট্রেডিং ভলিউমের চেয়ে কম। লুপ মধ্যে, বর্তমান ষাঁড় বাজার অবস্থা বা ভালুক বাজার অবস্থা অনুযায়ী, অর্ডার কার্যকর. এবং পরিবর্তনশীল মধ্যে অর্ডার আইডি রেকর্ডorderIdমৃত্যুদণ্ডSleep(200)প্রতিটি রাউন্ডে অর্ডার দেওয়ার পর ২০০ মিলিসেকেন্ড অপেক্ষা করতে হবে।orderIdis true (যদি অর্ডার ব্যর্থ হয়, অর্ডার আইডি ফেরত দেওয়া হবে না, এবং if শর্তটি ট্রিগার করা হবে না) । যদি শর্তটি সত্য হয়, অর্ডার আইডি পান এবং এটিকে নির্ধারণ করুনself.tradeOrderId.

একটি ভেরিয়েবল ঘোষণা করুনorderঅর্ডার ডেটা সংরক্ষণ করার জন্যnull. তারপরে, আইডি সহ অর্ডার ডেটা পেতে একটি লুপ ব্যবহার করুন এবং অর্ডারটি মুলতুবি অর্ডার স্থিতিতে রয়েছে কিনা তা নির্ধারণ করুন; যদি এটি মুলতুবি অর্ডার স্থিতিতে থাকে তবে আইডি সহ অর্ডারটি বাতিল করুন; যদি এটি মুলতুবি অর্ডার স্থিতিতে না থাকে তবে এটি সনাক্তকরণ লুপ থেকে বেরিয়ে আসবে।

                var order = null           // declare a variable to save the order data 
                while (true) {             // a while loop 
                    order = exchange.GetOrder(orderId)    // call "GetOrder" to query the order data with the ID of  orderId
                    if (order) {                          // if the order data is queried,and the query fails, the order is null, and "if" will not be triggered  
                        if (order.Status == ORDER_STATE_PENDING) {   // judge whether the current order status is pending order
                            exchange.CancelOrder(orderId)            // if the current order status is pending order, cancel the order 
                            Sleep(200)
                        } else {                                     // if not, execute "break" to break out of the while loop 
                            break
                        }
                    }
                }

তারপর, নিম্নলিখিত প্রক্রিয়াটি সম্পাদন করুনঃ

                self.tradeOrderId = 0              // reset "self.tradeOrderId"
                tradeAmount -= order.DealAmount    // update "tradeAmount", and subtract the executed amount of the orders in the delivery order 
                tradeAmount *= 0.9                 // reduce the intensity of ordering  
                if (order.Status == ORDER_STATE_CANCELED) {     // if the order is canceled 
                    self.updateOrderBook()                      // update the data, including the order book data
                    while (bull && self.bidPrice - tradePrice > 0.1) {   // in a bull market, if the updated bid price exceeds the current trading price by 0.1, reduce the trading intensity, and slightly adjust the trading price 
                        tradeAmount *= 0.99
                        tradePrice += 0.1
                    }
                    while (bear && self.askPrice - tradePrice < -0.1) {  // in a bear market, if the updated ask price exceeds the current trading price by 0.1, reduce the trading intensity, and slightly adjust the trading price 
                        tradePrice -= 0.1
                    }
                }

যখন প্রোগ্রাম প্রবাহ থেকে বিরতিwhile (tradeAmount >= MinStock) {...}লুপ, এর মানে হল যে দামের বিস্ফোরণ ট্রেডিং প্রক্রিয়াটি সম্পন্ন হয়েছে। কার্যকর করুনself.numTick = 0, অর্থাৎ, রিসেটself.numTickশূন্যে।

নির্মাতার শেষ মৃত্যুদণ্ডLeeksReaper()রিটার্ন করেselfবস্তুর, অর্থাৎ, যখনvar reaper = LeeksReaper(), বস্তুর ফিরে আসেreaper.

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


আরো