La stratégie de couverture de la monnaie monétaire permanente de Binance (l'indice monétaire monétaire monétaire) améliorée le 10 avril Bug, nécessitant une mise à jour

Auteur:Le foin, Date: 2020-04-03 11h12 et 31h
Les étiquettes:Binance

Le contenu est important!

  • Il faut d'abord voir cette étude.https://www.fmz.com/digest-topic/5294◦ Comprendre les principes stratégiques, les risques, la façon de filtrer les transactions, la façon de définir les paramètres, le ratio des positions ouvertes et du capital total, etc.;
  • Si vous avez déjà lu ce rapport, vous avez récemment mis à jour les données de la dernière semaine.
  • Les stratégies ne peuvent pas être testées directement, elles doivent être testées dans un environnement de recherche.
  • Le code de stratégie et les paramètres par défaut sont uniquement à des fins de recherche, et le fonctionnement du disque réel nécessite une prudence raisonnable.Les risques
  • La stratégie ne peut pas être rentable tous les jours, voir l'historique des retards, 1 à 2 semaines de décalage et de retrait sont normaux, et il est possible de retarder beaucoup, il faut le faire correctement.
  • Le code est ouvert, vous pouvez le modifier vous-même, et si vous avez des problèmes, les commentaires sont les bienvenus.
  • La stratégie doit fonctionner en mode plein portefeuille, ne pas configurer de portefeuille bidirectionnel, la stratégie ne prend en charge que les contrats à terme en binaire, la stratégie n'est pas utilisée pour la ligne K.
  • Les stratégies et les autres stratégies, ainsi que les opérations manuelles, sont en conflit et doivent être prises en compte.
  • Le disque virtuel nécessite un hébergeur à l'étranger pour fonctionner, la phase de test permet de louer un serveur Ali Cloud Hong Kong en un clic sur la plate-forme et de louer lui-même le loyer mensuel moins cher (le minimum de configuration est disponible, le tutoriel de déploiement:https://www.fmz.com/bbs-topic/2848 )
  • Les contrats à terme et les contrats à terme doivent être ajoutés séparément.Futures_Binance

Les principes stratégiques

La stratégie consiste à disperser l'équivalent en un panier de pièces de monnaie par défaut, tout en faisant des positions par défaut comme une couverture pour le bitcoin, ce qui réduit les risques et la volatilité.L'indice des prix du Bitcoin est essentiellement un faux-monnaie.Dans les deux derniers mois, l'effet de levier a augmenté de 3 fois ou plus, les données sont mises à jour à 4.8, la semaine dernière, les crypto-monnaies ont augmenté par rapport au bitcoin, donc les pertes, si vous regardez les crypto-monnaies multiples, vous pouvez définir le paramètre de faire de la crypto-monnaie à la crypto-monnaie multiples dans le paramètre:

La stratégie par défaut est de faire plus de bitcoins et de faire de la fausse monnaie, vous pouvez aussi faire l'inverse (si vous pensez que la fausse monnaie est au bas), la décision est à vous.

img

La logique stratégique

1. Mettre à jour le secteur et les comptes détenus 2. Mettre à jour la valeur de chaque portefeuille pour déterminer si la portefeuille doit être ajustée. 3. Mettre à jour les positions de l'ensemble des positions vides, déterminer les positions multiples et déterminer si elles doivent être ajustées. 4. La commande et la quantité de la commande sont décidées par Ice Mountain en fonction du prix de transaction (achat à prix de vente).Une fois la commande passée, elle est immédiatement annulée. Donc, vous verrez beaucoup de cellules 400: {code:-2011,msg:Unknown order sent.} qui ont échoué à être annulées. 5.再次循环

Le prix d'ouverture de chaque paire de devises est la valeur de la transaction, et la valeur moyenne de chaque contrat de devises est la valeur moyenne de la valeur de la contrepartie.

Si seulement BTC est vide, plus TRX, DASH, ONT, QTUM et Trade_value est de 50, alors TRX, DASH, ONT, QTUM ont tous plus de 50 positions et BTC détient 50*4 positions.

Si vous n'avez que BTC, TRX, DASH, ONT, QTUM et Trade_value est de 50, alors TRX, DASH, ONT et QTUM ont tous 50 positions vides et BTC détient plus de 50*4.

L'effet de levier dans le panneau d'état représente le montant de la garantie qui a été utilisé en proportion et ne devrait pas être trop élevé.

Paramètres stratégiques

img

  • Short_symbols: pièces vierges, séparées par des guillemets
  • Long_symbols: plus de pièces, peuvent également être laissées vides, non couvertes, directement vides.
  • Trade_value: une seule monnaie a une valeur de dépôt. Il faut également effectuer plusieurs couvertures, la valeur totale = 2*Trade_value* est le nombre de pièces de dépôt. Généralement, on utilise 3 à 5 fois l'effet de levier, c'est-à-dire la valeur totale = 3* le solde du compte.
  • Adjust_value: valeur du contrat (USDT) ajustement de la valeur de la déviation, trop d'ajustement est plus lent, trop peu de frais de traitement trop élevés, selon la décision de Trade_value; ne peut pas être inférieur à 20, sinon vous ne pouvez pas atteindre le minimum de transactions
  • Ice_value: une valeur de commande de glacier, qui ne peut pas être inférieure à 20, en sélectionnant simplement la plus petite des valeurs Adjust_value et Ice_value

Risque stratégique

Lorsque le prix d'une pièce en faillite augmente, la valeur du contrat augmente, ce qui entraîne une dépréciation et une augmentation des bénéfices. Cela permet de maintenir la valeur totale du contrat stable. Il est probable que la pièce de monnaie soit sortie d'un marché indépendant et qu'elle soit actuellement au bas d'un cycle annuel.


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

Relationnée

Plus de

Je vous en prie.Les prix sont-ils bas ou bas sur le marché?

Le code de conduite de l'équipeIl est nécessaire de mettre à jour le compte (s) if ((pair.slice ((pair.length-4, pair.length) == "USDT") est un fichier qui contient les données de base. En raison de l'existence de contrats busd, il est nécessaire de déterminer si les positions de contrat cibles sont ou non des positions lors de la mise à jour des informations de stockage. Dans le cas contraire, les informations de plusieurs positions peuvent être confuses, ce qui entraîne un nombre illimité d'opérations.