Binance sustentabilidade estratégia de hedge multicurrency versão original ((fazer mais sobre queda para fazer mais sobre vazio) 13 de abril atualização módulo de stop loss

Autora:Ervas daninhas, Data: 2020-04-04 21:24:43
Tags:Binance

Esta política já está disponível para o upgrade de cobrança, além do WeChat wangweibing_ustb para mais informações.

Conteúdo importante!

  • É preciso ver este estudo.https://www.fmz.com/digest-topic/5294■ Conheça a estratégia, os riscos, como selecionar os negócios, como definir os parâmetros, a proporção de posições abertas e o total de capital, entre outros.
  • O relatório anterior precisa ser baixado e carregado para o seu próprio ambiente de pesquisa. A modificação real funciona novamente. Se você já leu este relatório, atualize recentemente os dados da última semana.
  • O robô está parado há muito tempo e deve ser reiniciado para reiniciar os dados ou construir um novo robô.
  • As estratégias não podem ser testadas diretamente, elas precisam ser testadas no ambiente da pesquisa.
  • O código de estratégia e os parâmetros padrão são apenas para pesquisa, e o uso de disco físico requer cautela, com base nos parâmetros de sua pesquisa.Risco próprio
  • A estratégia não pode ser lucrativa todos os dias, olhando para a história, 1 a 2 semanas de crossovers e retrações são normais e precisam ser tratadas corretamente.
  • O código é aberto e pode ser modificado por si mesmo, se houver algum problema, os comentários e comentários são bem-vindos, é melhor se juntar ao grupo de Inventor Binance (há um método para se juntar aos relatórios de pesquisa) para receber notificações de atualizações.
  • A estratégia só suporta futuros em moeda de câmbio, e precisa funcionar em modo de estoque completo, não configure o estoque bidirecional!!, quando o robô é criado, o par de negociações padrão e o ciclo da linha K são usados, a estratégia não é usada para a linha K.
  • A estratégia e as outras estratégias, bem como as operações manuais, são conflitantes e precisam de atenção.
  • O disco físico precisa de um administrador estrangeiro para operar, e na fase de teste, é possível alugar o servidor Ali Cloud Hong Kong em um clique na plataforma, sendo o aluguel mensal mais barato (a configuração mínima é necessária, implementação de tutoriais:https://www.fmz.com/bbs-topic/2848)
  • Os futuros e os atuais do yuan precisam ser adicionados separadamente.Futures_Binance
  • A estratégia de reinicialização não afeta, mas os novos robôs reescreverão os dados históricos.
  • A política pode ser atualizada com base nos comentários dos usuários, usando diretamente Ctrl + A para copiar o código coberto (geralmente não se atualizam os parâmetros) e reiniciar o bot para usar o código mais recente.
  • A estratégia não é negociada no início, a primeira vez que é iniciada é necessária a gravação de dados, é necessário esperar que o mercado mude para negociar.

Atualização de 4.16

Modificou um bug para parar o dano

A mudança de parâmetros padrão:

var Alpha = 0.001 //指数移动平均的Alpha参数,设置的越大,基准价格跟踪越敏感,最终持仓也会越低,降低了杠杆,但会降低收益,具体需要根据回测结果自己权衡
var Update_base_price_time_interval = 60 //多久更新一次基准价格, 单位秒,和Alpha参数相关,Alpha 设置的越小,这个间隔也可以设置的更小

4.13 Atualizações

A configuração Stop_loss é de 0,8 para indicar quando o capital atinge menos de 80% do capital inicial, um stop-loss, esvaziar todas as posições e parar a estratégia. Com a estratégia em execução, o Stop_loss pode ser definido maior do que 1 (reiniciar efetivamente), por exemplo, de 1000 para 1500, o Stop_loss é definido como 1.3, e retorna para 1300 yuan. Não se quer um stop-loss.

Max_diff e Min_diff limitam o grau de desvio, que precisa ser determinado por si mesmo com base no seu próprio valor comercial, capital total e capacidade de aceitação de riscos.

Para dar um exemplo simples, se um total de 20 moedas for negociado, uma delas vai crescendo até o desvio de 0,4 e deixa de ser negociada, enquanto as outras moedas ficam inalteradas, perdendo 7 vezes o valor do trade.

var Stop_loss = 0.8 
var Max_diff = 0.4 //当偏差diff大于0.4时,不继续加空仓, 自行设置
var Min_diff = -0.3 //当diff小于-0.3时,不继续加多仓, 自行设置

4.10 Atualizações

Copiar o código da política para a política local, cobrir diretamente a salvação, reiniciar a máquina para funcionar e manter o local original.

A estratégia de superação e superação é importante para otimizar o código do notebook:https://www.fmz.com/bbs-topic/5364

O principal problema é o contraste entre o preço mais recente e o preço inicial do lançamento da estratégia, que cresce com o tempo e se desvia cada vez mais, uma moeda pode ter muitas posições, é muito arriscada e acabará tendo muitas posições, aumentando o risco e o recuo.

O último índice de moeda de caça = mean ((sum)) / EMA ((minha moeda de caça / preço do bitcoin))), que é comparado com o preço da linha de equilíbrio, é capaz de acompanhar as últimas mudanças de preço, é mais flexível, e a retrospecção é encontrada para reduzir a estratégia de detenção e também reduzir o retorno. Mais estável.

Para uma atualização sem problemas, dois dos parâmetros são escritos nas primeiras duas linhas do código da estratégia e são alterados conforme necessário.

O parâmetro alfa do equilíbrio móvel do índice Alpha = 0.04, quanto maior for a configuração, mais sensível será o acompanhamento do preço de referência, menos negociações serão feitas e a posse final também será menor, reduzindo a alavancagem, mas reduzindo os ganhos, reduzindo o retorno máximo, podendo aumentar o volume de negociações, que precisam ser compensados com base nos resultados da retrospectiva. Update_base_price_time_interval = 30*60 Quanto mais tempo é necessário para atualizar um preço de referência, por segundo, e está relacionado ao parâmetro Alpha, o menor é o intervalo que pode ser configurado.

Se você está lendo o artigo e quer negociar em todas as moedas, aqui está a lista.ETH,BCH,XRP,EOS,LTC,TRX,ETC,LINK,XLM,ADA,XMR,DASH,ZEC,XTZ,BNB,ATOM,ONT,IOTA,BAT,VET,NEO,QTUM,IOST

Junte-se ao grupo de WeChat para obter atualizações sobre a batalha de grupos de Bitcoin.

A seguir, um micro-signal para responder a uma mensagem de Bitcoin que é automaticamente puxada para o grupo:

https://www.fmz.comimg

Princípios estratégicos

A moeda que está acima do preço do índice de preço do Bitcoin-Cash, a moeda que está abaixo do índice, o maior o desvio, o maior o posicionamento.img

Lógica estratégica

1. atualizar o mercado e a conta de depósito, a primeira vez que a operação é registrada o preço inicial (as moedas recém-adicionadas são calculadas de acordo com o momento da adição) 2. Atualizar o índice, o índice é o índice de preço do Bitcoin = mean ((sum)) (preço do Bitcoin) / (preço inicial do Bitcoin)) 3. Ocorrer mais vagas de acordo com o índice de desvio, determinar posições de acordo com o tamanho do desvio 4. Encomenda e quantidade de encomenda são decididos por Ice Mountain, de acordo com o preço da transação ("comprar e vender um preço").O pedido será cancelado imediatamente após o envio. Então você verá muitas selas 400: {code:-2011, msg:Unknown order sent.} 5.再次循环

A alavancagem na caixa de estado representa que o valor garantido já foi usado e precisa ser mantido baixo para atender às novas posições abertas.

Parâmetros de estratégia

img

  • Trade_symbols: moedas negociadas, que precisam ser selecionadas por si mesmas com base na plataforma de pesquisa, também podem entrar no BTC
  • Trade_value: O preço do Bitcoin (BTC) tem um valor de 1% por desvio do índice, que deve ser decidido com base no total de capitais investidos e nas preferências de risco, recomendando-se definir como 3-10% do total de capitais. O tamanho da alavancagem pode ser avaliado através de um retrospectivo do ambiente de pesquisa, o Trade_value pode ser menor do que o Adjust_value, por exemplo, metade do Adjust_value, o que equivale ao valor de manutenção de um desvio do índice de 2%.
  • Adjust_value: Adjustamento do valor do contrato. Quando o indicador desvia * Trade_value - Holding atual > Adjust_value, ou seja, a diferença entre o valor do objetivo e o valor atual é superior a esse valor, o negócio começa. Adjustamentos excessivos são lentos e com freqüência muito pequena, não pode ser inferior a 10, caso contrário, não é possível atingir o mínimo de transações, recomendando-se definir para mais de 40% do Trade_value.
  • Ice_value: o valor do iceberg, também não pode ser inferior a 10, na verdade, selecione o menor de Adjust_value e Ice_value, se o maior de fundos pode ser definido relativamente grande, é recomendado que não seja inferior a 20% do Adjust_value, para que 5 vezes o iceberg possa concluir a transação, é claro, quando o Trade_value não é grande, o Ice_value pode ser definido relativamente grande, uma ou duas vezes pode ser ajustado.
  • Interval: tempo de sono rotativo, pode ser definido como um pouco menor, como 1s, mas não pode exceder o limite de frequência de Binance.
  • Reset: restabelece dados históricos, restabelece o preço inicial de referência da política para o preço atual, geralmente sem necessidade de configuração

Risco estratégico

Observe que, se uma moeda sair de um mercado independente, como um aumento de várias vezes em relação ao índice, haverá um grande acúmulo de posições vazias na moeda, e a mesma queda significativa também fará com que a estratégia seja muito mais.




var Alpha = 0.001 //指数移动平均的Alpha参数,设置的越大,基准价格跟踪越敏感,最终持仓也会越低,降低了杠杆,但会降低收益,具体需要根据回测结果自己权衡
var Update_base_price_time_interval = 60 //多久更新一次基准价格, 单位秒,和Alpha参数相关,Alpha 设置的越小,这个间隔也可以设置的更小

//Stop_loss设置为0.8表示当资金达到低于初始资金的80%时,止损,清空所有仓位,停止策略。
//随着策略运行,Stop_loss可以设置大于1(重启生效),比如从1000赚到1500,Stop_loss设置为1.3,则回撤到1300元止损。不想止损可以把这个参数设置的很小。
//风险是大家都用这种止损会形成踩踏,加大亏损。
//初始资金在状态栏的init_balance字段,注意提现等操作会影响,别不小心止损了。
//如果还是怕黑天鹅事件,比如某个币归0等,可以手动提现出来。

var Stop_loss = 0.8 
var Max_diff = 0.4 //当偏差diff大于0.4时,不继续加空仓, 自行设置
var Min_diff = -0.3 //当diff小于-0.3时,不继续加多仓, 自行设置

if(IsVirtual()){
    throw '不能回测,回测参考 https://www.fmz.com/digest-topic/5294 '
}
if(exchange.GetName() != 'Futures_Binance'){
    throw '只支持币安期货交易所,和现货交易所不同,需要单独添加,名称为Futures_Binance'
}
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 update_base_price_time= Date.now()
var assets = {}
var init_prices = {}


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, 
                                                     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, init_balance:0, stop_balance:0, short_value:0, long_value:0, profit:0}

function updateAccount(){ //更新账户和持仓
    exchange.SetContractType('swap')
    var account = exchange.GetAccount()
    var pos = exchange.GetPosition()
    if (!account || !pos){
        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
    } 
    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(trade_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)
    if(assets.USDT.init_balance == 0){
        if(_G('init_balance')){
            assets.USDT.init_balance = _N(_G('init_balance'),2)
        }else{
            assets.USDT.init_balance = assets.USDT.total_balance 
            _G('init_balance',assets.USDT.init_balance)
        }
    }
    assets.USDT.profit = _N(assets.USDT.margin_balance - assets.USDT.init_balance, 2)
    assets.USDT.stop_balance = _N(Stop_loss*assets.USDT.init_balance, 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(trade_symbols.indexOf(coin) < 0){continue}
            if(pos[k].positionSide != 'BOTH'){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(){ //更新指数
    
    if(!_G('init_prices') || Reset){
        Reset = false
        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')
        if(Date.now() - update_base_price_time > Update_base_price_time_interval*1000){
            update_base_price_time = Date.now()
            for(var i=0; i<trade_symbols.length; i++){ //更新初始价格
                init_prices[trade_symbols[i]] = init_prices[trade_symbols[i]]*(1-Alpha)+Alpha*(assets[trade_symbols[i]].ask_price+assets[trade_symbols[i]].bid_price)/(assets.BTC.ask_price+assets.BTC.bid_price)
            }
            _G('init_prices',init_prices)
        }
        var temp = 0
        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(!(trade_symbols[i] in init_prices)){
                Log('添加新的币种',trade_symbols[i])
                init_prices[trade_symbols[i]] = assets[trade_symbols[i]].btc_price / index
                _G('init_prices',init_prices)
            }
            assets[trade_symbols[i]].btc_change = _N(assets[trade_symbols[i]].btc_price/init_prices[trade_symbols[i]],4)
            temp += assets[trade_symbols[i]].btc_change
        }
        index = _N(temp/trade_symbols.length, 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
    }
    assets.USDT.short_value = 0
    assets.USDT.long_value = 0
    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)
        if(trade_symbols.indexOf(coin) < 0){continue}
        if(assets[coin].amount<0){
            assets.USDT.short_value += Math.abs((assets[coin].ask_value+assets[coin].bid_value)/2)
        }else{
            assets.USDT.long_value += Math.abs((assets[coin].ask_value+assets[coin].bid_value)/2)
        }
        assets.USDT.short_value = _N(assets.USDT.short_value,0)
        assets.USDT.long_value = _N(assets.USDT.long_value,0)
    }
    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)+1)
        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) //订单会立即撤销
    }
    return 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, 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 stopLoss(){ //止损函数
    while(true){
        if(assets.USDT.margin_balance < Stop_loss*assets.USDT.init_balance && assets.USDT.init_balance > 0){
            Log('触发止损,当前资金:', assets.USDT.margin_balance, '初始资金:', assets.USDT.init_balance)
            Ice_value = 200 //止损的快一些,可修改
            updateAccount()
            updateTick()
            var trading = false //是否正在交易
            for(var i=0; i<trade_symbols.length; i++){
                var symbol = trade_symbols[i]
                if(assets[symbol].ask_price == 0){ continue }
                if(assets[symbol].bid_value >= trade_info[symbol].minQty*assets[symbol].bid_price){
                    trade(symbol, 'sell', assets[symbol].bid_value)
                    trading = true
                }
                if(assets[symbol].ask_value <= -trade_info[symbol].minQty*assets[symbol].ask_price){
                    trade(symbol, 'buy', -assets[symbol].ask_value)
                    trading = true
                }
            }
            Sleep(1000)
            if(!trading){
                throw '止损结束,如果需要重新运行策略,需要调低止损'
            }
        }else{ //不用止损
            return
        }
    }    
}

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,3)
        if(aim_value - assets[symbol].ask_value >= Adjust_value && assets[symbol].btc_diff > Min_diff && assets.USDT.long_value-assets.USDT.short_value <= 1.1*Trade_value){
            trade(symbol,'buy', aim_value - assets[symbol].ask_value)
        }
        if(aim_value - assets[symbol].bid_value <= -Adjust_value && assets[symbol].btc_diff < Max_diff && assets.USDT.short_value-assets.USDT.long_value <= 1.1*Trade_value){
            trade(symbol,'sell', -(aim_value - assets[symbol].bid_value))
        }
    }
}

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

Relacionados

Mais.

Tiagombalsa@tmbs95 Liga-me ao telegrama, interessado.

A noiva também.A função onTick () tem uma linha como esta, assets.USDT.long_value-assets.USDT.short_value <= 1.1*Trade_value, eu entendo que foi definida para evitar desequilíbrios de espaço excessivos.

MikelslO WeChat não está disponível?

Capital da cadeia de créditoMax_diff e Min_diff não devem ser 0.04 e -0.03?

A Força Aérea nunca será escrava.Dê um pouco de sol a este círculo fechado.

Ervas daninhas/upload/asset/1b39347a88aa4cff916.jpg

Quantificação de turmasA estratégia do BNB é eliminar o BNB, uma transação que o BNB quer atrair, e estima-se que seja superada; não podemos ver isso com o olhar histórico.

A noiva também.O que é que isso significa?

A noiva também.Uma moeda sai de um mercado independente, e esta configuração de equilíbrio de mais espaço evita grandes perdas, por isso decide não desequilibrá-lo. Apenas pode encontrar maneiras de abrir uma lista de hedge.

Ervas daninhasErrado, wangweibing_ustb

ishangsanNa verdade, olhe para o código e saiba o resultado do teste de retorno de todas as moedas, não precisa se preocupar. Ao se juntar, Alpha = 0.05, adicione o LINK, ETC, BNB, o retorno inicial da história é de 3%, o retorno máximo do mercado extremo é de menos de 25%, Trade_Value usa 3% de segurança em todas as moedas.