Kontrak mata uang digital mudah dilacak oleh robot

Penulis:Mimpi kecil, Dibuat: 2021-04-07 21:30:05, Diperbarui: 2023-09-24 19:35:33

img

Kontrak mata uang digital mudah dilacak oleh robot

Pada artikel sebelumnya, kami mengimplementasikan robot pembayaran langsung sederhana, dan hari ini kami mengimplementasikan robot pembayaran sederhana versi kontrak.

Pikiran Desain

Versi kontrak memiliki perbedaan besar antara buku catatan robot dan buku catatan langsung. Buku catatan langsung terutama dapat dilakukan dengan memantau perubahan aset akun. Versi berjangka membutuhkan pemantauan perubahan posisi pemegang akun. Jadi, versi futures agak rumit, karena ada banyak pegangan, pegangan kosong, dan kontrak yang berbeda. Perincian harus ditangani dalam rangkaian ini. Untuk memicu tindakan tunggal berdasarkan pergerakan pemegang. Awalnya dirancang untuk menangani multihead, blank, bersama-sama, tetapi menemukan bahwa ini akan menjadi rumit. Setelah masalah analisis, keputusan untuk menangani multihead, blank, terpisah dipegang.

Implementasi Strategi

Parameter kebijakan:

img

Dukungan retesting, yang dapat langsung digunakan untuk mengatur retesting observasi secara default.

Kode sumber strategi:

/*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() {
    // 测试函数
    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), "参考账户测试开单#FF0000")
        } else if(x < 0.2) {
            exchange.SetDirection("sell")
            exchange.Sell(-1, _N(Math.max(1, x * 10), 0), "参考账户测试开单#FF0000")
        } else if(x >= 0.2 && x <= 0.5 && longPosAmount > 4) {
            exchange.SetDirection("closebuy")
            exchange.Sell(-1, longPosAmount, "参考账户测试平仓#FF0000")
        } else if(shortPosAmount > 4) {
            exchange.SetDirection("closesell")
            exchange.Buy(-1, _N(shortPosAmount / 2, 0), "参考账户测试平仓#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) {
        // 开仓
        var tradeFunc = type == PD_LONG ? e.Buy : e.Sell
        e.SetDirection(type == PD_LONG ? "buy" : "sell")
        tradeFunc(-1, delta)
    } else if (delta < 0) {
        // 平仓
        var tradeFunc = type == PD_LONG ? e.Sell : e.Buy
        e.SetDirection(type == PD_LONG ? "closebuy" : "closesell")
        if (nowAmount <= 0) {
            Log("未检测到持仓")
            return 
        }
        tradeFunc(-1, Math.min(nowAmount, Math.abs(delta)))
    } else {
        throw "错误"
    }
}

function main() {
    LogReset(1)
    if (exchanges.length < 2) {
        throw "没有跟单的交易所"
    }
    var exName = exchange.GetName()
    // 检测参考交易所
    if (!exName.includes("Futures_")) {
        throw "仅支持期货跟单"
    }
    Log("开始监控", exName, "交易所", "#FF0000")
    
    // 检测跟单交易所
    for (var i = 1 ; i < exchanges.length ; i++) {
        if (exchanges[i].GetName() != exName) {
            throw "跟单的期货交易所和参考交易所不同!"
        }
    }
    
    // 设置交易对、合约
    _.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()) {    // 回测时才模拟
            test()            // 测试函数,模拟参考账户主动交易,触发跟单账户跟单        
        }
        Sleep(5000)
        var nowRefPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
        var tbl = {
            type : "table", 
            title : "持仓",
            cols : ["名称", "标签", "多仓", "空仓", "账户资产(Stocks)", "账户资产(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) + "`")
        
        // 计算仓位变动量
        var longPosDelta = nowRefPosAmount.long - initRefPosAmount.long
        var shortPosDelta = nowRefPosAmount.short - initRefPosAmount.short

        // 检测变动
        if (longPosDelta == 0 && shortPosDelta == 0) {
            continue
        } else {
            // 检测到仓位变动
            for (var i = 1 ; i < exchanges.length ; i++) {
                // 执行多头动作
                if (longPosDelta != 0) {
                    Log(exchanges[i].GetName(), exchanges[i].GetLabel(), "执行多头跟单,变动量:", longPosDelta)
                    trade(exchanges[i], refCt, PD_LONG, longPosDelta)
                }
                // 执行空头动作
                if (shortPosDelta != 0) {
                    Log(exchanges[i].GetName(), exchanges[i].GetLabel(), "执行空头跟单,变动量:", shortPosDelta)
                    trade(exchanges[i], refCt, PD_SHORT, shortPosDelta)
                }
            }
        }

        // 执行跟单操作后,更新
        initRefPosAmount = nowRefPosAmount
    }
}

Pengujian

Karena OKEX telah memperbarui antarmuka V5 untuk memungkinkan penggunaan OKEX analog disk, saya menggunakan dua OKEX analog disk API KEY untuk melakukan pengujian yang sangat mudah.

Objek bursa pertama yang ditambahkan adalah bursa referensi, dan setiap bursa akan melakukan transaksi dengan akun bursa ini. Pada halaman OKEX analog, gunakan akun bursa untuk mengaktifkan kontrak biner koin kuartal 3 ETH.

img

Seperti yang dapat dilihat pada layar nyata yang mendeteksi perubahan dalam saham akun bursa acuan, dan kemudian mengikuti operasi tersebut.

img

Jika kita mencoba untuk mengimbangi dua posisi kontrak yang baru saja dibuka, maka posisi setelah itu adalah sebagai berikut:

img

Di sini, Anda dapat melihat beberapa gambar yang menarik dari situs web ini.

img

Strategi ini dirancang dengan cara yang sederhana dan mudah dimengerti, tanpa melakukan optimasi, bagian yang disempurnakan juga perlu menangani detail seperti pemeriksaan aset saat tagihan. Untuk desain yang sederhana, tagihan hanya menggunakan daftar harga pasar.

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

Selamat datang di blog ini.


Berkaitan

Lebih banyak

pw1013Tidak ada dua bursa yang berbeda.

Mingxi1005Ketika penemu dapat mencocokkan mata uang dan memenangkan kontrak berjangka?

AklcSaya berharap ada versi pembayaran dari USDT.

Lau99Saya ingin memiliki versi kontrak permanen dari Bitcoin, API pelaku?????

ZhousoneSaya berharap ada versi kontrak permanen dari token usdt.

QQlove23Terima kasih banyak untuk berbagi, sangat bermanfaat untuk dipelajari.

Mimpi kecilKarena spesifikasi kontrak mungkin berbeda di bursa, kode pesanan mungkin harus disesuaikan sesuai dengan situasi tertentu.

pw1013Saya menggunakan bibox, dengan komisi 80%, dan FMZ mendukungnya dengan sempurna.

pw1013Jika Anda ingin melakukan transaksi dengan orang lain di bursa okx, di mana Anda harus mengubah bibox futures yang saya gunakan sekarang?

Mimpi kecilJika Anda tidak bisa melakukan ini, Anda bisa mengubah kode.

Mimpi kecilDi sini, untuk mengevaluasi bursa ini, belum ada yang menghubungi kami dari bursa.