리소스 로딩... 로딩...

비안 지속가능한 다화폐 헤지핑 전략 (무효 또는 다화폐 지수) 4월 10일 개선 버그, 업데이트가 필요합니다.

저자:초목, 날짜: 2020-04-03 11:12:31
태그:바이낸스

중요한 내용!

  • 이 연구결과에 대해 더 자세히 알아보도록 하겠습니다.https://www.fmz.com/digest-topic/5294■ 전략 원리, 위험, 거래의 필터링 방법, 매개 변수 설정, 개설 및 총 자본 비율 등 다양한 문제를 이해하십시오.
  • 이전 연구 보고서는 다운로드하여 자신의 연구 환경에 업로드해야 합니다. 실제 변경은 다시 실행됩니다. 이 보고서를 보셨다면 최근 최신 주 데이터를 업데이트했습니다.
  • 전략은 직접적으로 재검토할 수 없고 연구 환경에서 재검토해야 합니다.
  • 전략 코드 및 기본 매개 변수는 연구용으로만 사용되며, 실제 디스크 운영은 신중해야 하며, 자신의 연구 기준으로 매개 변수를 결정해야 합니다.위험성
  • 전략은 매일 수익을 올릴 수 없으며, 1~2주간의 역습과 역습은 정상이며, 큰 역습이 발생할 수 있으며, 올바른 처리가 필요합니다.
  • 코드는 공개되어 있으며, 스스로 수정할 수 있으며, 어떤 문제가 있으면 댓글 피드백을 환영하며, 발명자 바이안 워크샵에 가입하는 것이 좋습니다 (연구 보고서에 가입하는 방법이 있습니다) 업데이트 알림을 받을 수 있습니다.
  • 전략은 전체 포지션 모드에서 실행되어야하며, 쌍방향 포지션을 설정하지 않으며, 전략은 비안 선물만을 지원하며, 로봇을 만들 때 기본 거래 쌍과 K 라인 주기를 사용할 수 있습니다. 전략은 K 라인을 사용하지 않습니다.
  • 다른 전략과 수동 조작이 충돌하고 있으므로 주의가 필요합니다.
  • 실제 디스크 운영은 해외 호스트가 필요합니다. 테스트 단계에서는 플랫폼에서 알리 클라우드 홍콩 서버를 한 번의 클릭으로 렌터 할 수 있습니다. 자신의 월 전체 임대료는 더 저렴합니다.https://www.fmz.com/bbs-topic/2848 )
  • 아이의 선물과 현금은 별도로 추가해야 합니다.Futures_Binance

전략적 원칙

전략은 유동값을 유동값으로 선택한 한 바구니의 동전을 사용하며, 유동값을 다비트코인 헤지링으로 사용하여 위험과 변동률을 줄이는 것이다. 가격의 변동에 따라 유동값을 일정하게 유지하기 위해 유동값을 지속적으로 조정한다.본질적으로 공짜 동전 - 비트코인 가격 지표▲ 최근 2개월의 성과 (약 3배의 지렛대, 데이터 업데이트 4.8) 최근 주간 비트코인에 비해 동전이 상승했고, 이로 인해 손실이 발생했다.

기본 전략은 더 많은 비트코인을 만들어 버리는 것입니다. 당신은 또한 반대로 할 수 있습니다. (만약 당신이 비트코인이 바닥에 있다고 생각한다면)

img

전략적 논리

1. 업계 및 계좌 보유를 업데이트합니다. 2. 각 동전의 빈자금 보유 가치를 업데이트하여 빈자금 보유를 조정할 필요가 있는지 판단합니다. 3. 전체 공백 지점 업데이트, 다중 지점 보유를 결정하고 다중 지점 조정 여부를 결정합니다. 4. 주문을 하려면, 다음 주문 양은 아이스 산의 위탁에 의해 결정됩니다.아래 명령어 즉시 취소 (그래서 많은 취소 실패 문자를 볼 수 있습니다 400: {code:-2011,??msg:Unknown order sent.}, 정상 현상) 5.再次循环

단, 긴, 더 많은 거래 쌍의 개시 값은 거래 값이며, 더 적은 거래 값은 헤지 값의 평균입니다.

만약 빈 BTC만 더하면 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* 트레이드_밸류* 공짜 화폐 수. 일반적으로 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)
    }
}

관련

더 많은

유저들은 이 상품을 구매할 수 있습니다.

wfwfaf1업데이트 계정 (() 에 필요한 if ((pair.slice ((pair.length-4,pair.length) == "USDT")) busd 계약이 존재하기 때문에, 보유 정보를 업데이트할 때 목표 계약 포지션인지 여부를 판단해야 하며, 더 많은 판단이 필요합니다. 다른 방법으로는 여러 포지션 정보가 혼동되어 무한한 지불이 발생합니다.