Strategi Berhenti Gelongsor


Tarikh penciptaan: 2023-10-07 16:11:45 Akhirnya diubah suai: 2023-10-07 16:11:45
Salin: 0 Bilangan klik: 701
1
fokus pada
1617
Pengikut

Gambaran keseluruhan

Strategi ini menggunakan penapis Kalman untuk mengesan harga dan menggunakan garis stop untuk menyesuaikan titik stop secara dinamik untuk mencapai stop slip.

Prinsip

Strategi ini menggunakan penapis Kalman untuk menjejaki harga dalam masa nyata. Penapis Kalman mengandungi dua persamaan:

Persamaan ramalan:

smooth = kf[1] + dk * sqrt(gain / 10000 * 2)

Kemas kini persamaan:

kf = smooth + velo

Dalam kes ini, dk adalah kesilapan ramalan, gain adalah keuntungan Kalman, dan keputusan untuk mengesan sensitiviti.

Di samping itu, strategi menggunakan garis hentian yang meluncur untuk mengunci keuntungan. Jarak hentian awal adalah peratusan set nilai hentian, seperti 2%.

Apabila melakukan lebih banyak, jika harga naik, garis berhenti juga bergerak ke atas secara beransur-ansur mendekati garis Kalman, langkah panjangnya adalah downStep, seperti 0.5%. Jika harga turun berhenti, buka semula kedudukan dan tetapkan jarak berhenti awal.

Saya tidak mahu bercakap tentangnya.

Dengan cara ini, strategi dapat mengunci keuntungan secara beransur-ansur mengikut trend, dengan pengurusan risiko yang lebih baik.

Kelebihan

  1. Menggunakan penapis Kalman untuk menjejaki harga dalam masa nyata dan bertindak balas dengan cepat.

  2. Menggunakan garis hentian sliding untuk mengunci keuntungan, pengurusan risiko berkesan. Jarak hentian boleh disesuaikan.

  3. Anda boleh memilih untuk melakukan lebih banyak atau hanya lebih banyak / kosong.

  4. Ia boleh dihentikan secara aktif atau konservatif mengikut trend.

  5. Stop loss boleh diatur secara fleksibel.

Risiko

  1. Penetapan parameter penapis Kalman yang tidak betul boleh menyebabkan ketidakstabilan pengesanan.

  2. Titik tergelincir boleh menyebabkan titik hentian tercetus terlebih dahulu. Anda boleh melepaskan jarak hentian dengan sewajarnya.

  3. Pasaran trend yang kuat tidak disyorkan untuk menggunakan strategi hentikan kerugian yang licin, dan harus mengikuti trend.

  4. Titik hentian pasaran goyah mungkin sering dipicu. Jarak hentian boleh dikurangkan dengan sewajarnya, atau tidak menggunakan hentian geser.

Pengoptimuman

  1. Ia boleh memperkenalkan lebih banyak penunjuk untuk menentukan arah trend dan mengoptimumkan masa untuk membuka kedudukan.

  2. Anda boleh menyesuaikan jarak pergerakan garis hentian anda mengikut turun naik pasaran.

  3. Ia boleh digabungkan dengan latihan teknik pembelajaran mesin untuk parameter pelemahan yang optimum.

  4. Ia boleh digabungkan dengan lebih banyak petunjuk risiko, dan dinamika untuk menyesuaikan pengurusan kedudukan.

ringkaskan

Strategi stop slip menggunakan penapis Kalman untuk mengesan perubahan harga, dan menggunakan garis stop slip untuk mengunci keuntungan, mengawal risiko sambil memastikan keuntungan, adalah strategi yang boleh dipercayai dan mudah dioptimumkan. Gabungan dengan penghakiman trend dan teknik pengurusan kedudukan dinamik dapat memberikan kesan strategi yang lebih baik.

Kod sumber strategi
/*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")