Binance sustentable estrategia de cobertura de monedas múltiples (Indice de monedas muertas o muertas) 10 de abril Mejorado Bug, necesita actualización

El autor:Las hierbas, Fecha: 2020-04-03 11:12:31
Las etiquetas:Binance

¡Esto es importante!

  • Hay que leer este estudio.https://www.fmz.com/digest-topic/5294■ Conocer los principios estratégicos, el riesgo, cómo filtrar las transacciones, cómo establecer los parámetros, el porcentaje de operaciones abiertas y el capital total, entre otros.
  • El último informe de investigación debe ser descargado y subido a su propio entorno de investigación. La modificación real se ejecuta de nuevo. Si ya ha leído este informe, actualice recientemente los datos de la última semana.
  • Las estrategias no pueden ser reevaluadas directamente, deben ser reevaluadas en el entorno de la investigación.
  • El código de la estrategia y los parámetros predeterminados son sólo para investigación, y el funcionamiento del disco físico requiere precaución, basándose en los parámetros de su propia investigación.El riesgo
  • La estrategia no puede ser rentable todos los días, se puede ver el retrospectivo de la historia, 1 o 2 semanas de recurrentes y retractos son normales, y es posible que el retrospectivo sea grande y requiera un tratamiento correcto.
  • El código es abierto, puede ser modificado por usted mismo, si hay algún problema, bienvenido a comentarios y comentarios, es mejor unirse al grupo de Inventor Binance (hay un método para unirse en los informes de investigación) para recibir notificaciones de actualización.
  • La estrategia debe operar en modo de todo el mercado, no se debe configurar el mantenimiento bidireccional, la estrategia solo admite futuros de binan, la estrategia no se utiliza para la línea K.
  • Las tácticas y otras tácticas, así como las operaciones manuales, son conflictivas y deben ser cuidadosas.
  • El disco físico requiere un operador en el extranjero, y durante la fase de prueba, se puede alquilar un servidor de Ali Cloud Hong Kong en la plataforma con un solo clic.https://www.fmz.com/bbs-topic/2848 )
  • Los futuros y los actuales del yuan deben añadirse por separado, y los futuros del yuan se denominanFutures_Binance

Principios estratégicos

La estrategia es dispersar el valor equivalente de una canasta de monedas cascadas al azar, al mismo tiempo que las posiciones equivalentes se arriesgan a los bitcoins, reduciendo el riesgo y la volatilidad.Esencialmente en tiempo real, el índice de precios de las monedas criptográficasEl rendimiento de los últimos dos meses (apalancamiento alrededor de 3 veces, los datos se actualizan a 4.8) en la última semana, las monedas digitales han aumentado con respecto a Bitcoin, por lo que las pérdidas, si miras más monedas digitales, se pueden configurar en los parámetros para hacer Bitcoin más monedas digitales:

La estrategia por defecto es hacer más bitcoins para hacer monedas virtuales, también puedes hacerlo al revés (si crees que las monedas virtuales están en el fondo) y tomar la decisión por ti mismo.

img

La lógica estratégica

1. Actualizar el sector y el mantenimiento de la cuenta 2. Actualizar el valor de las tenencias en blanco de cada moneda para determinar si las tenencias en blanco necesitan ser ajustadas. 3. Actualizar las posiciones de los títulos vacíos totales, determinar las tenencias de varios títulos y determinar si se deben ajustar los títulos de varios títulos. 4. El pedido y la cantidad del pedido son decididos por Ice Mountain, de acuerdo con el precio de transacción (comprar y vender a un precio).Se cancela inmediatamente después de la orden. Así que verá muchas unidades 400: {code:-2011, msg:Unknown order sent.} que han fallado en la cancelación. 5.再次循环

El valor de apertura de cada par de monedas con más o menos de los símbolos cortos y largos es el valor de cada contrato de monedas con menos o más de los símbolos cortos, el valor promedio del valor que se requiere para cubrir el riesgo.

Si solo hay BTC vacío, más TRX, DASH, ONT, QTUM, y el valor de comercio es de 50, entonces TRX, DASH, ONT, QTUM tienen más de 50 posiciones, y BTC tiene 50*4 posiciones vacías.

Si solo hay BTC, TRX, DASH, ONT, QTUM y Trade_value es 50, entonces TRX, DASH, ONT y QTUM tienen 50 vacantes y BTC tiene más posiciones de 50 * 4.

El apalancamiento en la columna de estado representa que el valor garantizado ya está en proporción y no debe ser demasiado alto.

Parámetros de la estrategia

img

  • Short_symbols: monedas en blanco, separadas por puntos y señas
  • Long_symbols: con más monedas, también puede dejar espacio, sin cobertura, directamente en blanco.
  • Trade_value: el valor de la moneda en blanco individual. También se debe realizar una cobertura múltiple, el valor total = 2 * Trade_value * el número de monedas en blanco. Generalmente, se utiliza un apalancamiento de 3-5 veces, es decir, el valor total = 3 * el saldo de la cuenta.
  • Adjust_value: valor del contrato (precio USDT) ajustar el valor de la desviación, demasiado ajuste lento, demasiado pequeño de la tarifa de trámite demasiado alto, según la decisión de Trade_value; no puede ser inferior a 20, de lo contrario no se alcanzará el mínimo de transacción
  • Ice_value: el valor de la montaña de hielo, también no puede ser menor de 20, en realidad selecciona el menor de Adjust_value y Ice_value

El riesgo estratégico

Cuando el precio de las monedas vacías sube, el valor del contrato aumenta, en este momento se rebaja, en cambio, el beneficio es aumentado. Esto mantiene el valor total del contrato constante. Las monedas cómodas tienen muchas posibilidades de salir de un mercado independiente y, en la actualidad, según el ciclo de un año, las monedas cómodas pueden estar en el fondo y pueden subir mucho desde el fondo.


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

Relacionados

Más.

¿Qué es eso?¿Es el precio de venta o el precio de mercado?

el número de unidades de producciónSe requiere en updateAccount (()) Si el nombre de la página es un nombre de usuario, entonces el nombre de la página es un nombre de usuario. Debido a la existencia de contratos busd, se necesita una línea adicional para determinar si se trata de una posición de contrato objetivo cuando se actualiza la información de tenencia. Si no, la información de varias posiciones puede ser confusa, lo que lleva a un número ilimitado de pagos.