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.
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.
Kelebihan strategi ini termasuk:
Isyarat masuk yang mudah dan jelas, mengelakkan pelbagai whipsaws.
Dinamis ATR trailing stop kunci dalam keuntungan dan menghalang mengejar tinggi dan rendah.
Kawalan nisbah risiko-balasan mengelakkan meninggalkan keuntungan di atas meja dan perdagangan berlebihan.
Boleh digunakan untuk produk yang berbeza, mudah untuk mengoptimumkan.
Terdapat juga beberapa risiko strategi ini:
Isyarat kemasukan mungkin tertinggal dalam beberapa tahap, kehilangan kemasukan pasaran terbaik.
Stop loss terlalu ketat atau terlalu longgar, menyebabkan stop loss yang tidak perlu atau kehilangan keuntungan.
Tiada penentuan trend, cenderung untuk terperangkap dalam pasaran yang berbeza.
Tidak dapat mengendalikan kedudukan semalam.
Arah pengoptimuman adalah:
Sertakan penunjuk lain untuk bias trend untuk mengelakkan whipsaws.
Sesuaikan parameter ATR atau tambahkan kawalan turun naik untuk menghentikan kerugian yang lebih baik.
Tambah penapisan trend untuk mengurangkan bunyi isyarat.
Tambah pengendalian kedudukan semalam untuk produk tertentu.
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.")