dev-resources.site
for different kinds of informations.
Multi-Timeframe Trend Following Strategy with ATR-Based Take Profit and Stop Loss
Overview
This is a trend-following trading strategy that combines UT Bot with a 50-period exponential moving average (EMA). The strategy is mainly short-term trading in a 1-minute time period, while using a 5-minute time period trend line as a direction filter. The strategy uses the ATR indicator to dynamically calculate the stop loss position and sets a double take profit target to optimize returns.
Strategy Principle
The core logic of the strategy is based on the following key components:
- Using UT Bot to calculate dynamic support and resistance levels
- Use the 50-period EMA with a 5-minute period to determine the overall trend direction
- Combine 21-period EMA and UT Bot signals to determine specific entry points
- Set dynamic trailing stop loss by ATR multiple
- Set two profit targets of 0.5% and 1%, and close 50% of the position respectively
When the price breaks through the support/resistance level calculated by UT Bot and the 21-period EMA crosses UT Bot, a trading signal is triggered if the price is in the right direction of the 5-minute 50-period EMA.
Strategy Advantages
- The combination of multiple time periods improves transaction reliability
- Dynamic ATR stop loss can be adjusted adaptively according to market fluctuations
- Double profit targets balance returns and win rates
- Using Heikin Ashi candlestick charts can filter out some false breakouts
- Support flexible trading direction selection (only long, only short or two-way trading)
Strategy Risks
- Short-term transactions may face higher spreads and commission costs
- Frequent false signals may occur in sideways markets
- Multiple restrictions may result in missing out on potential trading opportunities
- The setting of ATR parameters needs to be optimized for different markets
Strategy Optimization Direction
- You can add volume indicators as auxiliary confirmation
- Consider introducing more market sentiment indicators
- Develop adaptive parameters for different market volatility characteristics
- Added filtering for trading time periods
- Developing a smarter warehouse management system
Summary
This strategy builds a complete trading system by combining multiple technical indicators and time periods. It not only includes clear entry and exit conditions, but also provides a complete risk management mechanism. Although in actual application, parameter optimization still needs to be carried out according to specific market conditions, the overall framework has good practicality and scalability.
Strategy source code
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
//Created by Nasser mahmoodsani' all rights reserved
// E-mail : [email protected]
strategy("UT Bot Strategy with T/P and S/L and Trend EMA", overlay=true)
// Inputs
along = input(1, title='Key Value (Sensitivity - Long)', group="LONG")
clong = input(10, title='ATR Period (Long)', group="LONG")
h = input(true, title='Signals from Heikin Ashi Candles')
ashort = input(7, title='Key Value (Sensitivity - Short)', group="SHORT")
cshort = input(2, title='ATR Period (Short)', group="SHORT")
tradeType = input.string("Both", title="Trade Type", options=["Buy Only", "Sell Only", "Both"])
tp1_percent = input.float(0.5, title="TP1 Percentage", step=0.1, group="TP Settings") // TP1 % input
tp2_percent = input.float(1.0, title="TP2 Percentage", step=0.1, group="TP Settings") // TP2 % input
sl_percent = input.float(1.0, title="Stop Loss Percentage", step=0.1, group="TP Settings") // SL % input
sl_in_percent = input(true, title="Use Stop Loss in Percentage", group="TP Settings")
tp1_qty = input.float(0.5, title="Take Profit 1 Quantity (as % of position size)", minval=0.0, maxval=1.0, step=0.1)
tp2_qty = input.float(0.5, title="Take Profit 2 Quantity (as % of position size)", minval=0.0, maxval=1.0, step=0.1)
// Check that total quantities for TPs do not exceed 100%
if tp1_qty + tp2_qty > 1
runtime.error("The sum of Take Profit quantities must not exceed 100%.")
// Calculate 50 EMA from 5-Minute Timeframe
trendEmaPeriod = 50
trendEma_5min = request.security(syminfo.tickerid, "5", ta.ema(close, trendEmaPeriod))
plot(trendEma_5min, title="Trend EMA (5-Min)", color=color.blue, linewidth=2)
// Calculations
xATRlong = ta.atr(clong)
xATRshort = ta.atr(cshort)
nLosslong = along * xATRlong
nLossshort = ashort * xATRshort
src = h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close) : close
// LONG
var float xATRTrailingStoplong = na
var float stopLossLong = na
var float takeProfit1 = na
var float takeProfit2 = na
iff_1long = src > nz(xATRTrailingStoplong[1], 0) ? src - nLosslong : src + nLosslong
iff_2long = src < nz(xATRTrailingStoplong[1], 0) and src[1] < nz(xATRTrailingStoplong[1], 0) ? math.min(nz(xATRTrailingStoplong[1]), src + nLosslong) : iff_1long
xATRTrailingStoplong := src > nz(xATRTrailingStoplong[1], 0) and src[1] > nz(xATRTrailingStoplong[1], 0) ? math.max(nz(xATRTrailingStoplong[1]), src - nLosslong) : iff_2long
buy = src > xATRTrailingStoplong and ta.crossover(ta.ema(src, 21), xATRTrailingStoplong) and close > trendEma_5min
if buy and (tradeType == "Buy Only" or tradeType == "Both")
takeProfit1 := close * (1 + tp1_percent / 100)
takeProfit2 := close * (1 + tp2_percent / 100)
// Calculate stop loss based on percentage or ATR
if sl_in_percent
stopLossLong := close * (1 - sl_percent / 100)
else
stopLossLong := close - nLosslong
strategy.entry("Long", strategy.long)
strategy.exit("Take Profit 1", from_entry="Long", limit=takeProfit1, qty=strategy.position_size * tp1_qty)
strategy.exit("Take Profit 2", from_entry="Long", limit=takeProfit2, qty=strategy.position_size * tp2_qty)
strategy.exit("Stop Loss", from_entry="Long", stop=stopLossLong, qty=strategy.position_size)
// // Create Position Projectile for Long
// var line tpLineLong1 = na
// var line tpLineLong2 = na
// var line slLineLong = na
// var label entryLabelLong = na
// // Update projectile on entry
// line.delete(tpLineLong1)
// line.delete(tpLineLong2)
// line.delete(slLineLong)
// label.delete(entryLabelLong)
// tpLineLong1 := line.new(x1=bar_index, y1=takeProfit1, x2=bar_index + 1, y2=takeProfit1, color=color.green, width=2, style=line.style_solid)
// tpLineLong2 := line.new(x1=bar_index, y1=takeProfit2, x2=bar_index + 1, y2=takeProfit2, color=color.green, width=2, style=line.style_dashed)
// slLineLong := line.new(x1=bar_index, y1=stopLossLong, x2=bar_index + 1, y2=stopLossLong, color=color.red, width=2, style=line.style_solid)
// SHORT
var float xATRTrailingStopshort = na
var float stopLossShort = na
var float takeProfit1Short = na
var float takeProfit2Short = na
iff_1short = src > nz(xATRTrailingStopshort[1], 0) ? src - nLossshort : src + nLossshort
iff_2short = src < nz(xATRTrailingStopshort[1], 0) and src[1] < nz(xATRTrailingStopshort[1], 0) ? math.min(nz(xATRTrailingStopshort[1]), src + nLossshort) : iff_1short
xATRTrailingStopshort := src > nz(xATRTrailingStopshort[1], 0) and src[1] > nz(xATRTrailingStopshort[1], 0) ? math.max(nz(xATRTrailingStopshort[1]), src - nLossshort) : iff_2short
sell = src < xATRTrailingStopshort and ta.crossover(xATRTrailingStopshort, ta.ema(src, 21)) and close < trendEma_5min
if sell and (tradeType == "Sell Only" or tradeType == "Both")
takeProfit1Short := close * (1 - tp1_percent / 100)
takeProfit2Short := close * (1 - tp2_percent / 100)
// Calculate stop loss based on percentage or ATR
if sl_in_percent
stopLossShort := close * (1 + sl_percent / 100)
else
stopLossShort := close + nLossshort
strategy.entry("Short", strategy.short)
strategy.exit("Take Profit 1 Short", from_entry="Short", limit=takeProfit1Short, qty=strategy.position_size * tp1_qty)
strategy.exit("Take Profit 2 Short", from_entry="Short", limit=takeProfit2Short, qty=strategy.position_size * tp2_qty)
strategy.exit("Stop Loss Short", from_entry="Short", stop=stopLossShort, qty=strategy.position_size)
// Create Position Projectile for Short
// var line tpLineShort1 = na
// var line tpLineShort2 = na
// var line slLineShort = na
// var label entryLabelShort = na
// // Update projectile on entry
// line.delete(tpLineShort1)
// line.delete(tpLineShort2)
// line.delete(slLineShort)
// label.delete(entryLabelShort)
// tpLineShort1 := line.new(x1=bar_index, y1=takeProfit1Short, x2=bar_index + 1, y2=takeProfit1Short, color=color.green, width=2, style=line.style_solid)
// tpLineShort2 := line.new(x1=bar_index, y1=takeProfit2Short, x2=bar_index + 1, y2=takeProfit2Short, color=color.green, width=2, style=line.style_dashed)
// slLineShort := line.new(x1=bar_index, y1=stopLossShort, x2=bar_index + 1, y2=stopLossShort, color=color.red, width=2, style=line.style_solid)
// Updating Stop Loss after hitting Take Profit 1
if buy and close >= takeProfit1
strategy.exit("Adjusted Stop Loss", from_entry="Long", stop=close)
// Updating Stop Loss after hitting Take Profit 1 for Short
if sell and close <= takeProfit1Short
strategy.exit("Adjusted Stop Loss Short", from_entry="Short", stop=close)
Strategy parameters
The original address: https://www.fmz.com/strategy/475592
Featured ones: