
Эта стратегия использует пересечение двух движущихся средних для определения изменения рыночных тенденций и совершения покупок и продаж в соответствии с тенденциями. Когда краткосрочная средняя линия проходит через долгосрочную среднюю линию, выделяйте больше, а когда краткосрочная средняя линия проходит через долгосрочную среднюю линию, оставляйте пустоту, чтобы следовать за направлением тенденции.
В основе этой стратегии лежат два движущихся средних: быстрое среднее ((по умолчанию 32 циклов) и медленное среднее ((по умолчанию 32 циклов, которое можно корректировать с помощью параметров). Когда ценовые цены на закрытии пересекают/понижают каналы, образованные этими двумя средними, это означает, что тенденция реверсируется, и стратегия создает сигнал “покупаю” или “продаю”:
С помощью этого равнолинейного перекрестного способа стратегия может следовать тренду, удерживая множественные позиции в восходящем тренде, удерживая пустые позиции в нисходящем тренде до тех пор, пока не появится сигнал об обратном тренде.
В ответ на вышеуказанные риски можно рассмотреть возможность добавления соответствующих фильтров, таких как ATR или средняя реальная волновая ширина фильтров, чтобы снизить чрезмерную торговлю в волатильных рынках; установить разумные остановки, чтобы контролировать одноразовые потери; постоянно оптимизировать параметры, чтобы адаптироваться к рынку. Однако ограничения самой стратегии трудно полностью обойти.
Вышеуказанная оптимизация может улучшить способность стратегии реагировать на сложные рынки, однако следует обратить внимание на то, что чрезмерная оптимизация может привести к корректировке кривой, что приведет к плохой будущей производительности.
Двухлинейная стратегия по отслеживанию трендов имеет простой, удобный и широкий спектр применения. Однако она плохо работает на волатильных рынках, недостаточно реагирует на экстремальные ситуации и имеет большие трудности в оптимизации параметров. Стратегия может быть оптимизирована путем введения дополнительных методов фильтрации, динамического остановки потерь, управления позициями, многоциклического объединения и самостоятельной адаптации параметров. Однако ограничения самой стратегии по отслеживанию трендов в полной мере избегаются, в реальном экспорту все еще требуется осторожность, гибкая настройка в соответствии с рыночными особенностями. В целом, эта стратегия может служить основой для отслеживания трендов, но она не может быть самостоятельной и более подходящей как часть совместной стратегии.
/*backtest
start: 2023-03-16 00:00:00
end: 2024-03-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
//study(title="Demo - SSL Basic", shorttitle="Demo - SSL Basic", overlay=true)
strategy(title='Demo - SSL Basic', shorttitle='Demo - SSL Basic', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, commission_value=0.15)
// Backtest Date Range
start_date_long = input(title='Backtest Long Start Date', defval=timestamp('01 Jan 2018 00:00 +0530'))
end_date_long = input(title='Backtest Long End Date', defval=timestamp('25 Jan 2030 00:00 +0530'))
backtest_range = true
// Inputs
maType = input.string(title='SSL MA Type', options=['SMA', 'EMA', 'WMA'], defval='SMA')
sslLen = input(title='SSL Length', defval=32)
showCross = input(title='Show Crossover?', defval=true)
showEntry = input(title='Show Entry?', defval=true)
showTrend = input(title='Show Trend Colors?', defval=true)
// Calc MA for SSL Channel
calc_ma(close, len, type) =>
float result = 0
if type == 'SMA' // Simple
result := ta.sma(close, len)
result
if type == 'EMA' // Exponential
result := ta.ema(close, len)
result
if type == 'WMA' // Weighted
result := ta.wma(close, len)
result
result
// Add SSL Channel
maHigh = calc_ma(high, sslLen, maType)
maLow = calc_ma(low, sslLen, maType)
Hlv = int(na)
Hlv := close > maHigh ? 1 : close < maLow ? -1 : Hlv[1]
sslDown = Hlv < 0 ? maHigh : maLow
sslUp = Hlv < 0 ? maLow : maHigh
ss1 = plot(sslDown, title='Down SSL', linewidth=2, color=showTrend ? na : color.red)
ss2 = plot(sslUp, title='Up SSL', linewidth=2, color=showTrend ? na : color.lime)
// Conditions
longCondition = ta.crossover(sslUp, sslDown)
shortCondition = ta.crossover(sslDown, sslUp)
// Strategy
if shortCondition
strategy.close('Long', comment='Long Exit', alert_message='JSON')
if longCondition
strategy.close('Short', comment='Short Exit', alert_message='JSON')
if backtest_range and longCondition
strategy.entry('Long', strategy.long, comment='Long Entry', alert_message='JSON')
if backtest_range and shortCondition
strategy.entry('Short', strategy.short, comment= 'Short Entry', alert_message='JSON')
// Plots
fill(ss1, ss2, color=showTrend ? sslDown < sslUp ? color.new(color.lime, transp=75) : color.new(color.red, transp=75) : na, title='Trend Colors')