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