
La estrategia de línea de tendencia instantánea de Ehlers fue propuesta por John Ehlers en su libro de análisis de control de acciones y futuros. La estrategia utiliza indicadores técnicos para identificar la tendencia instantánea de una acción o un futuro y abrir posiciones cuando la tendencia se invierte.
El núcleo de la estrategia es calcular la línea de tendencia instantánea. La fórmula de cálculo de la línea de TI es la siguiente:
it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]
donde src representa el precio y a es un factor de nivelación con un valor predeterminado de 0.07. La fórmula es un filtro de segundo nivel que puede nivelación de precios y generar tendencias.
El otro indicador clave es la línea de retraso (lag), cuya fórmula es:
lag = 2.0 * it - nz(it[2])
La línea retrasa un ciclo de la línea IT. Cuando el precio sube por la línea retrasada, representa una reversión de la tendencia, haciendo más; cuando el precio baja por la línea retrasada, representa una reversión de la tendencia, haciendo vacío.
Además, la estrategia también establece un seguro de pérdidas para controlar el riesgo.
La estrategia tiene las siguientes ventajas:
La estrategia también tiene sus riesgos:
Estos riesgos pueden ser reducidos por:
La estrategia puede ser optimizada en las siguientes direcciones:
En general, la estrategia de línea de tendencia instantánea de Ells utiliza indicadores técnicos para identificar la tendencia en tiempo real de las acciones/futuros y abrir posiciones cuando la tendencia se invierte. Tiene ventajas como un filtro de ruido eficaz, alta ajustabilidad de parámetros, una lógica de generación de señales clara y un control de riesgo incorporado.
/*backtest
start: 2022-12-13 00:00:00
end: 2023-12-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Ehlers Instantaneous Trendline Strategy", shorttitle = "Ehlers Instantaneous Trendline Strategy", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, backtest_fill_limits_assumption = 1)
src = input(hl2, title="Source")
a = input(0.07, title="Alpha", step=0.01)
fr = input(false, title="Fill Trend Region")
it = na
if (na(it[2]) or na(it[1]))
it := (src + 2 * src[1] + src[2]) / 4.0
else
it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]
lag = 2.0 * it - nz(it[2])
rngFrac = input(0.35)
revPct = input(0.015)
stopType = input(title="Stop type", defval = "stop-order", options = ["stop-order", "market-order", "None"])
diff = input(0.5, title = "Spread")
LongPrice(p) =>
LongPrice = diff == 0 ? p : floor(p / diff) * diff
ShortPrice(p) =>
ShortPrice = diff == 0 ? p : ceil(p / diff) * diff
strategy.cancel_all()
reverseTrade = false
if stopType == "market-order"
if strategy.position_size > 0 and close < strategy.position_avg_price * (1 - revPct)
strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, limit = close - 2 * diff)
reverseTrade := true
if strategy.position_size < 0 and close > strategy.position_avg_price * (1 + revPct)
strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, limit = close + 2 * diff)
reverseTrade := true
if lag > it and not reverseTrade
price = LongPrice(max(close - (high - low) * rngFrac, low))
if strategy.position_size <= 0
strategy.order("Open long", strategy.long, strategy.equity / price - strategy.position_size, limit = price)
if stopType == "stop-order"
strategy.order("StopLoss open long", strategy.short, 2 * strategy.equity / price, stop = ShortPrice(price * (1 - revPct)))
else
if stopType == "stop-order"
strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, stop = ShortPrice(strategy.position_avg_price * (1 - revPct)))
if lag < it and not reverseTrade
price = ShortPrice(min(close - (high - low) * rngFrac, high))
if strategy.position_size >= 0
strategy.order("Open short", strategy.short, strategy.equity / price + strategy.position_size, limit = price)
if stopType == "stop-order"
strategy.order("StopLoss open short", strategy.long, 2 * strategy.equity / price, stop = LongPrice(price * (1 + revPct)))
else
if stopType == "stop-order"
strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, stop = LongPrice(strategy.position_avg_price * (1 + revPct)))
itPlot=plot(it, color=red, linewidth=1, title="Trend")
lagPlot=plot(lag, color=blue, linewidth=1, title="Trigger")
fill(itPlot, lagPlot, it < lag ? green : red, transp=70)
// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(9, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
strategy.cancel_all()
strategy.close_all()