
This is a backtesting strategy based on the SSL channel indicator, integrated with functions like ATR stop loss, ATR take profit and money management to facilitate a more comprehensive test on the SSL channel strategy.
The SSL channel indicator consists of the channel midline and channel bands. The channel midline contains an upper track and a lower track, which are usually simple moving averages of high and low prices over a lookback period. The channel bands are formed between the upper and lower tracks.
When price approaches the upper band, it indicates overbought conditions; when price approaches the lower band, it signals oversold conditions. A breakout of the channel bands implies a trend reversal.
The SSL channel parameter is set to ssl_period=16 in this strategy.
The Average True Range (ATR) measures market volatility and can be used to determine stop loss and take profit levels.
This strategy utilizes a 14-period ATR (atr_period=14) and dynamic multipliers atr_stop_factor=1.5 and atr_target_factor=1.0 to set adaptive stop loss and take profit based on volatility.
It also checks if the instrument has 2-decimal precision (two_digit) to adjust the stop and target accordingly for pairs like gold and JPY.
Money management is achieved through position_size (fixed position sizing) and risk (risk percentage per trade) parameters. The money management module will be enabled when use_mm=true.
The goal is to determine the optimal position size for each trade. By using fixed risk % per trade, the allowable position size will be calculated dynamically based on the account equity to limit the loss on every single trade.
These risks can be mitigated by:
The strategy can be improved in the following aspects:
With systematic optimization, this strategy can become a robust algorithmic trading system.
This strategy combines the SSL channel for trend, ATR for risk control, and money management for position sizing. Comprehensive backtesting facilitates evaluating and enhancing the strategy into an automated trading system. There is also room for improvements like adding filters, optimizing parameters and expanding functionality. Overall, this forms a solid foundation for building algorithmic trading strategies.
/*backtest
start: 2023-10-23 00:00:00
end: 2023-11-22 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © comiclysm
//@version=4
strategy("SSL Backtester", overlay=false)
//--This strategy will simply test the effectiveness of the SSL using
//--money management and an ATR-derived stop loss
//--USER INPUTS
two_digit = input(false, "Check this for 2-digit pairs (JPY, Gold, Etc)")
ssl_period = input(16, "SSL Period")
atr_period = input(14, "ATR Period")
atr_stop_factor = input(1.5, "ATR Stop Loss Factor")
atr_target_factor = input(1.0, "ATR Target Factor")
use_mm = input(true, "Check this to use Money Management")
position_size = input(1000, "Position size (for Fixed Risk)")
risk = input(0.01, "Risk % in Decimal Form")
//--INDICATORS------------------------------------------------------------
//--SSL
sma_high = sma(high, ssl_period)
sma_low = sma(low, ssl_period)
ssl_value = 0
ssl_value := close > sma_high ? 1 : close < sma_low ? -1 : ssl_value[1]
ssl_low = ssl_value < 0 ? sma_high : sma_low
ssl_high = ssl_value < 0 ? sma_low : sma_high
//--Average True Range
atr = atr(atr_period)
//--TRADE LOGIC----------------------------------------------------------
signal_long = ssl_value > 0 and ssl_value[1] < 0
signal_short = ssl_value < 0 and ssl_value[1] > 0
//--RISK MANAGMENT-------------------------------------------------------
strategy.initial_capital = 50000
balance = strategy.netprofit + strategy.initial_capital
risk_pips = atr*10000*atr_stop_factor
if(two_digit)
risk_pips := risk_pips / 100
risk_in_value = balance * risk
point_value = syminfo.pointvalue
risk_lots = risk_in_value / point_value / risk_pips
final_risk = use_mm ? risk_lots * 10000 : position_size
//--TRADE EXECUTION-----------------------------------------------------
if (signal_long)
stop_loss = close - atr * atr_stop_factor
target = close + atr * atr_target_factor
strategy.entry("Long", strategy.long, final_risk)
strategy.exit("X", "Long", stop=stop_loss, limit=target)
if (signal_short)
stop_loss = close + atr * atr_stop_factor
target = close - atr * atr_target_factor
strategy.entry("Short", strategy.short, final_risk)
strategy.exit("X", "Short", stop=stop_loss, limit=target)
//--PLOTTING-----------------------------------------------------------
plot(ssl_low, "SSL", color.red, linewidth=1)
plot(ssl_high, "SSL", color.lime, linewidth=1)