Strategi Stop Trailing Terbaik

Penulis:ChaoZhang, Tanggal: 2023-09-21 20:58:22
Tag:

Gambaran umum

Strategi ini menggunakan mekanisme stop loss trailing untuk memindahkan stop loss secara dinamis berdasarkan rentang fluktuasi harga, mencapai stop dinamis. Stop trailing diaktifkan setelah harga mencapai target keuntungan, bertujuan untuk melindungi keuntungan sambil menghindari stop out prematur.

Logika Strategi

Strategi masuk berdasarkan crossover MA ganda menilai arah tren.

Inovasi terletak pada desain stop loss:

  1. Stop trigger line ditetapkan. Trailing stop dimulai setelah harga melanggar garis ini.

  2. Garis stop loss mengikuti berdasarkan parameter Persentase. misalnya 3% mengikuti berarti 3% di bawah terendah terakhir.

  3. Posisi ditutup ketika harga berbalik untuk menyentuh garis stop loss.

Hal ini memastikan stop akan mengikuti keuntungan secara otomatis, sementara mengurangi kemungkinan berhenti keluar ketika keuntungan masih bagus.

Keuntungan

  • Hentian otomatis berdasarkan persentase
  • Jalur pemicu menghindari aktivasi dini
  • Dinamis trailing melindungi keuntungan
  • Menghindari berhenti karena retracements pendek
  • Garis pemicu dan persentase yang dapat disesuaikan dengan pasar

Risiko

  • MA crossover mungkin terlambat, menghasilkan sinyal palsu
  • Pengaturan garis pemicu yang tidak benar menyebabkan aktivasi dini atau terlambat
  • Pengaturan persentase yang salah memberikan berhenti terlalu lebar atau ketat
  • Tidak bisa sepenuhnya menghindari risiko whipsaw
  • Parameter perlu dioptimalkan untuk volatilitas pasar

Risiko dapat dikurangi dengan:

  • Mengoptimalkan periode MA untuk entri yang lebih baik
  • Pengujian nilai pemicu yang berbeda untuk posisi terbaik
  • Pengujian kembali persentase ideal berdasarkan penarikan historis
  • Mempertimbangkan masuk kembali untuk menghindari tren yang hilang
  • Menambahkan filter untuk menghindari kebocoran palsu

Arah Peningkatan

Strategi dapat ditingkatkan dengan:

  1. Mengoptimalkan periode MA ganda

  2. Mengoptimalkan atau menghapus garis pemicu

    Mulai langsung melacak atau gunakan nilai yang berbeda untuk produk yang berbeda

  3. Pengujian nilai persentase yang berbeda

    Temukan nilai optimal untuk produk yang berbeda

  4. Menambahkan aturan masuk kembali

    Tentukan kondisi masuk kembali setelah berhenti

  5. Penyesuaian ketegasan stop berdasarkan volatilitas

    Hentian yang lebih luas dalam lingkungan volatilitas yang meningkat

Ringkasan

Strategi ini menggunakan stop persentase trailing dengan garis pemicu sebelum diaktifkan. Mekanisme dinamis ini menyeimbangkan melindungi keuntungan dan menghindari berhenti yang tidak perlu berdasarkan pergerakan pasar. Tetapi parameter perlu dioptimalkan untuk produk yang berbeda, ditambah filter tambahan pada entri untuk meningkatkan akurasi. Re-entry juga membantu menghindari hilangnya tren setelah berhenti prematur. Perbaikan berkelanjutan diperlukan untuk adaptivitas.


/*backtest
start: 2022-09-14 00:00:00
end: 2023-09-20 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//@author=Daveatt

SystemName = "BEST Trailing Stop Strategy"
TradeId = "BEST"

InitCapital = 100000
InitPosition = 100
InitCommission = 0.075
InitPyramidMax = 1
CalcOnorderFills = true
CalcOnTick = true
DefaultQtyType = strategy.fixed
DefaultQtyValue = strategy.fixed
Precision = 2
Overlay=true


// strategy(title=SystemName, shorttitle=SystemName, overlay=Overlay, 
//  pyramiding=InitPyramidMax, initial_capital=InitCapital, default_qty_type=DefaultQtyType, default_qty_value=InitPosition, commission_type=strategy.commission.percent, 
//  commission_value=InitCommission, calc_on_order_fills=CalcOnorderFills, calc_on_every_tick=CalcOnTick, precision=2)


src = close
// Calculate moving averages
fastSMA = sma(close, 15)
slowSMA = sma(close, 45)

// Calculate trading conditions
enterLong  = crossover(fastSMA, slowSMA)
enterShort = crossunder(fastSMA, slowSMA)

// trend states
since_buy  = barssince(enterLong)
since_sell = barssince(enterShort)
buy_trend  = since_sell > since_buy
sell_trend = since_sell < since_buy 

change_trend = (buy_trend and sell_trend[1]) or (sell_trend and buy_trend[1])

//plot(buy_trend ? 1 : 0, title='buy_trend', transp=100)
//plot(sell_trend ? 1 : 0, title='sell_trend', transp=100)

// get the entry price
entry_price = valuewhen(enterLong or enterShort, close, 0)

// Plot moving averages
plot(series=fastSMA, color=color.teal)
plot(series=slowSMA, color=color.orange)

// Plot the entries
plotshape(enterLong, style=shape.circle, location=location.belowbar, color=color.green, size=size.small)
plotshape(enterShort, style=shape.circle, location=location.abovebar, color=color.red, size=size.small)



///////////////////////////////
//======[ Trailing STOP ]======//
///////////////////////////////

// use SL?
useSL = input(true, "Use stop Loss")
// Configure trail stop level with input
StopTrailPerc = input(title="Trail Loss (%)", type=input.float, minval=0.0, step=0.1, defval=3) * 0.01
// Will trigger the take profit trailing once reached
use_SL_Trigger = input(true, "Use stop Loss Trigger")
StopTrailTrigger   = input(2.0, "SL Trigger (%)",minval=0,step=0.5,type=input.float) * 0.01


StopLossPriceTrigger = 0.0
StopLossPriceTrigger := if (use_SL_Trigger)
    if buy_trend
        entry_price * (1 + StopTrailTrigger) 
    else
        entry_price * (1 - StopTrailTrigger)
else
    -1


var SL_Trigger_Long_HIT = false
SL_Trigger_Long_HIT := useSL and use_SL_Trigger and buy_trend and high >= StopLossPriceTrigger
 ? true : SL_Trigger_Long_HIT[1]


var SL_Trigger_Short_HIT = false
SL_Trigger_Short_HIT := useSL and use_SL_Trigger and sell_trend and low <= StopLossPriceTrigger
 ? true : SL_Trigger_Short_HIT[1]


display_long_SL_trigger     = useSL and buy_trend  and use_SL_Trigger 
 and SL_Trigger_Long_HIT == false and StopLossPriceTrigger != -1
display_short_SL_trigger    = useSL and sell_trend and use_SL_Trigger 
 and SL_Trigger_Short_HIT == false and StopLossPriceTrigger != -1
display_SL_trigger          = display_long_SL_trigger or display_short_SL_trigger

plot(display_SL_trigger ? StopLossPriceTrigger : na, title='SLPriceTrigger', transp=0, 
 color=color.maroon, style=plot.style_circles, linewidth=3)


// Determine trail stop loss prices
longStopPrice = 0.0, shortStopPrice = 0.0

longStopPrice := if useSL and buy_trend
    stopValue = low * (1 - StopTrailPerc)
    max(stopValue, longStopPrice[1])
else
    0

shortStopPrice := if useSL and sell_trend
    stopValue = high * (1 + StopTrailPerc)
    min(stopValue, shortStopPrice[1])
else
    999999

//////////////////////////////////////////////////////////////////////////////////////////
//*** STOP LOSS HIT CONDITIONS TO BE USED IN ALERTS  ***//
//////////////////////////////////////////////////////////////////////////////////////////

cond_long_stop_loss_hit  = useSL and buy_trend and crossunder(low, longStopPrice[1]) 
 and (SL_Trigger_Long_HIT or use_SL_Trigger == false)
cond_short_stop_loss_hit = useSL and sell_trend and crossover(high, shortStopPrice[1]) 
 and (SL_Trigger_Short_HIT or use_SL_Trigger == false)


// Plot stop loss values for confirmation
plot(series=useSL and buy_trend and low >= longStopPrice 
 and (SL_Trigger_Long_HIT or use_SL_Trigger == false)
 ? longStopPrice : na,
 color=color.fuchsia, style=plot.style_cross,
 linewidth=2, title="Long Trail Stop")

plot(series=useSL and sell_trend and high <= shortStopPrice 
 and (SL_Trigger_Short_HIT or use_SL_Trigger == false)
 ? shortStopPrice : na,
 color=color.fuchsia, style=plot.style_cross,
 linewidth=2, title="Short Trail Stop")

close_long  = cond_long_stop_loss_hit
close_short = cond_short_stop_loss_hit

// Submit entry orders
strategy.entry(TradeId + " L", long=true, when=enterLong)
strategy.close(TradeId + " L", when=close_long)

//if (enterShort)
strategy.entry(TradeId + " S", long=false, when=enterShort)
strategy.close(TradeId + " S", when=close_short)


if change_trend
    SL_Trigger_Long_HIT := false
    SL_Trigger_Short_HIT := false


Lebih banyak