Strategi Pengesanan Hentian Kerugian Terbuka-Tinggi-Rendah

Penulis:ChaoZhang, Tarikh: 2024-02-18 14:30:08
Tag:

img

Ringkasan

Strategi ini direka berdasarkan data terbuka, tinggi dan rendah carta lilin untuk mengenal pasti titik pembalikan trend untuk kemasukan. Selepas kemasukan, garis stop loss akan ditetapkan berdasarkan penunjuk ATR dan dikesan. Sasaran juga akan dikira berdasarkan nisbah risiko-balasan. Apabila harga mencapai sasaran stop loss atau keuntungan, pesanan akan dihantar untuk menutup kedudukan.

Logika Strategi

Isyarat masuk strategi ini berasal dari harga terbuka, tinggi dan rendah. Isyarat beli dihasilkan apabila harga pembukaan sama dengan harga rendah candlestick, dan isyarat jual dihasilkan apabila harga pembukaan sama dengan tinggi, menunjukkan peluang pembalikan trend yang berpotensi.

Selepas masuk, stop loss trailing dinamik dikira berdasarkan penunjuk ATR. Stop loss panjang ditetapkan pada paras terendah N bar baru-baru ini dikurangkan 1 ATR; stop loss pendek ditetapkan pada paras tertinggi N bar baru-baru ini ditambah 1 ATR. Garis stop loss akan dikemas kini secara dinamik untuk pergerakan harga trail.

Sasaran keuntungan dikira berdasarkan penetapan nisbah risiko-balasan. Sasaran panjang ditetapkan pada harga kemasukan ditambah (perbezaan risiko antara harga kemasukan dan kerugian berhenti dikalikan dengan nisbah risiko-balasan); sasaran pendek ditetapkan pada harga kemasukan dikurangkan (perbezaan risiko antara kerugian berhenti dan harga kemasukan dikalikan dengan nisbah risiko-balasan).

Apabila harga mencapai sasaran stop loss atau keuntungan, pesanan akan dihantar ke kedudukan rata.

Analisis Kelebihan

Kelebihan strategi ini termasuk:

  1. Isyarat masuk yang mudah dan jelas, mengelakkan pelbagai whipsaws.

  2. Dinamis ATR trailing stop kunci dalam keuntungan dan menghalang mengejar tinggi dan rendah.

  3. Kawalan nisbah risiko-balasan mengelakkan meninggalkan keuntungan di atas meja dan perdagangan berlebihan.

  4. Boleh digunakan untuk produk yang berbeza, mudah untuk mengoptimumkan.

Analisis Risiko

Terdapat juga beberapa risiko strategi ini:

  1. Isyarat kemasukan mungkin tertinggal dalam beberapa tahap, kehilangan kemasukan pasaran terbaik.

  2. Stop loss terlalu ketat atau terlalu longgar, menyebabkan stop loss yang tidak perlu atau kehilangan keuntungan.

  3. Tiada penentuan trend, cenderung untuk terperangkap dalam pasaran yang berbeza.

  4. Tidak dapat mengendalikan kedudukan semalam.

Arah pengoptimuman adalah:

  1. Sertakan penunjuk lain untuk bias trend untuk mengelakkan whipsaws.

  2. Sesuaikan parameter ATR atau tambahkan kawalan turun naik untuk menghentikan kerugian yang lebih baik.

  3. Tambah penapisan trend untuk mengurangkan bunyi isyarat.

  4. Tambah pengendalian kedudukan semalam untuk produk tertentu.

Kesimpulan

Kesimpulannya, ini adalah strategi yang mudah dan mudah dengan logik kemasukan yang jelas, metodologi stop loss yang munasabah dan kawalan risiko yang baik. Tetapi terdapat beberapa batasan seperti bias trend yang tidak mencukupi, kelewatan isyarat dll. Kecacatan ini juga menunjukkan arah untuk pengoptimuman masa depan. Dengan menggabungkan lebih banyak penapis penunjuk dan modul pengurusan risiko, strategi ini dapat ditingkatkan dan dibuat lebih mantap.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// Open-High-Low strategy

strategy('Strategy: OLH', shorttitle="OLH", overlay=true )

// Inputs
slAtrLen = input.int(defval=14, title="ATR Period for placing SL", group="StopLoss settings")
showSLLines = input.bool(defval=false, title="Show SL lines in chart", tooltip="Show SL lines also as dotted lines in chart. Note: chart may look untidy.", group="Stolploss settings")
// Trade related
rrRatio = input.float(title='Risk:Reward', step=0.1, defval=2.0, group="Trade settings")
endOfDay = input.int(defval=1500, title="Close all trades, default is 3:00 PM, 1500 hours (integer)", group="Trade settings")
mktAlwaysOn = input.bool(defval=true, title="Markets that never closed (Crypto, Forex, Commodity)", tooltip="Some markers never closes. For those cases, make this checked.", group="Trade settings")
lotSize = input.int(title='Lot Size', step=1, defval=1, group="Trade settings")


// Utils
green(open, close) => close > open ? true : false
red(open, close) => close < open ? true : false
body(open, close) => math.abs(open - close)
lowerwick = green(open, close) ? open - low : close - low
upperwick = green(open, close) ? high - close : high - open
crange = high - low
crangep = high[1] - low[1] // previous candle's candle-range
bullish = close > open ? true : false
bearish = close < open ? true : false


// Trade signals
longCond = barstate.isconfirmed and (open == low)
shortCond = barstate.isconfirmed and (open == high)

// For SL calculation
atr = ta.atr(slAtrLen)
highestHigh = ta.highest(high, 7)
lowestLow = ta.lowest(low, 7)
longStop = showSLLines ? lowestLow - (atr * 1) : na
shortStop = showSLLines ? highestHigh + (atr * 1) : na
plot(longStop, title="Buy SL", color=color.green, style=plot.style_cross)
plot(shortStop, title="Sell SL", color=color.red, style=plot.style_cross)

// Trade execute
h = hour(time('1'), syminfo.timezone)
m = minute(time('1'), syminfo.timezone)
hourVal = h * 100 + m
totalTrades = strategy.opentrades + strategy.closedtrades
if (mktAlwaysOn or (hourVal < endOfDay))
    // Entry
    var float sl = na
    var float target = na
    if (longCond)
        strategy.entry("enter long", strategy.long, lotSize, limit=na, stop=na, comment="Enter Long")
        sl := longStop
        target := close + ((close - longStop) * rrRatio)
        alert('Buy:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)
    if (shortCond)
        strategy.entry("enter short", strategy.short, lotSize, limit=na, stop=na, comment="Enter Short")
        sl := shortStop
        target := close - ((shortStop - close) * rrRatio)
        alert('Sell:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)

    // Exit: target or SL
    if ((close >= target) or (close <= sl))
        strategy.close("enter long", comment=close < sl ? "Long SL hit" : "Long target hit")
    if ((close <= target) or (close >= sl))
        strategy.close("enter short", comment=close > sl ? "Short SL hit" : "Short target hit")
else if (not mktAlwaysOn)
    // Close all open position at the end if Day
    strategy.close_all(comment = "Close all entries at end of day.")



Lebih lanjut