এই নিবন্ধে বর্ণিত কৌশলটির সারমর্ম একটি গতিশীল ভারসাম্য কৌশল, অর্থাৎ ভারসাম্য মুদ্রার মান সর্বদা মূল্যায়ন মুদ্রার মানের সমান। তবে, কৌশল যুক্তি খুব সহজ যখন এটি প্রাক-পেন্ডিং অর্ডার হিসাবে ডিজাইন করা হয়। এই কৌশলটি লেখার মূল উদ্দেশ্য কৌশল নকশার সমস্ত দিক দেখানো।
কৌশল লজিক ইনক্যাপসুলেশন রানটাইমে কিছু ডেটা এবং ট্যাগ ভেরিয়েবলের সাথে কৌশল লজিককে ক্যাপসুল করুন (বস্তু হিসাবে ক্যাপসুল করা) ।
কৌশল প্রক্রিয়াকরণের সূচনা কোড প্রাথমিক অ্যাকাউন্টের তথ্য মুনাফা গণনার জন্য প্রাথমিক রান রেকর্ড করা হয়। প্রাথমিক রানটাইমে, আপনি পরামিতি অনুযায়ী ডেটা পুনরুদ্ধার করতে চান কিনা তা চয়ন করতে পারেন।
কৌশল ইন্টারঅ্যাকশন প্রক্রিয়াকরণের জন্য কোড বিরতি এবং পুনরায় শুরু করার একটি সহজ ইন্টারেক্টিভ প্রসেসিং ডিজাইন করা হয়েছে।
কৌশলগত মুনাফা গণনার জন্য কোড মুদ্রা মানক গণনার পদ্ধতি ব্যবহার করা হয় মুনাফা গণনার জন্য।
কৌশলটিতে মূল তথ্যের ধারাবাহিকতার প্রক্রিয়া ডেটা পুনরুদ্ধারের জন্য যন্ত্রপাতি ডিজাইন করা।
কৌশল প্রক্রিয়াকরণের তথ্য প্রদর্শনের জন্য কোড স্ট্যাটাস বার ডেটা প্রদর্শন।
var Shannon = {
// member
e : exchanges[0],
arrPlanOrders : [],
distance : BalanceDistance,
account : null,
ticker : null,
initAccount : null,
isAskPending : false,
isBidPending : false,
// function
CancelAllOrders : function (e) {
while(true) {
var orders = _C(e.GetOrders)
if(orders.length == 0) {
return
}
Sleep(500)
for(var i = 0; i < orders.length; i++) {
e.CancelOrder(orders[i].Id, orders[i])
Sleep(500)
}
}
},
Balance : function () {
if (this.arrPlanOrders.length == 0) {
this.CancelAllOrders(this.e)
var acc = _C(this.e.GetAccount)
this.account = acc
var askPendingPrice = (this.distance + acc.Balance) / acc.Stocks
var bidPendingPrice = (acc.Balance - this.distance) / acc.Stocks
var askPendingAmount = this.distance / 2 / askPendingPrice
var bidPendingAmount = this.distance / 2 / bidPendingPrice
this.arrPlanOrders.push({tradeType : "ask", price : askPendingPrice, amount : askPendingAmount})
this.arrPlanOrders.push({tradeType : "bid", price : bidPendingPrice, amount : bidPendingAmount})
} else if(this.isAskPending == false && this.isBidPending == false) {
for(var i = 0; i < this.arrPlanOrders.length; i++) {
var tradeFun = this.arrPlanOrders[i].tradeType == "ask" ? this.e.Sell : this.e.Buy
var id = tradeFun(this.arrPlanOrders[i].price, this.arrPlanOrders[i].amount)
if(id) {
this.isAskPending = this.arrPlanOrders[i].tradeType == "ask" ? true : this.isAskPending
this.isBidPending = this.arrPlanOrders[i].tradeType == "bid" ? true : this.isBidPending
} else {
Log("Pending order failed, clear!")
this.CancelAllOrders(this.e)
return
}
}
}
if(this.isBidPending || this.isAskPending) {
var orders = _C(this.e.GetOrders)
Sleep(1000)
var ticker = _C(this.e.GetTicker)
this.ticker = ticker
if(this.isAskPending) {
var isFoundAsk = false
for (var i = 0; i < orders.length; i++) {
if(orders[i].Type == ORDER_TYPE_SELL) {
isFoundAsk = true
}
}
if(!isFoundAsk) {
Log("Selling order filled, cancel the order, reset")
this.CancelAllOrders(this.e)
this.arrPlanOrders = []
this.isAskPending = false
this.isBidPending = false
LogProfit(this.CalcProfit(ticker))
return
}
}
if(this.isBidPending) {
var isFoundBid = false
for(var i = 0; i < orders.length; i++) {
if(orders[i].Type == ORDER_TYPE_BUY) {
isFoundBid = true
}
}
if(!isFoundBid) {
Log("Buying order filled, cancel the order, reset")
this.CancelAllOrders(this.e)
this.arrPlanOrders = []
this.isAskPending = false
this.isBidPending = false
LogProfit(this.CalcProfit(ticker))
return
}
}
}
},
ShowTab : function() {
var tblPlanOrders = {
type : "table",
title : "Plan pending orders",
cols : ["direction", "price", "amount"],
rows : []
}
for(var i = 0; i < this.arrPlanOrders.length; i++) {
tblPlanOrders.rows.push([this.arrPlanOrders[i].tradeType, this.arrPlanOrders[i].price, this.arrPlanOrders[i].amount])
}
var tblAcc = {
type : "table",
title : "Account information",
cols : ["type", "Stocks", "FrozenStocks", "Balance", "FrozenBalance"],
rows : []
}
tblAcc.rows.push(["Initial", this.initAccount.Stocks, this.initAccount.FrozenStocks, this.initAccount.Balance, this.initAccount.FrozenBalance])
tblAcc.rows.push(["This", this.account.Stocks, this.account.FrozenStocks, this.account.Balance, this.account.FrozenBalance])
return "Time:" + _D() + "\n `" + JSON.stringify([tblPlanOrders, tblAcc]) + "`" + "\n" + "ticker:" + JSON.stringify(this.ticker)
},
CalcProfit : function(ticker) {
var acc = _C(this.e.GetAccount)
this.account = acc
return (this.account.Balance - this.initAccount.Balance) + (this.account.Stocks - this.initAccount.Stocks) * ticker.Last
},
Init : function() {
this.initAccount = _C(this.e.GetAccount)
if(IsReset) {
var acc = _G("account")
if(acc) {
this.initAccount = acc
} else {
Log("Failed to restore initial account information! Running in initial state!")
_G("account", this.initAccount)
}
} else {
_G("account", this.initAccount)
LogReset(1)
LogProfitReset()
}
},
Exit : function() {
Log("Cancel all pending orders before stopping...")
this.CancelAllOrders(this.e)
}
}
function main() {
// Initialization
Shannon.Init()
// Main loop
while(true) {
Shannon.Balance()
LogStatus(Shannon.ShowTab())
// Interaction
var cmd = GetCommand()
if(cmd) {
if(cmd == "stop") {
while(true) {
LogStatus("Pause", Shannon.ShowTab())
cmd = GetCommand()
if(cmd) {
if(cmd == "continue") {
break
}
}
Sleep(1000)
}
}
}
Sleep(5000)
}
}
function onexit() {
Shannon.Exit()
}
কৌশলগুলি শুধুমাত্র শিক্ষামূলক উদ্দেশ্যে এবং বাস্তব বট ট্রেডিংয়ে সতর্কতার সাথে ব্যবহার করা উচিত। কৌশল ঠিকানাঃhttps://www.fmz.com/strategy/225746