Strategi ini menggunakan filter Kalman untuk melacak harga, dan menggunakan stop loss line untuk secara dinamis menyesuaikan stop loss, untuk mencapai stop loss geser.
Strategi ini menggunakan filter Kalman untuk melacak harga secara real time. Filter Kalman terdiri dari dua persamaan:
Persamaan prediksi:
smooth = kf[1] + dk * sqrt(gain / 10000 * 2)
Pembaruan persamaan:
kf = smooth + velo
Dalam hal ini, dk adalah kesalahan prediksi, gain adalah keuntungan Kalman, dan keputusan untuk melacak sensitivitas.
Selain itu, strategi ini menggunakan stop loss yang geser untuk mengunci keuntungan. Stop loss awal adalah persentase dari stop loss yang ditetapkan, seperti 2%.
Ketika melakukan over, jika harga naik, stop loss line juga bergerak ke atas secara bertahap mendekati garis Kalman, langkah panjang adalah downStep, seperti 0.5%. Jika harga turun stop loss, membuka kembali posisi, mengatur jarak stop loss awal.
Tidak ada yang bisa dihindari.
Dengan demikian, strategi dapat mengunci keuntungan secara bertahap sesuai dengan tren, dengan manajemen risiko yang lebih baik.
Menggunakan filter Kalman untuk melacak harga secara real-time, respon cepat.
Menggunakan Stop Loss Sliding Line untuk mengunci keuntungan, manajemen risiko efektif. Stop loss distance dapat disesuaikan.
Fleksibilitas untuk melakukan lebih banyak atau hanya lebih banyak/kurang.
Hal ini dapat dilakukan dengan cara stop loss aktif atau stop loss konservatif.
Stop loss dapat diatur secara fleksibel.
Setting parameter filter Kalman yang salah dapat menyebabkan ketidakstabilan pelacakan.
Titik geser dapat menyebabkan titik stop yang dipicu terlebih dahulu. Anda dapat relaksasi jarak stop sesuai.
Pasar tren yang kuat tidak disarankan untuk menggunakan strategi stop loss geser, dan harus mengikuti tren.
Stop loss pada pasar yang bergoyang dapat sering terjadi. Anda dapat relaksasi stop loss dengan tepat, atau tidak menggunakan slip stop loss.
Ini adalah salah satu cara untuk mengoptimalkan waktu untuk membuka posisi.
Anda dapat menyesuaikan langkah-langkah stop loss line sesuai dengan volatilitas pasar.
Parameter penghentian yang optimal dapat digabungkan dengan pelatihan teknik pembelajaran mesin.
Ini bisa digabungkan dengan lebih banyak indikator risiko dan manajemen posisi yang disesuaikan secara dinamis.
Sliding stop strategi menggunakan filter Kalman untuk melacak perubahan harga, dan menggunakan sliding stop line untuk mengunci keuntungan, dan mengontrol risiko sambil menjamin keuntungan, adalah strategi yang dapat diandalkan dan mudah dioptimalkan. Dikombinasikan dengan teknik penilaian tren dan manajemen posisi dinamis, strategi ini dapat memberikan efek yang lebih baik.
/*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")