
本策略是基于SSL通道指标的回测策略,同时结合了ATR止损、ATR止盈和资金管理等功能,可以更全面地测试SSL通道策略的效果。
SSL通道指标由通道中线和通道带组成。通道中线是简单移动平均线,分为上轨和下轨,通常取高点期间的简单移动平均线作为上轨,低点期间的简单移动平均线作为下轨。通道带则由上轨和下轨之间的区域构成。
当价格接近通道上轨时视为超买,当价格接近通道下轨时视为超卖。价格突破通道带的时候,表示趋势发生转变的信号。
本策略中的SSL通道指标参数设置为:ssl_period=16。
ATR指平均真实波幅。它可以用来评估市场的波动性和确定止损止盈位置。
本策略使用了参数atr_period=14的ATR指标,并结合atr_stop_factor=1.5和atr_target_factor=1.0作为止损和止盈的动态倍数,实现了基于市场波动率的止损止盈。
此外,为了适应不同品种,本策略还加入了two_digit参数判断合约为2位精度的品种(如黄金、日元),从而可灵活调整止损止盈位。
资金管理主要通过参数position_size(固定仓位)和risk(百分比风险敞口)实现。当use_mm=true时会启用资金管理模块。
资金管理的主要目标是控制每次开仓的头寸大小。当采用固定百分比风险模式时,会根据账户权益计算出风险敞口后转化为合约数,从而实现抑制单笔损失的效果。
这些风险可以通过以下方法加以改善:
本策略可以从以下几个方面进行优化:
通过系统的测试和优化,本策略可以成为一个可靠和稳定的量化交易系统。
本策略整合了SSL通道指标判断趋势、ATR设定止损止盈和资金管理控制风险三种机制。通过全面的回测可以检验该策略的效果,并且可以作为量化交易策略优化的基础框架。与此同时,本策略也有可以改进的空间,如加入其他过滤指标、优化参数以及扩充功能等。总的来说,本策略为搭建自动化交易系统奠定了坚实的基石。
/*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)