ڈیجیٹل کرنسی فیوچر ٹریڈنگ کے منطق پر کچھ خیالات

مصنف:لیدیہ, تخلیق: 2022-11-30 17:12:20, تازہ کاری: 2023-09-11 19:59:55

img

ڈیجیٹل کرنسی فیوچر ٹریڈنگ کے منطق پر کچھ خیالات

دشواری کا منظرنامہ

ایک طویل عرصے سے ، ڈیجیٹل کرنسی ایکسچینج کے پوزیشن API انٹرفیس کا ڈیٹا تاخیر کا مسئلہ ہمیشہ مجھے پریشان کرتا رہا ہے۔ مجھے اس مسئلے سے نمٹنے کا صحیح طریقہ نہیں ملا ہے۔ مجھے اس مسئلے کے منظر کو دوبارہ پیش کرنے دیں۔ عام طور پر ، معاہدے کے تبادلے کے ذریعہ فراہم کردہ مارکیٹ کی قیمت کا آرڈر دراصل ہم منصب کی قیمت ہوتا ہے ، لہذا بعض اوقات اس نام نہاد مارکیٹ پرائس آرڈر کا استعمال کرنا قابل اعتماد نہیں ہوتا ہے۔ تاہم ، جب ہم ڈیجیٹل کرنسی فیوچر ٹریڈنگ کی حکمت عملی لکھتے ہیں تو ، ہم زیادہ تر حد کے آرڈر کا استعمال کرتے ہیں۔ ہر آرڈر کے بعد ، ہمیں یہ دیکھنے کے لئے پوزیشن کی جانچ پڑتال کرنے کی ضرورت ہوتی ہے کہ آیا آرڈر بند ہے اور اسی پوزیشن کو برقرار رکھا گیا ہے۔ مسئلہ اس انفارمیشن پوزیشن میں ہے۔ اگر آرڈر بند ہوجاتا ہے تو ، تبادلے کے پوزیشن انفارمیشن انٹرفیس کے ذریعہ واپس آنے والے ڈیٹا (یعنی ، جب ہم تبادلہ کرتے ہیں تو نیچے کی پرت کے ذریعہ اصل میں رسائی حاصل کرنے والا انٹرفیس) میں نئی پوزیشن کی معلومات

عملی تجربہ

اس مسئلے کی وجہ سے ، میں نے پاگل پن سے لمبی پوزیشنوں سے بھری حکمت عملی کھولی ہے۔ خوش قسمتی سے ، اس وقت مارکیٹ میں تیزی آئی ، اور تیرتا ہوا منافع 10 بی ٹی سی سے تجاوز کر گیا۔ خوش قسمتی سے ، مارکیٹ میں تیزی سے اضافہ ہوا۔ اگر یہ تیزی سے کم ہوا تو ، ہم نتیجہ کا تصور کرسکتے ہیں۔

حل

  • حل 1 حکمت عملی کو صرف ایک آرڈر دینے کے لئے ڈیزائن کیا جاسکتا ہے ، اور آرڈر کی قیمت موجودہ تجارتی مخالف کی قیمت ہے جس میں ایک بڑی سلائیڈنگ قیمت ہے ، تاکہ مخالف کے آرڈر کی ایک خاص گہرائی حاصل کی جاسکے۔ اس کا فائدہ یہ ہے کہ صرف ایک آرڈر دیا جائے گا ، اور اس کی پوزیشن کی معلومات کی بنیاد پر اس کا فیصلہ نہیں کیا جائے گا۔ اس سے بار بار آرڈرز کے مسئلے سے بچا جاسکتا ہے ، لیکن بعض اوقات آرڈر دینے سے قیمت کی تبدیلی نسبتا large بڑی ہونے پر تبادلے کی قیمت کی حد کا طریقہ کار متحرک ہوسکتا ہے ، اور سلائیڈنگ قیمت میں اضافہ کرنا ممکن ہے اور پھر بھی کوئی سودا کرنے میں ناکام رہے ، اس طرح موقع سے محروم ہوجائیں۔

  • حل 2 ایکسچینج کے مارکیٹ پرائس آرڈر فنکشن کے ساتھ ، قیمت کو مارکیٹ پرائس آرڈر کے طور پر ایف ایم زیڈ پر - 1 میں منتقل کیا جاتا ہے۔ فی الحال ، اوکیکس فیوچر انٹرفیس کو اپ گریڈ کیا گیا ہے تاکہ حقیقی مارکیٹ پرائس آرڈر کی حمایت کی جاسکے۔

  • حل 3 ہم اب بھی پچھلے ٹریڈنگ منطق کا استعمال کرتے ہیں اور قیمت کی حد کے احکامات کے ساتھ آرڈر دیتے ہیں ، لیکن ہم پوزیشن ڈیٹا تاخیر کی وجہ سے پیدا ہونے والے مسئلے کو حل کرنے کی کوشش کرنے کے لئے ٹریڈنگ منطق میں کچھ پتہ لگانے کا اضافہ کرتے ہیں۔ چیک کریں کہ آیا آرڈر بغیر کسی منسوخی کے زیر التواء آرڈرز کی فہرست سے براہ راست غائب ہوگیا ہے (انتظار کرنے والے آرڈرز کی فہرست سے غائب ہونے کے دو امکانات ہیں: 1. منسوخی اور 2. بھرا ہوا) ۔ اگر ایسی صورتحال کا پتہ چلتا ہے ، اور دوبارہ رکھے گئے آرڈر کی مقدار آخری آرڈر کی طرح ہی ہے ، تو یہ نوٹ کرنا ضروری ہے کہ آیا پوزیشن ڈیٹا میں تاخیر ہوئی ہے۔ پروگرام کو پوزیشن کی معلومات کو دوبارہ حاصل کرنے کے لئے انتظار کی منطق میں داخل ہونے دیں ، یا یہاں تک کہ انتظار کے اوقات کو متحرک کرنے کے لئے انتظار کی تعداد کو بہتر بنانا اور بڑھانا جاری رکھیں ، اگر یہ ایک خاص تعداد سے تجاوز کرتا ہے تو ، یہ اس بات کی نشاندہی کرتا ہے کہ انٹرفیس ڈیٹا میں تاخیر سنگین ہے ، جس کی وجہ سے ٹریڈنگ منطق ختم ہوجاتی ہے۔

حل 3 پر مبنی ڈیزائن

// 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اوپر اہم تقریب میں. ٹیمپلیٹ ایک بیٹا ورژن ہے، اور آپ کو تجاویز دینے کے لئے خوش آمدید ہیں. ہم اس کو بہتر بنانے کے لئے جاری رکھیں گے تاکہ ہم پوزیشن ڈیٹا تاخیر کے مسئلے کو سنبھال سکیں.


متعلقہ

مزید