Kontrak Cryptocurrency Bot Pengawasan Perintah Sederhana

Penulis:Ninabadass, Dicipta: 2022-04-11 10:47:42, Dikemas kini: 2022-04-11 10:53:37

Kontrak Cryptocurrency Bot Pengawasan Perintah Sederhana

Dalam artikel sebelumnya, kita melaksanakan bot pengawasan pesanan spot yang mudah, dan hari ini kita akan melaksanakan versi kontrak bot pengawasan pesanan yang mudah.

Idea Reka Bentuk

Terdapat perbezaan besar antara bot pengawasan pesanan versi kontrak dan versi spot. Pengawasan pesanan spot boleh diwujudkan terutamanya dengan memantau perubahan aset akaun. Versi niaga hadapan perlu memantau perubahan kedudukan dalam akaun. Oleh itu, situasi versi niaga hadapan adalah lebih rumit, kerana terdapat kontrak yang berbeza untuk kedudukan panjang dan pendek niaga hadapan, yang perlu menangani satu siri butiran. Idea teras adalah untuk memantau perubahan kedudukan, dan mencetuskan tindakan pengawasan pesanan berdasarkan perubahan kedudukan. Ia pada asalnya direka untuk menangani kedudukan panjang dan pendek bersama-sama, tetapi kami mendapati ia akan menjadi rumit untuk menangani itu. Selepas menganalisis masalah itu, diputuskan untuk menangani kedudukan panjang dan pendek secara berasingan.

Pelaksanaan Strategi

Parameter Strategi:

img

Ia menyokong backtest, dan boleh terus menggunakan tetapan lalai untuk backtest untuk pemerhatian.

Kod sumber:

/*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
    }
}

Ujian

Mengingat hakikat bahawa selepas OKEX dikemas kini antara muka V5, dan OKEX simulasi bot boleh digunakan, saya menggunakan API KAYs dua OKEX simulasi bot untuk menguji, sangat mudah.

Objek pertukaran pertama yang akan ditambah adalah platform rujukan, dan platform pengawasan pesanan mengikuti akaun platform rujukan untuk beroperasi. Pada halaman bot simulasi OKEX, akaun platform rujukan secara manual meletakkan 3 kontrak crypto-margin triwulanan ETH.

img

Ia dapat dilihat bahawa bot mengesan perubahan kedudukan, dan operasi berikut.

img

Mari kita cuba untuk menutup 2 kedudukan kontrak yang kita baru sahaja dibuka. kedudukan selepas menutup kedudukan ditunjukkan dalam gambar:

img

Robot itu mengikut dan menutup 2 kontrak.

img

Strategi ini direka dengan cara yang mudah dan mudah difahami tanpa pengoptimuman. Bahagian yang dipertingkatkan juga perlu menangani butiran seperti pengesanan aset semasa mengawasi pesanan. Untuk mempermudah reka bentuk, pesanan pasaran digunakan untuk pengawasan pesanan. Strategi ini hanya menyediakan idea pembelajaran, dan bot boleh dioptimumkan mengikut keperluan anda.

Alamat strategi:https://www.fmz.com/strategy/270012

Selamat datang untuk meninggalkan komen anda.


Lebih lanjut