Strategi Perang Milenium III

Penulis:Rumput, Tanggal: 2020-09-09 13:45:11
Tag:HedgeBinance

Pada saat yang sama, beberapa orang mengatakan bahwa mereka tidak dapat mengidentifikasi strategi yang digunakan untuk menghemat uang.https://www.fmz.com/digest-topic/6102

Anda harus membaca manual ini, dan tidak dapat berjalan tanpa otak. Kode kebijakan hanya untuk referensi, modifikasi jika diperlukan, dan saran diterima.

Prinsip Strategi

Kontrak bitcoin lokal seperti BTC, ETH, dan lain-lain ada tiga kontrak secara bersamaan, yaitu BTCUSD_PERP, BTCUSD_200925 di kuartal ini, dan BTCUSD_201225 di kuartal berikutnya.

Kontrak permanen dapat dianggap sebagai barang tunai, umumnya dua kontrak melakukan hedging dengan total tiga diferensiasi: musim-permanen, musim-permanen, musim-permanen, musim-permanen. Swap kupu-kupu membutuhkan tiga kontrak untuk dioperasikan, dengan diferensiasi adalah ((season-permanen) - (season-permanen), yaitu diferensiasi = musim-permanen + musim-permanen-2*).

Parameter Strategi

  • Mata uang yang diperdagangkan: membutuhkan tiga varietas yang berkelanjutan, saat ini, dan di musim berikutnya.
  • Jumlah halaman di bawah: Jumlah halaman di bawah setiap grid.
  • Perbedaan harga: setiap kali Anda menyimpang dari satu harga, buat lebih banyak atau kosong satu.
  • Parameter perpindahan perbedaan Alpha: digunakan untuk menghitung rata-rata perbedaan, dapat digunakan secara default atau dapat diulang sendiri.
  • Jumlah pesanan Ice Mountain: Jika jumlah pesanan terbuka terlalu besar, untuk mengurangi fenomena satu kaki, Anda dapat mengatur jumlah pesanan terbuka minimum setiap kali, kekurangannya adalah harga jual tidak tepat waktu. Tidak perlu Ice Mountain untuk menugaskan parameter ini.

Jika garis rata-rata dari perbedaan adalah 100, perbedaan saat ini adalah 200, jumlah pesanan berikutnya adalah 2, dan perbedaan pembukaan grid adalah 30, maka saat ini kepemilikan adalah: 6 kosong musim berikutnya, 6 kosong permanen, 12 lebih banyak musim tersebut. Tidak jelas dapat melihat kode secara spesifik.

Perhatian

  • Rasio transaksi membutuhkan kepemilikan satu arah, yaitu memegang banyak ruang pada waktu yang berbeda.
  • Di sini, Anda dapat menemukan beberapa tips yang dapat membantu Anda.
  • Strategi ini bukan strategi operasi tanpa otak, uji dengan hati-hati jika Anda memahami prinsipnya.
  • Pembahasan artikel penelitian tidak akan terjadi secara real-time, tanpa perlu mengoptimalkan parameter terlalu banyak.
  • Robot tidak beroperasi untuk waktu yang lama, sehingga diperlukan robot baru untuk mencegah perbedaan harga yang terlalu besar.
  • Parameter perbedaan harga pembukaan grid harus mencakup biaya transaksi, misalnya biaya transaksi tunggal adalah $ 10.000, harga Bitcoin adalah $ 10.000, maka setidaknya harus lebih besar dari 8 * 10000 * 0.0002 = 16, ditambah dengan saldo tertentu, dapat diatur menjadi 25-30.
  • Perbedaan waktu yang semakin besar antara periode kedua - periode ini, periode ini - yang berkelanjutan, akhirnya mendekati periode yang berkelanjutan, perhitungan kupu-kupu sebenarnya adalah perhitungan antara periode kedua dan permanen, tidak dapat dijalankan, dan perlu dihentikan atau diamati 2 minggu sebelum pengiriman.
  • Dalam hal ini, jika Anda menggunakan IOC, Anda akan menerima bagian yang dapat ditransfer dengan harga yang disetujui (atau lebih baik) dan bagian yang tidak dapat ditransfer secara penuh akan dibatalkan.
  • Dengan sedikit modifikasi, strategi ini juga dapat diubah menjadi perbandingan antara musim ini dan permanen atau musim berikutnya dan permanen.
  • Strategi ini tidak sering membuka posisi, dan mungkin tidak membuka satu hari pun.
  • Robot baru saja mulai beroperasi dan mulai menghitung harga rata-rata, tanpa melakukan sejarah.
  • Strategi ini kemungkinan besar dapat dioptimalkan sendiri karena tidak ada kesepakatan yang terjadi.
  • Harga yang lebih rendah ditambah dengan harga yang lebih rendah, tidak banyak mempengaruhi jumlah posisi terbuka yang kecil, untuk jumlah posisi terbuka yang besar perlu dioptimalkan sendiri, seperti komisi gunung es.

if(IsVirtual()){
    throw '不能回测,回测参考研究文章 https://www.fmz.com/digest-topic/6102'
}
if(exchange.GetName() != 'Futures_Binance'){
    throw '只支持币安期货交易所,和现货交易所不同,需要单独添加,名称为Futures_Binance'
}
if(Grid == 0){
    throw '需要设置网格差价,需要覆盖8份手续费,可设置为当前价*fee*15'
}

exchange.SetBase("https://dapi.binance.com") //切换至交割合约

var exchange_info = HttpQuery('https://dapi.binance.com/dapi/v1/exchangeInfo')
if(!exchange_info){
    throw '无法连接币安网络,需要非公用海外托管者'
}
exchange_info = JSON.parse(exchange_info)
trade_info = {} //合约基础信息
trade_contract = {NEXT_QUARTER:'',CURRENT_QUARTER:'',PERPETUAL:''} //需要交易的合约代码
for (var i=0; i<exchange_info.symbols.length; i++){
   trade_info[exchange_info.symbols[i].symbol] =  exchange_info.symbols[i]
   if(exchange_info.symbols[i].baseAsset == Symbol && exchange_info.symbols[i].contractType in trade_contract && exchange_info.symbols[i].contractStatus == 'TRADING'){
       trade_contract[exchange_info.symbols[i].contractType] = exchange_info.symbols[i].symbol
   }
}
if(!(trade_contract.NEXT_QUARTER && trade_contract.CURRENT_QUARTER && trade_contract.PERPETUAL)){
    throw '无法找到蝶式对冲的三个合约'
}
var pricePrecision = trade_info[trade_contract.PERPETUAL].pricePrecision //价格精度

var ticker = {}
var account = {}
var position = {}

var diff_mean = null //差价均价
if(_G('diff_mean') && _G('symbol') == Symbol){ //防止切换币种,差价出错
    diff_mean = _G('diff_mean')
}else{
    _G('symbol',Symbol)
}

var diff_buy = 0 //做多的差价
var diff_sell = 0 //做空的差价
Trade_value = _N(Trade_value, 0)
 
var init_asset = 0 //初始资金
if(_G('init_asset')){
    init_asset = _G('init_asset')
}else{
    updateAccount()
    init_asset = parseFloat(account[Symbol].marginBalance)
    _G('init_asset', init_asset)
}
var update_status_time = 0
var update_account_time = Date.now()

function onexit(){
    _G('diff_mean', diff_mean)
}

function updateTicker(){
    var bookTicker =  HttpQuery('https://dapi.binance.com/dapi/v1/ticker/bookTicker')
    try {
        bookTicker = JSON.parse(bookTicker)
        for(var i=0;i<bookTicker.length;i++){
            ticker[bookTicker[i].symbol] = bookTicker[i]
        }
    } catch (e) {
        Log('无法获取行情')
    }
}

function updateAccount(){
    var acc = exchange.IO("api", "GET", "/dapi/v1/account", "timestamp="+Date.now())
    if(!acc){
        Log('无法获取账户')
        return
    }
    for(var i=0;i<acc.assets.length;i++){
        account[acc.assets[i].asset] = acc.assets[i]
    }
}

function updatePosition(){
    var pos = exchange.IO("api", "GET", "/dapi/v1/positionRisk", "timestamp="+Date.now())
    if(!pos){
        Log('无法获取仓位')
        return
    }
    for(var i=0;i<pos.length;i++){
        position[pos[i].symbol] = pos[i]
    }
}

function updateStatus(){
    if(Date.now() - update_status_time < 4000){
        return
    }
    update_status_time = Date.now()
    if(Date.now() - update_account_time >  5*60*1000){
        update_account_time = Date.now()
        updateAccount()
        LogProfit(_N(parseFloat(account[Symbol].marginBalance) - init_asset, 5))
    }
    
    $.PlotLine('buy', _N(diff_buy, pricePrecision))
    $.PlotLine('sell', _N(diff_sell, pricePrecision))
    $.PlotLine('mean', _N(diff_mean, pricePrecision+3))
    
    var table1 = {type: 'table', title: '账户信息', 
             cols: ['账户余额', '未实现盈亏', '保证金余额',  '可用余额', '维持保证金', '起始保证金', 'BNB', '初始余额', '收益', '平均差价', '做多差价', '做空差价', '下单量'],
             rows: [[_N(parseFloat(account[Symbol].walletBalance),5), _N(parseFloat(account[Symbol].unrealizedProfit),5), _N(parseFloat(account[Symbol].marginBalance),5), 
                     _N(parseFloat(account[Symbol].availableBalance),5),  _N(parseFloat(account[Symbol].maintMargin),5), _N(parseFloat(account[Symbol].initialMargin),5), 
                     _N(parseFloat(account.BNB.walletBalance),5), _N(init_asset,5),
                      _N(parseFloat(account[Symbol].marginBalance) - init_asset,5), _N(diff_mean, pricePrecision+1),
                     _N(diff_buy, pricePrecision),_N(diff_sell, pricePrecision), Trade_value
                    ]]}
    var table2 = {type: 'table', title: '对冲信息', 
             cols: ['合约', '持仓张数', 'Bid', 'Ask', '持仓价值', '杠杆', '开仓均价', '未实现盈亏'],
             rows: []}
    for(var contract in trade_contract){
        var symbol = trade_contract[contract]
        table2.rows.push([symbol, position[symbol].positionAmt, ticker[symbol].bidPrice, ticker[symbol].askPrice, 
                          parseInt(position[symbol].positionAmt)*parseInt(trade_info[symbol].contractSize), position[symbol].leverage,
                         position[symbol].entryPrice, position[symbol].unRealizedProfit])
    }
    var logString = _D()+'  策略代码最后更新时间9月29日\n'
    LogStatus(logString + '`' + JSON.stringify(table1) + '`'+'\n'+'`' + JSON.stringify(table2) + '`')
}

function trade(symbol, side, price, amount){
    //IOC下单,未成交部分会自动撤销
    exchange.Log(side == 'BUY' ? LOG_TYPE_BUY : LOG_TYPE_SELL, price, amount, ' buy: ' + _N(diff_buy, pricePrecision) + ' sell: '+ _N(diff_sell, pricePrecision) + ' mean: '+_N(diff_mean, pricePrecision+3))
    exchange.IO("api", "POST","/dapi/v1/order","symbol="+symbol+"&side="+side+"&type=LIMIT&timeInForce=IOC&quantity="+amount+"&price="+price+"&timestamp="+Date.now())
}


function onTicker(){
    
    //由于是吃单,需要分别计算做多和做空的差价
    diff_sell = parseFloat(ticker[trade_contract.NEXT_QUARTER].bidPrice) + parseFloat(ticker[trade_contract.PERPETUAL].bidPrice) -
                2*parseFloat(ticker[trade_contract.CURRENT_QUARTER].askPrice)
    diff_buy = parseFloat(ticker[trade_contract.NEXT_QUARTER].askPrice) + parseFloat(ticker[trade_contract.PERPETUAL].askPrice)  -
                2*parseFloat(ticker[trade_contract.CURRENT_QUARTER].bidPrice)

    
    if(!diff_mean){diff_mean = (diff_buy+diff_sell)/2}
    diff_mean = diff_mean*(1-Alpha) + Alpha*(diff_buy+diff_sell)/2 //差价均价的更新
    
    
    var aim_buy_amount = -Trade_value*(diff_buy - diff_mean)/Grid
    var aim_sell_amount = -Trade_value*(diff_sell - diff_mean)/Grid 
    
    if(aim_buy_amount - parseFloat(position[trade_contract.PERPETUAL].positionAmt) > Trade_value){ //做多差价,价格加了滑价
        trade(trade_contract.PERPETUAL, 'BUY', _N(parseFloat(ticker[trade_contract.PERPETUAL].askPrice)*1.01, pricePrecision), _N(Math.min(aim_buy_amount-parseFloat(position[trade_contract.PERPETUAL].positionAmt),Ice_value),0))
    }
    if(aim_buy_amount - parseFloat(position[trade_contract.NEXT_QUARTER].positionAmt) > Trade_value){
        trade(trade_contract.NEXT_QUARTER, 'BUY', _N(parseFloat(ticker[trade_contract.NEXT_QUARTER].askPrice)*1.01,pricePrecision), _N(Math.min(aim_buy_amount-parseFloat(position[trade_contract.NEXT_QUARTER].positionAmt),Ice_value),0))
    }
    if(-2*aim_buy_amount - parseFloat(position[trade_contract.CURRENT_QUARTER].positionAmt) < -2*Trade_value){
        trade(trade_contract.CURRENT_QUARTER, 'SELL', _N(parseFloat(ticker[trade_contract.CURRENT_QUARTER].bidPrice)*0.99,pricePrecision), _N(2*Math.min(aim_buy_amount+parseFloat(position[trade_contract.CURRENT_QUARTER].positionAmt),Ice_value),0))
    }
    
    if(aim_sell_amount - parseFloat(position[trade_contract.PERPETUAL].positionAmt) < -Trade_value){ //做空差价
        trade(trade_contract.PERPETUAL, 'SELL', _N(parseFloat(ticker[trade_contract.PERPETUAL].bidPrice)*0.99,pricePrecision), _N(Math.min(parseFloat(position[trade_contract.PERPETUAL].positionAmt)-aim_sell_amount,Ice_value),0))
    }
    if(aim_sell_amount - parseFloat(position[trade_contract.NEXT_QUARTER].positionAmt) < -Trade_value){
        trade(trade_contract.NEXT_QUARTER, 'SELL', _N(parseFloat(ticker[trade_contract.NEXT_QUARTER].bidPrice)*0.99,pricePrecision), _N(Math.min(parseFloat(position[trade_contract.NEXT_QUARTER].positionAmt)-aim_sell_amount,Ice_value),0))
    }
    if(-2*aim_sell_amount - parseFloat(position[trade_contract.CURRENT_QUARTER].positionAmt) > 2*Trade_value){
        trade(trade_contract.CURRENT_QUARTER, 'BUY', _N(parseFloat(ticker[trade_contract.CURRENT_QUARTER].askPrice)*1.01,pricePrecision), _N(-2*Math.min(aim_sell_amount-parseFloat(position[trade_contract.CURRENT_QUARTER].positionAmt),Ice_value),0))
    }
}

function main() {
    updateAccount()
    updatePosition()
    while(true){
        updateTicker()
        updatePosition()
        onTicker()
        updateStatus()
        Sleep(1*1000)
    }
}

Berkaitan

Lebih banyak

Ting bernyanyiApa yang menyebabkan Anda tidak dapat mengakses informasi akun?

Menarik tinggi dan melempar rendahJika kita menghitung harga jual beli, apakah kita bisa mengoptimalkannya, karena trade-value mungkin jauh lebih besar dari jual beli, dan kemudian menjadi biaya yang sebenarnya jauh lebih tinggi dari jual beli.

Brand_MovedMengapa diff_sell mengambil dua bidPrice-askPrice, sedangkan diff_buy adalah dua askPrice-bidPrice?

Musim gugur dan musim panasAku tidak tahu apa yang terjadi.

Tidak.Cangkir suci dari dewa rumput

gavin.abc"Siapa yang bisa membuatku seperti ini?"

jingfengzKekuatan Dewa Rumput