Strategi Penghentian Terakhir Terbaik

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

Ringkasan

Strategi ini menggunakan mekanisme hentian kerugian untuk menggerakkan hentian kerugian secara dinamik berdasarkan julat turun naik harga, mencapai hentian dinamik. Hentian hentian diaktifkan selepas harga mencapai sasaran keuntungan, bertujuan untuk melindungi keuntungan sambil mengelakkan hentian awal. Ia meningkatkan strategi hentian kerugian biasa.

Logika Strategi

Strategi masuk berdasarkan persimpangan MA berganda menilai arah trend.

Inovasi terletak pada reka bentuk stop loss:

  1. Baris pencetus berhenti ditetapkan. Hentian menyusul bermula selepas harga memecahkan garis ini.

  2. Garis stop loss mengikut parameter Peratusan. contohnya 3% trailing bermaksud 3% di bawah paras terendah terakhir.

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

Ini memastikan berhenti akan mengikuti keuntungan secara automatik, sementara mengurangkan peluang berhenti ketika keuntungan masih baik.

Kelebihan

  • Peratusan berasaskan hentian automatik
  • Baris pencetus mengelakkan pengaktifan awal
  • Pengekalan dinamik melindungi keuntungan
  • Mengelakkan berhenti kerana retracements pendek
  • Garis pencetus dan peratusan yang boleh diselaraskan dengan pasaran

Risiko

  • Perpindahan MA mungkin terlambat, menghasilkan isyarat palsu
  • Tetapan garisan pencetus yang tidak betul menyebabkan pengaktifan awal atau lewat
  • Tetapan peratusan yang tidak betul memberi berhenti terlalu luas atau ketat
  • Tidak boleh sepenuhnya mengelakkan risiko whipsaw
  • Parameter perlu dioptimumkan untuk turun naik pasaran

Risiko boleh dikurangkan dengan:

  • Mengoptimumkan tempoh MA untuk kemasukan yang lebih baik
  • Ujian nilai pencetus yang berbeza untuk kedudukan terbaik
  • Ujian semula peratusan ideal berdasarkan pengambilan sejarah
  • Mempertimbangkan kemasukan semula untuk mengelakkan trend yang hilang
  • Menambah penapis untuk mengelakkan penyebaran palsu

Arahan Peningkatan

Strategi ini boleh ditingkatkan dengan:

  1. Mengoptimumkan tempoh MA berganda

  2. Mengoptimumkan atau membuang garis pencetus

    Mulakan secara langsung atau gunakan nilai yang berbeza untuk produk yang berbeza

  3. Ujian nilai peratusan belakang yang berbeza

    Cari nilai optimum untuk produk yang berbeza

  4. Menambah peraturan kemasukan semula

    Tetapkan keadaan kemasukan semula selepas berhenti dipukul

  5. Penyesuaian ketegasan hentian oleh turun naik

    Hentian yang lebih luas dalam persekitaran turun naik yang meningkat

Ringkasan

Strategi ini menggunakan penangguhan peratusan dengan garis pencetus sebelum mengaktifkan. Mekanisme dinamik ini menyeimbangkan melindungi keuntungan dan mengelakkan berhenti yang tidak perlu berdasarkan pergerakan pasaran. Tetapi parameter memerlukan pengoptimuman untuk produk yang berbeza, ditambah penapis tambahan pada entri untuk meningkatkan ketepatan. Masuk semula juga membantu mengelakkan kehilangan trend selepas berhenti sebelum masa. Penambahbaikan berterusan diperlukan untuk daya adaptasi.


/*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 lanjut