Ini adalah strategi perdagangan long-only breakout berdasarkan trendline dinamik dan pengesahan jumlah. Strategi ini mengenal pasti swing high utama dengan mengesan pergerakan harga dalam masa nyata dan secara dinamik membina trendline. Apabila harga memecahkan di atas trendline atas dengan jumlah yang ketara, strategi memasuki kedudukan panjang sambil menguruskan risiko melalui mekanisme mengambil keuntungan berasaskan peratusan, stop-loss, dan trailing stop.
Logik terasnya dibina di atas tiga tiang utama: pembinaan garis trend dinamik, pengesahan jumlah, dan sistem pengurusan risiko. Pertama, strategi menggunakan fungsi ta.pivothigh untuk mengenal pasti paras tertinggi pergerakan harga secara dinamik dan membina garis trend atas berdasarkan cerun dan penyambungan yang dikira dari dua paras tertinggi pergerakan terbaru. Kedua, isyarat kemasukan mesti disertai dengan jumlah 1.5 kali lebih tinggi daripada purata 20 tempoh untuk memastikan kesahihan pecah. Akhirnya, strategi menggunakan peratusan tetap mengambil keuntungan (2%) dan berhenti rugi (1%), dengan berhenti trailing 1% untuk mengunci keuntungan.
Ini adalah strategi trend-mengikuti yang direka dengan baik dengan logik yang kukuh. Melalui gabungan trendline dinamik dan pengesahan jumlah, bersama dengan sistem pengurusan risiko yang komprehensif, strategi menunjukkan kemampuan beradaptasi dan kebolehpercayaan yang baik. Walaupun ia mempunyai beberapa ketergantungan pasaran, terdapat ruang yang signifikan untuk peningkatan melalui arah pengoptimuman yang dicadangkan. Pedagang dinasihatkan untuk menjalankan pengoptimuman parameter yang menyeluruh dan pengujian belakang sebelum pelaksanaan langsung.
/*backtest start: 2019-12-23 08:00:00 end: 2024-12-09 08:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Long Only Strategy with Dynamic Trend Lines, Fixed TP/SL, and Trailing SL+", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10, pyramiding=0, // Prevent multiple entries calc_on_order_fills=true, calc_on_every_tick=true) // === Parameters === swingThreshold = input.int(5, title="Swing Detection Threshold") tpPercent = input.float(2.0, title="Take Profit (%)") slPercent = input.float(1.0, title="Stop Loss (%)") trailPercent = input.float(1.0, title="Trailing Stop (%)") volumeThresholdMultiplier = input.float(1.5, title="Volume Spike Threshold (x MA)") // === Volume Indicator === avgVolume = ta.sma(volume, 20) volumeSpike = volume > (avgVolume * volumeThresholdMultiplier) // === Detect Swing High === isSwingHigh = ta.pivothigh(high, swingThreshold, swingThreshold) // Variables to store swing highs var float swingHigh1 = na var float swingHigh2 = na var int swingHighBar1 = na var int swingHighBar2 = na // Update swing highs if (isSwingHigh) swingHigh2 := swingHigh1 swingHighBar2 := swingHighBar1 swingHigh1 := high[swingThreshold] swingHighBar1 := bar_index - swingThreshold // === Calculate Upper Trend Line === var float upperSlope = na var float upperIntercept = na // Calculate slope and intercept for upper trend line if there are two swing highs if (not na(swingHigh1) and not na(swingHigh2)) deltaX = swingHighBar1 - swingHighBar2 if (deltaX != 0) upperSlope := (swingHigh1 - swingHigh2) / deltaX upperIntercept := swingHigh1 - (upperSlope * swingHighBar1) else upperSlope := 0 upperIntercept := swingHigh1 // Calculate trend line price for the current bar var float upperTrendPrice = na if (not na(upperSlope) and not na(upperIntercept)) upperTrendPrice := upperSlope * bar_index + upperIntercept // Calculate trend line price for the previous bar var float upperTrendPrice_prev = na if (not na(upperSlope) and not na(upperIntercept)) upperTrendPrice_prev := upperSlope * (bar_index - 1) + upperIntercept // === Buy Condition Based on Trend Line Breakout === // Buy Signal: Price breaks above Upper Trend Line with volume spike breakoutBuyCondition = (not na(upperTrendPrice)) and (close > upperTrendPrice) and (not na(upperTrendPrice_prev)) and (close[1] <= upperTrendPrice_prev) and volumeSpike // === Manage Single Position === // Calculate Take Profit and Stop Loss levels based on percentage longTakeProfit = close * (1 + tpPercent / 100) longStopLoss = close * (1 - slPercent / 100) // Calculate Trailing Stop as trail_offset (in price) trail_offset = close * (trailPercent / 100) // Execute Trade with Single Position Management if (breakoutBuyCondition) // Close existing short position if any if (strategy.position_size < 0) strategy.close("Sell") // Open long position strategy.entry("Buy", strategy.long) // Set Take Profit, Stop Loss, and Trailing Stop Loss for long position strategy.exit("Take Profit Buy", from_entry="Buy", limit=longTakeProfit, stop=longStopLoss, trail_offset=trail_offset) // Plot Buy Signal plotshape(breakoutBuyCondition, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="BUY")