Комбинированная торговая стратегия индикатора Холла и стохастического индикатора


Дата создания: 2023-10-18 12:40:23 Последнее изменение: 2023-10-18 12:40:23
Копировать: 1 Количество просмотров: 1028
1
Подписаться
1617
Подписчики

Комбинированная торговая стратегия индикатора Холла и стохастического индикатора

Обзор

Эта стратегия использует индикатор Холла, чтобы определить направление тренда, а затем в сочетании с случайным индикатором для входа в рынок. Вход в рынок, когда Холл на среднем треке проходит вниз, и вход в рынок, когда он проходит вниз. В то же время, когда случайный индикатор K-линия проходит через D-линию из зоны сверхпокупок, и проходит через зону сверхпродаж.

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

Торговая стратегия использует главным образом индикатор Холла для определения направления рыночной тенденции, затем использует случайный индикатор для конкретного входа.

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

Затем направление тренда определяется отношением средней и верхней полосы к нижней полосе. Когда средняя полоса пересекает нижнюю полосу, она представляет собой более сильную рыночную торговлю, которая относится к тенденции потери; когда средняя полоса пересекает нижнюю полосу, она представляет собой более сильную рыночную торговлю, которая относится к тенденции потери.

Кроме того, в стратегии также определены методы расчета случайных индикаторов, включая формулы для расчета K-значений и D-значений.

После определения направления тренда, если bullish, то сделайте больше, когда K-линия случайного индикатора пересекает D-линию из-под зоны перепродажи; если bearish, то сделайте пустое, когда K-линия пересекает D-линию из-под зоны перепродажи.

Таким образом, в сочетании с трендовым суждением Холла и суждением о перекупе и перепродаже случайного индикатора, можно проводить более стабильный и точный вход.

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

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

В частности, есть следующие преимущества:

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

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

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

  4. Гибкость в адаптации к различным породам и временным периодам с помощью регулировки параметров;

  5. Используя смещение в середине орбиты для формирования торгового канала вверх и вниз по орбите, можно обнаружить потенциальные поддержки и сопротивления.

  6. STOP LOSS, EXIT ON TARGETS % используется для масштабирования позиций

  7. Use of hull data Dictionary gives multiple asset class flexibility

  8. Выбранные направления оптимизации могут повысить стабильность стратегии и доходность

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

В этой стратегии также есть определенные риски, о которых следует помнить, в частности:

  1. Показатель Холла является задержанным и может пропустить поворотный момент, что приведет к ненужным потерям.

  2. Неправильная настройка параметров случайного индикатора может привести к созданию избыточного сигнала, следует правильно отфильтровать перекрестный сигнал линии K и линии D.

  3. Холл-показатель используется в сочетании с случайным показателем, и если параметры не соответствуют, то может возникнуть ошибочный сигнал.

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

  5. В последнее время ситуация нестабильна, и средний и длинный индикаторы могут оказаться неэффективными.

  6. Data mismatches between hull and stoch causing false signals

  7. Sharp trend changes not caught by hull can cause losses

  8. Testing on more timeframes/symbols needed to verify robustness

Для этих рисков можно оптимизировать следующие шаги:

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

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

  3. Настройка параметров вверх-вниз для поиска оптимальной ширины канала.

  4. Добавление других сигналов подтверждения показателей, таких как MACD и т. д.

  5. Повышение стратегии сдерживания убытков для контроля риска.

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

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

  1. Тестирование большего количества разновидностей и большего количества параметров временных циклов для проверки стабильности стратегии.

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

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

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

  5. Исследуйте, можно ли использовать другие индикаторы для проверки сигналов.

  6. Оптимизация параметров, таких как длина индикатора Холла, параметры упрощения случайного индикатора K, D и т. Д.

  7. Добавлена функция управления позициями. Размер позиции может быть скорректирован в зависимости от количества выводов, выигрышей и т. д.

  8. Добавлены правила стоп-лоста, стоп-стоп.

  9. Optimize hull length parameter for better trend sensitivity

  10. Add additional filters or confirming indicators to improve signal quality

  11. Explore using hull bands to identify dynamic support/resistance levels

  12. Parameter optimization for stoch RSI lengths, overbought/oversold levels

  13. Introduce better position sizing and risk management rules

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

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

Исходный код стратегии
/*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)