Les ressources ont été chargées... Je charge...

Les accords binaires sont des accords à papillons (stratégie de guerre des milliers de légions 3)

Auteur:Le foin, Date: 2020-09-09 13h45
Les étiquettes:HaieBinance

Les stratégies d'optimisation monétaire, qui ne peuvent pas être vérifiées. Les principes spécifiques sont référencés dans les articles de la bibliothèque:https://www.fmz.com/digest-topic/6102

Il est nécessaire de lire ce manuel de stratégie et ne peut pas fonctionner sans cerveau. Le code de stratégie est à titre de référence, modifié si nécessaire, les commentaires sont les bienvenus.

Les principes stratégiques

Il existe trois contrats en même temps, à savoir le BTCUSD_PERP, le BTCUSD_200925 au cours du trimestre et le BTCUSD_201225 au cours du trimestre suivant.

Les contrats permanents peuvent être considérés comme des contrats à terme, généralement deux contrats de couverture ont trois différences: en cours de saison-permanent, en cours de saison-permanent, en cours de saison-permanent, en cours de saison-permanent. Le devis papillon nécessite l'opération de trois contrats, les différences sont: (seconde saison-permanent) - (seconde saison-permanent), c'est-à-dire différence = deuxième saison + permanent-2* en cours de saison.

Paramètres stratégiques

  • La monnaie échangée: trois variétés doivent être présentes en même temps, en permanence, en cours de saison et à la suite de saison.
  • Le nombre de feuilles suivantes: le nombre de feuilles suivantes de chaque grille.
  • Le prix de l'ouverture de la grille: chaque fois qu'un prix est dévié, faites-en plus ou faites-en un vide.
  • Paramètre d'élasticité de la différence Alpha: utilisé pour calculer la valeur moyenne de la différence, disponible par défaut ou peut être réévalué par vous-même.
  • Nombre d'offres d'acquisition: si le nombre d'offres d'acquisition est trop grand, pour réduire le phénomène de la jambe unique, vous pouvez définir le nombre minimum d'offres d'acquisition par fois.

Si la ligne moyenne du décalage est de 100, le décalage actuel est de 200 et le nombre d'ordres suivants est de 2, le décalage d'ouverture de la grille est de 30, alors la détention à ce moment-là est de: 6 espaces vacants au deuxième trimestre, 6 espaces vacants permanents, plus de 12 espaces vacants au cours de la saison.

Attention

  • Le taux de change nécessite environ une détention unidirectionnelle, c'est-à-dire plusieurs emplacements en même temps.
  • Le montant de la caution est le mode de l'intégralité.
  • Cette stratégie n'est pas une stratégie d'exploitation sans cerveau, testée avec prudence en comprenant les principes.
  • La réévaluation des articles de recherche ne sera pas une situation réelle, sans optimisation excessive des paramètres.
  • Les robots ne fonctionnent pas pendant de longues périodes, et de nouveaux robots doivent être construits pour éviter une différence de prix excessive.
  • Les paramètres de la différence de prix d'ouverture de la grille doivent couvrir les frais de transaction. Par exemple, si le prix de transaction est de 2 000 $, le prix du bitcoin est de 10 000, il doit être au moins supérieur à 8 * 10000 * 0.0002 = 16, plus un certain solde, qui peut être défini comme 25-30 ∞.
  • À l'approche de la livraison de la deuxième saison - la saison, la saison - le décalage de temps permanent devient de plus en plus grand, jusqu'à ce que la saison se rapproche de la saison permanente, les cotisations papillon sont en fait des cotisations entre la saison secondaire et la saison permanente, ne peuvent pas fonctionner et doivent être arrêtées ou observées deux semaines avant la livraison.
  • La partie qui peut être achetée immédiatement au prix de commande (ou meilleur prix) et celle qui ne peut pas être entièrement achetée immédiatement sera annulée.
  • Une modification de cette stratégie peut également être effectuée en ajustement entre la saison actuelle et permanente ou la saison suivante et permanente.
  • La stratégie consiste à ne pas ouvrir de positions fréquemment et peut-être même pas une seule fois par jour.
  • Le robot commence à calculer les différences moyennes dès le début de sa vie et ne fait aucune trace de l'histoire.
  • Les stratégies sont très probablement auto-optimisées en raison d'un seul pied causé par l'impossibilité d'une transaction.
  • Le prix de l'offre est plus bas, ce qui n'a pas d'impact sur le nombre d'offres d'ouverture de petites positions, mais nécessite une optimisation personnalisée pour le nombre d'offres d'ouverture de grandes positions, comme la commande d'un iceberg.

if(IsVirtual()){
    throw '不能回测,回测参考研究文章 https://www.fmz.com/digest-topic/6102'
}
if(exchange.GetName() != 'Futures_Binance'){
    throw '只支持币安期货交易所,和现货交易所不同,需要单独添加,名称为Futures_Binance'
}
if(Grid == 0){
    throw '需要设置网格差价,需要覆盖8份手续费,可设置为当前价*fee*15'
}

exchange.SetBase("https://dapi.binance.com") //切换至交割合约

var exchange_info = HttpQuery('https://dapi.binance.com/dapi/v1/exchangeInfo')
if(!exchange_info){
    throw '无法连接币安网络,需要非公用海外托管者'
}
exchange_info = JSON.parse(exchange_info)
trade_info = {} //合约基础信息
trade_contract = {NEXT_QUARTER:'',CURRENT_QUARTER:'',PERPETUAL:''} //需要交易的合约代码
for (var i=0; i<exchange_info.symbols.length; i++){
   trade_info[exchange_info.symbols[i].symbol] =  exchange_info.symbols[i]
   if(exchange_info.symbols[i].baseAsset == Symbol && exchange_info.symbols[i].contractType in trade_contract && exchange_info.symbols[i].contractStatus == 'TRADING'){
       trade_contract[exchange_info.symbols[i].contractType] = exchange_info.symbols[i].symbol
   }
}
if(!(trade_contract.NEXT_QUARTER && trade_contract.CURRENT_QUARTER && trade_contract.PERPETUAL)){
    throw '无法找到蝶式对冲的三个合约'
}
var pricePrecision = trade_info[trade_contract.PERPETUAL].pricePrecision //价格精度

var ticker = {}
var account = {}
var position = {}

var diff_mean = null //差价均价
if(_G('diff_mean') && _G('symbol') == Symbol){ //防止切换币种,差价出错
    diff_mean = _G('diff_mean')
}else{
    _G('symbol',Symbol)
}

var diff_buy = 0 //做多的差价
var diff_sell = 0 //做空的差价
Trade_value = _N(Trade_value, 0)
 
var init_asset = 0 //初始资金
if(_G('init_asset')){
    init_asset = _G('init_asset')
}else{
    updateAccount()
    init_asset = parseFloat(account[Symbol].marginBalance)
    _G('init_asset', init_asset)
}
var update_status_time = 0
var update_account_time = Date.now()

function onexit(){
    _G('diff_mean', diff_mean)
}

function updateTicker(){
    var bookTicker =  HttpQuery('https://dapi.binance.com/dapi/v1/ticker/bookTicker')
    try {
        bookTicker = JSON.parse(bookTicker)
        for(var i=0;i<bookTicker.length;i++){
            ticker[bookTicker[i].symbol] = bookTicker[i]
        }
    } catch (e) {
        Log('无法获取行情')
    }
}

function updateAccount(){
    var acc = exchange.IO("api", "GET", "/dapi/v1/account", "timestamp="+Date.now())
    if(!acc){
        Log('无法获取账户')
        return
    }
    for(var i=0;i<acc.assets.length;i++){
        account[acc.assets[i].asset] = acc.assets[i]
    }
}

function updatePosition(){
    var pos = exchange.IO("api", "GET", "/dapi/v1/positionRisk", "timestamp="+Date.now())
    if(!pos){
        Log('无法获取仓位')
        return
    }
    for(var i=0;i<pos.length;i++){
        position[pos[i].symbol] = pos[i]
    }
}

function updateStatus(){
    if(Date.now() - update_status_time < 4000){
        return
    }
    update_status_time = Date.now()
    if(Date.now() - update_account_time >  5*60*1000){
        update_account_time = Date.now()
        updateAccount()
        LogProfit(_N(parseFloat(account[Symbol].marginBalance) - init_asset, 5))
    }
    
    $.PlotLine('buy', _N(diff_buy, pricePrecision))
    $.PlotLine('sell', _N(diff_sell, pricePrecision))
    $.PlotLine('mean', _N(diff_mean, pricePrecision+3))
    
    var table1 = {type: 'table', title: '账户信息', 
             cols: ['账户余额', '未实现盈亏', '保证金余额',  '可用余额', '维持保证金', '起始保证金', 'BNB', '初始余额', '收益', '平均差价', '做多差价', '做空差价', '下单量'],
             rows: [[_N(parseFloat(account[Symbol].walletBalance),5), _N(parseFloat(account[Symbol].unrealizedProfit),5), _N(parseFloat(account[Symbol].marginBalance),5), 
                     _N(parseFloat(account[Symbol].availableBalance),5),  _N(parseFloat(account[Symbol].maintMargin),5), _N(parseFloat(account[Symbol].initialMargin),5), 
                     _N(parseFloat(account.BNB.walletBalance),5), _N(init_asset,5),
                      _N(parseFloat(account[Symbol].marginBalance) - init_asset,5), _N(diff_mean, pricePrecision+1),
                     _N(diff_buy, pricePrecision),_N(diff_sell, pricePrecision), Trade_value
                    ]]}
    var table2 = {type: 'table', title: '对冲信息', 
             cols: ['合约', '持仓张数', 'Bid', 'Ask', '持仓价值', '杠杆', '开仓均价', '未实现盈亏'],
             rows: []}
    for(var contract in trade_contract){
        var symbol = trade_contract[contract]
        table2.rows.push([symbol, position[symbol].positionAmt, ticker[symbol].bidPrice, ticker[symbol].askPrice, 
                          parseInt(position[symbol].positionAmt)*parseInt(trade_info[symbol].contractSize), position[symbol].leverage,
                         position[symbol].entryPrice, position[symbol].unRealizedProfit])
    }
    var logString = _D()+'  策略代码最后更新时间9月29日\n'
    LogStatus(logString + '`' + JSON.stringify(table1) + '`'+'\n'+'`' + JSON.stringify(table2) + '`')
}

function trade(symbol, side, price, amount){
    //IOC下单,未成交部分会自动撤销
    exchange.Log(side == 'BUY' ? LOG_TYPE_BUY : LOG_TYPE_SELL, price, amount, ' buy: ' + _N(diff_buy, pricePrecision) + ' sell: '+ _N(diff_sell, pricePrecision) + ' mean: '+_N(diff_mean, pricePrecision+3))
    exchange.IO("api", "POST","/dapi/v1/order","symbol="+symbol+"&side="+side+"&type=LIMIT&timeInForce=IOC&quantity="+amount+"&price="+price+"&timestamp="+Date.now())
}


function onTicker(){
    
    //由于是吃单,需要分别计算做多和做空的差价
    diff_sell = parseFloat(ticker[trade_contract.NEXT_QUARTER].bidPrice) + parseFloat(ticker[trade_contract.PERPETUAL].bidPrice) -
                2*parseFloat(ticker[trade_contract.CURRENT_QUARTER].askPrice)
    diff_buy = parseFloat(ticker[trade_contract.NEXT_QUARTER].askPrice) + parseFloat(ticker[trade_contract.PERPETUAL].askPrice)  -
                2*parseFloat(ticker[trade_contract.CURRENT_QUARTER].bidPrice)

    
    if(!diff_mean){diff_mean = (diff_buy+diff_sell)/2}
    diff_mean = diff_mean*(1-Alpha) + Alpha*(diff_buy+diff_sell)/2 //差价均价的更新
    
    
    var aim_buy_amount = -Trade_value*(diff_buy - diff_mean)/Grid
    var aim_sell_amount = -Trade_value*(diff_sell - diff_mean)/Grid 
    
    if(aim_buy_amount - parseFloat(position[trade_contract.PERPETUAL].positionAmt) > Trade_value){ //做多差价,价格加了滑价
        trade(trade_contract.PERPETUAL, 'BUY', _N(parseFloat(ticker[trade_contract.PERPETUAL].askPrice)*1.01, pricePrecision), _N(Math.min(aim_buy_amount-parseFloat(position[trade_contract.PERPETUAL].positionAmt),Ice_value),0))
    }
    if(aim_buy_amount - parseFloat(position[trade_contract.NEXT_QUARTER].positionAmt) > Trade_value){
        trade(trade_contract.NEXT_QUARTER, 'BUY', _N(parseFloat(ticker[trade_contract.NEXT_QUARTER].askPrice)*1.01,pricePrecision), _N(Math.min(aim_buy_amount-parseFloat(position[trade_contract.NEXT_QUARTER].positionAmt),Ice_value),0))
    }
    if(-2*aim_buy_amount - parseFloat(position[trade_contract.CURRENT_QUARTER].positionAmt) < -2*Trade_value){
        trade(trade_contract.CURRENT_QUARTER, 'SELL', _N(parseFloat(ticker[trade_contract.CURRENT_QUARTER].bidPrice)*0.99,pricePrecision), _N(2*Math.min(aim_buy_amount+parseFloat(position[trade_contract.CURRENT_QUARTER].positionAmt),Ice_value),0))
    }
    
    if(aim_sell_amount - parseFloat(position[trade_contract.PERPETUAL].positionAmt) < -Trade_value){ //做空差价
        trade(trade_contract.PERPETUAL, 'SELL', _N(parseFloat(ticker[trade_contract.PERPETUAL].bidPrice)*0.99,pricePrecision), _N(Math.min(parseFloat(position[trade_contract.PERPETUAL].positionAmt)-aim_sell_amount,Ice_value),0))
    }
    if(aim_sell_amount - parseFloat(position[trade_contract.NEXT_QUARTER].positionAmt) < -Trade_value){
        trade(trade_contract.NEXT_QUARTER, 'SELL', _N(parseFloat(ticker[trade_contract.NEXT_QUARTER].bidPrice)*0.99,pricePrecision), _N(Math.min(parseFloat(position[trade_contract.NEXT_QUARTER].positionAmt)-aim_sell_amount,Ice_value),0))
    }
    if(-2*aim_sell_amount - parseFloat(position[trade_contract.CURRENT_QUARTER].positionAmt) > 2*Trade_value){
        trade(trade_contract.CURRENT_QUARTER, 'BUY', _N(parseFloat(ticker[trade_contract.CURRENT_QUARTER].askPrice)*1.01,pricePrecision), _N(-2*Math.min(aim_sell_amount-parseFloat(position[trade_contract.CURRENT_QUARTER].positionAmt),Ice_value),0))
    }
}

function main() {
    updateAccount()
    updatePosition()
    while(true){
        updateTicker()
        updatePosition()
        onTicker()
        updateStatus()
        Sleep(1*1000)
    }
}

Relationnée

Plus de

Le chant de DingPourquoi ne pas avoir accès aux informations de votre compte?

En haut et en bas.Si vous comptez la différence en termes de prix d'achat/vente, est-il possible d'optimiser la différence, car la valeur de la transaction est probablement beaucoup plus grande que la valeur de la transaction, ce qui signifie que le coût réel est beaucoup plus élevé que le prix de la transaction.

Marque déplacéePourquoi diff_sell prend deux bidPrice-askPrice et diff_buy deux askPrice-bidPrice?

L'automne et l'étéJe suis un homme!

Je vous en prie.Le chapeau sacré du dieu des herbes

gavin.abcIl y a des centaines de milliers d'enfants dans le monde.

Je vous en prie.Le dieu des herbes