資源の読み込みに... 荷物...

ビンアンの永続多通貨ヘッジ戦略 (無効または多コインインデックス) 4月10日 バグを改良し,更新する必要があります

作者: リン・ハーン小草, 2020年4月3日11時12分31秒
タグ:バイナンス

重要な内容!!

  • この研究をご覧下さいhttps://www.fmz.com/digest-topic/5294・戦略原理,リスク,取引のフィルタリング方法,パラメータ設定方法,開場率,総資金の割合などについて理解する.
  • 前回の研究報告はダウンロードして自分の研究環境にアップロードする必要があります. 実際の変更は実行されます. このレポートを読んでいたら,最近最新の週間のデータを更新します.
  • 戦略は直接復習できません 研究環境で復習する必要があります
  • 策略コードやデフォルトパラメータは研究のみで,実装台操作は慎重で,自分の研究に基づいてパラメータを決定する必要があります.リスクを負う
  • 戦略は,毎日利益を得ることは不可能で,過去1〜2週間の反転と反転は正常であり,大きな反転の可能性があり,正しく処理する必要があります.
  • コードが公開され,自分で変更することができます. 問題があれば,コメントフィードバックを歓迎します. 発明者 バイアン 交流グループに参加してください (研究報告には加入方法があります). 更新通知を受けることができます.
  • 戦略は全株モードで動作し,双方向保有を設定しない必要がある.戦略は,金安先物のみをサポートし,ロボットを作成するときにデフォルト取引ペアとK線周期を使用しても,戦略はK線を使用していない.
  • 戦略と他の戦略と手動は対立し,注意が必要です.
  • リアルディスクの運用には海外のホストが必要で,テスト段階では,プラットフォームの1つのボタンを押してアリ雲香港サーバーをレンタルすることができ,月額でレンタが安くなります.https://www.fmz.com/bbs-topic/2848 )
  • 貨幣の先物と現貨は別々に追加する必要があります.Futures_Binance

戦略の原理

戦略は,分散等価を空き選択された1つのバスケットのコインとして,同時等価を多ビットコインのヘッジとして,リスクと波動率を減らす.価格の波動とともに,空き先の価値を恒定に保つために,常にポジションを調整し,多頭先のポジションを対等にします.基本的には,空虚のコイン-ビットコイン価格指数過去2ヶ月の業績 (レバレッジは3倍左右で,データは4.8に更新) 過去1週間,ビットコインに対してコインは上昇し,損失を出した.

デフォルトの戦略は,多ビットコインを空虚のコピーを行うこと,また逆の方法 (もしあなたがコピーを底辺にあると思うなら),決定権はあなた自身のものです.

img

戦略的論理

1. 市場と口座保持を更新する 2. 各コインの空頭保有額を更新し,空頭保有額を調整する必要があるかどうかを判断する. 3.総空頭ポジションを更新し,多頭保有を決定し,多頭ポジションを調整するかどうかを判断する 4. 注文の開始,注文量については,アイス山の委託により決定され,対価取引 (購入・販売価格) に基づく.削除された場合は, 400: {code:-2011,msg:Unknown order sent.} のように,多くの削除が失敗したセルが表示されます. 5.再次循环

Short_symbols,Long_symbolsは,取引対数が多く,より多くの各通貨の開場価値がTrade_valueであり,少ない各通貨の契約価値がヘッジ値を必要とする平均である.

TRX,DASH,ONT,QTUM,Trade_valueが50である場合,TRX,DASH,ONT,QTUMが50の空きポジションを持ち,BTCは50*4の空きポジションを持っている.

もしBTCが多く,空きTRX,DASH,ONT,QTUM,Trade_valueが50なら,TRX,DASH,ONT,QTUMは空き50を持ち,BTCは多き50*4を持ちます.

ステータス・バッグのレバレッジは,担保金に比例して使用されていることを表しています.

戦略パラメータ

img

  • Short_symbols:空白のコイン,,で区切られている
  • Long_symbols: 多額のコイン,空白,ヘッジなし,直接空白もできます.
  • Trade_value: 単一の通貨が空持する価値である.また,複数のヘッジを行う必要があります.総価値=2*Trade_value*空持するコインの数である.一般的に3-5倍のレバレッジを使用します.総価値=3*口座残高である.
  • Adjust_value: 契約値 (USDT料金) 調整偏差値,調整が遅すぎ,手数料が低すぎ,Trade_valueの自主決定による. 20以下にはなれない,そうでなければ最小取引に達しない.
  • Ice_value: アイスマンの委託値,同じく20以下にはならない.実際に選択すると,Adjust_value と Ice_value のうち小さいものを選択します.

戦略的リスク

空きコインの価格が上昇すると,契約価値が上昇し,このときは低価格で,逆に利潤は高価格である.これは総契約価値を恒定に保ちます. シェルターコインは独立した市場から脱出する可能性が高い. 現在,1年間のサイクルから見ると,シェルターコインは底部にあり,底部から上昇する可能性が高い. これは,どのように使用されるかによって,あなたがシェルターコインを好み,底部に達したと考えれば,方向は操作され,複数の指数を行うことができます. または,あなたが特定のコインを好み (必ずしもトークンよりも),それらをヘッジすることができます.


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)
    }
}

関連性

もっと

ほら価格制限は平価か市場価格か?

Wfwfaf1updateAccount ((() に必要とする if ((pair.slice ((pair.length-4,pair.length) == "USDT" busd 契約があるため,保有情報を更新する際に,ターゲット契約のポジションかどうかを判断する必要がある. 複数のポジションの情報が混乱し,無限の開示につながる.