Kebijakan ini sudah tersedia untuk versi upgrade biaya, ditambah WeChat wangweibing_ustb.
Futures_Binance
Mengubah bug yang menghentikan kerusakan
Perubahan pada parameter default:
var Alpha = 0.001 //指数移动平均的Alpha参数,设置的越大,基准价格跟踪越敏感,最终持仓也会越低,降低了杠杆,但会降低收益,具体需要根据回测结果自己权衡
var Update_base_price_time_interval = 60 //多久更新一次基准价格, 单位秒,和Alpha参数相关,Alpha 设置的越小,这个间隔也可以设置的更小
Stop_loss diatur menjadi 0,8 berarti stop loss ketika dana mencapai 80% dari dana awal, kosongkan semua posisi, stop strategi. Saat strategi berjalan, Stop_loss dapat diatur lebih besar dari 1 (hidup kembali efektif), misalnya dari 1000 yen hingga 1500, Stop_loss diatur menjadi 1,3, maka mundur ke stop loss 1300 yuan. Tidak ingin stop loss dapat mengatur parameter ini sangat kecil. Risiko adalah semua orang akan menggunakan stop loss ini untuk membentuk penetrasi, meningkatkan kerugian.
Max_diff dan Min_diff membatasi tingkat penyimpangan, yang harus ditentukan sendiri berdasarkan nilai perdagangan, total modal, dan kemampuan menanggung risiko.
Sebagai contoh sederhana, jika ada 20 koin yang diperdagangkan, salah satu dari mereka akan naik nilainya hingga deviasi 0,4 dan tidak akan diperdagangkan lagi, sementara yang lain akan tetap sama, kehilangan 7 kali nilai perdagangan.
var Stop_loss = 0.8
var Max_diff = 0.4 //当偏差diff大于0.4时,不继续加空仓, 自行设置
var Min_diff = -0.3 //当diff小于-0.3时,不继续加多仓, 自行设置
Menyalin kode kebijakan ke kebijakan lokal, langsung menutupi save, memulai kembali mesin, dan tetap berada di posisi aslinya.
Di sini, Anda dapat menemukan beberapa tips untuk mengoptimalkan kode notebook:https://www.fmz.com/bbs-topic/5364
Strategi asli indeks koin sandal = mean ((sum)) (((harga koin sandal/harga bitcoin) / ((harga awal koin sandal/harga awal bitcoin))); Masalah terbesar adalah kontras harga terbaru dan harga awal strategi yang diluncurkan, dengan bertambahnya waktu, akan semakin menyimpang, sebuah koin mungkin memegang banyak posisi, berisiko tinggi, dan akhirnya akan memegang banyak posisi, meningkatkan risiko dan mundur.
Indeks Bitcoin terbaru = mean ((sum)) / EMA ((harga Bitcoin) / harga Bitcoin))), yaitu dibandingkan dengan harga pada garis rata, dapat melacak perubahan harga terbaru, lebih fleksibel, retesting ditemukan mengurangi strategi pegangan, juga mengurangi mundur. Lebih stabil. Yang terpenting adalah strategi asli jika ditambah beberapa pasangan perdagangan yang tidak biasa, sangat berisiko, kemungkinan besar akan meledak, tetapi sekarang hampir tidak terpengaruh.
Untuk peningkatan yang mulus, dua parameter ditulis di dua baris pertama kode strategi, dan diubah sesuai kebutuhan.
Alpha = 0.04 parameter indeks pergerakan rata-rata, semakin besar yang diatur, harga acuan yang lebih sensitif untuk dilacak, semakin sedikit yang diperdagangkan, dan akhirnya pegangan juga akan lebih rendah, menurunkan leverage, tetapi akan mengurangi keuntungan, mengurangi mundur maksimum, dapat meningkatkan jumlah perdagangan, secara khusus perlu untuk meneimbang sendiri berdasarkan hasil retesting. Update_base_price_time_interval = 30*60 Lebih lama untuk memperbarui harga acuan, satuan detik, dan terkait dengan parameter Alpha, semakin kecil pengaturan Alpha, semakin kecil interval yang dapat diatur
Jika Anda membaca artikel ini dan ingin berdagang dalam semua mata uang, berikut adalah daftarnya.ETH,BCH,XRP,EOS,LTC,TRX,ETC,LINK,XLM,ADA,XMR,DASH,ZEC,XTZ,BNB,ATOM,ONT,IOTA,BAT,VET,NEO,QTUM,IOST
Dengan menambahkan sinyal di bawah ini, Anda akan langsung ditarik ke dalam kelompok dengan menjawab:
Uang yang akan dibuat kosong lebih tinggi dari indeks harga Bitcoin, lebih rendah dari indeks, semakin besar deviasinya, semakin besar posisinya.
1. memperbarui pasar dan menyimpan akun, pertama kali berjalan akan mencatat harga awal (mata uang baru yang ditambahkan dihitung sesuai dengan waktu yang ditambahkan)
2. Update indeks, indeksnya adalah indeks harga koin-bitcoin = mean(sum((harga koin-bitcoin/harga bitcoin)/ ((harga awal koin-bitcoin/harga awal bitcoin))
3. Menentukan posisi sesuai dengan ukuran deviasi.
4. Memesan, jumlah pesanan berikutnya ditentukan oleh Ice Mountain, sesuai dengan harga transaksi (membeli dengan menjual satu harga).Setelah mengirim pesanan, segera membatalkan (jadi Anda akan melihat banyak gagal membatalkan pesanan 400: {
Leverage dalam status binary mewakili bahwa mata uang jaminan telah digunakan secara proporsional dan perlu tetap rendah untuk memenuhi posisi baru
Perhatikan bahwa jika suatu mata uang keluar dari pasar independen, misalnya naik beberapa kali dibandingkan indeks, maka akan menumpuk banyak posisi kosong pada mata uang tersebut, dan penurunan yang sama juga akan membuat strategi banyak dilakukan.
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) } }
Tiagombalsa@tmbs95 Tambahkan saya di telegram, tertarik
Perempuan juga.Tolong ajari, dalam fungsi onTick (), ada baris seperti ini, assets.USDT.long_value-assets.USDT.short_value <= 1.1*Trade_value, saya mengerti ini diatur untuk mencegah keterimbangan ruang kosong yang terlalu besar.
MikelslTidak bisa mencari WeChat?
Modal rantaiMax_diff dan Min_diff seharusnya 0.04 dan -0.03 bukan?
Angkatan Udara Tidak Pernah Menjadi PerbudakanBerikan sedikit sinar matahari ke lingkaran tertutup ini.
Rumput/upload/asset/1b39347a88aa4cff916.jpg
Kualifikasi kelasOrang-orang menyarankan untuk melakukan lebih banyak overshooting untuk melakukan strategi overshooting kosong untuk menghilangkan BNB, transaksi ini adalah BNB ingin menarik, diperkirakan akan overshooting; tidak bisa melihat dari sudut pandang sejarah sekarang
Perempuan juga.Ini adalah dua hal.
Perempuan juga.Sebuah mata uang keluar dari pasar independen, pengaturan keseimbangan multi-ruang ini dapat mencegah kerugian besar, jadi keputusan tidak dapat diseimbangkan. Hanya bisa mencari cara untuk membuka daftar lindung nilai. Saat ini berbagai mata uang melambung, merasa tidak cocok untuk menjalankan strategi ini, mundur sedikit besar.
RumputSalah, wangweibing_ustb
izhangsanPada kenyataannya, lihatlah kode, hasil retesting untuk semua mata uang sudah diketahui, tidak perlu khawatir. Pada saat bergabung, Alpha = 0.05, tambahkan LINK, ETC, BNB, retret awal dalam sejarah adalah 3%, retret maksimum pasar ekstrim tidak mencapai 25%, Trade_Value menggunakan 3% untuk keamanan yang berlebihan untuk semua mata uang.