Стратегия торговли сочетанием скользящей средней и стохастического RSI

Автор:Чао Чжан, Дата: 2023-10-18 12:40:23
Тэги:

img

Обзор

Эта стратегия использует скользящий средний Hull для определения направления тренда и объединяет его со стохастическим RSI для входных сигналов. Долгие сделки принимаются, когда средняя линия HMA пересекает верхнюю линию, а короткие сделки - когда она пересекает верхнюю линию. Кроме того, длинные сделки вводятся, когда линия Stochastic RSI K пересекает нижнюю линию D из зоны перекупки, в то время как короткие сделки вводятся на пересечениях выше зоны перепродажи.

Логика стратегии

Ключевыми компонентами этой стратегии являются скользящая средняя Hull для направления тренда и стохастический RSI для синхронизации сигналов входа.

Во-первых, расчет Hull MA включает формулы для средней, верхней и нижней полос.

Направление тренда определяется взаимосвязью между средней полосой и верхней/нижней полосой.

Также определяется расчет стохастического RSI, включая значения Smoothed K и D. Значение K использует сглаживание SMA на RSI, в то время как значение D является вторым сглаживанием SMA на K.

После определения направления тренда, длинные сделки принимаются, когда линия Stoch RSI K пересекается ниже линии D из зоны перекупленности во время восходящего тренда.

Сочетание фильтра тренда Хэлла и анализа перекупленности/перепроданности по Сток РСИ обеспечивает надежный многофакторный подход к вступлению в сделки.

Преимущества

Основными преимуществами этой стратегии являются:

  1. Hull MA эффективно определяет общее направление развития рынка.

  2. Stoch RSI определяет уровни перекупленности/перепроданности по времени.

  3. Использование обоих вместе уменьшает ложные сигналы и объединяет сильные стороны.

  4. Гибкость оптимизации параметров для различных символов и временных рамок.

  5. Полосы корпуса идентифицируют потенциальную динамическую поддержку и сопротивление.

  6. Включает правила размещения позиций и управления рисками.

  7. Возможность использования нескольких объектов через словарь данных корпуса.

  8. Оптимизируемые компоненты для повышения рентабельности и сокращения затрат.

Риски

Некоторые риски следует учитывать:

  1. У Hull MA есть задержка и может пропустить изменения тренда.

  2. Если параметры не оптимизированы, RSI может генерировать чрезмерные сигналы.

  3. Несоответствие между параметрами корпуса и стока может вызвать плохие сигналы.

  4. Слишком широкие или узкие полосы корпуса повлияют на качество сигнала.

  5. Недавняя волатильность рынков ставит под сомнение среднесрочные и долгосрочные показатели.

  6. Несоответствие данных между корпусом и стоком вызывает ложные сигналы.

  7. Резкие изменения тренда, не замеченные "Халлом", могут привести к потерям.

  8. Нужно расширить тестирование на нескольких временных рамках и символах.

Некоторые способы решить эти вопросы:

  1. Сокращение длины корпуса для большей чувствительности к тренду.

  2. Оптимизируйте Stoch RSI, чтобы отфильтровать ложные перекрестки.

  3. Найдите оптимальную ширину канала корпуса.

  4. Добавьте дополнительные подтверждающие показатели, такие как MACD.

  5. Для контроля риска используйте стратегии стоп-лосса.

Возможности оптимизации

Некоторые способы улучшения этой стратегии:

  1. Проверка на большем количестве символов в различные временные рамки для проверки надежности.

  2. Включайте механизмы остановки потери, такие как остановки отслеживания или скользящие средние.

  3. Оптимизировать правила входа, установить более строгие фильтры, чтобы уменьшить ложные сигналы.

  4. Исследуйте использование полос корпуса для лучшего определения поддержки и сопротивления.

  5. Оценить дополнительные подтверждающие показатели для повышения надежности сигнала.

  6. Оптимизация параметров для длин, уровней перекупленности/перепроданности и т.д.

  7. Улучшить размер позиций и управление рисками.

  8. Дополнительные правила входа, остановки потерь и получения прибыли, необходимые для торговли в режиме реального времени.

  9. Оптимизируйте длину корпуса для лучшей чувствительности к тренду.

  10. Добавить фильтры или подтверждающие индикаторы для улучшения качества сигнала.

  11. Исследуйте полосы корпуса для динамических уровней поддержки/сопротивления.

  12. Оптимизируйте параметры RSI, такие как длина, перекуп/перепродажа.

  13. Внедрение передового размещения позиций и управления рисками.

Заключение

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


/*backtest
start: 2023-10-16 00:00:00
end: 2023-10-17 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//Basic Hull Ma Pack tinkered by InSilico 
//Converted to Strategy by DashTrader
strategy("Hull Suite + Stoch RSI Strategy v1.1", overlay=true, pyramiding=1, initial_capital=100, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.023)
strat_dir_input = input(title="Strategy Direction", defval="all", options=["long", "short", "all"])
strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)
//////////////////////////////////////////////////////////////////////
// Testing Start dates
testStartYear = input(2016, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
//Stop date if you want to use a specific range of dates
testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

stoch_upper_input = input(88, "Stoch Upper Threshold", type=input.float)
stoch_lower_input = input(5, "Stoch Lower Threshold", type=input.float)
sl = input(0.7, "SL %", type=input.float, step=0.1)
tp = input(2.1, "TP %", type=input.float, step=0.1)
// slowEMA = ema(close, slowEMA_input)

// vwap = vwap(close)
// rsi = rsi(close, rsi_input)


// stoch rsi
smoothK = 3
smoothD = 3
lengthRSI = 14
lengthStoch = 14
rsi1 = rsi(close, 14)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
// Component Code Stop
//////////////////////////////////////////////////////////////////////
//INPUT
src = input(close, title="Source")
modeSwitch = input("Hma", title="Hull Variation", options=["Hma", "Thma", "Ehma"])
length = input(180, title="Length(180-200 for floating S/R , 55 for swing entry)")
switchColor = input(true, "Color Hull according to trend?")
candleCol = input(false,title="Color candles based on Hull's Trend?")
visualSwitch  = input(true, title="Show as a Band?")
thicknesSwitch = input(1, title="Line Thickness")
transpSwitch = input(40, title="Band Transparency",step=5)

//FUNCTIONS
//HMA
HMA(_src, _length) =>  wma(2 * wma(_src, _length / 2) - wma(_src, _length), round(sqrt(_length)))
//EHMA    
EHMA(_src, _length) =>  ema(2 * ema(_src, _length / 2) - ema(_src, _length), round(sqrt(_length)))
//THMA    
THMA(_src, _length) =>  wma(wma(_src,_length / 3) * 3 - wma(_src, _length / 2) - wma(_src, _length), _length)
    
//SWITCH
Mode(modeSwitch, src, len) =>
      modeSwitch == "Hma"  ? HMA(src, len) :
      modeSwitch == "Ehma" ? EHMA(src, len) : 
      modeSwitch == "Thma" ? THMA(src, len/2) : na
      
//OUT
HULL = Mode(modeSwitch, src, length)
MHULL = HULL[0]
SHULL = HULL[2]

//COLOR
hullColor = switchColor ? (HULL > HULL[2] ? #00ff00 : #ff0000) : #ff9800

//PLOT
///< Frame
Fi1 = plot(MHULL, title="MHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
Fi2 = plot(visualSwitch ? SHULL : na, title="SHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
///< Ending Filler
fill(Fi1, Fi2, title="Band Filler", color=hullColor, transp=transpSwitch)
///BARCOLOR
barcolor(color = candleCol ? (switchColor ? hullColor : na) : na)

bgcolor(color = k < stoch_lower_input  and crossover(k, d) ? color.green : na)
bgcolor(color = d > stoch_upper_input and crossover(d, k) ? color.red : na)

notInTrade = strategy.position_size == 0

if notInTrade and HULL[0] > HULL[2] and testPeriod() and k < stoch_lower_input and crossover(k, d)
// if HULL[0] > HULL[2] and testPeriod()
    stopLoss = close * (1 - sl / 100) 
    profit25 = close * (1 + (tp / 100) * 0.25)
    profit50 = close * (1 + (tp / 100) * 0.5)
    takeProfit = close * (1 + tp / 100)
    
    
    strategy.entry("long", strategy.long, alert_message="buy")
    strategy.exit("exit long 25%", "long", stop=stopLoss, limit=profit25, qty_percent=25, alert_message="profit_25")
    strategy.exit("exit long 50%", "long", stop=stopLoss, limit=profit50, qty_percent=25, alert_message="profit_50")
    strategy.exit("exit long", "long", stop=stopLoss, limit=takeProfit)
    
    // line.new(bar_index, profit25, bar_index + 4, profit25, color=color.green)
    // line.new(bar_index, profit50, bar_index + 4, profit50, color=color.green)
    // box.new(bar_index, stopLoss, bar_index + 4, close, border_color=color.red, bgcolor=color.new(color.red, 80))
    // box.new(bar_index, close, bar_index + 4, takeProfit, border_color=color.green, bgcolor=color.new(color.green, 80))

    
if notInTrade and HULL[0] < HULL[2] and testPeriod() and d > stoch_upper_input and crossover(d, k)
// if HULL[0] < HULL[2] and testPeriod()
    stopLoss = close * (1 + sl / 100)
    profit25 = close * (1 - (tp / 100) * 0.25)
    profit50 = close * (1 - (tp / 100) * 0.5)
    takeProfit = close * (1 - tp / 100)
    
    

    strategy.entry("short", strategy.short, alert_message="sell")
    strategy.exit("exit short 25%", "short", stop=stopLoss, limit=profit25, qty_percent=25, alert_message="profit_25")
    strategy.exit("exit short 50%", "short", stop=stopLoss, limit=profit50, qty_percent=25, alert_message="profit_50")
    strategy.exit("exit short", "short", stop=stopLoss, limit=takeProfit)
    
    // line.new(bar_index, profit25, bar_index + 4, profit25, color=color.green)
    // line.new(bar_index, profit50, bar_index + 4, profit50, color=color.green)
    // box.new(bar_index, stopLoss, bar_index + 4, close, border_color=color.red, bgcolor=color.new(color.red, 80))
    // box.new(bar_index, close, bar_index + 4, takeProfit, border_color=color.green, bgcolor=color.new(color.green, 80))

// var table winrateDisplay = table.new(position.bottom_right, 1, 1)
// table.cell(winrateDisplay, 0, 0, "Winrate: " + tostring(strategy.wintrades / strategy.closedtrades * 100, '#.##')+" %", text_color=color.white)

Больше