
La estrategia utiliza un indicador de Hall para determinar la dirección de la tendencia, y luego se combina con un indicador aleatorio para ingresar. Cuando el indicador de Hall en la línea media cruza la línea baja, ve la entrada de entrada y la entrada de entrada. Al mismo tiempo, cuando el indicador aleatorio de la línea K cruza la línea D desde la zona de sobrecompra.
La estrategia de negociación utiliza principalmente el indicador Hall para determinar la dirección de la tendencia del mercado, y luego utiliza el indicador aleatorio para una entrada específica.
En primer lugar, la estrategia define el método de cálculo del indicador de Hall, que incluye la fórmula de cálculo de la media, la media superior y la media inferior. La media media se calcula con un promedio móvil ponderado WMA, y la media superior y la media inferior son la desviación de la media superior y la media inferior.
Luego, en función de la relación entre la vía media y la vía superior y inferior, se determina la dirección de la tendencia. Cuando la vía media atraviesa la vía inferior, representa una tendencia de compra más fuerte, que pertenece a la tendencia bajista; cuando la vía media atraviesa la vía inferior, la venta es más fuerte y pertenece a la tendencia bajista.
Además, la estrategia también define la forma de calcular el indicador aleatorio, incluyendo la fórmula de cálculo de los valores K y D. Los valores de K se utilizan para el suavizado SMA del RSI, y el valor de D es el suavizado SMA de nuevo de los valores de K.
Después de juzgar la dirección de la tendencia, si se mira hacia arriba, se hace más cuando la línea K del indicador aleatorio cruza la línea D desde la zona de sobreventa; si se mira hacia abajo, se hace vacío cuando la línea K cruza la línea D desde la zona de sobreventa.
De esta manera, la combinación de la tendencia de juicio de Hall indicador y el exceso de compra y venta de los indicadores aleatorios, se puede realizar una entrada más estable y precisa.
La mayor ventaja de esta estrategia es que, combinada con el juicio de tendencia y el juicio de compra y venta, permite un análisis multidimensional del mercado y una mayor precisión de entrada.
En concreto, las principales ventajas son las siguientes:
Los indicadores Hall son eficaces para determinar la dirección de las tendencias del mercado y posicionarse a gran escala.
Los indicadores aleatorios de sobrecompra y sobreventa permiten conocer las variaciones de la fuerza de compra y venta, así como los mejores momentos para entrar en el mercado.
La combinación de ambas aplicaciones permite aprovechar las ventajas de cada una de ellas para verificar las señales mutuamente y reducir las falsas.
Adaptabilidad a diferentes variedades y períodos de tiempo mediante ajustes de parámetros;
Utilizando la desviación de la órbita media para formar canales de transacción de construcción de órbita ascendente y descendente, se pueden encontrar soportes y resistencias potenciales.
STOP LOSS, EXIT ON TARGETS por ciento utilizado para escalar posiciones
Use of hull data Dictionary gives multiple asset class flexibility
La dirección de optimización elegida puede mejorar la estabilidad y la rentabilidad de la estrategia
La estrategia también tiene ciertos riesgos a tener en cuenta, principalmente:
El indicador de Hall está rezagado y puede perder el punto de inflexión de la tendencia, lo que puede provocar pérdidas innecesarias.
La configuración incorrecta de los parámetros del indicador aleatorio puede generar señales excedentes. Se debe filtrar adecuadamente la señal de cruce de la línea K y la línea D.
El indicador de Hall se usa junto con el indicador aleatorio, y si los parámetros no se ajustan correctamente, también puede producirse una señal de error.
La amplitud de las vías ascendentes y descendentes demasiado grande o demasiado pequeña puede afectar la calidad de la señal de negociación, por lo que es necesario realizar pruebas cuidadosas para encontrar los parámetros óptimos.
El resultado de las encuestas de la semana pasada fue que el índice de la línea media-larga podría no ser muy efectivo.
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
En cuanto a los riesgos, se pueden optimizar desde los siguientes puntos:
Reducir adecuadamente la longitud del indicador de Hall para aumentar la sensibilidad a los cambios de tendencia.
Optimización de los parámetros de los indicadores aleatorios para reducir las señales falsas.
Ajustar los parámetros de subida y bajada para encontrar la anchura óptima de la vía.
Añadir otras señales de verificación de indicadores, como MACD, etc.
Aumentar las estrategias de stop loss para controlar el riesgo.
La estrategia también puede ser optimizada en los siguientes aspectos:
Prueba más variedades y más parámetros de ciclo de tiempo para verificar la estabilidad de la estrategia.
Aumentar los mecanismos de detención de pérdidas, como la detención de seguimiento, la detención de movimiento, etc., para controlar mejor el riesgo.
Optimizar la lógica de las condiciones de entrada, establecer condiciones de filtración más estrictas y reducir las falsas señales.
Estudiar cómo utilizar el canal de Hall para determinar mejor los puntos de soporte y resistencia.
Explorar si se pueden agregar señales de verificación de otros indicadores.
Optimización de parámetros, como la longitud del indicador Hall, el indicador aleatorio K, el parámetro de suavizado D, etc.
Añade la función de administración de posiciones. Ajusta el tamaño de las posiciones según el número de retiradas y victorias consecutivas.
Se añaden las reglas de Stop Loss y Stop Stop.
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
En general, la estrategia de integración de la tendencia de juicio y el exceso de compra y venta de juicio para entrar en la entrada es una idea que funciona. Pero debido a la existencia de problemas en el propio indicador, su señal de comercio no es totalmente confiable, y la necesidad de una mayor optimización. Si se puede encontrar la combinación de parámetros óptimos, y complementado con otros indicadores de verificación y medios de control de riesgo, el efecto de la estrategia es de esperar. En resumen, en los parámetros de ajuste, mecanismo de parada de pérdidas, gestión de la posición, etc., se requiere más pruebas y optimización para que la estrategia sea estable y confiable y pueda ser rentable en el mercado real.
/*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)