Chiến lược này sử dụng Pivot Points để xác định các điểm đảo ngược thị trường và đưa ra các quyết định giao dịch dựa trên chúng. Khi một Pivot High được hình thành trong vòng 4 nến cuối cùng ở bên trái, chiến lược đi vào vị trí dài; khi một Pivot Low được hình thành trong vòng 4 nến cuối cùng ở bên trái, chiến lược đi vào vị trí ngắn. Stop loss được đặt ở một kích thước tick (syminfo.mintick) trên hoặc dưới giá nhập cảnh. Có hai điều kiện thoát: 1) thoát khi điểm quay ngược tiếp theo xuất hiện; 2) thoát khi lỗ nổi đạt 30%.
Chiến lược này xây dựng một hệ thống giao dịch hai chiều dựa trên chỉ số Pivot Point, nắm bắt các cơ hội đảo ngược thị trường bằng cách đi dài ở Pivot Highs và ngắn ở Pivot Lows. Chiến lược có một cơ sở lý thuyết và giá trị thực tế nhất định, nhưng do những hạn chế của chỉ số Pivot Point, chiến lược có thể phải đối mặt với một số rủi ro và thách thức trong hoạt động thực tế. Bằng cách tối ưu hóa loại chỉ số Pivot Point, các tham số, điều kiện lọc, dừng lỗ và lấy lợi nhuận, v.v., dự kiến sẽ tiếp tục cải thiện độ mạnh mẽ và lợi nhuận của chiến lược.
/*backtest start: 2023-04-24 00:00:00 end: 2024-04-29 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Pivot Reversal Strategy with Pivot Exit", overlay=true) leftBars = input(4) rightBars = input(2) var float dailyEquity = na // Reset equity to $10,000 at the beginning of each day isNewDay = ta.change(time("D")) != 0 if (isNewDay) dailyEquity := 10000 // Calculate pivot highs and lows swh = ta.pivothigh(leftBars, rightBars) swl = ta.pivotlow(leftBars, rightBars) // Define long entry condition swh_cond = not na(swh) hprice = 0.0 hprice := swh_cond ? swh : hprice[1] le = false le := swh_cond ? true : (le[1] and high > hprice ? false : le[1]) // Enter long position if long entry condition is met if (le) strategy.entry("PivRevLE", strategy.long, comment="EnterLong", stop=hprice + syminfo.mintick) // Define short entry condition swl_cond = not na(swl) lprice = 0.0 lprice := swl_cond ? swl : lprice[1] se = false se := swl_cond ? true : (se[1] and low < lprice ? false : se[1]) // Enter short position if short entry condition is met if (se) strategy.entry("PivRevSE", strategy.short, comment="EnterShort", stop=lprice - syminfo.mintick) // Exit condition: Exit at the next pivot point exitAtNextPivot() => if strategy.opentrades > 0 if strategy.position_size > 0 // Exiting long position at next pivot low if not na(swl) strategy.exit("ExitLong", "PivRevLE", stop=swl - syminfo.mintick) else // Exiting short position at next pivot high if not na(swh) strategy.exit("ExitShort", "PivRevSE", stop=swh + syminfo.mintick) // Call exitAtNextPivot function exitAtNextPivot() // Exit condition: Exit if profit is less than 30% exitIfProfitLessThanThirtyPercent() => if strategy.opentrades > 0 if strategy.position_size > 0 // Calculate profit percentage for long position profit_percentage_long = (close - strategy.position_avg_price) / strategy.position_avg_price * 100 // Exiting long position if profit is less than 30% if profit_percentage_long < -30 strategy.close("PivRevLE") else // Calculate profit percentage for short position profit_percentage_short = (strategy.position_avg_price - close) / strategy.position_avg_price * 100 // Exiting short position if profit is less than 30% if profit_percentage_short < -30 strategy.close("PivRevSE") // Call exitIfProfitLessThanThirtyPercent function exitIfProfitLessThanThirtyPercent()