Strategi Binance 2: Hapus Nilai Tinggi dan Rendah

Penulis:Kuantiti kelas, Tarikh: 2020-04-09 21:44:22
Tag:Binance

Terima kasih kepada FMZ untuk strategi terbuka, terima kasih kepada pengawal untuk sokongan! Beliau sendiri membuat dua perubahan: 1, kerana ramai rakan secara lalai adalah 10 kali 20 kali levera, dan strategi ini adalah mod penuh, satu wang yang besar, akan dihapuskan. Oleh itu, tambah jumlah Max_amount, jumlah pembelian mata wang tunggal tidak melebihi jumlah ini, mencegah pertumbuhan. 2. Jika terdapat mata wang yang sangat tinggi dan sangat rendah, contohnya mata wang yang unik, mudah untuk menarik semua orang ke bawah air, dan strategi keseluruhan mudah gagal. Oleh itu, saya mengeluarkan skor tertinggi ketika mengira indeks, mengeluarkan skor terendah, dan hasil indeks lebih adil. Pada masa yang sama, ia juga boleh digunakan sebagai mata wang asing untuk membeli barang-barang asing. Nota: Kerana keadaan terhad, dasar ini tidak diuji semula, hanya untuk rujukan, dan tidak bertanggungjawab jika ada kerugian!

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 dasar dan parameter lalai adalah untuk kajian sahaja, operasi pada cakera sebenar memerlukan berhati-hati dan risiko anda sendiri.
  • Kodnya terbuka, boleh diubah sendiri, jika ada masalah, maklum balas komen dialu-alukan, lebih baik bergabung dengan kumpulan pencipta Binance (dalam laporan kajian terdapat kaedah untuk menyertai)
  • Strategi ini perlu dijalankan dalam mod penuh, tetapi ia tidak boleh digunakan untuk semua jenis produk.Strategi menyokong Binance, membuat bot dengan pasangan perdagangan lalai dan kitaran K, strategi tidak menggunakan K-line

Prinsip-prinsip strategi

Ia akan membuat harga kosong lebih tinggi daripada indeks harga Bitcoin-Coincoin, lebih rendah daripada indeks, lebih besar penyimpangan, lebih besar kedudukan.img

Logik Strategi

1. Mengemas kini pasaran dan akaun simpanan, yang pertama kali dijalankan akan merakam harga awal (mata wang yang baru ditambahkan dikira mengikut masa ditambahkan) 2. mengemas kini indeks, indeks adalah indeks harga Bitcoin = mean ((sum)))) harga Bitcoin / harga Bitcoin) / harga awal Bitcoin) 3. Mengira lebih banyak pekerjaan kosong berdasarkan indeks penyimpangan, menentukan kedudukan berdasarkan saiz penyimpangan 4. Memesan, jumlah pesanan yang akan datang akan ditentukan oleh Ice Mountain, mengikut harga transaksi (membeli dan menjual satu harga).Apabila anda membuat pesanan, anda akan segera membatalkannya (jadi anda akan melihat banyak pesanan yang gagal dibatalkan, normal) 5.再次循环

Parameter strategi

img

  • Trade_symbols: Mata wang yang diperdagangkan, perlu disaring sendiri berdasarkan platform penyelidikan, juga boleh bergabung dengan BTC
  • Trade_value: Bitcoin tidak mempunyai nilai, perlu dibuat keputusan berdasarkan jumlah modal yang mereka masukkan, dan ukuran levera boleh dilihat melalui ujian semula persekitaran penyelidikan
  • Adjust_value: Nilai kontrak (USDT) Nilai penyesuaian penyimpangan, penyesuaian yang terlalu lama, tidak boleh di bawah 20, jika tidak, transaksi minimum tidak akan dicapai
  • Ice_value: Nilai yang diamanahkan gunung ais, juga tidak boleh kurang daripada 20, pilih yang lebih kecil daripada Adjust_value/Ice_value
  • Reset: Set semula data sejarah

Risiko Strategik

Perhatikan bahawa jika mata wang keluar dari pasaran bebas, seperti naik beberapa kali berbanding indeks, maka banyak kedudukan kosong akan terkumpul pada mata wang itu, dan penurunan yang sama juga akan membuat strategi banyak dilakukan.


//向上偏离最大的币的索引
var highIndex=0;
//向下偏离最大的币的索引
var lowIndex=0;

var trade_symbols = Trade_symbols.split(',')
var symbols = trade_symbols
var index = 1 //指数
if(trade_symbols.indexOf('BTC')<0){
    symbols = trade_symbols.concat(['BTC'])
}
var update_profit_time = 0
var assets = {}
var trade_info = {}
var exchange_info = HttpQuery('https://fapi.binance.com/fapi/v1/exchangeInfo')
if(!exchange_info){
    Log('无法连接网络')
    return
}
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, 
                                                     btc_price:0, btc_change:1,btc_diff: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, update_time: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<trade_symbols.length; i++){
        assets[trade_symbols[i]].margin = 0
        assets[trade_symbols[i]].unrealised_profit = 0
        assets[trade_symbols[i]].hold_price = 0
        assets[trade_symbols[i]].amount = 0
        assets[trade_symbols[i]].unrealised_profit = 0
    } 
    for(var j=0; j<account.Info.positions.length; j++){
        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)
    
    if(pos.length > 0){
        pos = JSON.parse(exchange.GetRawJSON())
        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 updateIndex(){ //更新指数
    var init_prices = {}
    if(!_G('init_prices') || Reset){
        for(var i=0; i<trade_symbols.length; i++){
            init_prices[trade_symbols[i]] = (assets[trade_symbols[i]].ask_price+assets[trade_symbols[i]].bid_price)/(assets.BTC.ask_price+assets.BTC.bid_price)
        }
        Log('保存启动时的价格')
        _G('init_prices',init_prices)
    }else{
        init_prices = _G('init_prices')
        var temp = 0
        
        highIndex=0;
        lowIndex=0;
        var highChange;var lowChange;
        //本次计算找出最大偏离的高低分
        for(var i=0; i<trade_symbols.length; i++){
            assets[trade_symbols[i]].btc_price =  (assets[trade_symbols[i]].ask_price+assets[trade_symbols[i]].bid_price)/(assets.BTC.ask_price+assets.BTC.bid_price)
            if(!init_prices[trade_symbols[i]]){
                Log('添加新的币种',trade_symbols[i])
                init_prices[trade_symbols[i]] = assets[trade_symbols[i]].btc_price 
                _G('init_prices',init_prices)
            }
            assets[trade_symbols[i]].btc_change = _N(assets[trade_symbols[i]].btc_price/init_prices[trade_symbols[i]],4)
            if(i==0){
                highChange=assets[trade_symbols[i]].btc_change;
                lowChange=assets[trade_symbols[i]].btc_change;
            }
            
            if(highChange<assets[trade_symbols[i]].btc_change){
                highChange=assets[trade_symbols[i]].btc_change;
                highIndex=i;
            }
            if(lowChange>assets[trade_symbols[i]].btc_change){
                lowChange=assets[trade_symbols[i]].btc_change;
                lowIndex=i;
            }
        }
        
        for(var i=0; i<trade_symbols.length; i++){
            assets[trade_symbols[i]].btc_price =  (assets[trade_symbols[i]].ask_price+assets[trade_symbols[i]].bid_price)/(assets.BTC.ask_price+assets.BTC.bid_price)
            assets[trade_symbols[i]].btc_change = _N(assets[trade_symbols[i]].btc_price/init_prices[trade_symbols[i]],4)
            if(i!=lowIndex&&i!=highIndex){ //去掉高低分的影响
                temp += assets[trade_symbols[i]].btc_change
            }
        }
        //因为去掉了最高最低分,所以减2
        index = _N(temp/(trade_symbols.length-2), 4)
    }
    
}

function updateTick(){ //更新行情
    var ticker = HttpQuery('https://fapi.binance.com/fapi/v1/ticker/bookTicker')
    try {
        ticker = JSON.parse(ticker)
    }catch(e){
        Log('get ticker time out')
        return
    }
    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)
    }
    updateIndex()
    for(var i=0; i<trade_symbols.length; i++){
        assets[trade_symbols[i]].btc_diff = _N(assets[trade_symbols[i]].btc_change - index, 4)
    }
}

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: ['Symbol', 'amount', 'hold_price',  'price', 'diff', 'value', 'margin', 'unrealised_profit'],
             rows: []}
        var infoList;
    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)
        if(i==lowIndex){
           infoList = [symbols[i]+"Low", assets[symbols[i]].amount, assets[symbols[i]].hold_price, price, assets[symbols[i]].btc_diff, value, _N(assets[symbols[i]].margin,3), _N(assets[symbols[i]].unrealised_profit,3)]    
        }else if(i==highIndex){
           infoList = [symbols[i]+"High", assets[symbols[i]].amount, assets[symbols[i]].hold_price, price, assets[symbols[i]].btc_diff, value, _N(assets[symbols[i]].margin,3), _N(assets[symbols[i]].unrealised_profit,3)]
        }else{
           infoList = [symbols[i], assets[symbols[i]].amount, assets[symbols[i]].hold_price, price, assets[symbols[i]].btc_diff, 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) + ' Index:' + index + '\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(){ //策略逻辑部分
    for(var i=0; i<trade_symbols.length; i++){
        var symbol = trade_symbols[i]
        if(assets[symbol].ask_price == 0){ continue }
        var aim_value = -Trade_value * _N(assets[symbol].btc_diff/0.01,1)
        
        if(i!=lowIndex&&i!=highIndex){ //高低分的货币不交易
           if(aim_value - assets[symbol].ask_value > Adjust_value&&assets[symbol].ask_value<Max_amount){
              trade(symbol,'buy', aim_value - assets[symbol].ask_value)
           }
           if(aim_value - assets[symbol].bid_value < -Adjust_value&&assets[symbol].bid_value<Max_amount){
              trade(symbol,'sell', -(aim_value - assets[symbol].bid_value))
           }
        }
    }
}

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

Berkaitan

Lebih lanjut

qq813380629Adakah anda tahu berapa banyak dana yang boleh digunakan untuk mendapatkan leverage ini?

Kuantiti kelasadalah nilai terbesar yang dimiliki oleh mata wang tunggal

Awan ringanHai, boleh saya tanya soalan? Max_amount Ini bermaksud nilai pegangan maksimum untuk setiap pasangan dagangan atau jumlah jaminan maksimum? Terima kasih.