Type/to search
8
Follow
1361
Followers
لیک ہارویسٹر کی حکمت عملی کا تجزیہ (2)
HFT
Created 2020-11-16 10:03:52  Updated 2024-12-05 22:03:01
 23
 8482

img

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

پھرپچھلا موادوضاحت کریں

تیسری اضافی تقریب:

python
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. اس بات کا تعین کریں کہ آیا موجودہ کل خالص قیمت پچھلی بار ریکارڈ کی گئی کل خالص قیمت سے مطابقت رکھتی ہے:

python
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

python
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)اس کے بعد تمام آرڈرز منسوخ کر دیے جائیں گے۔

python
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()رقم (پوزیشن) بیلنس چیک کریں۔

python
var burstPrice = self.prices[self.prices.length-1] * BurstThresholdPct # 计算爆发价格 var bull = false # 声明牛市标记的变量,初始为假 var bear = false # 声明熊市标记的变量,初始为假 var tradeAmount = 0 # 声明交易数量变量,初始为0

اگلا مرحلہ اس بات کا تعین کرنا ہے کہ آیا موجودہ قلیل مدتی مارکیٹ میں تیزی ہے یا مندی۔

python
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: یہ فنکشن جاوا اسکرپٹ ارے آبجیکٹ کا ایک ممبر فنکشن ہے اس کا کام انڈیکس کے مطابق ارے کے ایک حصے کو روکنا اور اسے واپس کرنا ہے۔

    javascript
    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] }

    img

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

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

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

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

python
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 }

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

python
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. پھر اس آئی ڈی کا آرڈر ڈیٹا حاصل کرنے کے لیے لوپ کریں، اور اس بات کا تعین کریں کہ آیا آرڈر پینڈنگ آرڈر کی حالت میں ہے، اس آئی ڈی کا آرڈر منسوخ کر دیں۔ پتہ لگانے کا لوپ

pine
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 } } }

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

pine
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()ہم نے تجزیہ کیا ہے کہ کنسٹرکٹر لیک ہارویسٹر آبجیکٹ کو کس طرح بناتا ہے، لیک ہارویسٹر آبجیکٹ کے مختلف طریقے، اور اہم منطقی افعال کو انجام دینے کے عمل کا میرا یقین ہے کہ اس مضمون کو پڑھنے کے بعد، آپ کو اعلی تعدد کے بارے میں واضح طور پر سمجھنا چاہیے۔ حکمت عملی الگورتھم کو سمجھنا۔

Related Recommendations
Comment
All comments (19)

    感谢梦总。梦总,请问韭菜收割机跟草神的高频机器人两者结合的思路有没有搞头啊?

    4 years ago

    草神有篇文章讲过,高频需要有市场环境。策略而言韭菜收割机跟草神的高频机器人有思路上的共同点。

    4 years ago

    说了一堆废话。核心的一句都没讲。

    4 years ago

    实在抱歉,这个文章主要是给入门初学者讲执行流程的,讲了一堆废话确实扎眼了,您忽略就行了。

    4 years ago

    有一点不明白,为什么一定要保持币和钱的平衡,如果没有达到平衡,就得操作买和卖。之后过BalanceTimeout又取消订单,不再平衡,而是进入下一个爆发环节。

    5 years ago

    下单命令在哪里。。。

    5 years ago

    之前看的云里雾里,用了一阵FMZ,重新看了一遍。总结思路来说。这个策略的思路是:
    监控盘口价格异动,发现价格爆发,顺着趋势的方向,以交易量大小作为参照计算出梭哈百分比,进行梭哈交易。梭哈交易完以后不持仓,长期保持一个币钱平衡的状态。
    我说的对吗,梦总?嘿嘿。

    5 years ago

    great !~

    5 years ago

    请教梦总,程序不停的在平衡币和钱,这个功能出于什么考虑?去掉balanceAccount()程序会怎样发展?

    5 years ago

    原版韭菜收割机是有一个平衡模块,可以考虑去掉。具体影响不太清楚了。

    5 years ago

    感谢梦总,fmz真的是大宝库

    5 years ago

    不客气 ~

    5 years ago

    还是看不明白

    5 years ago

    ~囧~

    5 years ago

    BurstThresholdVol 这个参数是干嘛的?该怎么设置啊

    6 years ago

    爆发量,这个是策略参数,人为设置的,详细看下策略、文章,就知道这个变量控制什么了。

    6 years ago

    细节满满,看了1小时才勉强理解细节,赞

    6 years ago

    梦总666,研究明白后我能写出跟print money 一样的韭菜收割机么

    6 years ago

    原理应该是差不多吧

    6 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)