
This strategy is a trend breakout trading system based on the falling wedge pattern in technical analysis. It dynamically identifies highs and lows in price action to construct upper and lower trendlines, entering long positions when price breaks above the upper trendline. The strategy employs dynamic take-profit and stop-loss mechanisms to control risk and lock in profits. This is a programmatic implementation of a classic technical analysis trading method, particularly suitable for capturing reversal opportunities when downtrends are potentially ending.
The core logic includes several key steps: 1. Using Pivot method to dynamically identify highs and lows in price movement 2. Recording and storing the last two highs and lows with their corresponding time indices 3. Calculating slopes of upper and lower trendlines based on these points 4. Identifying falling wedge formation: requiring descending highs and lows, with upper trendline slope less than lower trendline slope 5. Triggering buy signals when price breaks above the upper trendline 6. Setting percentage-based take-profit and stop-loss conditions relative to entry price
This is a well-designed trend trading strategy that implements traditional technical analysis methods programmatically. Its strength lies in automated market structure identification and potential trend reversal capture. However, attention must be paid to false breakouts and parameter optimization. With further enhancement and refinement, this strategy has potential for improved performance in actual trading.
/*backtest
start: 2025-04-11 00:00:00
end: 2025-07-10 00:00:00
period: 10m
basePeriod: 10m
exchanges: [{"eid":"Binance","currency":"BTC_USDT","balance":200000}]
*/
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
//@version=6
strategy("Falling Wedge Strategy by Nitin", overlay=true)
// Input parameters
leftBars = input.int(5, "Left Bars for Pivot", minval=1, maxval=20)
rightBars = input.int(5, "Right Bars for Pivot", minval=1, maxval=20)
takeProfitPercent = input.float(6, "Take Profit %", minval=0.1, maxval=100)/100
stopLossPercent = input.float(2, "Stop Loss %", minval=0.1, maxval=100)/100
// Global variables
var float buyPrice = na
// Detect pivot highs and lows
ph = ta.pivothigh(leftBars, rightBars)
pl = ta.pivotlow(leftBars, rightBars)
// Track last two pivot highs
var float[] highs = array.new_float()
var int[] highIndices = array.new_int()
if not na(ph)
array.unshift(highs, ph)
array.unshift(highIndices, bar_index[rightBars])
if array.size(highs) > 2
array.pop(highs)
array.pop(highIndices)
// Track last two pivot lows
var float[] lows = array.new_float()
var int[] lowIndices = array.new_int()
if not na(pl)
array.unshift(lows, pl)
array.unshift(lowIndices, bar_index[rightBars])
if array.size(lows) > 2
array.pop(lows)
array.pop(lowIndices)
// Calculate trendlines and detect falling wedge pattern
isFallingWedge = false
var float currentUpper = na
var float currentLower = na
if array.size(highs) >= 2 and array.size(lows) >= 2
h1 = array.get(highs, 0)
h2 = array.get(highs, 1)
i1 = array.get(highIndices, 0)
i2 = array.get(highIndices, 1)
l1 = array.get(lows, 0)
l2 = array.get(lows, 1)
j1 = array.get(lowIndices, 0)
j2 = array.get(lowIndices, 1)
m_upper = (h1 - h2) / (i1 - i2)
m_lower = (l1 - l2) / (j1 - j2)
currentUpper := h2 + m_upper * (bar_index - i2)
currentLower := l2 + m_lower * (bar_index - j2)
// Falling wedge pattern condition
isFallingWedge := h1 < h2 and l1 < l2 and m_upper < m_lower and m_upper < 0 and m_lower < 0
// Trading strategy execution
if isFallingWedge and ta.crossover(close, currentUpper) and strategy.position_size == 0
strategy.entry("Buy", strategy.long)
buyPrice := close
strategy.exit("Take Profit/Stop Loss", "Buy", stop=buyPrice * (1 - stopLossPercent), limit=buyPrice * (1 + takeProfitPercent))
// Plotting
plot(strategy.position_size > 0 ? buyPrice * (1 - stopLossPercent) : na, "Stop Loss", color=color.red, linewidth=2)
plot(strategy.position_size > 0 ? buyPrice * (1 + takeProfitPercent) : na, "Take Profit", color=color.green, linewidth=2)