Стратегия B-Xtrender на основе экспоненциального скользящего среднего пересечения


Дата создания: 2024-02-20 14:45:17 Последнее изменение: 2024-02-20 14:45:17
Копировать: 0 Количество просмотров: 1666
1
Подписаться
1617
Подписчики

Стратегия B-Xtrender на основе экспоненциального скользящего среднего пересечения

Обзор

Эта стратегия является торговой стратегией, основанной на принципе пересечения индексных средних линий. Она одновременно сочетает в себе индикатор RSI и фильтр средних линий, создавая более полную систему отслеживания тенденций и обратной торговли.

Стратегический принцип

  1. Торговые сигналы формируются с использованием быстрого и медленного скрещивания скользящих средних индексов. ЭМА скрещивания скользящих средних с параметрами 5 и 20 и EMA с параметрами 20 и 15 дней.
  2. При переходе через медленную линию на быстрой линии делается больше, при переходе через медленную линию на быстрой линии делается пусто. Используется индикатор RSI для повторной проверки, чтобы подтвердить эффективность торгового сигнала только в том случае, если RSI также пересекается.
  3. Включение 200-дневного скользящего среднего значения в качестве фильтра дает возможность подавать торговый сигнал только в том случае, если цена пересекает эту среднюю линию, что позволяет избежать многочисленных ложных перекрестков в условиях шок.

Стратегические преимущества

  1. Двойная EMA в сочетании с RSI значительно повышает надежность сигнала и снижает частоту ложных сигналов.
  2. С помощью быстрого и медленного сочетания параметров EMA учитывается как чувствительность торгового сигнала, так и его стабильность.
  3. Добавление однолинейных фильтров эффективно фильтрует шум при колебаниях и предотвращает ненужные транзакции.

Стратегический риск

  1. EMA - это отсталый индикатор, который задерживается при резких изменениях цены. Это может привести к увеличению убытков или риску пропущенного сигнала.
  2. Неправильная настройка параметров RSI также может привести к задержке сигнала.
  3. Хотя однородная фильтрация позволяет избежать колебаний, она также может отфильтровывать ранние входные возможности в начале тренда.

Направление оптимизации стратегии

  1. Динамически корректируйте параметры EMA, выбирая оптимальную комбинацию параметров в разных циклах.
  2. Попробуйте комбинировать с RSI другие индикаторы, такие как MACD.
  3. Оптимизируйте параметры однородной фильтрации, чтобы найти баланс между шумоподавлением и возможностью получения.

Подвести итог

Эта стратегия в целом является созданием более полной системы торговли индексными движущимися средними. Она основана на получении торговых сигналов, дополнительно вводит индикатор RSI для многоуровневой проверки. Это, несомненно, значительно улучшает качество сигнала, и является стратегией, которую стоит изучить и оптимизировать.

Исходный код стратегии
/*backtest
start: 2023-02-13 00:00:00
end: 2024-02-19 00:00:00
period: 1d
basePeriod: 1h
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/
// © QuantTherapy
//@version=4
strategy("B-Xtrender [Backtest Edition] @QuantTherapy")

i_short_l1  = input(5 , title="[Short] L1")
i_short_l2  = input(20, title="[Short] L2")
i_short_l3  = input(15, title="[Short] L3")

i_long_l1   = input(20, title="[Long] L1")
i_long_l2   = input(15, title="[Long] L2")

i_ma_use    = input(true , title="[MA Filter] Yes/No" )
i_ma_len    = input(200  , title="[MA Filter] length" )
i_ma_type   = input("EMA", title="[MA Filter] type", options = ["SMA", "EMA"])

shortTermXtrender = rsi( ema(close, i_short_l1) - ema(close, i_short_l2), i_short_l3 ) - 50
longTermXtrender  = rsi( ema(close, i_long_l1), i_long_l2 ) - 50

shortXtrenderCol = shortTermXtrender > 0 ? shortTermXtrender > shortTermXtrender[1] ? color.lime : #228B22 : shortTermXtrender > shortTermXtrender[1] ? color.red : #8B0000
plot(shortTermXtrender, color=shortXtrenderCol, style=plot.style_columns, linewidth=1, title="B-Xtrender Osc. - Histogram", transp = 40)

longXtrenderCol   = longTermXtrender> 0 ? longTermXtrender > longTermXtrender[1] ? color.lime : #228B22 : longTermXtrender > longTermXtrender[1] ? color.red : #8B0000
macollongXtrenderCol =  longTermXtrender > longTermXtrender[1] ? color.lime : color.red
plot(longTermXtrender , color=longXtrenderCol, style=plot.style_columns, linewidth=2, title="B-Xtrender Trend - Histogram", transp = 90)

plot(longTermXtrender , color=#000000             , style=plot.style_line, linewidth=5, title="B-Xtrender Trend - Line", transp = 100)
plot(longTermXtrender , color=macollongXtrenderCol, style=plot.style_line, linewidth=3, title="B-Xtrender Trend - Line", transp = 100)

// --- Initialize MA Filter
ma = i_ma_type == "EMA" ? ema(close, i_ma_len) : sma(close, i_ma_len)
maFilterLong = true
maFilterShort = true
if i_ma_use
    maFilterLong  := close > ma ? true : false
    maFilterShort := close < ma ? true : false

long  = shortTermXtrender > 0 and longTermXtrender > 0 and maFilterLong
closeLong = shortTermXtrender < 0 or longTermXtrender < 0 
short = shortTermXtrender < 0 and longTermXtrender < 0 and maFilterShort
closeShort = shortTermXtrender > 0 or longTermXtrender > 0 

plotshape(long[1]==true  and long[2]==false  ? 0 : na , location=location.absolute, style=shape.labelup  , color=color.lime, size=size.small, transp=10)
plotshape(short[1]==true and short[2]==false ? 0 : na, location=location.absolute, style=shape.labeldown, color=color.red , size=size.small, transp=10)
plotshape(closeLong[1]==true and closeLong[2]==false
 or closeShort[1]==true and closeShort[2]==false ? 0 : na, location=location.absolute, style=shape.circle, color=color.orange , size=size.small)

i_perc     = input(defval = 20.0, title = "[TSL-%] Percent"  , minval = 0.1 )
i_src = close // constant for calculation
sl_val = i_src * i_perc / 100

strategy.entry("Long", strategy.long, when = long ) 
strategy.close("Long", when = closeLong)

strategy.entry("Short", strategy.short, when = short) 
strategy.close("Short", when = closeShort)

// Calculate SL
longStopPrice = 0.0, shortStopPrice = 0.0
longStopPrice := if (strategy.position_size > 0)
    stopValue = close - sl_val
    max(stopValue, longStopPrice[1])
else
    0

shortStopPrice := if (strategy.position_size < 0)
    stopValue = close + sl_val
    min(stopValue, shortStopPrice[1])
else
    syminfo.mintick*1000000

// For TSL Visualisation on Chart    
// plot(series=(strategy.position_size > 0) ? longStopPrice : na,
//      color=color.fuchsia, style = plot.style_circles,
//      linewidth=1, title="Long Trail Stop")
     
// plot(series=(strategy.position_size < 0) ? shortStopPrice : na,
//      color=color.fuchsia, style = plot.style_circles,
//      linewidth=1, title="Short Trail Stop")

if (strategy.position_size > 0)
    strategy.exit(id="TSL Long", stop=longStopPrice)

if (strategy.position_size < 0)
    strategy.exit(id="TSL Short", stop=shortStopPrice)