Эта стратегия использует комбинацию трех различных технических индикаторов для создания стратегии межциклического арбитража, которая отслеживает тенденции цен в разные временные рамки для достижения низкорисковой избыточной доходности.
Тремя техническими индикаторами, используемыми в этой стратегии, являются Keltner Channel (KC), Volatility Stop (Vstop) и Williams Alligator (WAE). Keltner Channel используется для определения того, находятся ли цены за пределами диапазона канала и, таким образом, генерируют торговые сигналы.
Когда цена выше верхней рельсы Keltner Channel, это считается бычьим сигналом. Когда цена ниже нижней рельсы Keltner Channel, это считается медвежьим сигналом.
Стоп-лосс устанавливается на основе волатильности цены и ширины канала. Он может динамически регулироваться, чтобы обеспечить стоп-лосс, избегая чрезмерно консервативных позиций стоп-лосса.
Индикатор Williams Alligator оценивает, находятся ли цены в сильном восходящем или нисходящем тренде, рассчитывая ширину канала MACD и полосы Боллинджера.
Объединение этих трех индикаторов позволяет перекрестно проверять сигналы в разные временные рамки, что снижает вероятность ошибочных оценок и создает оптимизированную стратегическую логику.
Наибольшее преимущество этой стратегии заключается в точных торговых сигналах, предоставляемых комбинацией нескольких индикаторов. Три индикатора работают в разные временные рамки и перекрестно проверяют друг друга, что может эффективно снизить вероятность ошибочного суждения и повысить точность сигналов. Кроме того, установка Volatility Stop динамична и может регулировать позицию стоп-лосса в соответствии с волатильностью в режиме реального времени для дальнейшего контроля рисков.
По сравнению с едиными индикаторными стратегиями, эта комбинированная стратегия может обеспечить более точные и эффективные торговые сигналы.
Основным риском этой стратегии является то, что неправильное настройка параметров может вызвать переустановку. Три индикатора имеют в общей сложности 8 параметров. Неправильные настройки могут негативно повлиять на стратегию. Кроме того, отношение веса между индикаторами также должно быть правильно настроено, иначе сигналы могут нейтрализовать друг друга и стать недействительными.
Для уменьшения этих рисков при установке параметров следует полностью учитывать адаптируемость к различным рыночным условиям и корректировать оптимальную комбинацию параметров с помощью анализа обратного тестирования. Кроме того, надлежащим образом корректировать вес между индикаторами, чтобы гарантировать эффективное запускание торговых сигналов. При последовательных потерях следует рассмотреть вопрос о сокращении размера позиции для контроля потерь.
Пространство оптимизации этой стратегии в основном сосредоточено на двух аспектах: настройке параметров и улучшении стратегий стоп-лосса.
Выбирать параметры показателей более научно и оптимизировать комбинации параметров. Алгоритмы могут быть использованы для поиска оптимальных параметров с такими целями, как максимизация доходности и минимизация риска.
Улучшить стратегию стоп-лосса, чтобы еще больше уменьшить ненужные стоп-лосы, обеспечивая при этом стоп-лосс, тем самым повышая показатель выигрыша.
Оптимизировать весы между индикаторами и логикой суждений о торговых сигналах для снижения уровня ошибочных суждений.
Попробуйте внедрить модели машинного обучения для достижения автоматической оптимизации параметров или использовать программирование глубокого обучения для оценки и улучшения стратегии.
Эта стратегия создает кросс-циклическую систему арбитража посредством сочетания Keltner Channel, Volatility Stop и Williams Alligator. Комбинация мультииндикаторов улучшает точность сигнала и динамический стоп-лосс контролирует риски. Но есть возможности для улучшения в установке и оптимизации параметров. В целом эта стратегия имеет сильную научность и стоит дальнейших исследований и применения.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("QuarryLake", overlay=true) ///Ultilized modified full kelly for this strategy = 36% ///Keltner channel/// nPeriod = input(title="Keltner Period", type=input.integer, defval=200, minval=1) Mult = input(title="Keltner Mult", type=input.integer, defval=5, minval=1) xPrice = ema(hlc3, nPeriod) xMove = ema(high - low, nPeriod) xMoveMult = xMove * Mult xUpper = xPrice + xMoveMult xLower = xPrice - xMoveMult // plot(xPrice, color=red, title="KSmid") p1 = plot(xUpper, color=color.white, title="KSup") p2 = plot(xLower, color=color.white, title="KSdn") fill(p1, p2, color=close > xUpper ? color.green : close < xLower ? color.red : color.white) kclongcondition = close > xUpper kcshortcondition = close < xLower kccloselongcondition = crossunder(close, xUpper) kccloseshortcondition = crossover(close, xLower) ///Volatility Stop/// length = input(title="Vstop length", type=input.integer, defval=3, minval=1) mult1 = 1.5 atr_ = atr(length) max1 = 0.0 min1 = 0.0 is_uptrend_prev = false stop = 0.0 vstop_prev = 0.0 vstop1 = 0.0 is_uptrend = false is_trend_changed = false max_ = 0.0 min_ = 0.0 vstop = 0.0 max1 := max(nz(max_[1]), close) min1 := min(nz(min_[1]), close) is_uptrend_prev := nz(is_uptrend[1], true) stop := is_uptrend_prev ? max1 - mult1 * atr_ : min1 + mult1 * atr_ vstop_prev := nz(vstop[1]) vstop1 := is_uptrend_prev ? max(vstop_prev, stop) : min(vstop_prev, stop) is_uptrend := close - vstop1 >= 0 is_trend_changed := is_uptrend != is_uptrend_prev max_ := is_trend_changed ? close : max1 min_ := is_trend_changed ? close : min1 vstop := is_trend_changed ? is_uptrend ? max_ - mult1 * atr_ : min_ + mult1 * atr_ : vstop1 plot(vstop, color=is_uptrend ? color.green : color.red, style=plot.style_line, linewidth=1) vstoplongcondition = close > vstop vstoplongclosecondition = crossunder(close, vstop) vstopshortcondition = close < vstop vstopshortclosecondition = crossover(close, vstop) ///Waddah Attar Explosion/// sensitivity = input(150, title="Sensitivity") fastLength = input(20, title="FastEMA Length") slowLength = input(40, title="SlowEMA Length") channelLength = input(20, title="BB Channel Length") mult = input(2.0, title="BB Stdev Multiplier") DEAD_ZONE = nz(rma(tr(true), 100)) * 3.7 calc_macd(source, fastLength, slowLength) => fastMA = ema(source, fastLength) slowMA = ema(source, slowLength) fastMA - slowMA calc_BBUpper(source, length, mult) => basis = sma(source, length) dev = mult * stdev(source, length) basis + dev calc_BBLower(source, length, mult) => basis = sma(source, length) dev = mult * stdev(source, length) basis - dev t1 = (calc_macd(close, fastLength, slowLength) - calc_macd(close[1], fastLength, slowLength)) * sensitivity t2 = (calc_macd(close[2], fastLength, slowLength) - calc_macd(close[3], fastLength, slowLength)) * sensitivity e1 = calc_BBUpper(close, channelLength, mult) - calc_BBLower(close, channelLength, mult) trendUp = t1 >= 0 ? t1 : 0 trendDown = t1 < 0 ? -1 * t1 : 0 waelongcondition = trendUp and trendUp > DEAD_ZONE and trendUp > e1 waeshortcondition = trendDown and trendDown > DEAD_ZONE and trendDown > e1 ///Long Entry/// longcondition = kclongcondition and vstoplongcondition and waelongcondition if longcondition strategy.entry("Long", strategy.long) ///Long exit/// closeconditionlong = kccloselongcondition or vstoplongclosecondition if closeconditionlong strategy.close("Long") ///Short Entry/// shortcondition = kcshortcondition and vstopshortcondition and waeshortcondition if shortcondition strategy.entry("Short", strategy.short) ///Short exit/// closeconditionshort = kccloseshortcondition or vstopshortclosecondition if closeconditionshort strategy.close("Short") ///Free Hong Kong, the revolution of our time///