ビンアン永続多通貨ヘッジ戦略 原版 (多超跌多空超) 4月13日最新停止損失モジュール

作者: リン・ハーン小草, 2020年4月4日21時24分43秒
タグ:バイナンス

この方針は,WeChatのWangweibing_ustbの追加で利用できます.

重要な内容!!

  • この研究をご覧下さいhttps://www.fmz.com/digest-topic/5294・戦略原理,リスク,取引のフィルタリング方法,パラメータ設定方法,開場率,総資金の割合などについて理解する.
  • 前回の研究報告はダウンロードして自分の研究環境にアップロードする必要があります. 実際の変更は実行されます. このレポートを読んでいたら,最近最新の週間のデータを更新します.
  • ロボットが長時間停止して再起動すると,データをリセットするか,新しいロボットを構築する必要があります.
  • 戦略は直接復習できません 研究環境で復習する必要があります
  • 策略コードやデフォルトパラメータは研究のみで,実装台操作は慎重で,自分の研究に基づいてパラメータを決定する必要があります.リスクを負う
  • 戦略は毎日利益を得ることは不可能で,過去を見れば,1〜2週間の横盤と引き下げは正常であり,正しい扱いが必要です.
  • コードが公開され,自分で変更することができます. 問題があれば,コメントフィードバックを歓迎します. 発明者 バイアン 交流グループに参加してください (研究報告には加入方法があります). 更新通知を受けることができます.
  • 戦略は,金安先物のみをサポートし,全株モードで動作する必要があります. 双方向保持を設定しないでください!!,ロボットを作成するときにデフォルトで取引ペアとK線周期を使用できます. 戦略はK線を使用していません.
  • 戦略と他の戦略と手動は対立し,注意が必要です.
  • リアルディスクの運用には海外のホストが必要で,テスト段階では,プラットフォームの1つのボタンを押してアリ雲香港サーバーをレンタルすることができ,月額でレンタが安くなります.https://www.fmz.com/bbs-topic/2848)
  • 貨幣の先物と現貨は別々に追加する必要があります.Futures_Binance
  • このリブート戦略は効果はありませんが,新しいロボットは歴史データを再記録します.
  • ポリシーはユーザーフィードバックに基づいて更新される可能性があります.直接ctrl+Aをクリックしてコードをコピーします.
  • 戦略は取引を始めるには,取引をしない,最初の起動はデータを記録し,市場の変化を待つ必要があります.

4.16 に更新されました

障害を停止するバグが修正されました

変更されたデフォルトパラメータ:

var Alpha = 0.001 //指数移动平均的Alpha参数,设置的越大,基准价格跟踪越敏感,最终持仓也会越低,降低了杠杆,但会降低收益,具体需要根据回测结果自己权衡
var Update_base_price_time_interval = 60 //多久更新一次基准价格, 单位秒,和Alpha参数相关,Alpha 设置的越小,这个间隔也可以设置的更小

4.13 更新された内容

Stop_loss の設定は0.8で,資金が初期資金の80%以下に達すると,ストップ損失,すべてのポジションを空ける,停止戦略を示します. 戦略が実行されると,Stop_loss は1より大きい (再起動有効) を設定できます. 例えば1000円から1500円まで,Stop_loss の設定は1.3,停止損失を1300元まで引き戻します. ストップ損失を設定したい場合は,このパラメータを設定できます. リスクは,誰もがこのストップ損失を踏みにじ,損失を増やすことができます.

Max_diffとMin_diffは,自分のトレード_バリュー,総資金,リスク承担能力に基づいて自己決定する差異の程度を制限する.

簡単な例として,20コインが取引されている場合,そのうちの1コインの価値が0.4の偏差まで上昇し,取引は終了し,他のコインの価格は変わらず,trade_valueの7倍もの損失を伴う.

var Stop_loss = 0.8 
var Max_diff = 0.4 //当偏差diff大于0.4时,不继续加空仓, 自行设置
var Min_diff = -0.3 //当diff小于-0.3时,不继续加多仓, 自行设置

4.10 更新された内容

ローカルポリシーにコードをコピーし,直接保存を覆い,マシンを再起動すると,元の位置を維持します.

楽天フューチャー 超空 超低 超低 戦略 重要 楽天ノートブック コード アドレスhttps://www.fmz.com/bbs-topic/5364

原策のコインインデックス = mean ((sum ((((コイン価格/ビットコイン価格) / ((コイン初期価格/ビットコイン初期価格)) ◎最大の問題は,最新の価格と戦略開始の初期価格の対比であり,時間の成長とともに,ますます偏移し,コインが多くのポジションを保持する可能性があり,リスクが高く,最終的には多くのポジションを保持し,リスクと引き下げを増加させる.

最新のコインインデックス = mean ((sum (((((コイン価格/ビットコイン価格) /EMA ((コイン価格/ビットコイン価格))),すなわち均線価格と対照的に,最新の価格変動を追跡することができ,より柔軟で,再測が戦略保有を減少させ,引き下げも減少させることを発見した. より安定した.最も重要なことは,いくつかの異常な取引対を追加すると,リスクが非常に高く,爆破する可能性が高い,しかし今はほとんど影響を受けない.

この2つのパラメータは,シームレスなアップグレードのために,戦略コードの最初の2行に書き込まれ,必要に応じて変更されます.

アルファ = 0.04 指数移動平衡のアルファパラメータ,設定が大きくなるほど,基価追跡が敏感になり,取引が少なくなるほど,最終的な保有も低くなり,レバレッジは低下するが,収益は低下し,最大引き下げは低下し,取引成数が増加することが可能であり,具体的には,リトート結果に基づいて自己バランスを取る必要がある. Update_base_price_time_interval = 30*60 バランス値,単位秒,およびアルファパラメータに関連して,バランス値が更新される時間が長いほど,アルファ設定が小さいほど,この間隔は設定できる.

この記事を見て,すべての通貨を取引したい場合は,ここにリストがありますETH,BCH,XRP,EOS,LTC,TRX,ETC,LINK,XLM,ADA,XMR,DASH,ZEC,XTZ,BNB,ATOM,ONT,IOTA,BAT,VET,NEO,QTUM,IOST

微信グループに参加し,最新情報を取得する

微信で返信すると,自動にドラッグされます.

https://www.fmz.comimg

戦略の原理

コイン・ビットコイン・価格指数より高い価格で空白するコイン,指数より低い価格で空白するコイン,偏差が大きいほどポジションが大きい. この戦略では,異なったポジションをBTCでヘッジせず,BTCを取引対に加入することもできます. 過去2ヶ月の業績 (約3倍のレバレッジ,データ更新4.8):img

戦略的論理

1. 市場と口座保持を更新し,初回運用で初期価格を記録する (新規加入した通貨は加入時の計算) 2.インデックスを更新,インデックスはコイン-ビットコイン価格インデックス = mean ((sum)) (コインの価格/ビットコインの価格) / (コインの初期価格/ビットコインの初期価格)) 3. 偏差指数判断により空き作業を増やし,偏差の大きさによってポジションを判断する 4. 注文の開始,注文量については,アイス山の委託により決定され,対価取引 (購入・販売価格) に基づく.削除された場合は, 400: {code:-2011,msg:Unknown order sent.} のように,多くの削除が失敗したセルが表示されます. 5.再次循环

ステータスパック内のレバレッジは,担保金が占拠済みであり,新しい開拓を満たすために低い水準を維持する必要があることを表しています.

戦略パラメータ

img

  • Trade_symbols: 取引される通貨は,研究プラットフォームに基づいて自己フィルタリングが必要で,BTCに加入することができます.
  • Trade_value: コインの価格 (BTC評価) は,インデックス偏差が1%であるごとに保有価値があり,自分の投資総額とリスク偏向に基づいて決定する必要があります.総額の3-10%に設定することが推奨されています. 研究環境のリターンテストによって,レバレッジの大きさを見ることができます. Trade_valueは,Adjust_valueより小さく,例えば,Adjust_valueの半分,これは2%の偏差の保有価値に相当します.
  • Adjust_value: 契約値 (USDT価格) の偏差値調整. * Trade_value - 現存値 > Adjust_value,つまり目標値と現存値の差がこの値を超えると取引が開始される. 過剰な調整が遅い,少なすぎる取引が頻繁である場合,10以下ではできません.そうでなければ最小取引に達することはできません. Trade_valueの40%以上を設定することをお勧めします.
  • Ice_value: アイスマンの委託値も10以下にはならない.実際は,単一の選択でAdjust_valueとIce_valueの小さいものを選択します.より多くの資金が設定できる場合,この調整は比較的大きいので,より速く,Adjust_valueの20%以下ではないことをお勧めします.そうすれば,5回のアイスマンは取引を完了できます.もちろん,Trade_valueが小さい場合,Ice_valueの設定が比較的大きい場合は,1回または2回調整できます.
  • Interval: サイクリング休眠時間, 1s などの小さいものを設定できますが,バイアンの周波数制限を超えてはいけません.
  • Reset: 履歴データをリセットします. 戦略参照の初期価格を現在の価格にリセットします. 通常,設定する必要はありません.

戦略的リスク

コインが独立市場から脱出した場合,例えば指数相関で数倍上昇した場合,そのコインに大量に空置所が蓄積され,同様の大幅な減少が戦略的に大量に作動させることを注意する.




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

関連性

もっと

ティアゴンバルサ@tmbs95 興味があるなら 携帯で連絡してください

婚約者もonTick (タック) の関数には,assets.USDT.long_value-assets.USDT.short_value <= 1.1*Trade_value という一行がありますが,この設定は,余分な空白の失衡を防ぐためだと理解しています.

ミケルス微信が検索できない?

株式資本この2つの差は0.04と−0.03でなければなりません.

空軍は決して奴隷ではない閉ざされた円に太陽を注ぎましょう

小草/upload/asset/1b39347a88aa4cff916.jpg /upload/asset/1b39347a88aa4cff916.jpg /upload/asset/1b39347a88aa4cff916.jpg /upload/asset/1b39347a88aa4cff916.jpg /upload/asset/1b39347a88aa4aa4cff916.jpg /upload/asset/1b39347a88aa4aa4cff916.jpg

区分量化個人的に提案されているのは,BNBを排除する戦略で,この取引はBNBが人気を得るために,超高値になると予想されています.

婚約者もこの2つのことは,

婚約者もコインが独立市場に出たとき,この多空平衡の設定は大きな損失を防ぐことができるので,バランスが崩れないことを決定した.

小草間違えました,wangweibing_ustb

イザングサン実際,コードを見て,全通貨のリトート結果がわかるので,心配する必要はありません. 加入する際に,Alpha = 0.05,LINK,ETC,BNBを加えると,歴史上の初期レグロは3%で,極端な市場は最大レグロは25%未満で,Trade_Valueは3%で安全な過剰な全通貨です.