Esta estratégia utiliza uma combinação de três indicadores técnicos diferentes para construir uma estratégia de arbitragem transcultural que capta as tendências dos preços em diferentes prazos para alcançar retornos excessivos de baixo risco.
Os três indicadores técnicos usados nesta estratégia são o canal de Keltner (KC), a parada de volatilidade (Vstop) e o Alligador de Williams (WAE). O canal de Keltner é usado para determinar se os preços estão fora da faixa do canal e, assim, gerar sinais de negociação. A parada de volatilidade é usada para ajustar dinamicamente as posições de stop loss para garantir a parada de perda, reduzindo a perda de parada desnecessária. O indicador de alligador de Williams é usado para determinar se os preços estão em uma forte tendência. Especificamente:
Quando o preço está acima do trilho superior do Canal de Keltner, é considerado um sinal de alta.
A posição de stop loss é definida com base na volatilidade do preço e na largura do canal, podendo ajustar-se dinamicamente para garantir o stop loss e evitar posições de stop loss excessivamente conservadoras.
O indicador Williams Alligator avalia se os preços estão numa forte tendência ascendente ou descendente através do cálculo da largura do canal MACD e da Banda de Bollinger.
Ao combinar esses três indicadores, os sinais em diferentes prazos são validados cruzando-se. Isso reduz a probabilidade de julgamento errado e constrói uma lógica estratégica otimizada.
A maior vantagem desta estratégia são os sinais de negociação precisos trazidos pela combinação de vários indicadores. Os três indicadores funcionam em diferentes prazos e se validam mutuamente, o que pode efetivamente reduzir a probabilidade de julgamento errado e melhorar a precisão dos sinais. Além disso, a configuração de parada de volatilidade é dinâmica e pode ajustar a posição de stop loss de acordo com a volatilidade em tempo real para controlar ainda mais os riscos.
Em comparação com as estratégias de indicador único, esta estratégia combinada pode fornecer sinais de negociação mais precisos e eficientes. Ao mesmo tempo, os três indicadores trabalham juntos para formar julgamentos de negociação em vários prazos, o que é um projeto de lógica muito científico e razoável que vale a pena aprender.
O principal risco desta estratégia é que configurações incorretas de parâmetros podem causar sobreajuste. Os três indicadores têm 8 parâmetros no total.
Para reduzir esses riscos, a adaptabilidade a diferentes ambientes de mercado deve ser totalmente considerada durante a configuração de parâmetros e a combinação ideal de parâmetros deve ser ajustada por meio de análise de backtesting. Além disso, ajuste adequadamente os pesos entre os indicadores para garantir que os sinais de negociação possam ser ativados efetivamente.
O espaço de otimização desta estratégia concentra-se principalmente em dois aspectos: ajuste de parâmetros e melhoria das estratégias de stop loss.
Escolha os parâmetros do indicador de forma mais científica e otimize as combinações de parâmetros. Os algoritmos podem ser usados para encontrar os parâmetros ideais com objetivos como maximização do retorno e minimização de riscos.
Melhorar a estratégia de stop loss para reduzir ainda mais a stop loss desnecessária, garantindo a stop loss, melhorando assim a taxa de ganho.
Otimizar os pesos entre os indicadores e a lógica dos julgamentos de sinais de negociação para reduzir a taxa de julgamento errado.
Tente introduzir modelos de aprendizagem de máquina para obter otimização automática de parâmetros ou use programação de aprendizagem de reforço profundo para avaliação e melhoria de estratégia.
Esta estratégia constrói um sistema de arbitragem de ciclo cruzado através da combinação do canal de Keltner, Volatility Stop e Williams Alligator. A combinação de múltiplos indicadores melhora a precisão do sinal e controla os riscos de perda de parada dinâmica. Mas há espaço para melhoria na configuração e otimização de parâmetros.
/*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///