آئیے پچھلے باب کے مواد کی وضاحت کرتے ہیں (https://www.fmz.com/bbs-topic/9725).
تیسرا اضافی فنکشن:
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 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 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 API انٹرفیس پر. موجودہ اکاؤنٹ کے تازہ ترین ڈیٹا حاصل کریں اور متغیر کو تفویض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)){...}
اس بات کا تعین کرتا ہے کہ اگر موجودہ ٹائم اسٹیمپ اور آخری بار ریکارڈ ٹائم اسٹیمپ کے درمیان فرق پیرامیٹر سے زیادہ ہےCalcNet Interval * 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
درست ہے تو، کی صفت کو اپ ڈیٹ کریںself.preNet
متغیر کے ساتھ خالص قیمت ریکارڈ کرنے کے لئے استعمال کیا جاتا ہےnet
. پھر کل خالص پرنٹ کریںnet
FMZ Quant ٹریڈنگ پلیٹ فارم روبوٹ کے پیداوار وکر چارٹ کے اعداد و شمار (کےLogProfit
فنکشن FMZ API دستاویز میں سوال کیا جا سکتا ہے).
اگر آمدنی کی باقاعدگی سے پرنٹنگ شروع نہیں ہوتی ہے تو ، درج ذیل عمل کو جاری رکھیں تاکہ آمدنی کو ریکارڈ کیا جاسکے۔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
، اگر کرنسی زیادہ ہے تو، ایک فروخت اور چھوٹے احکامات جاری. آخر میں، انتظار کرنے کے بعد تمام احکامات منسوخSleep(BalanceTimeout)
پیرامیٹرز کی ترتیبات کے مطابق ایک مخصوص وقت کے لئے.
Var orders = exchange. Get Orders () # Get all current makers, with orders variable
If (orders) { # If the variable orders used to obtain the current order data is not null
for (var i = 0; i < orders.length; I + +) { # Loop through orders and cancel orders one by one
if (orders[i].Id != self.tradeOrderId) {
Exchange. CancelOrder (orders [I]. Id) # Call exchange. CancelOrder to cancel orders based on orders [I]. Id
}
}
}
چوتھا اضافی فنکشن:
حکمت عملی کے بنیادی حصے میں، یہاں اہم کھیل آتا ہے.self.poll = function(){...}
اس سے پہلے کہ ہم نے پچھلے مضمون میں کہا تھا، اس سے پہلے کہ ہم نے اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ ہم اس سے پہلے کہ اس سےmain()
تقریب کو چلانے کے لئے شروع ہوتا ہے اور لامحدود میں داخل ہوتا ہےwhile
لوپ، ہم استعمال کرتے ہیںvar reaper = LeeksReaper()
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 Burst Price
Var bull = false # Declare a bull-marked variable, initially false
Var bear = false # Declare a bear marked variable, initially false
Var tradeAmount = 0 # Declare the transaction amount variable, initially 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
: فنکشن ایک رکن فنکشن ہےJavaScript
array object۔ یہ array کے ایک حصے کو انڈیکس کے مطابق واپس کرنے کے لئے استعمال ہوتا ہے۔ مثال کے طور پر:
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 the elements from 4 to 1 and return a new array: [4,3,2,1]
}
ریڑھ کی ہڈی یا بیل مارکیٹ کا جائزہ لینے کی شرائط یہ ہیں:
·self.numTick > 2
سچ ہونا ضروری ہے، یعنی جب پتہ لگانے کی قیمت کا ایک نیا راؤنڈ شروع ہوتا ہے، تو اسے پتہ لگانے کے کم از کم تین راؤنڈ کے بعد چالو کرنا ضروری ہے، تاکہ شروع میں چالو کرنے سے بچنے کے لۓ.
· آخری اعداد و شمار کے درمیان فرقself.prices
قیمت کے تسلسل، یعنی تازہ ترین اعداد و شمار، اور پچھلے رینج میں زیادہ سے زیادہ یا کم از کم قیمتself.prices
array کے پھٹنے کی قیمت سے تجاوز کرنا چاہئےburstPrice
.
اگر تمام شرائط درست ہیں، نشان زد کریںbull
یاbear
سچ کے طور پر، اور متغیر کو ایک قدر تفویضtradeAmount
سٹڈ ٹرانزیکشن کی منصوبہ بندی کرنے کے لئے.
پھر، کے مطابقself.vol
اپ ڈیٹ اور پچھلے میں حساب کیا جاتا ہے.self.updateTrades()
فنکشن،BurstThresholdVol
پیرامیٹر کا تعین کرتا ہے کہ کیا ٹرانزیکشن شدت کو کم کرنا ہے (منصوبہ بند ٹرانزیکشن حجم کو کم کرنا) ۔
if (self.vol < BurstThresholdVol) {
TradeAmount * = self. Vol/BurstThresholdVol //Reduce the planned volume by self. Vol/BurstThresholdVol times of the previous volume
}
if (self.numTick < 5) {
TradeAmount * = 0.8 // reduced to 80% of the plan
}
If (self. NumTick < 10) { // reduce to 80% of the plan
tradeAmount *= 0.8
}
اگلا، فیصلہ کریں کہ کیا ٹریڈنگ سگنل اور حجم ضروریات کو پورا کرتے ہیں:
If ( (!Bull && !Bear) | | tradeAmount < MinStock) { # If it is not a bull market and not a bear market, or the amount tradeAmount planned to trade is less than the minimum trading volume MinStock set by the parameter, the poll function returns without trading operations directly
return
}
مذکورہ بالا فیصلے کے بعد، پھانسیvar tradePrice = bull ? self.bidPrice: self.askPrice
ٹرانزیکشن کی قیمت کا تعین کرتا ہے کہ آیا یہ ایک ریچھ مارکیٹ ہے یا ایک بیل مارکیٹ ، اور اس کی قیمت کو متعلقہ بل کی قیمت کے ساتھ تفویض کرتا ہے۔
آخر میں، ایکwhile
لوپ میں داخل کیا جاتا ہے، اور لوپ کی واحد سٹاپ شرط یہ ہے کہtradeAmount > = MinStock
کم از کم تجارتی حجم سے کم ہے۔
لوپ میں، حکم موجودہ مارکیٹ کی حالت کے مطابق عملدرآمد کیا جاتا ہے. اور متغیر میں آرڈر ID ریکارڈ.orderId
. Sleep(200)
ہر لوپ میں آرڈر دینے کے بعد 200 ملی سیکنڈ تک انتظار کرتا ہے۔ اس کے بعد لوپ کا تعین کرتا ہے کہ آیاorderId
درست ہے (اگر آرڈر ناکام ہوجاتا ہے تو آرڈر ID واپس نہیں کیا جائے گا ، اور اگر شرط کو متحرک نہیں کیا جائے گا) ۔ اگر شرط درست ہے۔ آرڈر ID حاصل کریں اور اسے تفویض کریںself.tradeOrderId
.
متغیر کا اعلان کریںorder
آرڈر کے اعداد و شمار کو ذخیرہ کرنے کے لئے استعمال کیا جاتا ہے، جس کی ابتدائی قیمت ہےnull
. پھر آئی ڈی کے آرڈر کے اعداد و شمار ایک لوپ میں حاصل کیا جاتا ہے، اور حکم بنانے والے ریاست ہے یا نہیں کا فیصلہ، اگر ایسا ہے تو، آئی ڈی کے حکم منسوخ کر دیا جاتا ہے، اور اگر نہیں، پتہ لگانے لوپ ختم ہو گیا ہے.
Var order = null // Declare a variable to hold the order data
While (true) { // a while loop
Order = exchange. GetOrder (orderId) // Call GetOrder to query the order data whose order ID is orderId
If (order) { // If the order data is queried and the query fails and the order is null, the current if condition will not be triggered
If (order. Status = = ORDER _ STATE _ PENDING) { // Judge whether the order status is maker
Exchange. CancelOrder (orderId) // If the order is maker, cancel the order
Sleep(200)
} else { // otherwise execute break to end the current while loop
break
}
}
}
پھر مندرجہ ذیل عمل انجام دیا جاتا ہے:
Self. TradeOrderId = 0 // Reset self. TradeOrderId.
TradeAmount-= order. DealAmount // Update tradeAmount, subtract the quantity of the order on the bill of lading that has been completed
TradeAmount * = 0.9 //Decrease the order amount
If (order. Status = = ORDER _ STATE _ CANCELED) { // if the order is already cancelled
Self. UpdateOrderBook () // Update data such as order book
While (bull & & self. BidPrice-tradePrice > 0.1) { // In a bull market, if the updated bill of lading price exceeds the current trading price by 0.1, the trading amount will be reduced and the trading price will be adjusted slightly
tradeAmount *= 0.99
tradePrice += 0.1
}
While (bear & & self. AskPrice-tradePrice < -0.1) { // In a bear market, if the updated bill of lading price exceeds the current trading price by 0.1, the trading amount will be reduced and the trading price will be adjusted slightly
tradeAmount *= 0.99
tradePrice -= 0.1
}
}
پروگرام کے عمل کے لوپ کے اختتام پر جبwhile (tradeAmount > = MinStock){...}
، یہ اس قیمت دھماکے کے لین دین کے عمل کے عمل کو مکمل کیا جاتا ہے کہ ظاہر کرتا ہے.
عملدرآمدself.numTick = 0
، یعنی، ری سیٹ کریںself.numTick
0 تک
کےLeeksReaper()
کنسٹرکٹر واپس کرتا ہےself
کے اختتام پر اعتراض، یعنی، جبvar reaper = LeeksReaper()
، اسے واپس کر دیا جاتا ہےreaper
.
اب تک، ہم نے تجزیہ کیا ہے کہ کس طرحLeeksReaper()
کنسٹرکٹر لیکس ریپر آبجیکٹ ، لیکس ریپر آبجیکٹ کا ہر طریقہ ، اور اہم منطقی افعال کے عمل کو تشکیل دیتا ہے۔ مجھے یقین ہے کہ اس مضمون کو پڑھنے کے بعد آپ کو اس اعلی تعدد حکمت عملی الگورتھم کے عمل کی واضح تفہیم ہوگی۔