আসুন শেষ অধ্যায়ের বিষয়বস্তু ব্যাখ্যা করি (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
এফএমজেড এপিআই ইন্টারফেসে. বর্তমান অ্যাকাউন্টের সর্বশেষ তথ্য পান এবং এটি পরিবর্তনশীল বরাদ্দ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
শর্তেও সংজ্ঞায়িত করা হয় (গভীরতা তথ্য, অর্ডার তালিকায় বৈধ স্তরের তথ্য থাকতে হবে) । যখন if বিবৃতি শর্তটি ট্রিগার করা হয়,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
যদি true হয়, তাহলে এর অ্যাট্রিবিউট আপডেট করুনself.preNet
ভেরিয়েবলের সাথে নেট মূল্য রেকর্ড করার জন্য ব্যবহৃতnet
. তারপর মোট নেট মুদ্রণ করুনnet
এফএমজেড কোয়ান্ট ট্রেডিং প্ল্যাটফর্ম রোবটের ফলন কার্ভ চার্টে তথ্য (দ্য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
অ্যারে অবজেক্ট. এটি সূচক অনুযায়ী অ্যারের একটি অংশ ফেরত দিতে ব্যবহৃত হয়। উদাহরণস্বরূপঃ
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
অ্যারে এর ফাটল মূল্য অতিক্রম করা উচিত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
ন্যূনতম ট্রেডিং ভলিউমের চেয়ে কম।
লুপ, অর্ডার বর্তমান বাজার অবস্থা অনুযায়ী কার্যকর করা হয়. এবং পরিবর্তনশীল মধ্যে অর্ডার আইডি রেকর্ডorderId
. Sleep(200)
প্রতিটি লুপে একটি অর্ডার স্থাপন করার পরে 200 মিলিসেকেন্ডের জন্য অপেক্ষা করে। লুপটি তারপর নির্ধারণ করে যে কিorderId
is true (যদি অর্ডার ব্যর্থ হয়, অর্ডার আইডি ফেরত দেওয়া হবে না, এবং যদি শর্তটি ট্রিগার করা হবে না) । যদি শর্তটি true হয়। অর্ডার আইডি পান এবং এটিকে অর্ডার আইডিতে বরাদ্দ করুন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
শূন্যে।
দ্যLeeksReaper()
কনস্ট্রাক্টর রিটার্ন করেself
বাস্তবায়ন শেষে বস্তুর, অর্থাৎ যখনvar reaper = LeeksReaper()
, এটা ফিরে আসেreaper
.
এখন পর্যন্ত, আমরা বিশ্লেষণ করেছি কিভাবেLeeksReaper()
কনস্ট্রাক্টর LeeksReaper অবজেক্ট, LeeksReaper অবজেক্টের প্রতিটি পদ্ধতি এবং প্রধান লজিক ফাংশনগুলির কার্যকরকরণ প্রক্রিয়া তৈরি করে। আমি বিশ্বাস করি যে এই নিবন্ধটি পড়ার পরে আপনার এই উচ্চ-ফ্রিকোয়েন্সি কৌশল অ্যালগরিদম প্রক্রিয়া সম্পর্কে একটি পরিষ্কার ধারণা থাকবে।