
Эта стратегия использует индикатор Холла, чтобы определить направление тренда, а затем в сочетании с случайным индикатором для входа в рынок. Вход в рынок, когда Холл на среднем треке проходит вниз, и вход в рынок, когда он проходит вниз. В то же время, когда случайный индикатор K-линия проходит через D-линию из зоны сверхпокупок, и проходит через зону сверхпродаж.
Торговая стратегия использует главным образом индикатор Холла для определения направления рыночной тенденции, затем использует случайный индикатор для конкретного входа.
Во-первых, в стратегии определены методы расчета показателя Холла, включая формулы для расчета средней, верхней и нижней полос. Средняя полоса рассчитывается с использованием взвешенной скользящей средней WMA, верхняя и нижняя полосы - смещение средней полосы.
Затем направление тренда определяется отношением средней и верхней полосы к нижней полосе. Когда средняя полоса пересекает нижнюю полосу, она представляет собой более сильную рыночную торговлю, которая относится к тенденции потери; когда средняя полоса пересекает нижнюю полосу, она представляет собой более сильную рыночную торговлю, которая относится к тенденции потери.
Кроме того, в стратегии также определены методы расчета случайных индикаторов, включая формулы для расчета K-значений и D-значений.
После определения направления тренда, если bullish, то сделайте больше, когда K-линия случайного индикатора пересекает D-линию из-под зоны перепродажи; если bearish, то сделайте пустое, когда K-линия пересекает D-линию из-под зоны перепродажи.
Таким образом, в сочетании с трендовым суждением Холла и суждением о перекупе и перепродаже случайного индикатора, можно проводить более стабильный и точный вход.
Самым большим преимуществом этой стратегии является то, что в сочетании с оценкой тенденций и оценкой сверхпокупа и сверхпродажи, она позволяет проводить многомерный анализ рынка с высокой точностью входа.
В частности, есть следующие преимущества:
Показатель Холла позволяет эффективно оценивать направление рыночных тенденций и ориентироваться на них на большом уровне.
В результате, мы сможем оценить изменения в силе покупателей и продавцов, а также определить лучшие моменты для входа в рынок.
Использование обоих в сочетании позволяет использовать свои преимущества, проверять сигналы друг друга и уменьшать количество ложных сигналов.
Гибкость в адаптации к различным породам и временным периодам с помощью регулировки параметров;
Используя смещение в середине орбиты для формирования торгового канала вверх и вниз по орбите, можно обнаружить потенциальные поддержки и сопротивления.
STOP LOSS, EXIT ON TARGETS % используется для масштабирования позиций
Use of hull data Dictionary gives multiple asset class flexibility
Выбранные направления оптимизации могут повысить стабильность стратегии и доходность
В этой стратегии также есть определенные риски, о которых следует помнить, в частности:
Показатель Холла является задержанным и может пропустить поворотный момент, что приведет к ненужным потерям.
Неправильная настройка параметров случайного индикатора может привести к созданию избыточного сигнала, следует правильно отфильтровать перекрестный сигнал линии K и линии D.
Холл-показатель используется в сочетании с случайным показателем, и если параметры не соответствуют, то может возникнуть ошибочный сигнал.
Слишком большая или слишком маленькая ширина трекера может повлиять на качество торгового сигнала и требует тщательного тестирования для поиска оптимальных параметров.
В последнее время ситуация нестабильна, и средний и длинный индикаторы могут оказаться неэффективными.
Data mismatches between hull and stoch causing false signals
Sharp trend changes not caught by hull can cause losses
Testing on more timeframes/symbols needed to verify robustness
Для этих рисков можно оптимизировать следующие шаги:
Сокращение длины индикатора Холла, повышение чувствительности к изменениям тенденций.
Оптимизация параметров случайных показателей, уменьшение ложных сигналов.
Настройка параметров вверх-вниз для поиска оптимальной ширины канала.
Добавление других сигналов подтверждения показателей, таких как MACD и т. д.
Повышение стратегии сдерживания убытков для контроля риска.
Эта стратегия также может быть оптимизирована в следующих аспектах:
Тестирование большего количества разновидностей и большего количества параметров временных циклов для проверки стабильности стратегии.
Добавление механизмов погашения убытков. Такие как убытки от отслеживания, убытки от перемещения и т. д., могут лучше контролировать риск.
Оптимизация логики условий входа, установка более строгих условий фильтрации, уменьшение ложных сигналов.
Изучение того, как использовать канал Холла для лучшего определения позиций поддержки и сопротивления.
Исследуйте, можно ли использовать другие индикаторы для проверки сигналов.
Оптимизация параметров, таких как длина индикатора Холла, параметры упрощения случайного индикатора K, D и т. Д.
Добавлена функция управления позициями. Размер позиции может быть скорректирован в зависимости от количества выводов, выигрышей и т. д.
Добавлены правила стоп-лоста, стоп-стоп.
Optimize hull length parameter for better trend sensitivity
Add additional filters or confirming indicators to improve signal quality
Explore using hull bands to identify dynamic support/resistance levels
Parameter optimization for stoch RSI lengths, overbought/oversold levels
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)