Die Gebühren-Upgrade ist jetzt verfügbar, und WeChat wangweibing_ustb gibt weitere Informationen.
Futures_Binance
Ein Fehler wurde geändert, der den Verlust stoppen sollte.
Die Standardparameter wurden geändert:
var Alpha = 0.001 //指数移动平均的Alpha参数,设置的越大,基准价格跟踪越敏感,最终持仓也会越低,降低了杠杆,但会降低收益,具体需要根据回测结果自己权衡
var Update_base_price_time_interval = 60 //多久更新一次基准价格, 单位秒,和Alpha参数相关,Alpha 设置的越小,这个间隔也可以设置的更小
Stop_loss ist auf 0.8 eingestellt, was bedeutet, dass, wenn das Geld unter 80% des ursprünglichen Kapitals erreicht wird, der Stop-Loss, die Freigabe aller Positionen und die Stop-Strategie ausgeführt werden. Wenn die Strategie ausgeführt wird, kann der Stop_loss größer als 1 eingestellt werden (Wiederbelebung wirksam), z. B. von 1.000 bis 1500, der Stop_loss ist auf 1.3 eingestellt, dann wird der Stop auf 1300 Yuan zurückgezogen.
Max_diff und Min_diff beschränken den Abweichungsgrad, der sich anhand des eigenen Handelswerts, des Gesamtkapitals und der Risikobereitschaft selbst feststellen muss.
Ein einfaches Beispiel: Wenn 20 Münzen gehandelt werden, steigt der Wert einer Münze bis zu einer Abweichung von 0,4 und wird nicht mehr gehandelt, während die Preise der anderen Münzen unverändert bleiben und siebenmal den Trade_value verlieren.
var Stop_loss = 0.8
var Max_diff = 0.4 //当偏差diff大于0.4时,不继续加空仓, 自行设置
var Min_diff = -0.3 //当diff小于-0.3时,不继续加多仓, 自行设置
Wenn Sie den Policy-Code in die lokale Policy kopieren, können Sie ihn direkt überladen, um ihn zu speichern, um den Computer neu zu starten und den ursprünglichen Standort zu erhalten.
Bei der Optimierung der Notebook-Code-Adresse:https://www.fmz.com/bbs-topic/5364
Die ursprüngliche Strategie ist der Kryptowährungsindex = mean ((sum)) (Kryptowährungspreis/Bitcoinpreis) / ((Kryptowährungsstartpreis/Bitcoinstartpreis)). Das größte Problem ist die Kontrast zwischen dem neuesten Preis und dem ursprünglichen Preis, an dem die Strategie gestartet wurde. Im Laufe der Zeit wächst die Abweichung.
Der neueste Kryptowährungsindex = mean ((sum ((((Kryptowährungspreis/Bitcoin-Preis) /EMA ((Kryptowährungspreis/Bitcoin-Preis))), d.h. der Preis wird mit der Ebenenlinie verglichen, um die neuesten Preisänderungen zu verfolgen, ist flexibler, die Rückmessung zeigt, dass die Strategie gehalten und zurückgezogen wurde.
Für ein nahtloses Upgrade wurden zwei dieser Parameter in die ersten beiden Zeilen des Strategiecodes geschrieben und bei Bedarf geändert.
Alpha = 0.04 Indikator-Alpha-Parameter für das bewegliche Gleichgewicht, je größer die Einstellung, desto empfindlicher ist der Benchmark-Preis-Tracking, desto weniger werden Trades getätigt, desto niedriger wird die Haltung, was den Hebel senkt, aber die Erträge reduziert, den maximalen Rückzug reduziert und die Transaktionen erhöhen kann. Update_base_price_time_interval = 30*60 Je länger ein Benchmarkpreis aktualisiert wird, je Sekunden, und je kleiner der Alpha-Einstellung, desto kleiner kann dieser Intervall eingestellt werden
Wenn Sie den Artikel lesen und alle Währungen handeln möchten, hier ist eine Liste.ETH,BCH,XRP,EOS,LTC,TRX,ETC,LINK,XLM,ADA,XMR,DASH,ZEC,XTZ,BNB,ATOM,ONT,IOTA,BAT,VET,NEO,QTUM,IOST
Mit der folgenden Mikrosignal wird die Antwort auf die Anzeige automatisch in die Gruppe gezogen:
Es wird eine Währung, die den Preis über dem Bitcoin-Coin-Price-Index und die Währung, die den Preis unter dem Bitcoin-Price-Index überschreitet, absetzen. Je größer die Abweichung, desto größer ist die Position.
1. Aktualisierung des Marktes und der Kontobewahrung, wobei der erste Lauf den ursprünglichen Preis (die neu hinzugefügten Währungen berechnet nach dem Zeitpunkt des Beitritts) erfasst
2. Aktualisieren Sie den Index, der Index ist der Münze-Bitcoin-Preisindex = mean ((sum))
3. Nach Abweichungsindex-Bewusstsein, nach Abweichungsgröße, nach Positionsgröße
4. Die Bestellung und die Menge der Bestellung werden von Ice Mountain beauftragt und werden nach dem Gegenhandelspreis getätigt (Kauf-Verkauf-Preis).Sie werden sofort nach der Bestellung widerrufen. (So sehen Sie viele fehlgeschlagene Zellen 400: {
Die Hebelung in der Status-Palette stellt ein gebührenpflichtiges Gewicht dar, das niedrig gehalten werden muss, um neue Positionen zu befriedigen.
Beachten Sie, dass, wenn eine Währung aus einem unabhängigen Markt tritt, z. B. ein paar Mal höher als der Index, eine große Anzahl von Leerstandspositionen auf der Währung angesammelt wird. Ein ähnlicher starker Rückgang kann dazu führen, dass die Strategie viel zu tun hat.
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) } }
Zitronen@tmbs95 Fügen Sie mich zum Telegramm hinzu.
Auch die BrautBitte zeigen Sie mir, dass es in der Funktion onTick ((() eine Zeile gibt, die lautet: assets.USDT.long_value-assets.USDT.short_value <= 1.1*Trade_value. Ich verstehe, dass dies so eingestellt wurde, um zu vermeiden, dass zu viele Leerzeichen zu groß sind.
- Ich weiß nicht.Wir können sie nicht finden?
Anlage-KapitalSollten Max_diff und Min_diff nicht 0.04 und -0.03 sein?
Die Luftwaffe wird nie Sklaven sein.Geben Sie diesem geschlossenen Kreis ein wenig Sonnenlicht.
Das Gras/upload/asset/1b39347a88aa4cff916.jpg
Quantifizierung der ZonenEinige Leute schlagen vor, mehr zu überschreiten und weniger zu überschreiten, um die BNB auszuschalten.
Auch die BrautDas sind zwei Dinge.
Auch die BrautEine Währung geht aus dem unabhängigen Markt, und diese Multi-Leer-Gleichgewichts-Einstellung kann große Verluste verhindern, also entscheidet man, dass es nicht ausgeglichen werden kann.
Das GrasDas ist falsch, wangweibing_ustb
ZürichIn der Tat, wenn man sich den Code anschaut, weiß man, dass die Rückmeldung der gesamten Währung erfolgt, keine Sorge. Bei der Einbeziehung, Alpha = 0.05, fügen Sie LINK, ETC, BNB hinzu, der anfängliche Rückzug der Geschichte beträgt 3%, der maximale Rückzug des extremen Marktes beträgt weniger als 25%, Trade_Value mit 3% sicherer Überwältigung der gesamten Währung.