Binance dauerhafte Hedging-Strategie für Multi-Währungen (Beien oder Multi-Zeechen-Index) 10. April Verbessert Bug, muss aktualisiert werden

Schriftsteller:Das Gras, Datum: 2020-04-03 11:12:31
Tags:Binance

Wichtige Inhalte!

  • Ich muss diese Studie lesen.https://www.fmz.com/digest-topic/5294◦ Verständnis für eine Reihe von Fragen wie Strategieprinzipien, Risiken, wie man den Handel durchsucht, wie man die Parameter setzt, wie man die Anteile an der Eröffnung und dem Gesamtkapital anpasst.
  • Der letzte Bericht muss heruntergeladen und in die eigene Umgebung hochgeladen werden. Die tatsächliche Änderung läuft wieder. Wenn Sie diesen Bericht bereits gelesen haben, aktualisieren Sie die Daten der letzten Woche.
  • Strategien können nicht direkt nachgeprüft werden, sie müssen in der Forschung nachgeprüft werden.
  • Die Strategiecode und die Standardparameter sind nur für Forschungszwecke und die Festplattenbetriebsweise erfordert Vorsicht.Die Risiken
  • Die Strategie kann nicht jeden Tag profitabel sein, wenn man sich die Geschichte anschaut, ist ein 1-2-wöchiges Hinterhalt und Rückzug normal, und es ist möglich, dass es große Rückschläge gibt, die richtig behandelt werden müssen.
  • Der Code ist öffentlich zugänglich und kann selbst geändert werden. Kommentare und Feedback sind herzlich willkommen, wenn es Probleme gibt.
  • Die Strategie muss im Gesamtmodus ausgeführt werden, ohne dass eine zweiseitige Lagerhaltung eingerichtet wird. Die Strategie unterstützt nur Binance-Futures.
  • Man muss sich vor Augen halten, dass die Strategie mit anderen Strategien und die manuelle Handhabung in Konflikt stehen.
  • Für den Betrieb der Festplatte benötigen Sie einen ausländischen Host, während der Testphase können Sie einen Ali Cloud Hongkong Server mit einem Klick auf der Plattform mieten und die volle Miete monatlich günstiger machen.https://www.fmz.com/bbs-topic/2848 )
  • Die Futures und die Bargeld müssen getrennt hinzugefügt werden.Futures_Binance

Die Strategie

Die Strategie ist es, die Diversifizierung des Gleichwerts in einem Korb von Kaufteilen und gleichzeitige Positionen als Über-Bitcoin-Hedging zu verfolgen, um Risiken und Volatilität zu reduzieren.Das ist eine Art Zeitvertreib. Bitcoin-Preisindex◎ Die Vergangenheit der letzten zwei Monate (Leverage um das Dreifache, Daten aktualisiert auf 4.8) Die letzten Wochen waren die Kryptowährungen gegenüber Bitcoin höher, also die Verluste, wenn Sie mehr Kryptowährungen betrachten, können Sie in den Parametern einstellen, um Bitcoin als Kryptowährung zu verwenden:

Die Strategie ist, dass Sie standardmäßig mehr Bitcoin machen, als Sie es tun, und Sie können auch umgekehrt (wenn Sie denken, dass Sie an der Unterseite sind) die Entscheidung selbst treffen.

img

Strategische Logik

1. Aktienmarkt und Aktienhaltung aktualisieren 2. Aktualisieren Sie den Wert der Haltungen für alle Münzen, um festzustellen, ob die Haltungen angepasst werden müssen 3. Aktualisierung der Positionen der Gesamtflächen, Festlegung von Positionen mit mehreren Positionen und Entscheidung, ob Positionen mit mehreren Positionen angepasst werden sollen 4. Die Bestellung und die Bestellmenge werden von Ice Mountain beauftragt und werden nach dem Gegenpreis (Kauf-Verkauf-Preis) getätigt.Sie werden sofort nach der Bestellung widerrufen. (So sehen Sie viele fehlgeschlagene Zellen 400: {code:-2011,msg:Unknown order sent.}, normal) 5.再次循环

Der Handel mit mehr, mehr oder weniger Kurz- und Lang-Symbols wird als Trade-Value bezeichnet, wobei der Vertragspreis für jede Währung als Durchschnitt des Hedge-Wertes betrachtet wird.

Wenn nur BTC frei ist und TRX, DASH, ONT, QTUM und Trade_value 50 sind, dann haben TRX, DASH, ONT und QTUM alle mehr als 50 Positionen und BTC hält 50*4 Positionen.

Wenn es nur mehr BTC gibt und der leere TRX, DASH, ONT, QTUM, Trade_value 50 ist, dann haben TRX, DASH, ONT, QTUM alle 50 leere Positionen und BTC hält mehr als 50*4 Positionen.

Der Leverage in der Status-Laser repräsentiert die garantierte Summe, die in einem Prozentsatz verwendet wird und sollte nicht zu hoch sein.

Strategieparameter

img

  • Short_symbols: Leere Münzen, mit Klammern, Klammern getrennt
  • Long_symbols: Es gibt mehrere Währungen, sie können auch leer, nicht abgesichert, direkt leer gelassen werden.
  • Trade_value: Einzelne Währungen haben einen freien Wert. Es müssen auch mehrere Hedges durchgeführt werden, der Gesamtwert = 2*Trade_value* ist die Anzahl der freien Währungen.
  • Adjust_value: Vertragswert (USDT-Preis) Anpassung des Abweichungswerts, zu viel Anpassung ist langsamer, zu kleine Gebühren sind zu hoch, nach eigenem Ermessen von Trade_value. Kann nicht unter 20 liegen, sonst wird die Mindesttransaktion nicht erreicht
  • Ice_value: Ein Eisberg-Aufgabegrad, der ebenfalls nicht kleiner als 20 sein kann, wird dann einfach ausgesucht, wenn Adjust_value der geringere Wert zwischen Ice_value und Ice_value ist

Strategische Risiken

Wenn der Preis der leeren Münze steigt, steigt der Wert des Vertrags, dann wird die Lagerhaltung verringert, im Gegensatz dazu werden die Gewinne erhöht. Dies hält den Gesamtvertragspreis konstant. Es ist sehr wahrscheinlich, dass die Münze aus dem unabhängigen Markt herauskommt, und derzeit kann sie aus einem Jahreszyklus ausgehen und kann von unten steigen.


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

Verwandt

Mehr

Ich weiß nicht.Ist das ein Standard oder ein Marktpreis?

wfwfaf1UpdateAccount (() ist erforderlich. if ((pair.slice ((pair.length-4, pair.length) == "USDT") Da es Busd-Kontrakte gibt, muss bei der Aktualisierung der Lagerhaltungsinformationen entschieden werden, ob es sich um eine Zielkontraktposition handelt. Wenn Sie nicht mehrere Positionen haben, wird die Information verwirrt, was zu einer unbegrenzten Anzahl von Aufträgen führt.