Binance stratégie de couverture de devises multi-monnaie durable version originale (faire plus de dépassement de dépassement de dépassement de dépassement) 13 avril dernier module stop loss

Auteur:Le foin, Date: 2020-04-04 21h24 et 43 min
Les étiquettes:Binance

Cette politique est déjà disponible dans la version mise à niveau, plus WeChat wangweibing_ustb pour plus de détails.

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.
  • Si le robot s'arrête trop longtemps, il doit redémarrer les données ou construire un nouveau robot.
  • 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, on peut regarder l'histoire en arrière, 1 à 2 semaines de décalage et de retrait sont normaux et doivent être traités 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 ne prend en charge que les contrats à terme en binaire, elle doit fonctionner en mode plein portefeuille, ne pas configurer de portefeuille bidirectionnel!!, 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
  • Cette stratégie de redémarrage n'a pas d'effet, mais les nouveaux robots réenregistrent les données historiques.
  • La politique peut être mise à jour en fonction des commentaires des utilisateurs, en cliquant directement sur Ctrl + A pour copier le code couvert et le sauvegarder (les paramètres ne sont généralement pas mis à jour).
  • Les stratégies ne commencent pas par des transactions, la première fois qu'elles sont lancées, il faut enregistrer les données, il faut attendre que le marché change avant de négocier.

Mise à jour le 4.16

Un bug a été modifié pour arrêter les dommages

Les paramètres par défaut ont été modifiés:

var Alpha = 0.001 //指数移动平均的Alpha参数,设置的越大,基准价格跟踪越敏感,最终持仓也会越低,降低了杠杆,但会降低收益,具体需要根据回测结果自己权衡
var Update_base_price_time_interval = 60 //多久更新一次基准价格, 单位秒,和Alpha参数相关,Alpha 设置的越小,这个间隔也可以设置的更小

4.13 Mise à jour

Le paramètre Stop_loss est défini à 0,8 pour indiquer que lorsque le fonds atteint moins de 80% du capital initial, le stop-loss, vider tous les postes et arrêter la stratégie. Lorsque la stratégie est en cours d'exécution, le Stop_loss peut être défini à plus de 1 (réinitialiser l'effet), par exemple, de 1000 à 1500, le Stop_loss est défini à 1,3, puis revenir au stop-loss de 1300 yuans.

Max_diff et Min_diff limitent le degré de déviation, qui doit être déterminé en fonction de sa propre valeur commerciale, de son capital total et de sa capacité à supporter les risques.

Par exemple, si vous négociez 20 pièces, l'une d'elles augmente progressivement jusqu'à un écart de 0,4 et cesse de se négocier, tandis que les autres monnaies restent inchangées et perdent 7 fois leur valeur commerciale.

var Stop_loss = 0.8 
var Max_diff = 0.4 //当偏差diff大于0.4时,不继续加空仓, 自行设置
var Min_diff = -0.3 //当diff小于-0.3时,不继续加多仓, 自行设置

4.10 Mise à jour

Copier le code de la politique dans la politique locale, en superposant directement la sauvegarde, redémarrer le moteur pour qu'il fonctionne et conserver son emplacement d'origine

Le prix de l'euro est en hausse et le taux de change est en baisse.https://www.fmz.com/bbs-topic/5364

Le principal problème est le contraste entre le prix le plus récent et le prix initial de lancement de la stratégie, qui deviendra de plus en plus déviant avec le temps, une pièce peut avoir beaucoup de positions, le risque est élevé, et finira par avoir beaucoup de positions, ce qui augmente le risque et le retrait.

Le dernier indice de crypto-monnaie = mean ((sum)) (en anglais: mean)) (en anglais: mean ((sum))), c'est-à-dire comparé au prix de la ligne de l'équilibre, est capable de suivre les dernières variations de prix, est plus flexible, et le retrait a été trouvé pour réduire les stratégies de détention et de retrait. Plus stable.

Pour une mise à niveau transparente, deux des paramètres sont écrits dans les deux premières lignes du code de stratégie et modifiés au besoin.

Le paramètre alpha de l'alpha = 0.04 indice de l'équilibre des mouvements, plus il est placé, plus le prix de référence est sensible, moins de transactions sont effectuées, et la position finale est inférieure, ce qui réduit l'effet de levier, mais réduit les gains, réduit le recul maximal, et peut augmenter le nombre de transactions, qui doivent être pesées en fonction des résultats de la réévaluation. Update_base_price_time_interval = 30*60 Plus le temps de mise à jour d'un prix de référence, en unités de seconde, est lié au paramètre Alpha, plus l'alpha est petit, plus l'intervalle peut être réduit

Si vous lisez l'article et que vous voulez échanger toutes les devises, voici la liste.ETH,BCH,XRP,EOS,LTC,TRX,ETC,LINK,XLM,ADA,XMR,DASH,ZEC,XTZ,BNB,ATOM,ONT,IOTA,BAT,VET,NEO,QTUM,IOST

Rejoignez le groupe WeChat pour recevoir des mises à jour sur la bataille de Binance.

Le groupe a été créé en collaboration avec le groupe de travail de la communauté Bitcoin.com.

https://www.fmz.comimg

Les principes stratégiques

Les devises qui se vendent au-dessus de l'indice de prix Bitcoin-Cash, les devises qui se vendent au-dessous de l'indice, les plus grandes écarts, les plus grandes positions. Cette stratégie ne couvre pas les positions asymétriques avec BTC, mais peut également inclure BTC dans la paire de transactions.img

La logique stratégique

1. mise à jour du marché et des comptes de dépôt, la première fois que l'opération est enregistrée le prix initial (les nouvelles devises ajoutées sont calculées en fonction du moment de l'ajout) 2. mettre à jour l'indice, l'indice est la pièce de monnaie - indice de prix du bitcoin = mean ((sum))) prix de la pièce de monnaie / prix du bitcoin) / (prix initial de la pièce de monnaie / prix initial du bitcoin)) 3. le choix de l'emplacement en fonction de l'indice de déviation. 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.再次循环

L'effet de levier dans la pile d'état représente un montant de garantie qui a été utilisé et doit être maintenu à un niveau bas pour satisfaire les nouvelles positions ouvertes.

Paramètres stratégiques

img

  • Trade_symbols: les devises échangées, qui doivent être sélectionnées par la plate-forme de recherche, peuvent également rejoindre BTC
  • Trade_value: le prix de Bitcoin (BTC) a une valeur de 1% par écarte de l'indice, et doit être déterminé en fonction de son investissement total et de ses préférences en matière de risques. Il est recommandé de définir une valeur de 3 à 10% du capital total.
  • Adjust_value: la valeur du contrat (USDT) est ajustée. Lorsque l'indicateur dévie de * Trade_value - Holding actuel > Adjust_value, c'est-à-dire que la différence entre la valeur de la position cible et la valeur actuelle est supérieure à cette valeur, la transaction commence. Un ajustement trop important est lent, les transactions trop petites sont fréquentes et ne peuvent pas être inférieures à 10, sinon le minimum de transaction n'est pas atteint.
  • Ice_value: la valeur de la montagne de glace, ne peut pas non plus être inférieure à 10, en fait, sélectionnez simplement Adjust_value avec la plus petite des valeurs de glace, si vous avez plus de fonds, il est recommandé de ne pas être inférieur à 20% de la valeur d'ajustement.
  • Interval: temps de sommeil cyclique, peut être réglé sur quelque chose de plus petit, comme 1s, mais ne peut pas dépasser la limite de fréquence binaire.
  • Réinitialiser: réinitialiser les données historiques, réinitialiser le prix initial de référence de la stratégie au prix actuel, généralement sans réglage

Risque stratégique

Notez que si une monnaie sort du marché indépendant, par exemple en augmentant plusieurs fois par rapport à l'indice, elle accumulera beaucoup de positions vides sur cette monnaie.




var Alpha = 0.001 //指数移动平均的Alpha参数,设置的越大,基准价格跟踪越敏感,最终持仓也会越低,降低了杠杆,但会降低收益,具体需要根据回测结果自己权衡
var Update_base_price_time_interval = 60 //多久更新一次基准价格, 单位秒,和Alpha参数相关,Alpha 设置的越小,这个间隔也可以设置的更小

//Stop_loss设置为0.8表示当资金达到低于初始资金的80%时,止损,清空所有仓位,停止策略。
//随着策略运行,Stop_loss可以设置大于1(重启生效),比如从1000赚到1500,Stop_loss设置为1.3,则回撤到1300元止损。不想止损可以把这个参数设置的很小。
//风险是大家都用这种止损会形成踩踏,加大亏损。
//初始资金在状态栏的init_balance字段,注意提现等操作会影响,别不小心止损了。
//如果还是怕黑天鹅事件,比如某个币归0等,可以手动提现出来。

var Stop_loss = 0.8 
var Max_diff = 0.4 //当偏差diff大于0.4时,不继续加空仓, 自行设置
var Min_diff = -0.3 //当diff小于-0.3时,不继续加多仓, 自行设置

if(IsVirtual()){
    throw '不能回测,回测参考 https://www.fmz.com/digest-topic/5294 '
}
if(exchange.GetName() != 'Futures_Binance'){
    throw '只支持币安期货交易所,和现货交易所不同,需要单独添加,名称为Futures_Binance'
}
var trade_symbols = Trade_symbols.split(',')
var symbols = trade_symbols
var index = 1 //指数
if(trade_symbols.indexOf('BTC')<0){
    symbols = trade_symbols.concat(['BTC'])
}
var update_profit_time = 0
var update_base_price_time= Date.now()
var assets = {}
var init_prices = {}


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, 
                                                     btc_price:0, btc_change:1,btc_diff: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, update_time:0, init_balance:0, stop_balance:0, short_value:0, long_value:0, profit:0}

function updateAccount(){ //更新账户和持仓
    exchange.SetContractType('swap')
    var account = exchange.GetAccount()
    var pos = exchange.GetPosition()
    if (!account || !pos){
        Log('update account time out')
        return
    }
    assets.USDT.update_time = Date.now()
    for(var i=0; i<trade_symbols.length; i++){
        assets[trade_symbols[i]].margin = 0
        assets[trade_symbols[i]].unrealised_profit = 0
        assets[trade_symbols[i]].hold_price = 0
        assets[trade_symbols[i]].amount = 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(trade_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)
    if(assets.USDT.init_balance == 0){
        if(_G('init_balance')){
            assets.USDT.init_balance = _N(_G('init_balance'),2)
        }else{
            assets.USDT.init_balance = assets.USDT.total_balance 
            _G('init_balance',assets.USDT.init_balance)
        }
    }
    assets.USDT.profit = _N(assets.USDT.margin_balance - assets.USDT.init_balance, 2)
    assets.USDT.stop_balance = _N(Stop_loss*assets.USDT.init_balance, 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(trade_symbols.indexOf(coin) < 0){continue}
            if(pos[k].positionSide != 'BOTH'){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 updateIndex(){ //更新指数
    
    if(!_G('init_prices') || Reset){
        Reset = false
        for(var i=0; i<trade_symbols.length; i++){
            init_prices[trade_symbols[i]] = (assets[trade_symbols[i]].ask_price+assets[trade_symbols[i]].bid_price)/(assets.BTC.ask_price+assets.BTC.bid_price)
        }
        Log('保存启动时的价格')
        _G('init_prices',init_prices)
    }else{
        init_prices = _G('init_prices')
        if(Date.now() - update_base_price_time > Update_base_price_time_interval*1000){
            update_base_price_time = Date.now()
            for(var i=0; i<trade_symbols.length; i++){ //更新初始价格
                init_prices[trade_symbols[i]] = init_prices[trade_symbols[i]]*(1-Alpha)+Alpha*(assets[trade_symbols[i]].ask_price+assets[trade_symbols[i]].bid_price)/(assets.BTC.ask_price+assets.BTC.bid_price)
            }
            _G('init_prices',init_prices)
        }
        var temp = 0
        for(var i=0; i<trade_symbols.length; i++){
            assets[trade_symbols[i]].btc_price =  (assets[trade_symbols[i]].ask_price+assets[trade_symbols[i]].bid_price)/(assets.BTC.ask_price+assets.BTC.bid_price)
            if(!(trade_symbols[i] in init_prices)){
                Log('添加新的币种',trade_symbols[i])
                init_prices[trade_symbols[i]] = assets[trade_symbols[i]].btc_price / index
                _G('init_prices',init_prices)
            }
            assets[trade_symbols[i]].btc_change = _N(assets[trade_symbols[i]].btc_price/init_prices[trade_symbols[i]],4)
            temp += assets[trade_symbols[i]].btc_change
        }
        index = _N(temp/trade_symbols.length, 4)
    }
    
}

function updateTick(){ //更新行情
    var ticker = HttpQuery('https://fapi.binance.com/fapi/v1/ticker/bookTicker')
    try {
        ticker = JSON.parse(ticker)
    }catch(e){
        Log('get ticker time out')
        return
    }
    assets.USDT.short_value = 0
    assets.USDT.long_value = 0
    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)
        if(trade_symbols.indexOf(coin) < 0){continue}
        if(assets[coin].amount<0){
            assets.USDT.short_value += Math.abs((assets[coin].ask_value+assets[coin].bid_value)/2)
        }else{
            assets.USDT.long_value += Math.abs((assets[coin].ask_value+assets[coin].bid_value)/2)
        }
        assets.USDT.short_value = _N(assets.USDT.short_value,0)
        assets.USDT.long_value = _N(assets.USDT.long_value,0)
    }
    updateIndex()
    for(var i=0; i<trade_symbols.length; i++){
        assets[trade_symbols[i]].btc_diff = _N(assets[trade_symbols[i]].btc_change - index, 4)
    }
}

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)+1)
        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) //订单会立即撤销
    }
    return 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, assets[symbols[i]].btc_diff, 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) + ' Index:' + index + '\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 stopLoss(){ //止损函数
    while(true){
        if(assets.USDT.margin_balance < Stop_loss*assets.USDT.init_balance && assets.USDT.init_balance > 0){
            Log('触发止损,当前资金:', assets.USDT.margin_balance, '初始资金:', assets.USDT.init_balance)
            Ice_value = 200 //止损的快一些,可修改
            updateAccount()
            updateTick()
            var trading = false //是否正在交易
            for(var i=0; i<trade_symbols.length; i++){
                var symbol = trade_symbols[i]
                if(assets[symbol].ask_price == 0){ continue }
                if(assets[symbol].bid_value >= trade_info[symbol].minQty*assets[symbol].bid_price){
                    trade(symbol, 'sell', assets[symbol].bid_value)
                    trading = true
                }
                if(assets[symbol].ask_value <= -trade_info[symbol].minQty*assets[symbol].ask_price){
                    trade(symbol, 'buy', -assets[symbol].ask_value)
                    trading = true
                }
            }
            Sleep(1000)
            if(!trading){
                throw '止损结束,如果需要重新运行策略,需要调低止损'
            }
        }else{ //不用止损
            return
        }
    }    
}

function onTick(){ //策略逻辑部分
    for(var i=0; i<trade_symbols.length; i++){
        var symbol = trade_symbols[i]
        if(assets[symbol].ask_price == 0){ continue }
        var aim_value = -Trade_value * _N(assets[symbol].btc_diff/0.01,3)
        if(aim_value - assets[symbol].ask_value >= Adjust_value && assets[symbol].btc_diff > Min_diff && assets.USDT.long_value-assets.USDT.short_value <= 1.1*Trade_value){
            trade(symbol,'buy', aim_value - assets[symbol].ask_value)
        }
        if(aim_value - assets[symbol].bid_value <= -Adjust_value && assets[symbol].btc_diff < Max_diff && assets.USDT.short_value-assets.USDT.long_value <= 1.1*Trade_value){
            trade(symbol,'sell', -(aim_value - assets[symbol].bid_value))
        }
    }
}

function main() {
    while(true){
        updateAccount()
        updateTick()
        stopLoss() //止损
        onTick()
        updateStatus()
        Sleep(Interval*1000)
    }
}

Relationnée

Plus de

les tiges de laine@tmbs95 Ajoutez-moi sur le télégramme, intéressé

Les fiancées aussi.S'il vous plaît expliquer, dans la fonction onTick (), il y a une ligne comme celle-ci, assets.USDT.long_value-assets.USDT.short_value <= 1.1*Trade_value, je comprends que c'est pour éviter un déséquilibre trop grand, mais cette restriction peut affecter gravement la vitesse d'ouverture.

- Je vous en prie.Je ne peux pas trouver WeChat.

Le capital de la chaîneMax_diff et Min_diff ne devraient pas être 0.04 et -0.03?

L'armée de l'air ne sera jamais esclave.Donnez un peu de soleil à ce cercle fermé.

Le foinJe ne sais pas si je peux vous aider, mais je peux vous aider.

Quantification des classes de quartierLes individus suggèrent de faire plus de dépassement et de faire plus de dépassement dans la stratégie de dépassement de l'espace pour éliminer le BNB, une transaction que le BNB veut attirer la popularité et qui devrait dépasser l'espace; on ne peut pas regarder l'histoire à présent.

Les fiancées aussi.Il y a deux choses.

Les fiancées aussi.Une monnaie sortant de marché indépendant, ce réglage de l'équilibre de l'espace peut empêcher de grosses pertes, donc la décision ne peut pas être déséquilibrée. Il suffit de trouver un moyen d'ouvrir une liste de couverture.

Le foinVous avez tort, wangweibing_ustb.

lhangsanEn fait, si vous regardez le code, vous verrez les résultats de la réévaluation de l'ensemble de la monnaie, pas besoin de vous inquiéter. En rejoignant, Alpha = 0.05, en ajoutant LINK, ETC, BNB, le retrait initial de l'histoire est de 3%, le retrait maximal du marché extrême n'est pas de 25%, Trade_Value utilise 3% de sécurité sur la monnaie entière.