Futures_Binance
Strategi ini akan mengalihkan ekuivalen untuk menjadi satu simpanan simpanan keranjang yang dipilih secara percuma, sementara kedudukan ekuivalen untuk menjadi liputan bitcoin, mengurangkan risiko dan turun naik. Dengan turun naik harga, terus menyesuaikan kedudukan untuk mengekalkan nilai ekuivalen tetap dan kedudukan ekuivalen berbilang.Pada asasnya, indeks harga Bitcoin adalah indeks mata wang palsu.◎ Performa dalam dua bulan kebelakangan ini (Leverage kira-kira 3 kali ganda, data dikemas kini kepada 4.8), Bitcoin telah meningkat berbanding Bitcoin dalam minggu kebelakangan ini, oleh itu kerugian, jika anda melihat lebih banyak Bitcoin, anda boleh menetapkan untuk membuat Bitcoin menjadi lebih banyak Bitcoin dalam parameter:
Strategi lalai adalah melakukan banyak bitcoin untuk membuat kripto, anda juga boleh sebaliknya (jika anda fikir kripto berada di bahagian bawah) dan membuat keputusan sendiri.
1. Mengemas kini saham dan akaun simpanan
2. Mengemas kini nilai pegangan kosong setiap syiling untuk menentukan sama ada pegangan kosong perlu disesuaikan
3. Mengemas kini kedudukan kosong keseluruhan, menentukan pegangan berbilang dan menentukan sama ada kedudukan berbilang perlu disesuaikan
4. Memesan, jumlah pesanan yang akan datang akan ditentukan oleh Ice Mountain, mengikut harga transaksi (membeli dan menjual satu harga).Perintah ini akan ditarik balik dengan segera selepas pesanan di bawah. Jadi anda akan melihat banyak fail 400: {
Untuk menentukan nilai perdagangan yang lebih tinggi, nilai permulaan setiap mata wang yang lebih tinggi adalah nilai perdagangan, dan nilai kontrak setiap mata wang yang lebih rendah adalah purata nilai yang diperlukan untuk lindung nilai.
Jika hanya BTC kosong, lebih TRX, DASH, ONT, QTUM, dan Trade_value adalah 50, maka TRX, DASH, ONT, QTUM mempunyai lebih banyak kedudukan 50, dan BTC memegang kedudukan kosong 50 * 4.
Jika hanya ada lebih BTC, TRX kosong, DASH, ONT, QTUM, dan Trade_value adalah 50, maka TRX, DASH, ONT, dan QTUM mempunyai 50 kosong, dan BTC memegang lebih banyak 50 * 4.
Leverage dalam status yang diletakkan di atas adalah untuk menunjukkan bahawa mata wang jaminan telah digunakan secara perbandingan dan tidak boleh terlalu tinggi.
Apabila harga mata wang kosong meningkat, nilai kontrak meningkat, pada masa ini adalah penurunan, sebaliknya keuntungan adalah kenaikan. Ini menjadikan nilai kontrak keseluruhan tetap stabil. Mata wang simpanan sangat mungkin keluar dari pasaran bebas, pada masa ini dari satu tahun, mata wang simpanan mungkin berada di bahagian bawah, dan mungkin meningkat dari bahagian bawah.
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) } }
Oh, Tuhan.Adakah harga terhad di bawah harga biasa atau harga pasaran?
wfwfaf1UpdateAccount (() diperlukan if ((pair.slice ((pair.length-4, pair.length) == "USDT") Oleh kerana terdapat kontrak busd, perlu menentukan sama ada kedudukan kontrak sasaran atau tidak apabila mengemas kini maklumat simpanan. Jika tidak, banyak maklumat kedudukan akan menjadi bercampur-campur, menyebabkan pembayaran tanpa had.