ایک طویل عرصے سے ، ڈیجیٹل کرنسی ایکسچینج کے پوزیشن API انٹرفیس کا ڈیٹا تاخیر کا مسئلہ ہمیشہ مجھے پریشان کرتا رہا ہے۔ مجھے اس مسئلے سے نمٹنے کا صحیح طریقہ نہیں ملا ہے۔ مجھے اس مسئلے کے منظر کو دوبارہ پیش کرنے دیں۔ عام طور پر ، معاہدے کے تبادلے کے ذریعہ فراہم کردہ مارکیٹ کی قیمت کا آرڈر دراصل ہم منصب کی قیمت ہوتا ہے ، لہذا بعض اوقات اس نام نہاد
اس مسئلے کی وجہ سے ، میں نے پاگل پن سے لمبی پوزیشنوں سے بھری حکمت عملی کھولی ہے۔ خوش قسمتی سے ، اس وقت مارکیٹ میں تیزی آئی ، اور تیرتا ہوا منافع 10 بی ٹی سی سے تجاوز کر گیا۔ خوش قسمتی سے ، مارکیٹ میں تیزی سے اضافہ ہوا۔ اگر یہ تیزی سے کم ہوا تو ، ہم نتیجہ کا تصور کرسکتے ہیں۔
حل 1 حکمت عملی کو صرف ایک آرڈر دینے کے لئے ڈیزائن کیا جاسکتا ہے ، اور آرڈر کی قیمت موجودہ تجارتی مخالف کی قیمت ہے جس میں ایک بڑی سلائیڈنگ قیمت ہے ، تاکہ مخالف کے آرڈر کی ایک خاص گہرائی حاصل کی جاسکے۔ اس کا فائدہ یہ ہے کہ صرف ایک آرڈر دیا جائے گا ، اور اس کی پوزیشن کی معلومات کی بنیاد پر اس کا فیصلہ نہیں کیا جائے گا۔ اس سے بار بار آرڈرز کے مسئلے سے بچا جاسکتا ہے ، لیکن بعض اوقات آرڈر دینے سے قیمت کی تبدیلی نسبتا large بڑی ہونے پر تبادلے کی قیمت کی حد کا طریقہ کار متحرک ہوسکتا ہے ، اور سلائیڈنگ قیمت میں اضافہ کرنا ممکن ہے اور پھر بھی کوئی سودا کرنے میں ناکام رہے ، اس طرح موقع سے محروم ہوجائیں۔
حل 2 ایکسچینج کے مارکیٹ پرائس آرڈر فنکشن کے ساتھ ، قیمت کو مارکیٹ پرائس آرڈر کے طور پر ایف ایم زیڈ پر - 1 میں منتقل کیا جاتا ہے۔ فی الحال ، اوکیکس فیوچر انٹرفیس کو اپ گریڈ کیا گیا ہے تاکہ حقیقی مارکیٹ پرائس آرڈر کی حمایت کی جاسکے۔
حل 3 ہم اب بھی پچھلے ٹریڈنگ منطق کا استعمال کرتے ہیں اور قیمت کی حد کے احکامات کے ساتھ آرڈر دیتے ہیں ، لیکن ہم پوزیشن ڈیٹا تاخیر کی وجہ سے پیدا ہونے والے مسئلے کو حل کرنے کی کوشش کرنے کے لئے ٹریڈنگ منطق میں کچھ پتہ لگانے کا اضافہ کرتے ہیں۔ چیک کریں کہ آیا آرڈر بغیر کسی منسوخی کے زیر التواء آرڈرز کی فہرست سے براہ راست غائب ہوگیا ہے (انتظار کرنے والے آرڈرز کی فہرست سے غائب ہونے کے دو امکانات ہیں: 1. منسوخی اور 2. بھرا ہوا) ۔ اگر ایسی صورتحال کا پتہ چلتا ہے ، اور دوبارہ رکھے گئے آرڈر کی مقدار آخری آرڈر کی طرح ہی ہے ، تو یہ نوٹ کرنا ضروری ہے کہ آیا پوزیشن ڈیٹا میں تاخیر ہوئی ہے۔ پروگرام کو پوزیشن کی معلومات کو دوبارہ حاصل کرنے کے لئے انتظار کی منطق میں داخل ہونے دیں ، یا یہاں تک کہ انتظار کے اوقات کو متحرک کرنے کے لئے انتظار کی تعداد کو بہتر بنانا اور بڑھانا جاری رکھیں ، اگر یہ ایک خاص تعداد سے تجاوز کرتا ہے تو ، یہ اس بات کی نشاندہی کرتا ہے کہ انٹرفیس ڈیٹا میں تاخیر سنگین ہے ، جس کی وجہ سے ٹریڈنگ منطق ختم ہوجاتی ہے۔
// Parameters
/*
var MinAmount = 1
var SlidePrice = 5
var Interval = 500
*/
function GetPosition(e, contractType, direction) {
e.SetContractType(contractType)
var positions = _C(e.GetPosition);
for (var i = 0; i < positions.length; i++) {
if (positions[i].ContractType == contractType && positions[i].Type == direction) {
return positions[i]
}
}
return null
}
function Open(e, contractType, direction, opAmount) {
var initPosition = GetPosition(e, contractType, direction);
var isFirst = true;
var initAmount = initPosition ? initPosition.Amount : 0;
var nowPosition = initPosition;
var directBreak = false
var preNeedOpen = 0
var timeoutCount = 0
while (true) {
var ticker = _C(e.GetTicker)
var needOpen = opAmount;
if (isFirst) {
isFirst = false;
} else {
nowPosition = GetPosition(e, contractType, direction);
if (nowPosition) {
needOpen = opAmount - (nowPosition.Amount - initAmount);
}
// Check directBreak and the position remains unchanged
if (preNeedOpen == needOpen && directBreak) {
Log("Suspected position data is delayed, wait for 30 seconds", "#FF0000")
Sleep(30000)
nowPosition = GetPosition(e, contractType, direction);
if (nowPosition) {
needOpen = opAmount - (nowPosition.Amount - initAmount);
}
/*
timeoutCount++
if (timeoutCount > 10) {
Log("Suspected position is delayed for 10 consecutive times, and the order is failed!", "#FF0000")
break
}
*/
} else {
timeoutCount = 0
}
}
if (needOpen < MinAmount) {
break;
}
var amount = needOpen;
preNeedOpen = needOpen
e.SetDirection(direction == PD_LONG ? "buy" : "sell");
var orderId;
if (direction == PD_LONG) {
orderId = e.Buy(ticker.Sell + SlidePrice, amount, "open long positions", contractType, ticker);
} else {
orderId = e.Sell(ticker.Buy - SlidePrice, amount, "open short positions", contractType, ticker);
}
directBreak = false
var n = 0
while (true) {
Sleep(Interval);
var orders = _C(e.GetOrders);
if (orders.length == 0) {
if (n == 0) {
directBreak = true
}
break;
}
for (var j = 0; j < orders.length; j++) {
e.CancelOrder(orders[j].Id);
if (j < (orders.length - 1)) {
Sleep(Interval);
}
}
n++
}
}
var ret = {
price: 0,
amount: 0,
position: nowPosition
};
if (!nowPosition) {
return ret;
}
if (!initPosition) {
ret.price = nowPosition.Price;
ret.amount = nowPosition.Amount;
} else {
ret.amount = nowPosition.Amount - initPosition.Amount;
ret.price = _N(((nowPosition.Price * nowPosition.Amount) - (initPosition.Price * initPosition.Amount)) / ret.amount);
}
return ret;
}
function Cover(e, contractType, opAmount, direction) {
var initPosition = null;
var position = null;
var isFirst = true;
while (true) {
while (true) {
Sleep(Interval);
var orders = _C(e.GetOrders);
if (orders.length == 0) {
break;
}
for (var j = 0; j < orders.length; j++) {
e.CancelOrder(orders[j].Id);
if (j < (orders.length - 1)) {
Sleep(Interval);
}
}
}
position = GetPosition(e, contractType, direction)
if (!position) {
break
}
if (isFirst == true) {
initPosition = position;
opAmount = Math.min(opAmount, initPosition.Amount)
isFirst = false;
}
var amount = opAmount - (initPosition.Amount - position.Amount)
if (amount <= 0) {
break
}
var ticker = _C(exchange.GetTicker)
if (position.Type == PD_LONG) {
e.SetDirection("closebuy");
e.Sell(ticker.Buy - SlidePrice, amount, "close long positions", contractType, ticker);
} else if (position.Type == PD_SHORT) {
e.SetDirection("closesell");
e.Buy(ticker.Sell + SlidePrice, amount, "close short positions", contractType, ticker);
}
Sleep(Interval)
}
return position
}
$.OpenLong = function(e, contractType, amount) {
if (typeof(e) == "string") {
amount = contractType
contractType = e
e = exchange
}
return Open(e, contractType, PD_LONG, amount);
}
$.OpenShort = function(e, contractType, amount) {
if (typeof(e) == "string") {
amount = contractType
contractType = e
e = exchange
}
return Open(e, contractType, PD_SHORT, amount);
};
$.CoverLong = function(e, contractType, amount) {
if (typeof(e) == "string") {
amount = contractType
contractType = e
e = exchange
}
return Cover(e, contractType, amount, PD_LONG);
};
$.CoverShort = function(e, contractType, amount) {
if (typeof(e) == "string") {
amount = contractType
contractType = e
e = exchange
}
return Cover(e, contractType, amount, PD_SHORT);
};
function main() {
Log(exchange.GetPosition())
var info = $.OpenLong(exchange, "quarter", 100)
Log(info, "#FF0000")
Log(exchange.GetPosition())
info = $.CoverLong(exchange, "quarter", 30)
Log(exchange.GetPosition())
Log(info, "#FF0000")
info = $.CoverLong(exchange, "quarter", 80)
Log(exchange.GetPosition())
Log(info, "#FF0000")
}
نمونہ کا پتہ:https://www.fmz.com/strategy/203258
ٹیمپلیٹ انٹرفیس اسی طرح بلایا جاتا ہے$.OpenLong
, $.CoverLong
اوپر اہم تقریب میں.
ٹیمپلیٹ ایک بیٹا ورژن ہے، اور آپ کو تجاویز دینے کے لئے خوش آمدید ہیں. ہم اس کو بہتر بنانے کے لئے جاری رکھیں گے تاکہ ہم پوزیشن ڈیٹا تاخیر کے مسئلے کو سنبھال سکیں.