Futures_Binance
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.
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: {
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.
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) } }
¿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.