Chiến lược Binance 2: Loại bỏ điểm cao và điểm thấp

Tác giả:Số lượng lớp học, Ngày: 2020-04-09 21:44:22
Tags:Binance

Cảm ơn chiến lược công khai của FMZ, cảm ơn sự hỗ trợ của lính canh! Ông đã thực hiện hai thay đổi: 1, vì nhiều người bạn mặc định là 10 lần và 20 lần đòn bẩy, và chiến lược này là chế độ toàn bộ, một tiền tệ bùng nổ, sẽ bị phá hủy. Vì vậy, thêm vào một số tiền Max_amount, số tiền mua đơn lẻ sẽ không vượt quá con số này, ngăn chặn bùng nổ. 2, nếu có một đợt tăng và giảm trong bể đồng tiền, ví dụ như một đồng tiền độc đáo, dễ dàng kéo mọi người xuống nước, chiến lược tổng thể dễ dàng thất bại. Vì vậy, khi tôi tính toán chỉ số, tôi loại bỏ điểm số cao nhất và loại bỏ điểm số thấp nhất, kết quả chỉ số công bằng hơn. Trong khi đó, một số người cho rằng đồng tiền đặc biệt sẽ trở lại bình thường hoặc có thể được mua như bình thường. Lưu ý: do giới hạn về điều kiện, chính sách này không được kiểm tra lại, chỉ để tham khảo và không chịu trách nhiệm về bất kỳ tổn thất nào!

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.
  • Mã chiến lược và các tham số mặc định chỉ dành cho nghiên cứu, hoạt động thực tế cần thận trọng và tự chịu rủi ro.
  • 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ác chiến lược cần phải được thực hiện theo mô hình toàn kho.Chiến lược hỗ trợ Binance, tạo robot bằng cách 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.

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

Các đồng tiền giá cao hơn chỉ số giá Bitcoin, và thấp hơn chỉ số, càng sai, thì vị trí càng lớn.img

Logic chiến lược

1. cập nhật thị trường và tài khoản lưu trữ, lần đầu tiên chạy sẽ ghi lại giá ban đầu ((tiền tệ mới được thêm vào được tính theo thời gian gia nhập) 2. Cập nhật chỉ số, chỉ số là đồng xu - chỉ số giá Bitcoin = mean(sum((giá đồng xu / giá Bitcoin) / ((giá đồng xu / giá Bitcoin)))) 3. Xác định vị trí dựa trên chỉ số sai lệch 4. Đặt hàng, số lượng đặt hàng được Ice Mountain ủy thác, theo giá giao dịch đối thủ (mua bán một giá).Bạn sẽ thấy rất nhiều đơn hàng bị hủy bỏ, bình thường. 5.再次循环

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

img

  • Trade_symbols: đồng tiền giao dịch, cần tự sàng lọc dựa trên nền tảng nghiên cứu của mình, cũng có thể tham gia BTC
  • Trade_value: Đồng xu không giữ giá trị, cần phải được quyết định dựa trên tổng số vốn đầu tư của mình, có thể xem kích thước đòn bẩy bằng cách kiểm tra lại môi trường nghiên cứu
  • Adjust_value: Giá trị hợp đồng (USDT) điều chỉnh giá trị sai lệch, điều chỉnh quá chậm, 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, chỉ cần chọn nhỏ nhất trong Adjust_value/Ice_value
  • Reset: Đặt lại dữ liệu lịch sử

Rủi ro chiến lược

Lưu ý rằng nếu một đồng tiền ra khỏi thị trường độc lập, ví dụ như tăng nhiều lần so với chỉ số, sẽ tích lũy nhiều vị trí trống trên đồng tiền đó, và sự sụt giảm lớn tương tự cũng sẽ làm cho chiến lược nhiều hơn.


//向上偏离最大的币的索引
var highIndex=0;
//向下偏离最大的币的索引
var lowIndex=0;

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 assets = {}
var trade_info = {}
var exchange_info = HttpQuery('https://fapi.binance.com/fapi/v1/exchangeInfo')
if(!exchange_info){
    Log('无法连接网络')
    return
}
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}

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<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
        assets[trade_symbols[i]].unrealised_profit = 0
    } 
    for(var j=0; j<account.Info.positions.length; j++){
        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)
    
    if(pos.length > 0){
        pos = JSON.parse(exchange.GetRawJSON())
        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 updateIndex(){ //更新指数
    var init_prices = {}
    if(!_G('init_prices') || Reset){
        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')
        var temp = 0
        
        highIndex=0;
        lowIndex=0;
        var highChange;var lowChange;
        //本次计算找出最大偏离的高低分
        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(!init_prices[trade_symbols[i]]){
                Log('添加新的币种',trade_symbols[i])
                init_prices[trade_symbols[i]] = assets[trade_symbols[i]].btc_price 
                _G('init_prices',init_prices)
            }
            assets[trade_symbols[i]].btc_change = _N(assets[trade_symbols[i]].btc_price/init_prices[trade_symbols[i]],4)
            if(i==0){
                highChange=assets[trade_symbols[i]].btc_change;
                lowChange=assets[trade_symbols[i]].btc_change;
            }
            
            if(highChange<assets[trade_symbols[i]].btc_change){
                highChange=assets[trade_symbols[i]].btc_change;
                highIndex=i;
            }
            if(lowChange>assets[trade_symbols[i]].btc_change){
                lowChange=assets[trade_symbols[i]].btc_change;
                lowIndex=i;
            }
        }
        
        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)
            assets[trade_symbols[i]].btc_change = _N(assets[trade_symbols[i]].btc_price/init_prices[trade_symbols[i]],4)
            if(i!=lowIndex&&i!=highIndex){ //去掉高低分的影响
                temp += assets[trade_symbols[i]].btc_change
            }
        }
        //因为去掉了最高最低分,所以减2
        index = _N(temp/(trade_symbols.length-2), 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
    }
    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)
    }
    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))
        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: ['Symbol', 'amount', 'hold_price',  'price', 'diff', 'value', 'margin', 'unrealised_profit'],
             rows: []}
        var infoList;
    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)
        if(i==lowIndex){
           infoList = [symbols[i]+"Low", 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)]    
        }else if(i==highIndex){
           infoList = [symbols[i]+"High", 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)]
        }else{
           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 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,1)
        
        if(i!=lowIndex&&i!=highIndex){ //高低分的货币不交易
           if(aim_value - assets[symbol].ask_value > Adjust_value&&assets[symbol].ask_value<Max_amount){
              trade(symbol,'buy', aim_value - assets[symbol].ask_value)
           }
           if(aim_value - assets[symbol].bid_value < -Adjust_value&&assets[symbol].bid_value<Max_amount){
              trade(symbol,'sell', -(aim_value - assets[symbol].bid_value))
           }
        }
    }
}

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

Có liên quan

Thêm nữa

813380629Có bao nhiêu khoản đầu tư có thể được sử dụng cho một khoản đầu tư như vậy?

Số lượng lớp họcĐây là giá trị nắm giữ lớn nhất của một đồng tiền.

Những đám mây nhẹXin chào, tôi có một câu hỏi. Max_amount Đây là giá trị nắm giữ tối đa hoặc số tiền bảo hiểm tối đa cho mỗi cặp giao dịch?