Binance Sustainable Multicurrency Hedging Strategy (англ. Binance Sustainable Multicurrency Hedging Strategy) (англ. Binance Sustainable Multicurrency Hedging Strategy) (англ. Binance Sustainable Multicurrency Hedging Strategy) (англ. Binance Sustainable Multicurrency Hedging Strategy) (англ. Binance Sustainable Multicurrency Hedging Strategy) (англ. Binance Sustainable Multicurrency Hedging Strategy) (англ. Binance Sustainable Multicurrency Hedging Strategy) (англ.

Автор:Трава, Дата: 2020-04-03 11:12:31
Тэги:Binance

Важная информация!

  • Это исследование стоит посмотреть.https://www.fmz.com/digest-topic/5294Ознакомьтесь с целым рядом вопросов, таких как принципы стратегии, риски, способы отбора сделок, параметры, соотношение открытых позиций и общего капитала.
  • Предыдущий отчет необходимо скачать и загрузить в собственную исследовательскую среду. Фактические изменения выполняются снова. Если вы уже читали этот отчет и недавно обновили данные за последнюю неделю.
  • Стратегия не может быть ретестована напрямую, она должна быть ретестована в исследовательской среде.
  • Политика кода и параметры по умолчанию предназначены только для исследования, и для работы на дискета требуется осторожность, чтобы решить параметры в соответствии с собственными исследованиями.Риск на себя
  • Стратегия не может быть прибыльной каждый день, можно посмотреть на историю обратного отсчета, 1-2-недельный переход и откат нормальны, и возможно большой обратный отсчет, который нужно правильно обработать.
  • Код является открытым, его можно изменить самостоятельно, если есть какие-либо проблемы, добро пожаловать на комментарии и отзывы, лучше присоединиться к группе разработчиков Binance (в докладе есть способ присоединения), чтобы получить уведомления об обновлениях.
  • Стратегия должна работать в режиме полного хранения, не устанавливать двунаправленное хранение, стратегия поддерживает только фьючерсы на биржах, создавая робот с парой по умолчанию и циклом линии K, стратегия не используется для линии K.
  • Тактика и другие тактики, а также ручные действия конфликтуют, и необходимо обратить внимание на это.
  • Для работы на реальном диске требуется зарубежный хост, на тестовом этапе можно арендовать сервер Ali Cloud Hong Kong на платформе одним щелчком мыши, чтобы аренда была дешевле в месяц ((просто минимальная конфигурация, развертывание учебника:https://www.fmz.com/bbs-topic/2848 )
  • Фьючерсы и наличные должны быть добавлены отдельно.Futures_Binance

Принципы стратегии

Стратегия распределяет эквиваленты на выбранные на случайный случай кошельки кошельков, в то же время эквивалентные позиции используются для хеджирования биткойнов, снижая риск и волатильность. По мере колебаний цены постоянно корректируются позиции, чтобы сохранить постоянные цены на вакуумных позициях и эквивалентные многоглавые позиции.По сути дела, козырь - это индекс цен на биткоин.‒ Последние два месяца ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒

Стратегия по умолчанию заключается в том, чтобы сделать больше биткойнов, чтобы сделать копия, а вы можете сделать обратное (если вы считаете, что копия находится внизу), чтобы принять решение самостоятельно.

img

Стратегическая логика

1. Обновление рынка и счета 2. Обновление валовых позиций для каждой копейки с целью определения необходимости корректировки валовых позиций 3. Обновление позиций с общим вакансией, определение многоличных позиций и определение необходимости их корректировки 4. Заказ и количество заказов определяются по поручению Айсхамы, в соответствии с ценой контракта ("купить и продать по цене").После подачи заказа немедленно аннулировать (так что вы увидите много неудачных аннулирований заказа 400: {code:-2011,msg:Unknown order sent.}, нормальное явление) 5.再次循环

Определяет, что длинные символы и короткие символы являются двойными, что длинные символы и короткие символы являются двойными, что длинные символы и короткие символы являются двойными.

Если только пустые BTC, плюс TRX, DASH, ONT, QTUM, Trade_value 50, то TRX, DASH, ONT, QTUM имеют множество позиций 50, а BTC имеет пустые позиции 50*4.

Если только больше BTC, пустой TRX, DASH, ONT, QTUM, Trade_value 50, то TRX, DASH, ONT, QTUM имеют 50 пустых позиций, а BTC имеет более 50*4 позиций.

Левардж в статусе - это сумма, которая не должна быть слишком высокой.

Параметры стратегии

img

  • Short_symbols: пустые монеты, разделенные козырями, козырями
  • Long_symbols: больше монет, также можно оставить пустые, без хеджирования, прямо пустые.
  • Trade_value: наличие ценности в одной валюте. Также необходимо сделать несколько хеджировок, общая стоимость = 2*Trade_value* - количество наличных валют. Обычно используется 3-5-кратный рычаг, то есть общая стоимость = 3* баланс счета.
  • Adjust_value: стоимость контракта (USDT-оценка) - изменение отклонения, слишком большие изменения медленные, слишком маленькие процедурные сборы слишком высокие, по решению Trade_value; не может быть ниже 20, иначе не достигнут минимальной сделки
  • Ice_value: значение, порученное айсбергу, также не может быть ниже 20, на самом деле выберите меньшее из числа Adjust_value и Ice_value

Стратегические риски

Когда цена недействительной монеты растет, стоимость контракта увеличивается, тогда он уменьшается, а наоборот, прибыль увеличивается. Это позволяет сохранить постоянную стоимость контракта. Цифры вполне вероятно, что они выйдут из независимого рынка, и в настоящее время, если смотреть на годовой цикл, цифры могут быть на дне, а также могут подняться от основания.


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

Связанные

Больше

О, да.А что вы думаете о том, что мы можем сделать, если у нас есть деньги?

wfwfaf1updateAccount (()) требуется if ((pair.slice ((pair.length-4, pair.length) == "USDT") Поскольку существуют контракты busd, при обновлении информации о хранении необходимо определить, является ли это позицией на целевом контракте, необходимо сделать дополнительный вывод. В противном случае информация о нескольких позициях может быть запутанной, что приведет к бесконечному количеству открытий.