پچھلے مضمون میں، ہم ایک سادہ سپاٹ حکم کی نگرانی بوٹ لاگو کیا، اور آج ہم ایک سادہ حکم کی نگرانی بوٹ کا ایک معاہدہ ورژن لاگو کرنے جا رہے ہیں.
معاہدے کے ورژن اور اسپاٹ ورژن کے آرڈر سپروائزنگ بوٹ کے مابین ایک بہت بڑا فرق ہے۔ اسپاٹ آرڈر سپروائزنگ بنیادی طور پر اکاؤنٹ کے اثاثوں کی تبدیلیوں کی نگرانی کرکے حاصل کی جاسکتی ہے۔ فیوچر ورژن کو اکاؤنٹ میں پوزیشن کی تبدیلیوں کی نگرانی کرنے کی ضرورت ہے۔ لہذا ، فیوچر ورژن کی صورتحال زیادہ پیچیدہ ہے ، کیونکہ فیوچر کی لمبی اور مختصر پوزیشنوں کے لئے مختلف معاہدے موجود ہیں ، جس میں متعدد تفصیلات سے نمٹنے کی ضرورت ہے۔ بنیادی خیال پوزیشن کی تبدیلیوں کی نگرانی کرنا ہے ، اور پوزیشن کی تبدیلیوں کی بنیاد پر آرڈر سپروائزنگ ایکشن کو متحرک کرنا ہے۔ یہ اصل میں لمبی اور مختصر پوزیشنوں سے مل کر نمٹنے کے لئے ڈیزائن کیا گیا تھا ، لیکن ہمیں معلوم ہوا کہ اس سے نمٹنے کے لئے پیچیدہ ہوگا۔ مسئلہ کا تجزیہ کرنے کے بعد ، یہ فیصلہ کیا گیا ہے کہ لمبی اور مختصر پوزیشنوں سے الگ الگ نمٹا جائے۔
حکمت عملی پیرامیٹر:
یہ بیک ٹیسٹ کی حمایت کرتا ہے، اور مشاہدے کے لئے بیک ٹیسٹ کرنے کے لئے براہ راست ڈیفالٹ کی ترتیبات کا استعمال کرسکتا ہے.
ماخذ کوڈ:
/*backtest
start: 2021-03-18 00:00:00
end: 2021-04-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD"},{"eid":"Futures_OKCoin","currency":"BTC_USD"},{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
*/
function test() {
// test function
var ts = new Date().getTime()
if (ts % (1000 * 60 * 60 * 6) > 1000 * 60 * 60 * 5.5) {
Sleep(1000 * 60 * 10)
var nowPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
var longPosAmount = nowPosAmount.long
var shortPosAmount = nowPosAmount.short
var x = Math.random()
if (x > 0.7) {
exchange.SetDirection("buy")
exchange.Buy(-1, _N(Math.max(1, x * 10), 0), "the reference account tests ordering#FF0000")
} else if(x < 0.2) {
exchange.SetDirection("sell")
exchange.Sell(-1, _N(Math.max(1, x * 10), 0), "the reference account tests ordering#FF0000")
} else if(x >= 0.2 && x <= 0.5 && longPosAmount > 4) {
exchange.SetDirection("closebuy")
exchange.Sell(-1, longPosAmount, "the reference account tests closing positions#FF0000")
} else if(shortPosAmount > 4) {
exchange.SetDirection("closesell")
exchange.Buy(-1, _N(shortPosAmount / 2, 0), "he reference account tests closing position#FF0000")
}
}
}
function getPosAmount(pos, ct) {
var longPosAmount = 0
var shortPosAmount = 0
_.each(pos, function(ele) {
if (ele.ContractType == ct && ele.Type == PD_LONG) {
longPosAmount = ele.Amount
} else if (ele.ContractType == ct && ele.Type == PD_SHORT) {
shortPosAmount = ele.Amount
}
})
return {long: longPosAmount, short: shortPosAmount}
}
function trade(e, ct, type, delta) {
var nowPosAmount = getPosAmount(_C(e.GetPosition), ct)
var nowAmount = type == PD_LONG ? nowPosAmount.long : nowPosAmount.short
if (delta > 0) {
// open position
var tradeFunc = type == PD_LONG ? e.Buy : e.Sell
e.SetDirection(type == PD_LONG ? "buy" : "sell")
tradeFunc(-1, delta)
} else if (delta < 0) {
// close position
var tradeFunc = type == PD_LONG ? e.Sell : e.Buy
e.SetDirection(type == PD_LONG ? "closebuy" : "closesell")
if (nowAmount <= 0) {
Log("no position detected")
return
}
tradeFunc(-1, Math.min(nowAmount, Math.abs(delta)))
} else {
throw "error"
}
}
function main() {
LogReset(1)
if (exchanges.length < 2) {
throw "no platform with order supervision"
}
var exName = exchange.GetName()
// detect the platform for reference
if (!exName.includes("Futures_")) {
throw "only support futures order supervising"
}
Log("start monitoring", exName, "platform", "#FF0000")
// detect the order supervising platform
for (var i = 1 ; i < exchanges.length ; i++) {
if (exchanges[i].GetName() != exName) {
throw "The order supervising platform is different from the reference platform!"
}
}
// set trading pair and contract
_.each(exchanges, function(e) {
if (!IsVirtual()) {
e.SetCurrency(refCurrency)
if (isSimulate) {
if (e.GetName() == "Futures_OKCoin") {
e.IO("simulate", true)
}
}
}
e.SetContractType(refCt)
})
var initRefPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
while(true) {
if (IsVirtual()) { // only simulate during backtest
test() // test function, which simulates a reference account to trade automatically, to trigger the order supervising of the account
}
Sleep(5000)
var nowRefPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
var tbl = {
type : "table",
title : "position",
cols : ["name", "label", "long", "short", "account asset (Stocks)", "account assest (Balance)"],
rows : []
}
_.each(exchanges, function(e) {
var pos = getPosAmount(_C(e.GetPosition), refCt)
var acc = _C(e.GetAccount)
tbl.rows.push([e.GetName(), e.GetLabel(), pos.long, pos.short, acc.Stocks, acc.Balance])
})
LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`")
// calculate the position amount of change
var longPosDelta = nowRefPosAmount.long - initRefPosAmount.long
var shortPosDelta = nowRefPosAmount.short - initRefPosAmount.short
// detect the change
if (longPosDelta == 0 && shortPosDelta == 0) {
continue
} else {
// detect the position change
for (var i = 1 ; i < exchanges.length ; i++) {
// execute the action of long
if (longPosDelta != 0) {
Log(exchanges[i].GetName(), exchanges[i].GetLabel(), "Execute long order supervising, amount of change:", longPosDelta)
trade(exchanges[i], refCt, PD_LONG, longPosDelta)
}
// execute the action of short
if (shortPosDelta != 0) {
Log(exchanges[i].GetName(), exchanges[i].GetLabel(), "Execute short order supervising, amount of change:", shortPosDelta)
trade(exchanges[i], refCt, PD_SHORT, shortPosDelta)
}
}
}
// after the operation of order supervising, update
initRefPosAmount = nowRefPosAmount
}
}
اس حقیقت کو مدنظر رکھتے ہوئے کہ OKEX نے V5 انٹرفیس کو اپ ڈیٹ کرنے کے بعد ، اور OKEX سیمولیٹ بوٹ استعمال کیا جاسکتا ہے ، میں نے ٹیسٹ کرنے کے لئے دو OKEX سیمولیٹ بوٹس کے API KAYs کا استعمال کیا ، بہت آسان۔
تبادلے کا پہلا اعتراض جوڑنا ہے وہ ریفرنس پلیٹ فارم ہے، اور آرڈر سپروائزنگ پلیٹ فارم کام کرنے کے لئے ریفرنس پلیٹ فارم کے اکاؤنٹ پر عمل کرتا ہے۔ اوکیکس کے مشابہ بوٹ پیج پر ، حوالہ پلیٹ فارم اکاؤنٹ دستی طور پر 3 ETH سہ ماہی کریپٹو مارجن معاہدوں کو رکھتا ہے۔
یہ دیکھا جا سکتا ہے کہ بوٹ پوزیشن تبدیلیوں کا پتہ لگایا، اور مندرجہ ذیل کارروائیوں.
آئیے ہم ان 2 معاہدوں کی پوزیشنوں کو بند کرنے کی کوشش کریں جو ہم نے ابھی کھولے ہیں۔ پوزیشنوں کو بند کرنے کے بعد پوزیشنوں کو شکل میں دکھایا گیا ہے:
روبوٹ نے دو معاہدوں کو چلانے اور بند کرنے کے لئے پیروی کی.
حکمت عملی کو بغیر کسی اصلاح کے آسان اور سمجھنے میں آسان انداز میں ڈیزائن کیا گیا ہے۔ بہتر حصے میں احکامات کی نگرانی کرتے وقت اثاثوں کے پتہ لگانے جیسی تفصیلات سے بھی نمٹنے کی ضرورت ہے۔ ڈیزائن کو آسان بنانے کے ل order ، آرڈر کی نگرانی کے احکامات کے لئے مارکیٹ آرڈرز کا استعمال کیا جاتا ہے۔ حکمت عملی صرف سیکھنے کے خیالات فراہم کرتی ہے ، اور بوٹ کو آپ کی ضروریات کے مطابق بہتر بنایا جاسکتا ہے۔
حکمت عملی کا پتہ:https://www.fmz.com/strategy/270012
اپنے تبصرے چھوڑنے کے لئے خوش آمدید.