Strategi dagangan mengekori henti rugi dinamik


Tarikh penciptaan: 2023-10-09 16:59:57 Akhirnya diubah suai: 2023-10-09 16:59:57
Salin: 0 Bilangan klik: 1199
1
fokus pada
1702
Pengikut

Gambaran keseluruhan

Strategi ini berdasarkan purata gelombang sebenar (ATR) untuk menetapkan garis hentian yang dinamik, mengesan perubahan harga saham, dan mencapai perlindungan hentian sambil mengunci keuntungan maksimum.

Prinsip Strategi

Strategi ini dilaksanakan melalui langkah-langkah berikut:

  1. Untuk mengira ATR, kitaran ATR ditetapkan oleh parameter nATRPeriod, dengan default 5;

  2. Berdasarkan nilai ATR yang dikira pada garis stop loss, amplitudo stop loss ditetapkan oleh parameter nATRMultip, 3.5 kali ATR secara lalai;

  3. Apabila harga saham naik, jika lebih tinggi daripada had berhenti sebelum ini, had berhenti akan dinaikkan kepada harga saham tolak had berhenti; apabila harga saham turun, jika lebih rendah daripada had berhenti sebelum ini, had berhenti akan dinaikkan kepada harga saham tolak had berhenti;

  4. menilai sama ada harga saham telah melanggar garis berhenti, dan apabila ia melanggar ia akan memberi isyarat untuk membeli atau menjual;

  5. Bergantung pada isyarat untuk menembusi garisan berhenti, masuk ke dalam kedudukan untuk melakukan lebih banyak atau kosong, dan kosongkan kedudukan apabila menyentuh garisan berhenti sekali lagi.

Apabila harga saham naik, barisan hentikan akan terus naik, sehingga mengunci keuntungan; apabila harga saham turun, barisan hentikan akan terus turun, sehingga hentikan. Indeks ATR dapat mencerminkan dengan lebih tepat tahap turun naik harga saham, menyesuaikan barisan hentikan mengikut dinamik ATR, dapat mengelakkan hentikan terlalu radikal atau konservatif.

Analisis kelebihan

  • Mengubah garis hentian secara dinamik, hentian tepat pada masanya, dan mengelakkan peningkatan kerugian
  • Penyesuaian garis henti lebih lancar, mengelakkan henti awal
  • Menggunakan indikator ATR untuk mengira perhentian kerugian yang lebih munasabah yang mencerminkan pergerakan terkini
  • Menjejaki garis hentian untuk mengunci keuntungan

Analisis risiko

  • Tetapan parameter penunjuk ATR perlu berhati-hati, ATR yang terlalu pendek boleh menyebabkan pergerakan garis henti terlalu besar, dan terlalu lama tidak dapat mencerminkan pergerakan harga dalam masa yang tepat
  • Parameter stop loss perlu ditetapkan mengikut pergerakan saham tertentu, terlalu besar atau terlalu kecil akan mempengaruhi kesan strategi
  • Tracking stop loss boleh mengurangkan ruang untuk keuntungan dan menghentikan kerugian sebelum harga saham naik lagi
  • Perubahan kedudukan yang kerap menyebabkan kos dagangan yang lebih tinggi

Anda boleh mengoptimumkan parameter, menyesuaikan parameter kitaran ATR dan amplitud hentian, dan mencari kombinasi parameter terbaik untuk mengimbangi hentian dan pengesanan. Anda juga boleh menggabungkan penyaringan masa masuk ke pasaran dengan petunjuk teknikal lain untuk mengurangkan hentian yang tidak perlu.

Arah pengoptimuman

  • Optimumkan parameter kitaran ATR untuk menjadikan perubahan garisan henti lebih dekat dengan turun naik harga
  • Mengoptimumkan parameter stop loss amplitudo untuk membuat stop loss lebih munasabah
  • Menambah penanda lain untuk penyaringan masa masuk
  • Hanya masuk ke dalam kedudukan tambahan apabila terdapat trend kenaikan harga saham yang jelas
  • Pertimbangkan untuk menyertai mekanisme kemasukan semula untuk mengelakkan kehilangan saham yang dijangka terus meningkat

ringkaskan

Strategi ini mencapai penutupan dan penguncian keuntungan dalam proses pemegangan dengan cara menyesuaikan garis stop loss ATR secara dinamik. Ia lebih sesuai dengan turun naik harga saham, dan mengelakkan penutupan yang terlalu radikal atau konservatif daripada kedudukan stop loss tetap. Indeks ATR membuat penyesuaian garis stop loss lebih disasarkan. Tetapi strategi penetapan parameter dan kemasukan kembali memerlukan pengoptimuman lebih lanjut untuk mengurangkan kerugian yang tidak perlu dan mengembangkan ruang keuntungan.

Kod sumber strategi
/*backtest
start: 2023-09-08 00:00:00
end: 2023-10-08 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//@okadoke
////////////////////////////////////////////////////////////
// Based on Average True Range Trailing Stops Strategy by HPotter
// Average True Range Trailing Stops Strategy, by Sylvain Vervoort 
// The related article is copyrighted material from Stocks & Commodities Jun 2009 
////////////////////////////////////////////////////////////
strategy(title="ATR Trailing Stops Strategy", shorttitle="ATRTSS", overlay = true, 
  initial_capital=100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type="percent", commission_value=0.0)
  
nATRPeriod      = input(5, "ATR Period")
nATRMultip      = input(3.5, "ATR Multiplier")
useShorts       = input(false, "Test w/Shorts?")
daysBackMax     = input(defval = 360, title = "Max Days Back to Test", minval = 0)
daysBackMin     = input(defval = 0, title = "Min Days Back to Test", minval = 0)
msBackMax       = 1000 * 60 * 60 * 24 * daysBackMax
msBackMin       = 1000 * 60 * 60 * 24 * daysBackMin

xATR = atr(nATRPeriod)
nLoss = nATRMultip * xATR
xATRTrailingStop = na
xATRTrailingStop := 
 iff(close > nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), close - nLoss),
  iff(close < nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), close + nLoss), 
   iff(close > nz(xATRTrailingStop[1], 0), close - nLoss, close + nLoss))) 
                       
pos = na 
pos := 
 iff(close[1] < nz(xATRTrailingStop[1], 0) and close > nz(xATRTrailingStop[1], 0), 1, 
  iff(close[1] > nz(xATRTrailingStop[1], 0) and close < nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0)))
        
color = pos == -1 ? red: pos == 1 ? green : blue 
plot(xATRTrailingStop, color=color, title="ATR Trailing Stop")

isWithinTimeBounds = (msBackMax == 0 or (time > (timenow - msBackMax))) and (msBackMin == 0 or (time < (timenow - msBackMin)))

buy     = crossover(close, xATRTrailingStop)
sell    = crossunder(close, xATRTrailingStop)

strategy.entry("LONG", long=true, when=buy and isWithinTimeBounds)
strategy.close("LONG", when=sell and isWithinTimeBounds)
strategy.entry("SHORT", long=false, when=useShorts and sell and isWithinTimeBounds)
strategy.close("SHORT", when=useShorts and buy and isWithinTimeBounds)