ক্রিপ্টোকারেন্সি কন্ট্রাক্ট সিম্পল অর্ডার সুপারভাইজিং বট

লেখক:নিনাবাদাস, সৃষ্টিঃ ২০২২-০৪-১১ ১০ঃ৪৭ঃ৪২, আপডেটঃ ২০২২-০৪-১১ ১০ঃ৫৩ঃ৩৭

ক্রিপ্টোকারেন্সি কন্ট্রাক্ট সিম্পল অর্ডার সুপারভাইজিং বট

পূর্ববর্তী নিবন্ধে, আমরা একটি সহজ স্পট অর্ডার তত্ত্বাবধান বট বাস্তবায়ন, এবং আজ আমরা একটি সহজ অর্ডার তত্ত্বাবধান বট একটি চুক্তি সংস্করণ বাস্তবায়ন করতে যাচ্ছি.

ডিজাইন আইডিয়া

চুক্তি সংস্করণ এবং স্পট সংস্করণের অর্ডার তত্ত্বাবধান বট মধ্যে একটি বড় পার্থক্য আছে। স্পট অর্ডার তত্ত্বাবধান প্রধানত অ্যাকাউন্ট সম্পদ পরিবর্তন পর্যবেক্ষণ দ্বারা উপলব্ধি করা যেতে পারে। ফিউচার সংস্করণ একটি অ্যাকাউন্টে অবস্থান পরিবর্তন পর্যবেক্ষণ করতে হবে। সুতরাং, ফিউচার সংস্করণের পরিস্থিতি আরও জটিল, কারণ ফিউচারগুলির দীর্ঘ এবং সংক্ষিপ্ত অবস্থানের জন্য বিভিন্ন চুক্তি রয়েছে, যা একটি সিরিজ বিশদ নিয়ে কাজ করতে হবে। মূল ধারণাটি হল অবস্থান পরিবর্তনগুলি পর্যবেক্ষণ করা এবং অবস্থান পরিবর্তনের উপর ভিত্তি করে অর্ডার-নিরীক্ষণের পদক্ষেপটি ট্রিগার করা। এটি মূলত দীর্ঘ এবং সংক্ষিপ্ত অবস্থানগুলি একসাথে মোকাবেলা করার জন্য ডিজাইন করা হয়েছিল, তবে আমরা খুঁজে পেয়েছি যে এটি মোকাবেলা করা জটিল হবে। সমস্যাটি বিশ্লেষণ করার পরে, দীর্ঘ এবং সংক্ষিপ্ত অবস্থানগুলি আলাদাভাবে মোকাবেলা করার সিদ্ধান্ত নেওয়া হয়েছে।

কৌশল বাস্তবায়ন

কৌশল পরামিতি:

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 KAY ব্যবহার করেছি, খুব সুবিধাজনকভাবে।

প্রথম এক্সচেঞ্জ অবজেক্টটি হল রেফারেন্স প্ল্যাটফর্ম, এবং অর্ডার তদারকি প্ল্যাটফর্মটি রেফারেন্স প্ল্যাটফর্মের অ্যাকাউন্ট অনুসরণ করে কাজ করে। OKEX সিমুলেটেড বট পৃষ্ঠায়, রেফারেন্স প্ল্যাটফর্ম অ্যাকাউন্টটি ম্যানুয়ালি 3 ETH ত্রৈমাসিক ক্রিপ্টো-মার্জিন চুক্তি স্থাপন করে।

img

আপনি দেখতে পাচ্ছেন যে বট অবস্থান পরিবর্তন এবং নিম্নলিখিত অপারেশন সনাক্ত করেছে।

img

আসুন আমরা যে ২টি কনট্রাক্ট পজিশন খুলেছি তা বন্ধ করার চেষ্টা করি। পজিশন বন্ধ হওয়ার পর পজিশনগুলি চিত্রটিতে দেখানো হয়েছেঃ

img

রোবটটি কাজ করার জন্য অনুসরণ করে এবং ২টি চুক্তি বন্ধ করে দেয়।

img

কৌশলটি অপ্টিমাইজেশান ছাড়াই একটি সহজ এবং সহজেই বোঝার উপায়ে ডিজাইন করা হয়েছে। উন্নত অংশটি অর্ডার তদারকি করার সময় সম্পদ সনাক্তকরণের মতো বিশদগুলিও মোকাবেলা করতে হবে। নকশাটি সহজ করার জন্য, অর্ডার তদারকি অর্ডারের জন্য বাজার অর্ডার ব্যবহার করা হয়। কৌশলটি কেবল শেখার ধারণা সরবরাহ করে এবং বটটি আপনার প্রয়োজন অনুসারে অনুকূলিত করা যেতে পারে।

কৌশল ঠিকানাঃhttps://www.fmz.com/strategy/270012

আপনার মতামত দিতে স্বাগতম।


আরো