Binance Sustainable Multi-currency Hedging Strategy (Định chỉ số đồng tiền ảo) được cải thiện vào ngày 10 tháng 4 Bug, cần cập nhật

Tác giả:Cỏ nhỏ, Ngày: 2020-04-03 11:12:31
Tags:Binance

Nội dung quan trọng!

  • Bạn nên xem nghiên cứu này trước.https://www.fmz.com/digest-topic/5294Bạn có thể tìm hiểu các nguyên tắc chiến lược, rủi ro, cách lọc giao dịch, cách thiết lập các tham số, tỷ lệ đầu tư và tổng vốn.
  • Một báo cáo nghiên cứu trước đây cần phải được tải xuống và tải lên môi trường nghiên cứu của bạn. Thực tế sửa đổi chạy lại. Nếu bạn đã xem báo cáo này, bạn đã cập nhật dữ liệu mới nhất trong tuần gần đây.
  • Chiến lược không thể được kiểm tra trực tiếp, nó cần phải được kiểm tra trong môi trường nghiên cứu.
  • Các mã chiến lược và các tham số mặc định chỉ dành cho nghiên cứu, thực tế là cần thận trọng, dựa trên nghiên cứu của riêng mình quyết định các tham số.Mối nguy hiểm
  • Chiến lược không thể kiếm được lợi nhuận mỗi ngày, nhìn lại lịch sử, 1 - 2 tuần qua lại và rút lại là bình thường, và có thể có nhiều lần quay lại, cần phải được xử lý đúng.
  • Mã là công khai, bạn có thể tự sửa đổi, nếu có bất kỳ vấn đề nào, hãy chào đón phản hồi, tốt nhất là tham gia nhóm tin tức của nhà phát minh (có cách tham gia trong báo cáo nghiên cứu) để được thông báo cập nhật.
  • Chiến lược cần chạy trong chế độ toàn kho, không thiết lập giữ hai chiều, chiến lược chỉ hỗ trợ các hợp đồng tương lai đồng xu, khi tạo robot có thể sử dụng các cặp giao dịch mặc định và chu kỳ đường K, chiến lược không sử dụng đường K.
  • Chiến thuật và chiến thuật khác và hoạt động thủ công là xung đột, cần lưu ý
  • Trong giai đoạn thử nghiệm, người dùng có thể thuê máy chủ Ali Cloud Hong Kong trên nền tảng chỉ bằng một cú bấm, thuê riêng hàng tháng rẻ hơn ((còn cấu hình tối thiểu, triển khai hướng dẫn:https://www.fmz.com/bbs-topic/2848 )
  • Tiền tương lai và tiền mặt của đồng tiền tệ cần được thêm riêng biệt, tiền tương lai của đồng tiền tệ làFutures_Binance

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

Chiến lược này sẽ phân tán giá trị tương đương với một chiếc đồng tiền khoá được chọn không, đồng thời giữ các vị trí tương đương với Bitcoin để giảm rủi ro và biến động.Về cơ bản, thời gian làm tiền ảo - Chỉ số giá BitcoinCác hoạt động trong hai tháng gần đây (tăng đòn bẩy khoảng 3 lần, dữ liệu được cập nhật đến 4.8) trong tuần gần đây, đồng tiền ảo đã tăng so với Bitcoin, do đó mất mát, nếu bạn nhìn vào nhiều đồng tiền ảo, bạn có thể thiết lập trong tham số làm trống Bitcoin làm nhiều đồng tiền ảo:

Phương pháp mặc định là làm nhiều Bitcoin làm tiền ảo, bạn cũng có thể ngược lại (nếu bạn nghĩ rằng tiền ảo ở đáy), quyền quyết định ở bên bạn.

img

Logic chiến lược

1. cập nhật thị trường và tài khoản giữ 2. Cập nhật giá trị nắm giữ trống của mỗi đồng xu, để xác định xem liệu nắm giữ trống có cần điều chỉnh hay không 3. Cập nhật tổng số vị trí trống, xác định nhiều vị trí và quyết định xem có nên điều chỉnh nhiều vị trí hay không 4. Đặt hàng, số lượng đặt hàng được quyết định bởi Ice Mountain theo giá giao dịch đối thủ (mua bán một giá).Đặt hàng ngay lập tức bị hủy bỏ (vì vậy bạn sẽ thấy rất nhiều đơn hàng bị hủy bỏ không thành công 400: {code:-2011,msg:Unknown order sent.}, hiện tượng bình thường) 5.再次循环

Điều này sẽ xác định giá trị giao dịch của mỗi đồng tiền có giá trị giao dịch nhiều hơn, giá trị hợp đồng của mỗi đồng tiền ít hơn là trung bình của giá trị cần được bảo hiểm.

Nếu chỉ có BTC trống, nhiều hơn TRX, DASH, ONT, QTUM, và Trade_value là 50, thì TRX, DASH, ONT, QTUM đều có nhiều hơn 50, và BTC giữ khoảng trống 50 * 4.

Nếu chỉ có nhiều BTC, TRX trống, DASH, ONT, QTUM, và Trade_value là 50, thì TRX, DASH, ONT, QTUM đều có khoảng trống 50, và BTC có nhiều vị trí 50 * 4.

Động thái này có thể được sử dụng để tạo ra một số lượng lớn các khoản đầu tư.

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

img

  • Short_symbols: đồng tiền trống, được tách bằng dấu chấm, dấu chấm
  • Long_symbols: làm nhiều đồng tiền, cũng có thể để trống, không có rủi ro, trống trực tiếp.
  • Trade_value: Một đồng tiền duy nhất giữ giá trị. Bạn cũng phải có nhiều rủi ro, tổng giá trị = 2 * Trade_value * số lượng đồng tiền không. Thông thường sử dụng đòn bẩy 3-5 lần, tức tổng giá trị = 3 * số dư tài khoản.
  • Adjust_value: Giá hợp đồng (USDT) điều chỉnh giá trị sai lệch, điều chỉnh quá chậm, phí quá nhỏ, tùy theo quyết định của Trade_value; không thể thấp hơn 20, nếu không sẽ không đạt được giao dịch tối thiểu
  • Ice_value: giá trị được ủy quyền của tảng băng trôi, cũng không thể thấp hơn 20, thực tế chỉ cần chọn Adjust_value và nhỏ hơn trong Ice_value

Rủi ro chiến lược

Khi giá của đồng tiền không tăng, giá trị hợp đồng tăng, tại thời điểm này là giảm giá, ngược lại là tăng giá. Điều này giúp giá trị hợp đồng tổng thể duy trì ổn định. Đồng tiền ngầm có khả năng ra khỏi thị trường độc lập, hiện nay nhìn từ chu kỳ một năm, đồng tiền ngầm có thể ở đáy và có khả năng tăng lên từ đáy. Tùy thuộc vào cách sử dụng, nếu bạn nhìn tốt về đồng tiền ngầm và cho rằng đã ở đáy, hướng có thể vận hành, làm nhiều chỉ số.


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

Có liên quan

Thêm nữa

Ồ.Có phải giá bán đơn giản hay giá thị trường?

wfwfaf1updateAccount (()) cần if ((pair.slice ((pair.length-4, pair.length) == "USDT") Vì có hợp đồng busd, khi cập nhật thông tin nắm giữ, cần phải quyết định liệu đó có phải là vị trí hợp đồng mục tiêu hay không. Nếu không, thông tin về nhiều vị trí sẽ bị xáo trộn, dẫn đến việc mở hàng vô hạn.