Binance Sustainable Multicurrency Hedging Strategy (menggunakan atau tidak menggunakan multi-currency index) 10 April Perbaikan Bug, perlu diperbarui

Penulis:Rumput, Tanggal: 2020-04-03 11:12:31
Tag:Binance

Artikel penting!

  • Anda harus melihat penelitian ini.https://www.fmz.com/digest-topic/5294◦ Mengetahui berbagai hal seperti prinsip-prinsip strategi, risiko, cara menyaring perdagangan, cara mengatur parameter, rasio posisi awal dan total modal, dan lain sebagainya.
  • Laporan penelitian sebelumnya harus diunduh dan diunggah ke lingkungan penelitian Anda sendiri. Modifikasi sebenarnya berjalan lagi. Jika Anda telah membaca laporan ini, Anda baru saja memperbarui data minggu terbaru.
  • Strategi tidak dapat diuji secara langsung, tetapi harus diuji dalam lingkungan penelitian.
  • Kode strategi dan parameter default hanya untuk penelitian, dan operasi disk harus dilakukan dengan hati-hati.Mengambil Risiko
  • Strategi tidak mungkin menguntungkan setiap hari, melihat sejarah retrospektif, 1 - 2 minggu di atas dan mundur normal, dan kemungkinan retrospektif besar, perlu diperlakukan dengan benar
  • Kode adalah terbuka dan dapat dimodifikasi sendiri, jika ada masalah, silakan komentar dan umpan balik, Anda sebaiknya bergabung dengan komunitas penemu Binance (masih ada cara untuk bergabung dalam laporan penelitian) untuk mendapatkan pemberitahuan terbaru.
  • Strategi ini harus berjalan dalam mode saham penuh, tidak mengatur kepemilikan dua arah, strategi ini hanya mendukung masa depan Binance, ketika membuat robot dengan pasangan perdagangan default dan siklus K line, strategi ini tidak digunakan untuk K line.
  • Strategi dan strategi lain serta operasi manual saling bertentangan dan perlu diperhatikan.
  • Pada tahap uji coba, Anda dapat menyewa server Ali Cloud Hong Kong di platform dengan satu tombol, dan menyewa seluruhnya lebih murah per bulan ((konfigurasi minimal saja, deploy tutorial:https://www.fmz.com/bbs-topic/2848 )
  • Fitur-fitur futures dan spot akan ditambahkan secara terpisah.Futures_Binance

Prinsip Strategi

Strategi yang digunakan adalah melakukan diversifikasi ekuivalen untuk menghemat satu keranjang koin, sementara posisi ekuivalen untuk menghemat lebih dari satu bitcoin, mengurangi risiko dan volatilitas. Dengan adanya fluktuasi harga, posisi ekuivalen terus disesuaikan untuk menjaga nilai ekuivalen tetap konstan dan posisi ekuivalen multi-kuivalen.Pada dasarnya, Bitcoin adalah indeks harga yang dibuat dari koin palsu.Performa dalam dua bulan terakhir (leverage sekitar 3 kali lipat, data diperbarui menjadi 4.8) Bitcoin meningkat dibandingkan Bitcoin dalam seminggu terakhir, sehingga kerugian, jika Anda melihat lebih banyak koin, Anda dapat mengatur untuk melakukan Bitcoin menjadi lebih banyak koin di parameter:

Strategi default adalah melakukan banyak bitcoin untuk membuat koin palsu, Anda juga dapat melakukan sebaliknya (jika Anda berpikir bahwa koin palsu berada di bagian bawah) dan membuat keputusan sendiri.

img

Logika strategis

1. Pembaruan pasar dan pemegang akun 2. memperbarui nilai saham kosong masing-masing koin untuk menentukan apakah saham kosong perlu disesuaikan 3. memperbarui posisi kosong total, menentukan kepemilikan multi-posisi, dan memutuskan apakah multi-posisi harus disesuaikan 4. Pesan, jumlah pesanan berikutnya ditentukan oleh Ice Mountain, sesuai dengan harga transaksi (membeli dengan menjual harga).Setelah mengirim pesanan, segera membatalkan (jadi Anda akan melihat banyak gagal membatalkan pesanan 400: {code:-2011,msg:Unknown order sent.}, normal) 5.再次循环

Short_symbols, Long_symbols, dan trading pair yang lebih banyak, dengan nilai awal setiap mata uang yang lebih banyak adalah Trade_value, dengan nilai kontrak setiap mata uang yang lebih sedikit adalah rata-rata nilai yang dibutuhkan untuk melakukan hedging.

Jika hanya kosong BTC, lebih TRX, DASH, ONT, QTUM, dan Trade_value adalah 50, maka TRX, DASH, ONT, QTUM memiliki banyak posisi 50, dan BTC memegang posisi kosong 50 * 4.

Jika hanya ada BTC, TRX kosong, DASH, ONT, QTUM, dan Trade_value adalah 50, maka TRX, DASH, ONT, dan QTUM masing-masing memiliki 50 posisi kosong, dan BTC memiliki lebih dari 50 posisi * 4.

Leverage dalam status tab menunjukkan bahwa nilai jaminan telah digunakan secara proporsional dan tidak terlalu tinggi.

Parameter Strategi

img

  • Short_symbols: Koin kosong, dipisahkan dengan tanda dan tanda
  • Long_symbols: Buat lebih banyak mata uang, juga bisa kosong, tidak di-hedge, langsung kosong.
  • Trade_value: nilai yang dimiliki oleh mata uang tunggal. Juga harus melakukan banyak hedging, nilai total = 2 * Nilai perdagangan * jumlah mata uang kosong. Umumnya menggunakan leverage 3-5 kali lipat, yaitu nilai total = 3 * saldo akun.
  • Adjust_value: Nilai kontrak (USDT) nilai penyesuaian deviasi, terlalu banyak penyesuaian lambat, terlalu sedikit biaya prosedur terlalu tinggi, sesuai dengan keputusan Trade_value sendiri; tidak dapat di bawah 20, atau tidak akan mencapai transaksi minimum
  • Ice_value: nilai yang diutus gunung es, juga tidak dapat kurang dari 20, maka pilih Adjust_value dan yang lebih kecil dari Ice_value

Risiko Strategis

Ketika harga koin kosong naik, nilai kontrak meningkat, saat ini diperdagangkan, sebaliknya keuntungan diperdagangkan. Hal ini membuat nilai kontrak keseluruhan tetap konstan. Koin sandal sangat mungkin keluar dari pasar independen, saat ini dari siklus setahun, koin sandal mungkin berada di bagian bawah, dan mungkin naik dari bagian bawah.


if(IsVirtual()){
    throw '不能回测,回测参考 https://www.fmz.com/digest-topic/5294 '
}
if(exchange.GetName() != 'Futures_Binance'){
    throw '只支持币安期货交易所,和现货交易所不同,需要单独添加,名称为Futures_Binance'
}

var short_symbols = Short_symbols.split(',')
var long_symbols = Long_symbols.split(',')

if(short_symbols.length == 1 && short_symbols[0] == ''){
    short_symbols = []
}
if(long_symbols.length == 1 && long_symbols[0] == ''){
    long_symbols = []
}
var symbols = []
for(var i=0; i<short_symbols.length; i++){
    if(short_symbols[i]){
        symbols.push(short_symbols[i])
    }
}
for(var i=0; i<long_symbols.length; i++){
    if(long_symbols[i]){
        symbols.push(long_symbols[i])
    }
}
var update_profit_time = 0
var assets = {}
var trade_info = {}
var exchange_info = HttpQuery('https://fapi.binance.com/fapi/v1/exchangeInfo')
if(!exchange_info){
    throw '无法连接币安网络,需要海外托管者'
}
exchange_info = JSON.parse(exchange_info)
for (var i=0; i<exchange_info.symbols.length; i++){
    if(symbols.indexOf(exchange_info.symbols[i].baseAsset) > -1){
       assets[exchange_info.symbols[i].baseAsset] = {amount:0, hold_price:0, value:0, bid_price:0, ask_price:0, realised_profit:0, margin:0, unrealised_profit:0}
       trade_info[exchange_info.symbols[i].baseAsset] = {minQty:parseFloat(exchange_info.symbols[i].filters[1].minQty),
                                                         priceSize:parseInt((Math.log10(1.1/parseFloat(exchange_info.symbols[i].filters[0].tickSize)))),
                                                         amountSize:parseInt((Math.log10(1.1/parseFloat(exchange_info.symbols[i].filters[1].stepSize))))
                                                        }
    }
}
assets.USDT = {unrealised_profit:0, margin:0, margin_balance:0, total_balance:0, leverage:0}


function updateAccount(){
    var account = exchange.GetAccount()
    var pos = exchange.GetPosition()
    if (account == null || pos == null ){
        Log('update account time out')
        return
    }
    assets.USDT.update_time = Date.now()
    for(var i=0; i<symbols.length; i++){
        assets[symbols[i]].margin = 0
        assets[symbols[i]].unrealised_profit = 0
        assets[symbols[i]].hold_price = 0
        assets[symbols[i]].amount = 0
        assets[symbols[i]].unrealised_profit = 0
    }
    for(var j=0; j<account.Info.positions.length; j++){
        if(account.Info.positions[j].positionSide == 'BOTH'){
            var pair = account.Info.positions[j].symbol 
            var coin = pair.slice(0,pair.length-4)
            if(symbols.indexOf(coin) < 0){continue}
            assets[coin].margin = parseFloat(account.Info.positions[j].initialMargin) + parseFloat(account.Info.positions[j].maintMargin)
            assets[coin].unrealised_profit = parseFloat(account.Info.positions[j].unrealizedProfit)
        }
    }
    assets.USDT.margin = _N(parseFloat(account.Info.totalInitialMargin) + parseFloat(account.Info.totalMaintMargin),2)
    assets.USDT.margin_balance = _N(parseFloat(account.Info.totalMarginBalance),2)
    assets.USDT.total_balance = _N(parseFloat(account.Info.totalWalletBalance),2)
    assets.USDT.unrealised_profit = _N(parseFloat(account.Info.totalUnrealizedProfit),2)
    assets.USDT.leverage = _N(assets.USDT.margin/assets.USDT.total_balance,2)
    pos = JSON.parse(exchange.GetRawJSON())
    if(pos.length > 0){
        for(var k=0; k<pos.length; k++){
            var pair = pos[k].symbol
            var coin = pair.slice(0,pair.length-4)
            if(symbols.indexOf(coin) < 0){continue}
            assets[coin].hold_price = parseFloat(pos[k].entryPrice)
            assets[coin].amount = parseFloat(pos[k].positionAmt)
            assets[coin].unrealised_profit = parseFloat(pos[k].unRealizedProfit)
        }
    }
}

function updateTick(){
    var ticker = HttpQuery('https://fapi.binance.com/fapi/v1/ticker/bookTicker')
    if(ticker == null){
        Log('get ticker time out')
        return
    }
    ticker = JSON.parse(ticker)
    for(var i=0; i<ticker.length; i++){
        var pair = ticker[i].symbol 
        var coin = pair.slice(0,pair.length-4)
        if(symbols.indexOf(coin) < 0){continue}
        assets[coin].ask_price = parseFloat(ticker[i].askPrice)
        assets[coin].bid_price = parseFloat(ticker[i].bidPrice)
        assets[coin].ask_value = _N(assets[coin].amount*assets[coin].ask_price, 2)
        assets[coin].bid_value = _N(assets[coin].amount*assets[coin].bid_price, 2)
    }
}

function trade(symbol, dirction, value){
    if(Date.now()-assets.USDT.update_time > 10*1000){
        Log('更新账户延时,不交易')
        return
    }
    var price = dirction == 'sell' ? assets[symbol].bid_price : assets[symbol].ask_price
    var amount = _N(Math.min(value,Ice_value)/price, trade_info[symbol].amountSize)
    if(amount < trade_info[symbol].minQty){
        Log(symbol, '合约调整偏离价值或冰山委托订单设置过小,达不到最小成交, 至少需要: ', _N(trade_info[symbol].minQty*price,0))
        return
    }
    exchange.IO("currency", symbol+'_'+'USDT')
    exchange.SetContractType('swap')
    exchange.SetDirection(dirction)
    var f = dirction == 'buy' ? 'Buy' : 'Sell'
    var id = exchange[f](price, amount, symbol)
    if(id){
        exchange.CancelOrder(id) //订单会立即撤销
    }
}



function updateStatus(){
        var table = {type: 'table', title: '交易对信息', 
             cols: ['币种', '数量', '持仓价格', '当前价格', '持仓价值', '保证金', '未实现盈亏'],
             rows: []}
    for (var i=0; i<symbols.length; i++){
        var price = _N((assets[symbols[i]].ask_price + assets[symbols[i]].bid_price)/2, trade_info[symbols[i]].priceSize)
        var value = _N((assets[symbols[i]].ask_value + assets[symbols[i]].bid_value)/2, 2)
        var infoList = [symbols[i], assets[symbols[i]].amount, assets[symbols[i]].hold_price, price, value,_N(assets[symbols[i]].margin,3), _N(assets[symbols[i]].unrealised_profit,3)]
        table.rows.push(infoList)
    }
    var logString = _D() + '  ' + JSON.stringify(assets.USDT) + '\n'
    LogStatus(logString + '`' + JSON.stringify(table) + '`')
    
    if(Date.now()-update_profit_time > Log_profit_interval*1000){
        LogProfit(_N(assets.USDT.margin_balance,3))
        update_profit_time = Date.now()
    }
    
}

function onTick(){
    var short_value = Trade_value
    if(short_symbols.length<long_symbols.length){
        short_value = _N(long_symbols.length*Trade_value/short_symbols.length,0)
    }
    var long_value = Trade_value
    if(short_symbols.length>long_symbols.length){
        long_value = _N(short_symbols.length*Trade_value/long_symbols.length,0)
    }
    var symbol = ''
    for(var i=0; i<short_symbols.length; i++){
        symbol = short_symbols[i]
        if(assets[symbol].ask_price == 0){ continue }
        if(assets[symbol].bid_value + short_value > Adjust_value){
            trade(symbol, 'sell', assets[symbol].bid_value + short_value)
        }
        if(assets[symbol].ask_value + short_value < -Adjust_value){
            trade(symbol, 'buy', -(assets[symbol].ask_value + short_value))
        }
    }
    for(var i=0; i<long_symbols.length; i++){
        symbol = long_symbols[i]
        if(assets[symbol].ask_price == 0){ continue }
        if(assets[symbol].bid_value - long_value > Adjust_value){
            trade(symbol, 'sell', assets[symbol].bid_value-long_value)
        }
        if(assets[symbol].ask_value - long_value < -Adjust_value){
            trade(symbol, 'buy', long_value-assets[symbol].ask_value)
        }
    }   
}

function main() {
    while(true){
        updateAccount()
        updateTick()
        onTick()
        updateStatus()
        Sleep(Interval*1000)
    }
}

Berkaitan

Lebih banyak

Tidak.Apakah harga terbatas di bawah harga biasa atau harga pasar?

Wfwfaf1updateAccount (() diperlukan if ((pair.slice ((pair.length-4, pair.length) == "USDT") Karena ada kontrak busd, ketika memperbarui informasi kepemilikan, perlu menentukan apakah posisi kontrak yang ditargetkan. Jika tidak, banyak informasi posisi akan terganggu, yang akan menyebabkan pembukaan tanpa batas.