
Se trata de una estrategia de seguimiento de tendencias basada en las medias móviles equilibradas de primera vista. Se combina la línea de paridad, la Fusión de Kawa y el mecanismo de salida de entrada de entrada de precisión para mejorar la rentabilidad.
La estrategia se basa en calcular el precio de cierre del último día de negociación y los parámetros de entrada definidos por el usuario, para construir una media móvil de equilibrio a primera vista. Hacer más cuando el precio sube por encima de la media; hacer vacío cuando el precio baja por encima de la media.
Al mismo tiempo, la estrategia añade un mecanismo de confirmación de la nube que determina el color de las medias móviles de equilibrio a primera vista. Solo se hace más cuando el color de las medias móviles de equilibrio a primera vista es verde y se deja en blanco cuando el color es rojo, lo que puede filtrar algunas señales inexactas y mejorar la probabilidad de ganancias de la estrategia.
La mayor ventaja de esta estrategia es la combinación de las ventajas de los dos indicadores de la línea media y la media móvil de equilibrio a primera vista, que considera tanto el movimiento general de la media de precios como el cambio cuantitativo en el precio de cierre del último día de negociación. Además, el mecanismo de confirmación en la nube también evita las señales falsas de negociación, lo que aumenta la estabilidad de la estrategia.
En cuanto a la optimización de los parámetros, la configuración de stop loss también permite controlar el riesgo de la estrategia. Finalmente, el promedio móvil de equilibrio a primera vista, como un indicador técnico más nuevo que muchos no están familiarizados, brinda una ventaja inicial para la aplicación de la estrategia.
El mayor riesgo de esta estrategia reside en la inestabilidad de la propia media móvil de equilibrio a primera vista. Su eficacia a largo plazo y el espacio para la optimización de parámetros como nuevo indicador están en discusión. Si el modelo se supone que falla, se producen una gran cantidad de señales erróneas.
Además, cualquier estrategia de seguimiento de la tendencia tiene el riesgo de que la tendencia se invierta. La estrategia sufre grandes pérdidas cuando el precio supera la línea media pero se desvía rápidamente. Por lo tanto, la configuración de puntos de parada es muy importante.
La estrategia se puede optimizar aún más de la siguiente manera:
Optimización de los parámetros de longitud de las medias móviles de equilibrio primario para encontrar el punto de equilibrio óptimo.
Prueba diferentes configuraciones de parámetros de stop loss para determinar la combinación óptima de parámetros. Un parámetro de stop loss demasiado grande limita el límite de ganancias, y un parámetro de stop loss demasiado pequeño es demasiado arriesgado.
Añadir otros indicadores técnicos, como MACD, KD, etc., para formar un consenso de indicadores múltiples y evitar más señales erróneas.
Realizar retrospectivas de diferentes variedades y ciclos para determinar el mejor escenario de aplicación de la estrategia.
Considere la inclusión de modelos de aprendizaje automático para lograr la optimización dinámica de los parámetros y el ajuste adaptativo de la estrategia.
Esta estrategia integra las ventajas de las medias y las medias móviles de equilibrio a primera vista, establece un stop loss razonable y agrega un mecanismo de confirmación de nube para rastrear la tendencia de manera efectiva y controlar el riesgo. La estrategia se puede aplicar ampliamente a variedades como índices de acciones, divisas, mercancías y criptomonedas, y es un conjunto de estrategias cuantitativas recomendadas.
/*backtest
start: 2022-11-17 00:00:00
end: 2023-11-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
strategy("Ichimoku Backtester with TP and SL", overlay=true,
currency = currency.USD, default_qty_type = strategy.percent_of_equity,
default_qty_value = 95)
//@version=4
//Inputs
ts_bars = input(9, minval=1, title="Tenkan-Sen Bars")
ks_bars = input(26, minval=1, title="Kijun-Sen Bars")
ssb_bars = input(52, minval=1, title="Senkou-Span B Bars")
cs_offset = input(26, minval=1, title="Chikou-Span Offset")
ss_offset = input(26, minval=1, title="Senkou-Span Offset")
long_entry = input(true, title="Long Entry")
short_entry = input(true, title="Short Entry")
wait_for_cloud = input(true, title="Wait for Cloud Confirmation")
use_short_stop_loss = input(true, title="Use Short Stop Loss")
short_stop_loss = input(title="Short Stop Loss (%)", type=input.float, minval=0.0, step=0.1,
defval=5) * 0.01
use_long_stop_loss = input(true, title="Use Long Stop Loss")
long_stop_loss = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1,
defval=5) * 0.01
use_short_take_profit = input(true, title="Use Short Take Profit")
short_take_profit = input(title="Short Take Profit (%)", type=input.float, minval=0.0, step=0.1,
defval = 20) * .01
use_long_take_profit = input(true, title="Use Long Take Profit")
long_take_profit = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1,
defval = 20) * .01
// === INPUT SHOW PLOT ===
showDate = input(defval = false, title = "Show Date Range", type = input.bool)
// === INPUT BACKTEST RANGE ===
fromMonth = input(defval = 1, title = "From Month", type = input.integer, minval = 1, maxval = 12)
fromDay = input(defval = 1, title = "From Day", type = input.integer, minval = 1, maxval = 31)
fromYear = input(defval = 2020, title = "From Year", type = input.integer, minval = 1970)
thruMonth = input(defval = 1, title = "Thru Month", type = input.integer, minval = 1, maxval = 12)
thruDay = input(defval = 1, title = "Thru Day", type = input.integer, minval = 1, maxval = 31)
thruYear = input(defval = 2112, title = "Thru Year", type = input.integer, minval = 1970)
// === FUNCTION EXAMPLE ===
start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window
finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window
window() => time >= start and time <= finish ? true : false // create function "within window of time"
middle(len) => avg(lowest(len), highest(len))
// Ichimoku Components
tenkan = middle(ts_bars)
kijun = middle(ks_bars)
senkouA = avg(tenkan, kijun)
senkouB = middle(ssb_bars)
bgcolor(color = showDate and window() ? color.gray : na, transp = 90) // plot within time window
// Plot Ichimoku Kinko Hyo
plot(tenkan, color=#0496ff, title="Tenkan-Sen")
plot(kijun, color=#991515, title="Kijun-Sen")
plot(close, offset=-cs_offset+1, color=#459915, title="Chikou-Span")
sa=plot(senkouA, offset=ss_offset-1, color=color.green, title="Senkou-Span A")
sb=plot(senkouB, offset=ss_offset-1, color=color.red, title="Senkou-Span B")
fill(sa, sb, color = senkouA > senkouB ? color.green : color.red, title="Cloud color")
ss_high = max(senkouA[ss_offset-1], senkouB[ss_offset-1])
ss_low = min(senkouA[ss_offset-1], senkouB[ss_offset-1])
// Entry/Exit Signals
tk_cross_bull = tenkan > kijun
tk_cross_bear = tenkan < kijun
cs_cross_bull = mom(close, cs_offset-1) > 0
cs_cross_bear = mom(close, cs_offset-1) < 0
price_above_kumo = close > ss_high
price_below_kumo = close < ss_low
senkou_green = senkouA > senkouB ? true : false
bullish = tk_cross_bull and cs_cross_bull and price_above_kumo
bearish = tk_cross_bear and cs_cross_bear and price_below_kumo
if (wait_for_cloud)
bullish := bullish and senkou_green
bearish := bearish and not senkou_green
longStopPrice = strategy.position_avg_price * (1 - long_stop_loss)
shortStopPrice = strategy.position_avg_price * (1 + short_stop_loss)
longLimitPrice = strategy.position_avg_price * (1 + long_take_profit)
shortLimitPrice = strategy.position_avg_price * (1 - short_take_profit)
in_long = false
in_long := in_long[1]
open_long = bullish and not in_long
open_short = bearish and in_long
if (open_long)
in_long := true
if (open_short)
in_long := false
strategy.entry("Long", strategy.long, when=open_long and long_entry and (showDate ? window() : true))
strategy.entry("Short", strategy.short ,when=open_short and short_entry and (showDate ? window() : true))
if (strategy.position_size > 0.0)
if (use_long_stop_loss and not use_long_take_profit)
strategy.exit("Long", stop = longStopPrice)
if (use_long_take_profit and not use_long_stop_loss)
strategy.exit("Long", limit = longLimitPrice)
if (use_long_take_profit and use_long_stop_loss)
strategy.exit("Long", stop = longStopPrice, limit=longLimitPrice)
if (strategy.position_size < 0.0)
if (use_short_stop_loss and not use_short_take_profit)
strategy.exit("Short", stop = shortStopPrice)
if (use_short_take_profit and not use_short_stop_loss)
strategy.exit("Short", limit = shortLimitPrice)
if (use_short_take_profit and use_short_stop_loss)
strategy.exit("Short", stop = shortStopPrice, limit = shortLimitPrice)
strategy.close("Long", when=bearish and not short_entry and (showDate ? window() : true))
strategy.close("Short", when=bullish and not long_entry and (showDate ? window() : true))