Beian-Kontrakt-Schmetterlings-Sortiment (Tausendkriegsstrategie 3)

Schriftsteller:Das Gras, Datum: 2020-09-09 13:45:11
Tags:HeckeBinance

Bei der Einführung von Binance-Schmetterlings-Spar-Strategien kann man sich nicht zurückziehen.https://www.fmz.com/digest-topic/6102

Sie müssen dieses Handbuch lesen, es ist nicht möglich, ohne Gehirn zu laufen.

Die Strategie

Bei den Bitcoin-Nebenkontrakte, wie BTC, ETH und anderen, gibt es drei gleichzeitige Kontrakte, nämlich BTCUSD_PERP, BTCUSD_200925 im Vorquartal und BTCUSD_201225 im Nachquartal.

Dabei handelt es sich um einen dauerhaften Vertrag, bei dem zwei Kontrakte in der Regel zu drei Differenzen abgesichert werden: in der Saison - dauerhaft, im Nachquartal - dauerhaft, im Nachquartal - dauerhaft. Die Schmetterlingsspanne erfordert die Ausführung von drei Kontrakten, wobei die Differenz ist ((Nachquartal - dauerhaft) - ((Nachquartal - dauerhaft), d.h. Differenz = Nachquartal + dauerhaft-2* in der Saison.

Strategieparameter

  • Handelswährungen: Es müssen gleichzeitig drei verschiedene, dauerhafte, saisonale und nachjährige Sorten vorhanden sein.
  • Anzahl der Blätter: Anzahl der Blätter in jedem Gitter.
  • Die Netze eröffnen Differenzpreise: Jedes Mal, wenn ein Differenzpreis abweicht, machen Sie mehr oder machen Sie einen leeren.
  • Differenz-Gleichungsparameter Alpha: Für die Berechnung des Durchschnittswerts der Differenz verwendet, kann standardmäßig verwendet werden oder selbst überprüft werden.
  • Eisberg Auftragszahlen: Wenn die Anzahl der geöffneten Positionen zu groß ist, um das Phänomen der Einbeinung zu reduzieren, kann die minimale Anzahl der geöffneten Positionen pro Mal festgelegt werden.

Wenn die Durchschnittslinie der Differenz 100 ist, die aktuelle Differenz 200 ist, die Anzahl der nächsten Aufträge 2 ist, die Netzausgabe Differenz 30 ist, dann ist die Haltung zu diesem Zeitpunkt: Nachquartal 6 Leerstände, dauerhaft 6 Leerstände, in der Saison 12 mehr.

Hinweis

  • Die Transaktionsrate erfordert etwa einseitiges Halten, d.h. mehrere Flächen gleichzeitig.
  • Die Garantie ist in einem vollständigen Modell.
  • Diese Strategie ist nicht eine Strategie, die ohne Gehirn funktioniert, und wird sorgfältig getestet, wenn man die Prinzipien versteht.
  • Die Rezension von Forschungsartikeln ist nicht realistischer Art und erfordert keine übermäßige Optimierung der Parameter.
  • Die Roboter sind lange nicht in Betrieb, und es ist notwendig, neue Roboter zu bauen, um zu verhindern, dass der Preisunterschied zu groß ist.
  • Der Nettozahlungsunterschied muss die Gebühren abdecken, z. B. eine Gebühr von 2 000 USD, ein Bitcoin-Preis von 10000 USD, mindestens größer als 8*10000*0.0002=16, plus ein bestimmter Restbetrag, der auf 25-30 festgelegt werden kann.
  • Der Zeitunterschied zwischen der Lieferung der zweiten Quartalszeit - der gleichen, der gleichen - dauerhaften wird größer und größer, und schließlich ist die Periode nahe der dauerhaften, die Schmetterlingsquote ist in der Tat die Quote zwischen der zweiten Quartalszeit und der dauerhaften und kann nicht ausgeführt werden, und muss zwei Wochen vor der Lieferung gestoppt oder beobachtet werden, ob sie fortgesetzt wird.
  • Bei der Anwendung der IOC wird der Teil, der sofort zu einem Auftragspreis (oder einem günstigeren Preis) abgewickelt werden kann, abgesagt, wenn er nicht sofort vollständig abgewickelt werden kann.
  • Die Strategie kann leicht modifiziert werden, um die Differenz zwischen aktuellen und dauerhaften oder nachquartigen und dauerhaften zu ändern.
  • Die Strategie besteht darin, nicht häufig und möglicherweise auch nicht einmal am Tag eine Position zu eröffnen.
  • Der Roboter beginnt mit der Berechnung der durchschnittlichen Differenz erst, wenn er gerade erst in Betrieb ist, ohne auf die Geschichte zurückzugehen.
  • Die Strategie kann sich wahrscheinlich selbst optimieren, da sie aufgrund der fehlenden Transaktion mit einem einzigen Bein verursacht wird.
  • Die niedrigere und die niedrigere Preislage beeinflusst die Anzahl der kleinen Anlagen wenig. Für große Anlagen muss man sich selbst optimieren, wie zum Beispiel beim Eisberg-Auftrag.

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

Verwandt

Mehr

Ding singt.Was ist der Grund, warum ich keine Zugangsdaten habe?

Hohe Aufnahme und niedrige AbwurfDie Differenz, wenn man sie auf Kauf-Verkauf-Preis berechnet, kann man optimieren, weil der Trade-Value wahrscheinlich viel größer ist als der Kauf-Verkauf-Preis, und dann wird die tatsächliche Kosten deutlich höher als der Kauf-Verkauf-Preis.

Marke_bewegtWarum nimmt diff_sell zwei bidPrice-askPrice und diff_buy zwei askPrice-bidPrice?

Die Frühling ist unbekanntDas ist ein Riesenspiel!

Ich weiß nicht.Die heilige Tasse des Grasgottes

gavin.abcDer Grasherb ist mächtig.

- Das ist Jingfengz.Die Grassgötter