avatar of 发明者量化-小小梦 发明者量化-小小梦
پر توجہ دیں نجی پیغام
4
پر توجہ دیں
1271
پیروکار

لیک ہارویسٹر کی حکمت عملی کا تجزیہ (2)

میں تخلیق کیا: 2020-11-16 10:03:52, تازہ کاری: 2024-12-05 22:03:01
comments   23
hits   8088

لیک ہارویسٹر کی حکمت عملی کا تجزیہ (2)

لیک ہارویسٹر کی حکمت عملی کا تجزیہ (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("开始平衡", 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("开始平衡", 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، اور موجد API انٹرفیس کو کال کریں۔exchange.GetAccount()فنکشن، کرنٹ اکاؤنٹ کا تازہ ترین ڈیٹا حاصل کریں اور اسے تفویض کریں۔accountمتغیر پھر فیصلہ کریں۔accountیہ متغیر، اگر متغیر ہے۔nullاگر قیمت (جیسے ٹائم آؤٹ، نیٹ ورک، ایکسچینج انٹرفیس استثناء، وغیرہ) حاصل کرنے میں ناکام رہتی ہے، تو یہ براہ راست واپس کر دی جائے گی (اس کے مطابقif (!account){...}یہاں)۔

self.account = accountیہ جملہ مقامی متغیرات کے لیے ہے۔accountتعمیر شدہ آبجیکٹ کو تفویض کیا گیا۔accountاوصاف کو تعمیر شدہ آبجیکٹ میں اکاؤنٹ کی تازہ ترین معلومات کو ریکارڈ کرنے کے لیے استعمال کیا جاتا ہے۔

var now = new Date().getTime()یہ بیان مقامی متغیر کا اعلان کرتا ہے۔now، اور JavaScript زبان کے وقت اور تاریخ آبجیکٹ کو کال کریں۔getTime()فنکشن موجودہ ٹائم اسٹیمپ لوٹاتا ہے۔ کو تفویض کریں۔nowمتغیر

if (self.orderBook.Bids.length > 0 && now - self.preCalc > (CalcNetInterval * 1000)) {...}یہ کوڈ تعین کرتا ہے کہ آیا موجودہ ٹائم اسٹیمپ اور آخری ریکارڈ شدہ ٹائم اسٹیمپ کے درمیان فرق پیرامیٹر سے زیادہ ہےCalcNetInterval * 1000اس کا مطلب یہ ہے کہ آخری اپ ڈیٹ سے اب تک، اس سے زیادہCalcNetInterval * 1000ملی سیکنڈ(CalcNetIntervalسیکنڈ)، آمدنی کی پرنٹنگ کے وقت کے فنکشن کو حاصل کرنے کے لیے چونکہ پہلی بولی کی قیمت آمدنی کا حساب لگاتے وقت استعمال کی جاتی ہے، اس لیے شرائط بھی حد ہوتی ہیں۔self.orderBook.Bids.length > 0یہ شرط (گہرائی کا ڈیٹا، خرید آرڈر کی فہرست میں گیئر کی درست معلومات ہونی چاہیے)۔ جب یہ اگر بیان کی حالت کو متحرک کیا جاتا ہے تو، عمل درآمدself.preCalc = nowتازہ ترین پرنٹ آمدنی کے ٹائم اسٹیمپ متغیر کو اپ ڈیٹ کریں۔self.preCalcموجودہ ٹائم اسٹیمپnow. یہاں آمدنی کے اعدادوشمار خالص قیمت کے حساب کتاب کا طریقہ استعمال کرتے ہیں، کوڈ ہے۔var net = _N(account.Balance + account.FrozenBalance + self.orderBook.Bids[0].Price * (account.Stocks + account.FrozenStocks))یعنی، سکے کو موجودہ خرید قیمت کے مطابق رقم (ڈینومینیٹر) میں تبدیل کریں، اور پھر اسے اکاؤنٹ میں رقم کی رقم میں شامل کریں اور اسے اعلان کردہ مقامی متغیر کو تفویض کریں۔net. اس بات کا تعین کریں کہ آیا موجودہ کل خالص قیمت پچھلی بار ریکارڈ کی گئی کل خالص قیمت سے مطابقت رکھتی ہے:

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

اگر وہ متضاد ہیں،net != self.preNetاگر درست ہے تو استعمال کریں۔netمتغیر خالص قیمت کو ریکارڈ کرنے کے لیے استعمال ہونے والی پراپرٹی کو اپ ڈیٹ کرتا ہے۔self.preNet. پھر اسے پرنٹ کریں۔netموجد کے مقداری تجارتی پلیٹ فارم روبوٹ کے منافع کے منحنی خطوط کے لیے کل مالیت کا ڈیٹا (FMZ API دستاویز میں استفسار کیا جا سکتا ہےLogProfitیہ فنکشن)۔

اگر شیڈول شدہ پرنٹنگ آمدنی کو متحرک نہیں کیا جاتا ہے، تو درج ذیل عمل کو جاری رکھیں۔account.Stocks(موجودہ اکاؤنٹ میں دستیاب سکوں کی تعداد)account.Balance(اکاؤنٹ میں موجود رقم کی موجودہ رقم) میں درج ہے۔self.btcself.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، اگر آپ کو لگتا ہے کہ آپ کے پاس بہت سارے سکے ہیں، تو آپ ابتدائی قیمت پر فروخت کرکے ایک چھوٹا آرڈر دے سکتے ہیں۔ آخر میں، پیرامیٹر کی ترتیبات کے مطابق ایک خاص وقت کا انتظار کریں۔Sleep(BalanceTimeout)اس کے بعد تمام آرڈرز منسوخ کر دیے جائیں گے۔

        var orders = exchange.GetOrders()                  # 获取当前所有挂单,存在orders变量
        if (orders) {                                      # 如果获取当前挂单数据的变量orders不为null
            for (var i = 0; i < orders.length; i++) {      # 循环遍历orders,逐个取消订单
                if (orders[i].Id != self.tradeOrderId) {
                    exchange.CancelOrder(orders[i].Id)     # 调用exchange.CancelOrder,根据orders[i].Id取消订单
                }
            }
        }

چوتھا اضافی فنکشن:

حکمت عملی کا بنیادی حصہ، خاص بات یہاں ہے،self.poll = function() {...}فنکشن پوری حکمت عملی کی بنیادی منطق ہے ہم نے پچھلے مضمون میں بھی اس کے بارے میں بات کی تھی۔main()فنکشن پر عمل درآمد شروع ہوتا ہے اور داخل ہوتا ہے۔whileلامحدود لوپ سے پہلے، ہم استعمال کرتے ہیںvar reaper = LeeksReaper()ایک لیک ہارویسٹر آبجیکٹ بنایا، اور پھرmain()فنکشن میں لوپ کالreaper.poll()یہ وہ فنکشن ہے جسے کہا جاتا ہے۔

self.pollفنکشن پر عمل درآمد شروع ہوتا ہے اور ہر لوپ سے پہلے کچھ تیاری کا کام کرتا ہے۔self.numTick++تعداد میں اضافہ کریں،self.updateTrades()تازہ ترین مارکیٹ کے لین دین کے ریکارڈ کو اپ ڈیٹ کریں اور متعلقہ ڈیٹا کا حساب لگائیں۔self.updateOrderBook()آرڈر بک ڈیٹا کو اپ ڈیٹ کریں اور متعلقہ ڈیٹا کا حساب لگائیں۔self.balanceAccount()رقم (پوزیشن) بیلنس چیک کریں۔

        var burstPrice = self.prices[self.prices.length-1] * BurstThresholdPct   # 计算爆发价格
        var bull = false             # 声明牛市标记的变量,初始为假
        var bear = false             # 声明熊市标记的变量,初始为假
        var tradeAmount = 0          # 声明交易数量变量,初始为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_.maxsliceیہ تینوں افعال بھی سمجھنے میں بہت آسان ہیں۔

  • _.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))    // 会截取 4 ~ 1 这几个元素,返回一个新数组:[4,3,2,1]
  }

لیک ہارویسٹر کی حکمت عملی کا تجزیہ (2)

ریچھوں اور بیلوں کا فیصلہ کرنے کی شرائط یہ ہیں:

  • self.numTick > 2قائم ہونے کے لیے، اس کا مطلب یہ ہے کہ جب پتہ لگانے کی قیمتوں کا ایک نیا دور شروع ہوتا ہے، تو اسے شروع میں متحرک ہونے سے بچنے کے لیے کم از کم تین راؤنڈز کا پتہ لگانے کے بعد متحرک کیا جانا چاہیے۔
  • قیمت کا سلسلہself.pricesمیں آخری ڈیٹاself.pricesصف میں پچھلی رینج میں زیادہ سے زیادہ یا کم از کم قیمت کے فرق کو توڑنا ہے۔burstPriceیہ دھماکے کی قیمت ہے۔

اگر تمام شرائط پوری ہو جائیں تو نشان لگائیں۔bullیاbearکے لیےtrue، اور دیناtradeAmountمتغیرات تفویض کریں اور اسٹڈ تجارت کی منصوبہ بندی کریں۔

پچھلے کے مطابقself.updateTrades()فنکشن میں اپ ڈیٹ اور حساب کیا گیا۔self.vol، پیرامیٹر کے لیےBurstThresholdVolفیصلہ کریں کہ آیا ٹریڈنگ کی شدت کو کم کرنا ہے (منصوبہ بند تجارت کا سائز کم کرنا)۔

        if (self.vol < BurstThresholdVol) {
            tradeAmount *= self.vol / BurstThresholdVol   // 缩减计划交易量,缩减为之前量的self.vol / BurstThresholdVol 倍
        }
        
        if (self.numTick < 5) {
            tradeAmount *= 0.8      // 缩减为计划的80%
        }
        
        if (self.numTick < 10) {    // 缩减为计划的80%
            tradeAmount *= 0.8
        }

اگلا، اس بات کا تعین کریں کہ آیا تجارتی سگنل اور تجارتی حجم ضروریات کو پورا کرتے ہیں:

        if ((!bull && !bear) || tradeAmount < MinStock) {   # 如果非牛市并且也非熊市,或者计划交易的量tradeAmount小于参数设置的最小交易量MinStock,poll函数直接返回,不做交易操作
            return
        }

مندرجہ بالا فیصلے کے بعد، پھانسیvar tradePrice = bull ? self.bidPrice : self.askPriceلین دین کی قیمت اس کے مطابق مقرر کریں کہ آیا یہ بیئر مارکیٹ ہے یا بیل مارکیٹ، اور قیمت کو لڈنگ قیمت کے متعلقہ بل کے ساتھ تفویض کریں۔

آخر میں درج کریں awhileلوپ کو روکنے کے لئے صرف شرط ہےtradeAmount >= MinStockمنصوبہ بند لین دین کا حجم کم از کم لین دین کے حجم سے کم ہے۔ لوپ میں، موجودہ مارکیٹ میں تیزی ہے یا مندی کی بنیاد پر آرڈرز دیے جاتے ہیں۔ اور آرڈر آئی ڈی کو متغیر میں ریکارڈ کریں۔orderId. آرڈر کے ہر دور کے بعدSleep(200)200 ملی سیکنڈ انتظار کریں۔ پھر لوپ میں فیصلہ کریںorderIdکیا یہ درست ہے (اگر آرڈر ناکام ہوجاتا ہے تو، آرڈر کی ID واپس نہیں کی جائے گی اور اگر شرط کو متحرک نہیں کیا جائے گا)، اگر شرط درست ہے؟ آرڈر ID حاصل کریں اور اسے تفویض کریں۔self.tradeOrderId

آرڈر ڈیٹا کو ذخیرہ کرنے کے لیے متغیر کا اعلان کریں۔orderابتدائی قدر ہے۔null. پھر اس آئی ڈی کا آرڈر ڈیٹا حاصل کرنے کے لیے لوپ کریں، اور اس بات کا تعین کریں کہ آیا آرڈر پینڈنگ آرڈر کی حالت میں ہے، اس آئی ڈی کا آرڈر منسوخ کر دیں۔ پتہ لگانے کا لوپ

                var order = null           // 声明一个变量用于保存订单数据
                while (true) {             // 一个while循环
                    order = exchange.GetOrder(orderId)    // 调用GetOrder查询订单ID为 orderId的订单数据
                    if (order) {                          // 如果查询到订单数据,查询失败order为null,不会触发当前if条件
                        if (order.Status == ORDER_STATE_PENDING) {   // 判断订单状态是不是正在挂单中
                            exchange.CancelOrder(orderId)            // 如果当前正在挂单,取消该订单
                            Sleep(200)
                        } else {                                     // 否则执行break跳出当前while循环
                            break
                        }
                    }
                }

پھر درج ذیل عمل پر عمل کریں:

                self.tradeOrderId = 0              // 重置self.tradeOrderId
                tradeAmount -= order.DealAmount    // 更新tradeAmount,减去提单的订单已经成交的数量
                tradeAmount *= 0.9                 // 减小下单力度
                if (order.Status == ORDER_STATE_CANCELED) {     // 如果订单已经是取消了
                    self.updateOrderBook()                      // 更新订单薄等数据
                    while (bull && self.bidPrice - tradePrice > 0.1) {   // 牛市时,更新后的提单价格超过当前交易价格0.1就减小交易力度,略微调整交易价格
                        tradeAmount *= 0.99
                        tradePrice += 0.1
                    }
                    while (bear && self.askPrice - tradePrice < -0.1) {  // 熊市时,更新后的提单价格超过当前交易价格0.1就减小交易力度,略微调整交易价格
                        tradeAmount *= 0.99
                        tradePrice -= 0.1
                    }
                }

جب پروگرام کا بہاؤ چھلانگ لگاتا ہے۔while (tradeAmount >= MinStock) {...}یہ سائیکل اشارہ کرتا ہے کہ قیمت کے دھماکے کے لین دین کا عمل مکمل ہو گیا ہے۔ لاگوself.numTick = 0، یعنی ری سیٹ کریں۔self.numTick0 ہے.

LeeksReaper()کنسٹرکٹر آخر کار انجام دیتا ہے۔selfلوٹا ہوا اعتراض ہے۔var reaper = LeeksReaper()جب اسے واپس کر دیا گیا۔reaper

اب تکLeeksReaper()ہم نے تجزیہ کیا ہے کہ کنسٹرکٹر لیک ہارویسٹر آبجیکٹ کو کس طرح بناتا ہے، لیک ہارویسٹر آبجیکٹ کے مختلف طریقے، اور اہم منطقی افعال کو انجام دینے کے عمل کا میرا یقین ہے کہ اس مضمون کو پڑھنے کے بعد، آپ کو اعلی تعدد کے بارے میں واضح طور پر سمجھنا چاہیے۔ حکمت عملی الگورتھم کو سمجھنا۔