Стратегии следования за трендом на основе множественных индикаторов


Дата создания: 2023-12-27 17:15:45 Последнее изменение: 2023-12-27 17:15:45
Копировать: 1 Количество просмотров: 599
1
Подписаться
1623
Подписчики

Стратегии следования за трендом на основе множественных индикаторов

Обзор

Эта стратегия называетсяСтратегия отслеживания тенденций в комбинации с несколькими показателями(Multi-Indicator Trend Tracking Strategy), которая использует несколько индикаторов, таких как индикаторы преобразования Фишера, взвешенные движущиеся средние ((WMA), относительно сильные индикаторы ((RSI) и средние линии ((OBV), чтобы определить направление тенденции рынка и осуществить трендовую торговлю.

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

  1. Индекс преобразования Фишера определяет тенденцию и интенсивность изменения цены. Торговый сигнал подается, когда четыре линии Фишера меняют цвет одновременно.
  2. WMA определяет направление тенденции. RSI фильтрует ложные сигналы.
  3. Показатель OBV используется для подтверждения тенденций.

В частности, индикатор преобразования Фишера содержит 4 линии в 1x, 2x, 4x и 8x. 4 линии одновременно вверх по зеленому направлению дают сигнал плюс, а 4 линии одновременно вниз по красному направлению дают сигнал пустоты. WMA определяет направление большого тренда, если индикатор вверх, то это является либеральным, а если вниз, то это является либеральным.

Анализ преимуществ

Эта стратегия имеет следующие преимущества:

  1. Индекс преобразования Фишера обладает сильным суждением, когда четыре линии Фишера меняют цвет одновременно, что обеспечивает высокую вероятность обратного тренда.
  2. WMA оценивает основные тенденции, чтобы избежать обратной торговли.
  3. Индекс OBV подтверждает тенденцию, чтобы избежать ложных прорывов на рынке без трендов.
  4. RSI отфильтровывает фальшивые сигналы и обеспечивает их надежность.

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

Анализ рисков

Однако есть и риски:

  1. Если рыночная ситуация будет скорректирована, то линия Фишера может создать ложный сигнал. В этом случае необходимо использовать фильтр RSI.
  2. Неправильная настройка параметров WMA также влияет на точность суждения.
  3. Индекс преобразования Фишера плохо оценивает ситуацию на сверхкороткой линии.
  4. В случае срыва кабеля, стратегия может привести к огромным потерям.

Для снижения риска можно соответствующим образом скорректировать параметры RSI, оптимизировать параметры цикла WMA. При этом можно установить точку остановки, чтобы избежать чрезмерных потерь.

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

Эта стратегия может быть улучшена в следующих аспектах:

  1. Можно проверить эффективность стратегии под различными периодическими параметрами, чтобы найти оптимальную комбинацию параметров.
  2. Добавление механизма остановки убытков. Они прекращаются, когда убытки достигают определенной доли.
  3. В соответствии с результатами обратного измерения дополнительно корректируйте параметры индикатора преобразования Фишера, чтобы найти наиболее точное сочетание параметров для оценки индикатора.
  4. Попробуйте добавить фильтры для других показателей, таких как сильные и слабые, предвзятость и т.д.
  5. Тестирование различных размеров позиций.

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

Эта стратегия использует индикаторы Fisher Conversion, WMA, OBV и RSI для определения направления тренда на рынке. Она имеет высокую точность сигналов, высокую способность подтверждения и эффективную способность блокировать тренд для получения прибыли.

Исходный код стратегии
/*backtest
start: 2022-12-20 00:00:00
end: 2023-12-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//author Sdover0123
strategy(title='FTR, WMA, OBV & RSI Strat', shorttitle='FTR WMA, OBV, RSI',overlay=false, default_qty_type=strategy.percent_of_equity, initial_capital = 100, default_qty_value=100, commission_value = 0.06, pyramiding = 3)
Len = input.int(10, minval=1, group ="Fisher Transform")
mult1 = input.int(1, minval=1, group ="Fisher Transform")
mult2 = input.int(2, minval=1, group ="Fisher Transform")
mult3 = input.int(4, minval=1, group ="Fisher Transform")
mult4 = input.int(8, minval=1, group ="Fisher Transform")
fish(Length, timeMultiplier) =>
    var nValue1 = 0.0
    var nValue2 = 0.0
    var nFish = 0.0
    xHL2 = hl2
    xMaxH = ta.highest(xHL2, Length * timeMultiplier)
    xMinL = ta.lowest(xHL2, Length * timeMultiplier)
    nValue1 := 0.33 * 2 * ((xHL2 - xMinL) / (xMaxH - xMinL) - 0.5) + 0.67 * nz(nValue1[1])
    if nValue1 > .99
        nValue2 := .999
        nValue2
    else if nValue1 < -.99
        nValue2 := -.999
        nValue2
    else
        nValue2 := nValue1
        nValue2
    nFish := 0.5 * math.log((1 + nValue2) / (1 - nValue2)) + 0.5 * nz(nFish[1])
    nFish
Fisher1 = fish(Len, mult1)
Fisher2 = fish(Len, mult2)
Fisher4 = fish(Len, mult3)
Fisher8 = fish(Len, mult4)

rsiLength = input.int(14, minval=1, group ="Moving Averages")
rsiVal = (ta.rsi(close, rsiLength) - 50) / 10
avg = strategy.position_avg_price

wma(source, length) =>
    sum = 0.0
    for i = 0 to length - 1
        sum := sum + source[i] * (length - i)
    wma = sum / (length * (length + 1) / 2)
    wma

wmaLength = input.int(10, "WMA Length", minval=1, group ="Moving Averages")
wmaClose = wma(close, wmaLength)
// Determine if WMA is bullish or bearish
isWmaBullish = wmaClose > wmaClose[1]
isWmaBearish = wmaClose < wmaClose[1]

//OBV 
src = close
length = input.int(20, title="OBV Length", group="On-Balance Volume")
obv1(src) =>
    change_1 = ta.change(src)
    ta.cum(ta.change(src) > 0 ? volume : change_1 < 0 ? -volume : 0 * volume)*0.01
os = obv1(src)
obv_osc = os - ta.ema(os, length)
obc_color = (obv_osc > 0 ? color.rgb(0, 255, 8) : color.rgb(255, 0, 0))
plot(obv_osc, color=obc_color, style=plot.style_line, title='OBV-Points', linewidth=2)
plot(obv_osc, color=color.new(#b2b5be, 70), title='OBV', style=plot.style_area)
obvBullFilter = input.float(0.1, minval = 0, maxval = 5, step = 0.01, title ="OBV Bullish minimum value", group="On-Balance Volume")
obvBearFilter = input.float(-0.1, minval = -5, maxval = 0, step = 0.01, title ="OBV Bearish minimum value", group="On-Balance Volume")
obvBull = obv_osc > obvBullFilter
obvBear = obv_osc < obvBearFilter

// Add buy/sell signals
ReversalFilterDown = input.float(-0.7, 'Reversal Down TP Filter', -4, 4, step = 0.01, group = "RSI Level Filters", tooltip = "This is defined by taking the RSI value -50 and /10. When all Fisher lines are changing colour, this will SL/TP the long")
ReversalFilterUp = input.float(0.7, 'Reversal Up TP Filter', -4, 4, step = 0.01, group = "RSI Level Filters", tooltip = "This is defined by taking the RSI value -50 and /10. When all Fisher lines are changing colour, this will SL/TP the short")
RSILevelBuyFilter = input.float(1.66, 'RSI Level Buy Filter', -4, 4, step = 0.01, group = "RSI Level Filters", tooltip = "This is defined by taking the RSI value -50 and /10. Consider negative values")
RSILevelSellFilter = input.float(1, 'RSI Level Sell Filter', -4, 4, step = 0.01, group = "RSI Level Filters", tooltip = "This is defined by taking the RSI value -50 and /10. Consider negative values")
//buys - if breaking out and all Fisher are green and RSI filter value is met 
buySignal = Fisher1 > Fisher1[1] and Fisher2 > Fisher2[1] and Fisher4 > Fisher4[1] and Fisher8 > Fisher8[1] and rsiVal > RSILevelBuyFilter and isWmaBullish and obvBull
ReversalUp = Fisher1 > Fisher1[1] and Fisher2 > Fisher2[1] and Fisher4 > Fisher4[1] and Fisher8 > Fisher8[1] and rsiVal > ReversalFilterUp
//sells - if breaking down and all Fisher are green and RSI filter value is met 
sellSignal = Fisher1 < Fisher1[1] and Fisher2 < Fisher2[1] and Fisher4 < Fisher4[1] and Fisher8 < Fisher8[1] and rsiVal < RSILevelSellFilter and isWmaBearish and obvBear
ReversalDown = Fisher1 < Fisher1[1] and Fisher2 < Fisher2[1] and Fisher4 < Fisher4[1] and Fisher8 < Fisher8[1] and rsiVal < ReversalFilterDown


// Buy and Sell conditions
if buySignal and time>timestamp(2022, 06, 01, 09, 30) and barstate.isconfirmed
    strategy.close("Sell", comment = "Close Short")
    strategy.entry("Buy", strategy.long, comment = "Long")

if sellSignal and time>timestamp(2022, 06, 01, 09, 30) and barstate.isconfirmed
    strategy.close("Buy", comment = "Close Long")
    strategy.entry("Sell", strategy.short, comment = "Short")

if ReversalDown
    strategy.close("Buy", comment = "Close Long")

if ReversalUp
    strategy.close("Sell", comment = "Close Short")

//Plotting
//Fisher
plot(Fisher1, color=Fisher1 > nz(Fisher1[1]) ? color.green : color.rgb(255, 0, 0), title='Fisher TF:1')
plot(Fisher2, color=Fisher2 > nz(Fisher2[1]) ? color.green : color.rgb(255, 0, 0), title='Fisher TF:1', linewidth=2)
plot(Fisher4, color=Fisher4 > nz(Fisher4[1]) ? #008000 : #b60000, title='Fisher TF:1', linewidth=3)
plot(Fisher8, color=Fisher8 > nz(Fisher8[1]) ? #004f00 : #b60000, title='Fisher TF:1', linewidth=3)
//RSI
plot(rsiVal, color=rsiVal < 0 ? color.purple : color.yellow, linewidth=2, title='RSI')

//WMA
plot(isWmaBullish ? -2 : na, color=color.rgb(76, 175, 79, 20), linewidth=3, style=plot.style_linebr, title="WMA Bullish")
plot(isWmaBearish ? -2 : na, color=color.rgb(255, 82, 82, 20), linewidth=3, style=plot.style_linebr, title="WMA Bearish")

//Buy/Sell Signals
plotshape(buySignal, title='Buy Signal', location=location.bottom, color=color.new(color.lime, 0), style=shape.triangleup, size=size.small)
plotshape(sellSignal, title='Sell Signal', location=location.top, color=color.new(color.red, 0), style=shape.triangledown, size=size.small)

//Orientation
hline(RSILevelBuyFilter, color=color.rgb(25, 36, 99, 20), linestyle=hline.style_dotted, linewidth=2)
hline(RSILevelSellFilter, color=color.rgb(111, 27, 27, 20), linestyle=hline.style_dotted, linewidth=2)
hline(0, color=color.rgb(181, 166, 144, 39), linestyle=hline.style_dashed, linewidth=2, title = "Zero Line")
hline(1.5, color=color.rgb(217, 219, 220, 50), linestyle=hline.style_dotted, linewidth=2, title = "1.5 // 65 Line")
hline(-1.5, color=color.rgb(217, 219, 220, 50), linestyle=hline.style_dotted, linewidth=2, title = "-1.5 // 35 Line")