
La estrategia utiliza el ángulo de pendiente de la línea media para determinar la dirección de la tendencia, combinado con un indicador de la tasa de cambio de precios, para realizar operaciones a corto y largo plazo. Su esencia es determinar la tendencia de los precios utilizando el ángulo de pendiente de la línea media, así como una estrategia de seguimiento de tendencias que utiliza un indicador de la tasa de cambio de precios para corregir la tendencia.
La estrategia se basa principalmente en los siguientes indicadores:
Ángulo de la línea media: para determinar la dirección de la tendencia de los precios, calcula el ángulo de inclinación de la línea media de Jurik y el promedio móvil del índice. El ángulo mayor a 0 es la tendencia alcista y menor a 0 es la tendencia bajista.
Cambio de precio: calcula el cambio de precio de cierre de las 12 líneas K más recientes para filtrar las señales de invalidez a través de la volatilidad.
Hacer más cuando el ángulo de la línea media es hacia arriba (más grande que 0) y la tasa de cambio de precio cumple con las condiciones; hacer vacío cuando el ángulo de la línea media es hacia abajo (menor que 0) y la tasa de cambio de precio cumple con las condiciones.
Concretamente, la estrategia primero calcula el ángulo de pendiente de la línea media de Jurik y el EMA. Luego calcula el indicador de la tasa de cambio de los precios, que se utiliza para filtrar durante el período de liquidación. La señal de negociación se produce cuando el ángulo de la línea media indica una tendencia y la tasa de cambio de los precios cumple con las condiciones.
La estrategia tiene las siguientes ventajas:
El uso de la pendiente de la línea media para determinar la tendencia es muy confiable y tiene una alta probabilidad de éxito.
El índice de variación de precios puede filtrar eficazmente las fluctuaciones y evitar transacciones no válidas.
La media de Jurik reaccionó rápidamente a la ruptura, mientras que la EMA ofreció un juicio de tendencia estable, ambos complementarios.
El uso de un método de negociación bidireccional de largo y corto plazo permite capturar las divisas más valiosas en situaciones de tendencia.
La estrategia también tiene sus riesgos:
Cuando los precios oscilan fuertemente, la línea media tiene una mayor probabilidad de generar una señal errónea. Se puede reducir este riesgo mediante parámetros de optimización.
Las señales de línea uniforme pueden cambiar con frecuencia al entrar en la corrección, generando demasiadas transacciones innecesarias. Se pueden agregar condiciones de filtración adicionales para reducir las transacciones no válidas.
Cuando un evento inesperado provoca un salto en el precio, el stop loss puede ser superado y el stop loss puede ser liberado adecuadamente.
La estrategia puede ser optimizada en los siguientes aspectos:
Optimización de los parámetros de la línea media, búsqueda de la combinación óptima de parámetros y mejora de la estabilidad de la estrategia.
Aumentar las condiciones de filtración, como la volatilidad y el volumen de transacciones, para reducir aún más las transacciones no válidas.
La combinación de otros indicadores para determinar el punto de parada hace que la parada sea más inteligente.
Desarrollar algoritmos de tamaño de transacción adaptados para obtener ganancias más estables.
La estrategia en su conjunto es una estrategia de seguimiento de tendencias muy práctica. Utiliza una pendiente de línea media para determinar tendencias de manera muy confiable, mientras que el indicador de la tasa de cambio de precios puede filtrar eficazmente las señales de invalidez. Al mismo tiempo, se obtienen mejores ganancias con el método de negociación bidireccional largo y corto.
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// Based on ma angles code by Duyck which also uses Everget Jurik MA calulation and angle calculation by KyJ
strategy("Trend Angle BF", overlay=false)
/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() => true
src=input(ohlc4,title="source")
// definition of "Jurik Moving Average", by Everget
jma(_src,_length,_phase,_power) =>
phaseRatio = _phase < -100 ? 0.5 : _phase > 100 ? 2.5 : _phase / 100 + 1.5
beta = 0.45 * (_length - 1) / (0.45 * (_length - 1) + 2)
alpha = pow(beta, _power)
jma = 0.0
e0 = 0.0
e0 := (1 - alpha) * _src + alpha * nz(e0[1])
e1 = 0.0
e1 := (_src - e0) * (1 - beta) + beta * nz(e1[1])
e2 = 0.0
e2 := (e0 + phaseRatio * e1 - nz(jma[1])) * pow(1 - alpha, 2) + pow(alpha, 2) * nz(e2[1])
jma := e2 + nz(jma[1])
//// //// Determine Angle by KyJ //// ////
angle(_src) =>
rad2degree=180/3.14159265359 //pi
ang=rad2degree*atan((_src[0] - _src[1])/atr(14))
jma_line=jma(src,10,50,1)
ma=ema(src,input(56))
jma_slope=angle(jma_line)
ma_slope=angle(ma)
///////////// Rate Of Change /////////////
source = close
roclength = input(12, minval=1)
pcntChange = input(2, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))
/////////////// Strategy ///////////////
long = ma_slope>=0 and isMoving()
short = ma_slope<=0 and isMoving()
last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)
last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])
last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])
in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal
last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(900.0, title='Take Profit %') / 100
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1])
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1])
slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na
/////////////// Execution ///////////////
if testPeriod()
strategy.entry("Long", strategy.long, when=long)
strategy.entry("Short", strategy.short, when=short)
strategy.exit("Long Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
strategy.exit("Short Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
///////////// Plotting /////////////
hline(0, title='Zero line', color=color.purple, linewidth=1)
plot(ma_slope,title="ma slope", linewidth=2,color=ma_slope>=0?color.lime:color.red)
bgcolor(isMoving() ? long ? color.green : short ? color.red : na : color.white, transp=80)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)