
La estrategia se basa en la idea de comprar en los puntos bajos y vender en los puntos altos del mercado. Se sigue el precio más alto y el precio más bajo en el pasado de un período determinado, se establecen posiciones de varios tipos cuando el precio supera el precio más bajo, se cierran las posiciones cuando el precio cae por debajo del precio más alto o alcanza las condiciones de parada.
Precios mínimos ((lowcriteria): se llama a la función ta.lowest para calcular los precios mínimos de un período determinado en el pasado y trazar una línea de precios mínimos basada en el ciclo de revisión establecido por el usuario (la línea K de 20 por defecto).
El precio más alto (highcriteria): se llama a la función ta.highest, que calcula el precio más alto en un período determinado en el pasado, basado en el ciclo de revisión establecido por el usuario (la línea de 10 K por defecto), y se traza la línea de precio más alta.
Cuando el precio actual rompe la línea de precio más baja, se emite una señal de compra para establecer una posición de más.
Se ofrecen dos opciones de salida:
Freno fijo: Arbitraje de liquidación cuando el precio alcanza el nivel de freno establecido (si supera el 8% del precio de entrada).
Breakout: Cuando el precio cae por debajo de la línea de precio más alta, se determina una reversión de la tendencia y se detiene la pérdida de posición.
La inclusión de la línea media EMA determina la dirección de la tendencia y solo se compra cuando el precio está por encima de la línea media EMA (conocida como tendencia alcista). El filtro se puede activar o desactivar.
Utiliza estrategias de compra y venta para romper los puntos bajos y altos, de acuerdo con las leyes básicas del mercado.
El aumento de la capacidad de discernimiento de tendencias evita que los inversores abran posiciones frecuentemente cuando los precios fluctúan.
Ofrece dos opciones de salida, tanto para alcanzar un alto nivel de paradas como para reducir las pérdidas.
Parámetros personalizables para adaptarse a un entorno de mercado más amplio.
El espacio para la optimización de la estrategia es amplio y puede perfeccionarse aún más a través de ajustes de parámetros, diseño de filtros, etc.
El parón fijo no puede ajustarse a la evolución real del mercado, lo que puede conducir a un parón prematuro o a un parón demasiado pequeño.
En el momento en que se supera el precio máximo de venta, es posible que se hayan generado grandes pérdidas que no se puedan controlar de manera efectiva.
La EMA sólo puede determinar la tendencia a partir de un determinado período histórico y puede retrasarse en la transformación de la tendencia real.
Los datos de la detección no pueden representar el futuro, y hay incertidumbre sobre el efecto en el disco.
Métodos de frenado adicionales: como frenado móvil, frenado por diferencia de nivel, etc., para que el nivel de frenado se ajuste en tiempo real según la evolución del mercado.
Optimización de la señal de salida: por ejemplo, cambiar la salida por lotes o agregar otros indicadores de juicio.
Optimizar el juicio de tendencias: por ejemplo, agregar más indicadores, o el juicio de aprendizaje automático.
Parámetros de optimización: encontrar la combinación óptima de parámetros a través de una respuesta más amplia.
Aumentar la prevención de pérdidas: hacer que el control de pérdidas sea más flexible y efectivo.
Esta estrategia en general utiliza el clásico principio de compra y venta de bajo precio, bajo ciertas condiciones puede obtener mejores resultados. Pero la estrategia en sí misma todavía tiene espacio para la optimización, a través de ajustes de parámetros, optimización de salida, mejora de la forma de detener el daño, etc. Puede obtener un rendimiento más estable. Este artículo analiza en profundidad los principios, ventajas, riesgos y direcciones de optimización de la estrategia.
/*backtest
start: 2022-11-16 00:00:00
end: 2023-11-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// @version=5
// Author = TradeAutomation
strategy(title="Low-High-Trend Strategy", shorttitle="Low-High-Trend Strategy", process_orders_on_close=true, overlay=true, commission_type=strategy.commission.cash_per_order, commission_value=1, slippage=3, initial_capital = 25000, margin_long=50, margin_short=50, default_qty_type=strategy.percent_of_equity, default_qty_value=110)
// Backtest Date Range Inputs //
StartTime = input(defval=timestamp('01 Jan 2000 05:00 +0000'), title='Start Time')
EndTime = input(defval=timestamp('01 Jan 2099 00:00 +0000'), title='End Time')
InDateRange = true
// Strategy Calculations //
lowcriteria = ta.lowest(close, input(20, "Lowest Price Lookback", tooltip="The strategy will BUY when the price crosses over the lowest it has been in the last X amount of bars"))[1]
highcriteria = ta.highest(close, input(10, "Highest Price Lookback", tooltip="If Take-Profit is not checked, the strategy will SELL when the price crosses under the highest it has been in the last X amount of bars"))[1]
plot(highcriteria, color=color.green)
plot(lowcriteria, color=color.red)
// Take Profit //
TakeProfitInput = input(true, "Sell with Take-Profit % intead of highest price cross?")
TakeProfit = ta.crossover(close,strategy.position_avg_price*(1+(.01*input.float(8, title="Take Profit %", step=.25))))
// Operational Functions //
TrendFilterInput = input(true, "Only buy when price is above EMA trend?")
ema = ta.ema(close, input(200, "EMA Length"))
TrendisLong = (close>ema)
plot(ema)
// Entry & Exit Functions//
if (InDateRange and TrendFilterInput==true)
strategy.entry("Long", strategy.long, when = ta.crossover(close, lowcriteria) and TrendisLong)
if (InDateRange and TrendFilterInput==false)
strategy.entry("Long", strategy.long, when = ta.crossover(close, lowcriteria))
if (InDateRange and TakeProfitInput==true)
strategy.close("Long", when = TakeProfit)
if (InDateRange and TakeProfitInput==false)
strategy.close("Long", when = ta.crossunder(close, highcriteria))
if (not InDateRange)
strategy.close_all()