Biên An hợp đồng bướm (Chiến lược chiến tranh hàng ngàn quân đội 3)

Tác giả:Cỏ nhỏ, Ngày: 2020-09-09 13:45:11
Tags:Lòng cheBinance

Trong khi đó, các nhà nghiên cứu cũng cho rằng, các chiến lược này có thể được sử dụng trong các hoạt động kinh doanh.https://www.fmz.com/digest-topic/6102

Bạn cần phải đọc hết hướng dẫn này, không thể chạy trên máy tính không có não. Mã chính sách chỉ để tham khảo, thay đổi khi cần, chào đón phản hồi.

Nguyên tắc chiến lược

Các hợp đồng tiền điện tử như BTC và ETH có ba hợp đồng đồng thời, đó là BTCUSD_PERP, BTCUSD_200925 trong quý và BTCUSD_201225 trong quý.

Hợp đồng vĩnh cửu có thể được sử dụng như là hiện tại, thường hai hợp đồng được bảo hiểm với tổng số ba chênh lệch: trong mùa - vĩnh cửu, mùa sau - vĩnh cửu, mùa sau - vĩnh cửu.

Các tham số chiến lược

  • Các loại tiền tệ giao dịch: cần có cùng một lúc ba giống duy trì, mùa và mùa tiếp theo.
  • Số đơn vị sau: Số đơn vị sau của mỗi lưới.
  • Mức giá mở lưới: mỗi khi sai một mức giá, làm nhiều hơn hoặc làm trống một.
  • Phân số phẳng chênh lệch Alpha: được sử dụng để tính giá chênh lệch trung bình, có thể được sử dụng mặc định hoặc tự kiểm tra.
  • Số lượng giao dịch của Ice Mountain: Nếu số lượng giao dịch mở quá lớn, để giảm hiện tượng một chân, bạn có thể thiết lập số lượng giao dịch mở tối thiểu mỗi lần, nhược điểm là đánh giá chênh lệch không kịp thời. Không cần giao dịch của Ice Mountain.

Nếu đường trung bình của chênh lệch giá là 100, chênh lệch giá hiện tại là 200, số đơn hàng tiếp theo là 2, giá chênh lệch đơn hàng mở lưới là 30, thì tại thời điểm này, nắm giữ là: 6 đơn vị trống trong quý tiếp theo, 6 đơn vị trống vĩnh viễn, 12 đơn vị trong mùa đó. Không rõ có thể xem mã cụ thể.

Lưu ý

  • Tỷ lệ giao dịch đòi hỏi một cách đơn phương, tức là giữ nhiều không gian cùng một lúc.
  • Chứng khoán là một mô hình toàn bộ.
  • Chiến lược này không phải là một chiến lược hoạt động vô trí, kiểm tra cẩn thận khi hiểu nguyên tắc.
  • Các bài nghiên cứu sẽ không được xem xét như là một trường hợp thực tế, không cần tối ưu hóa các tham số quá nhiều.
  • Robot không hoạt động trong một thời gian dài và cần phải xây dựng robot mới để ngăn chặn sự chênh lệch giá quá lớn.
  • Các tham số giá chênh lệch thanh toán lưới phải bao gồm phí giao dịch, ví dụ như phí giao dịch đơn là 10.000, giá Bitcoin là 10.000, thì ít nhất phải lớn hơn 8 * 10.000 * 0.0002 = 16, cộng với số dư nhất định, có thể được đặt là 25-30.
  • Tiếp cận giao hàng quý II - mùa, mùa - thời gian khác nhau vĩnh cửu ngày càng lớn, cuối cùng đến gần mùa cuối cùng vĩnh cửu, chiết khấu bướm thực sự là chiết khấu giữa mùa thứ hai và vĩnh cửu, không thể hoạt động, cần phải dừng lại hoặc xem liệu tiếp tục hoạt động trong 2 tuần trước khi giao hàng. Các hợp đồng mở lại cũng được quan sát tương tự.
  • Các đơn đặt hàng dưới đây sử dụng IOC, sẽ được giao dịch ngay lập tức ở mức giá ủy quyền (hoặc giá tốt hơn) và những phần không thể hoàn thành hoàn toàn ngay lập tức sẽ bị hủy bỏ. Vì vậy, không cần phải rút tiền.
  • Chiến lược này cũng có thể được sửa đổi một chút và được thay đổi thành tỷ lệ cược giữa mùa và vĩnh cửu hoặc mùa và vĩnh cửu.
  • Chiến lược này không mở giao dịch thường xuyên và có thể không mở một giao dịch trong một ngày.
  • Trong khi đó, các nhà phân tích khác cũng cho biết, robot mới chỉ bắt đầu tính giá chênh lệch trung bình khi nó mới bắt đầu hoạt động.
  • Các chiến lược có thể được tự tối ưu hóa vì một chân gây ra không thể giao dịch.
  • Giá trượt thêm đơn giản, không ảnh hưởng nhiều đến số lượng giao dịch mở nhỏ, số lượng giao dịch mở lớn cần phải tối ưu hóa bản thân, chẳng hạn như ủy quyền núi băng.

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

Có liên quan

Thêm nữa

Đinh ca hátTại sao bạn không thể truy cập thông tin tài khoản?

Nhấp cao và hạ thấp.Nếu tính theo giá bán mua, liệu chúng ta có thể tối ưu hóa nó không, bởi vì giá trị thương mại có thể lớn hơn giá bán mua, và sau đó sẽ trở thành chi phí thực sự cao hơn giá bán mua.

Brand_MovedTại sao diff_sell lấy hai bidPrice-askPrice và diff_buy lấy hai askPrice-bidPrice?

Mùa thu và mùa hèĐáng sợ!

Ồ.Chén thánh của thần thảo mộc

gavin.abcChú trời cỏ là một kẻ bạo lực (tạm dịch: "đánh tiếng")!!!

jingfengzThần Cỏ