
This strategy uses Pivot Points to identify market reversal points and make trading decisions based on them. When a Pivot High is formed within the last 4 candles on the left, the strategy enters a long position; when a Pivot Low is formed within the last 4 candles on the left, the strategy enters a short position. The stop loss is set at one tick size (syminfo.mintick) above or below the entry price. There are two exit conditions: 1) exit when the next opposite pivot point appears; 2) exit when the floating loss reaches 30%.
This strategy builds a bi-directional trading system based on the Pivot Point indicator, capturing market reversal opportunities by going long at Pivot Highs and short at Pivot Lows. The strategy has certain theoretical basis and practical value, but due to the limitations of the Pivot Point indicator itself, the strategy may face some risks and challenges in actual operation. By optimizing the Pivot Point indicator type, parameters, filtering conditions, stop loss and profit taking, etc., it is expected to further improve the robustness and profitability of the strategy.
/*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()