Sumber dimuat naik... memuat...

Strategi Hedging Multi-mata wang Binance yang Berkelanjutan (Indeks Mata Wang Binance) 10 April Diperbaiki Bug, perlu dikemas kini

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

Maklumat penting!

  • Kita perlu lihat kajian ini.https://www.fmz.com/digest-topic/5294◦ Mengenalpasti pelbagai isu seperti prinsip strategi, risiko, cara menyaring dagangan, cara menetapkan parameter, peratusan kedudukan dan jumlah modal;
  • Laporan kajian sebelumnya perlu dimuat turun dan dimuat naik ke persekitaran penyelidikan anda sendiri. Perubahan sebenar berjalan lagi. Jika anda telah membaca laporan ini, anda baru sahaja mengemas kini data minggu ini.
  • Strategi tidak boleh diuji semula secara langsung, ia perlu diuji semula dalam persekitaran penyelidikan.
  • Kod strategi dan parameter lalai adalah untuk kajian sahaja, operasi cakera sebenar memerlukan berhati-hati, dan parameter keputusan berdasarkan kajian anda sendiri.Mengambil risiko sendiri
  • Strategi tidak boleh menguntungkan setiap hari, melihat sejarah retrospektif, 1 - 2 minggu berpusing dan mundur adalah normal, dan kemungkinan retrospektif yang besar, perlu dirawat dengan betul
  • Kodnya terbuka, boleh diubah sendiri, jika ada masalah, maklum balas komen dialu-alukan, lebih baik bergabung dengan kumpulan pencipta Binance (masih ada cara untuk menyertai laporan kajian) untuk mendapatkan pemberitahuan kemas kini
  • Strategi ini perlu dijalankan dalam mod stok penuh, tidak menetapkan pegangan dua arah, strategi ini hanya menyokong niaga hadapan Binance, apabila membuat bot dengan pasangan perdagangan lalai dan kitaran K, strategi ini tidak digunakan untuk K line
  • Strategi dan strategi lain serta operasi manual bercanggah dan perlu diperhatikan.
  • Dalam tahap ujian, anda boleh menyewa pelayan Ali Cloud Hong Kong pada satu butang di platform, sewa sendiri lebih murah setiap bulan ((konfigurasi minimum sahaja, pelaksanaan tutorial:https://www.fmz.com/bbs-topic/2848 )
  • Futures dan spot untuk Binance perlu ditambahkan secara berasingan, dan Futures Binance adalahFutures_Binance

Prinsip-prinsip strategi

Strategi ini akan mengalihkan ekuivalen untuk menjadi satu simpanan simpanan keranjang yang dipilih secara percuma, sementara kedudukan ekuivalen untuk menjadi liputan bitcoin, mengurangkan risiko dan turun naik. Dengan turun naik harga, terus menyesuaikan kedudukan untuk mengekalkan nilai ekuivalen tetap dan kedudukan ekuivalen berbilang.Pada asasnya, indeks harga Bitcoin adalah indeks mata wang palsu.◎ Performa dalam dua bulan kebelakangan ini (Leverage kira-kira 3 kali ganda, data dikemas kini kepada 4.8), Bitcoin telah meningkat berbanding Bitcoin dalam minggu kebelakangan ini, oleh itu kerugian, jika anda melihat lebih banyak Bitcoin, anda boleh menetapkan untuk membuat Bitcoin menjadi lebih banyak Bitcoin dalam parameter:

Strategi lalai adalah melakukan banyak bitcoin untuk membuat kripto, anda juga boleh sebaliknya (jika anda fikir kripto berada di bahagian bawah) dan membuat keputusan sendiri.

img

Logik Strategi

1. Mengemas kini saham dan akaun simpanan 2. Mengemas kini nilai pegangan kosong setiap syiling untuk menentukan sama ada pegangan kosong perlu disesuaikan 3. Mengemas kini kedudukan kosong keseluruhan, menentukan pegangan berbilang dan menentukan sama ada kedudukan berbilang perlu disesuaikan 4. Memesan, jumlah pesanan yang akan datang akan ditentukan oleh Ice Mountain, mengikut harga transaksi (membeli dan menjual satu harga).Perintah ini akan ditarik balik dengan segera selepas pesanan di bawah. Jadi anda akan melihat banyak fail 400: {code:-2011,msg:Unknown order sent.}, normal 5.再次循环

Untuk menentukan nilai perdagangan yang lebih tinggi, nilai permulaan setiap mata wang yang lebih tinggi adalah nilai perdagangan, dan nilai kontrak setiap mata wang yang lebih rendah adalah purata nilai yang diperlukan untuk lindung nilai.

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

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

Leverage dalam status yang diletakkan di atas adalah untuk menunjukkan bahawa mata wang jaminan telah digunakan secara perbandingan dan tidak boleh terlalu tinggi.

Parameter strategi

img

  • Short_symbols: Mata wang kosong, dipisahkan dengan tanda, tanda
  • Long_symbols: Buat lebih banyak mata wang, juga boleh kosong, tidak berhad, kosong langsung.
  • Trade_value: Nilai simpanan mata wang tunggal. Juga perlu melakukan banyak lindung nilai, jumlah nilai = 2 * Trade_value * jumlah mata wang simpanan. Biasanya menggunakan leverage 3-5 kali ganda, iaitu jumlah nilai = 3 * baki akaun.
  • Adjust_value: Nilai kontrak (USDT) penyesuaian nilai penyimpangan, penyesuaian yang terlalu lama, bayaran prosedur yang terlalu rendah, berdasarkan keputusan Trade_value sendiri. Tidak boleh di bawah 20, jika tidak, anda tidak akan mencapai transaksi minimum
  • Ice_value: Nilai yang diamanahkan gunung ais, juga tidak boleh kurang daripada 20, sebenarnya pilih Adjust_value dan yang lebih kecil daripada Ice_value

Risiko Strategik

Apabila harga mata wang kosong meningkat, nilai kontrak meningkat, pada masa ini adalah penurunan, sebaliknya keuntungan adalah kenaikan. Ini menjadikan nilai kontrak keseluruhan tetap stabil. Mata wang simpanan sangat mungkin keluar dari pasaran bebas, pada masa ini dari satu tahun, mata wang simpanan mungkin berada di bahagian bawah, dan mungkin meningkat dari bahagian 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 lanjut

Oh, Tuhan.Adakah harga terhad di bawah harga biasa atau harga pasaran?

wfwfaf1UpdateAccount (() diperlukan if ((pair.slice ((pair.length-4, pair.length) == "USDT") Oleh kerana terdapat kontrak busd, perlu menentukan sama ada kedudukan kontrak sasaran atau tidak apabila mengemas kini maklumat simpanan. Jika tidak, banyak maklumat kedudukan akan menjadi bercampur-campur, menyebabkan pembayaran tanpa had.