وسائل لوڈ ہو رہے ہیں... لوڈنگ...

کریپٹوکرنسی معاہدہ سادہ آرڈر سپروائزنگ بوٹ

مصنف:نینا باداس, تخلیق: 2022-04-11 10:47:42, تازہ کاری: 2022-04-11 10:53:37

کریپٹوکرنسی معاہدہ سادہ آرڈر سپروائزنگ بوٹ

پچھلے مضمون میں، ہم ایک سادہ سپاٹ حکم کی نگرانی بوٹ لاگو کیا، اور آج ہم ایک سادہ حکم کی نگرانی بوٹ کا ایک معاہدہ ورژن لاگو کرنے جا رہے ہیں.

ڈیزائن آئیڈیا

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

حکمت عملی کا نفاذ

حکمت عملی پیرامیٹر:

img

یہ بیک ٹیسٹ کی حمایت کرتا ہے، اور مشاہدے کے لئے بیک ٹیسٹ کرنے کے لئے براہ راست ڈیفالٹ کی ترتیبات کا استعمال کرسکتا ہے.

ماخذ کوڈ:

/*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 سہ ماہی کریپٹو مارجن معاہدوں کو رکھتا ہے۔

img

یہ دیکھا جا سکتا ہے کہ بوٹ پوزیشن تبدیلیوں کا پتہ لگایا، اور مندرجہ ذیل کارروائیوں.

img

آئیے ہم ان 2 معاہدوں کی پوزیشنوں کو بند کرنے کی کوشش کریں جو ہم نے ابھی کھولے ہیں۔ پوزیشنوں کو بند کرنے کے بعد پوزیشنوں کو شکل میں دکھایا گیا ہے:

img

روبوٹ نے دو معاہدوں کو چلانے اور بند کرنے کے لئے پیروی کی.

img

حکمت عملی کو بغیر کسی اصلاح کے آسان اور سمجھنے میں آسان انداز میں ڈیزائن کیا گیا ہے۔ بہتر حصے میں احکامات کی نگرانی کرتے وقت اثاثوں کے پتہ لگانے جیسی تفصیلات سے بھی نمٹنے کی ضرورت ہے۔ ڈیزائن کو آسان بنانے کے ل order ، آرڈر کی نگرانی کے احکامات کے لئے مارکیٹ آرڈرز کا استعمال کیا جاتا ہے۔ حکمت عملی صرف سیکھنے کے خیالات فراہم کرتی ہے ، اور بوٹ کو آپ کی ضروریات کے مطابق بہتر بنایا جاسکتا ہے۔

حکمت عملی کا پتہ:https://www.fmz.com/strategy/270012

اپنے تبصرے چھوڑنے کے لئے خوش آمدید.


مزید