この戦略は,価格を追跡するためにカルマンフィルターを用い,ストップ・ロスのポイントをストップ・ロスの線で動的に調整し,スライディング・ストップ・ロスを達成します.
この戦略は,リアルタイムで価格を追跡するためにカルマンフィルターを使用します.カルマンフィルターには2つの方程式があります:
予測方程式:
スムーズ = kf[1] + dk * sqrt(gain / 10000 * 2)
更新式:
kf = スムーズ + ベロ
ここで dk は予測誤差で,追跡感度を決定する Kalman gain が加算される.
さらに,戦略は利益をロックするためにスライディングストップ損失ラインを使用します.初期ストップ損失距離は,2%などのストップ損失パーセント設定です.
価格が上昇すると,ストップ・ロスは,0.5%のようなダウンステップのステップサイズで,カルマンラインに近づくにつれて徐々に上昇します.価格がストップ・ロスの値に下落した場合,ポジションを再開し,初期ストップ・ロスの距離を設定します.
短さは似ている.
したがって,戦略は,良質なリスク管理によって,傾向に応じて徐々に利益を得ることができます.
カルマンフィルターを使って リアルタイムで価格を追跡します
スライディングストップ・ロストラインで 利益を固定し リスク管理が上手く ストップ・ロスト距離を調整できます
柔軟に長/短または長/短だけを選択してください.
傾向に基づいて,積極的にまたは保守的にストップ・ロスをします.
柔軟に設定して 必要な時に 利益とストップ・ロスを取る
カルマンフィルターのパラメータの設定が不適切であれば,追跡が不安定になる可能性があります.
スライドが早すぎる時にストップ・ロストポイントを誘発する.
スライディングストップ・ロスは,強いトレンド市場には適さない.トレンドに従うべきだ.
ストップ・ロスは,ランジング・マーケットで頻繁に行動する可能性があります.ストップ・ロスの距離を拡大するか,スライディング・ストップ・ロスを使用しないでください.
入場時間を最適化するためにより多くの指標を組み込む.
ストップ・ロスの動きを 市場の変動に基づいて調整する.
機械学習を使って 最適なストップ損失パラメータを訓練します
より多くのリスク指標を組み込み,ポジションのサイズを動的に調整する.
ロフトストップ戦略は,価格変化を追跡し,リスクを制御しながら収益性を確保し,滑るストップ損失線で利益をロックするためにカルマンフィルターを使用する.これは信頼性があり,容易に最適化できる戦略である.トレンド判断とダイナミックなポジションサイジングを組み合わせることで,さらに優れた戦略パフォーマンスを達成することができる.
/*backtest start: 2023-09-06 00:00:00 end: 2023-10-06 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © BigCoinHunter //@version=5 // strategy(title='Loft Strategy V1', overlay=true, // pyramiding=0, default_qty_type=strategy.fixed, // default_qty_value=100, initial_capital=100000, // currency=currency.USD, commission_value=0.05, // commission_type=strategy.commission.percent, // process_orders_on_close=true) //-------------- fetch user inputs ------------------ gain = input.float(title="Kalman Gain:", defval=1.0, minval=1.0, maxval=5000.0, step=100.0) src = input(defval=close, title='Source:') stopPercentMax = input.float(title='Beginning Approach(%):', defval=2.0, minval=0.1, maxval=30.0, step=0.1) stopPercentMin = input.float(title='Final Approach(%): ', defval=0.5, minval=0.1, maxval=30.0, step=0.1) downStep = input.float(title='Approach Decrease Step:', defval=0.005, minval=0.0, maxval = 5, step=0.005) tp = input.float(title="Take Profit:", defval=1.5, minval=0.0, maxval=100.0, step=0.1) * 0.01 sl = input.float(title="Stop Loss: ", defval=0.0, minval=0.0, maxval=100.0, step=0.1) * 0.01 longEntry = input.bool(defval=true, title= 'Long Entry', inline="11") shortEntry = input.bool(defval=true, title='Short Entry', inline="11") //---------- backtest range setup ------------ fromDay = input.int(defval = 1, title = "From Day", minval = 1, maxval = 31) fromMonth = input.int(defval = 1, title = "From Month", minval = 1, maxval = 12) fromYear = input.int(defval = 2021, title = "From Year", minval = 2010) toDay = input.int(defval = 30, title = "To Day", minval = 1, maxval = 31) toMonth = input.int(defval = 12, title = "To Month", minval = 1, maxval = 12) toYear = input.int(defval = 2022, title = "To Year", minval = 2010) //------------ time interval setup ----------- start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window finish = timestamp(toYear, toMonth, toDay, 23, 59) // backtest finish window window() => true // create function "within window of time" //------- define the global variables ------ enterLongComment = "ENTER LONG" exitLongComment = "EXIT LONG" enterShortComment = "ENTER SHORT" exitShortComment = "EXIT SHORT" longTPSL = "Long TP/SL" longTP = "Long TP" longSL = "Long SL" shortTPSL = "Short TP/SL" shortTP = "Short TP" shortSL = "Short SL" var bool long = true var bool stoppedOutLong = false var bool stoppedOutShort = false var float kf = 0.0 var float velo = 0.0 //------ kalman filter calculation -------- dk = src - nz(kf[1], src) smooth = nz(kf[1], src) + dk * math.sqrt(gain / 10000 * 2) velo := nz(velo[1], 0) + gain / 10000 * dk kf := smooth + velo //--------- calculate the loft stopLoss line --------- var stopPercent = stopPercentMax var stopLoss = kf - kf * (stopPercent /100) if long == true stopLoss := kf - (kf * (stopPercent / 100)) if long[1] == true and stopLoss <= stopLoss[1] stopLoss := stopLoss[1] else if (long[1] == true) stopPercent := stopPercent - downStep if(stopPercent < stopPercentMin) stopPercent := stopPercentMin if(kf < stopLoss) long := false stopPercent := stopPercentMax stopLoss := kf + (kf * (stopPercent / 100)) else stopLoss := kf + (kf * (stopPercent / 100)) if long[1] == false and stopLoss >= stopLoss[1] stopLoss := stopLoss[1] else if(long[1] == false) stopPercent := stopPercent - downStep if(stopPercent < stopPercentMin) stopPercent := stopPercentMin if(kf > stopLoss) long := true stopPercent := stopPercentMax stopLoss := kf - (kf * (stopPercent / 100)) //--------- calculate the input/output points ----------- longProfitPrice = strategy.position_avg_price * (1 + tp) // tp -> take profit percentage longStopPrice = strategy.position_avg_price * (1 - sl) // sl -> stop loss percentage shortProfitPrice = strategy.position_avg_price * (1 - tp) shortStopPrice = strategy.position_avg_price * (1 + sl) //------------------- determine buy and sell points --------------------- buySignall = window() and long and (not stoppedOutLong) sellSignall = window() and (not long) and (not stoppedOutShort) //---------- execute the strategy ----------------- if(longEntry and shortEntry) if long strategy.entry("LONG", strategy.long, when = buySignall, comment = enterLongComment) stoppedOutLong := true stoppedOutShort := false else strategy.entry("SHORT", strategy.short, when = sellSignall, comment = enterShortComment) stoppedOutLong := false stoppedOutShort := true else if(longEntry) strategy.entry("LONG", strategy.long, when = buySignall, comment = enterLongComment) strategy.close("LONG", when = sellSignall, comment = exitLongComment) if long stoppedOutLong := true else stoppedOutLong := false else if(shortEntry) strategy.entry("SHORT", strategy.short, when = sellSignall, comment = enterShortComment) strategy.close("SHORT", when = buySignall, comment = exitShortComment) if not long stoppedOutShort := true else stoppedOutShort := false //----------------- take profit and stop loss ----------------- if(tp>0.0 and sl>0.0) if ( strategy.position_size > 0 ) strategy.exit(id="LONG", limit=longProfitPrice, stop=longStopPrice, comment = longTPSL) else if ( strategy.position_size < 0 ) strategy.exit(id="SHORT", limit=shortProfitPrice, stop=shortStopPrice, comment = shortTPSL) else if(tp>0.0) if ( strategy.position_size > 0 ) strategy.exit(id="LONG", limit=longProfitPrice, comment = longTP) else if ( strategy.position_size < 0 ) strategy.exit(id="SHORT", limit=shortProfitPrice, comment = shortTP) else if(sl>0.0) if ( strategy.position_size > 0 ) strategy.exit(id="LONG", stop=longStopPrice, comment = longSL) else if ( strategy.position_size < 0 ) strategy.exit(id="SHORT", stop=shortStopPrice, comment = shortSL) //------------- plot charts --------------------- lineColor1 = long ? color.green : color.red lineColor2 = long ? color.aqua : color.fuchsia kalmanLine = plot(kf, color=lineColor1, linewidth=3, title = "Kalman Filter") stopLine = plot(stopLoss, color=lineColor2, linewidth=2, title = "Stop Loss Line")