Estrategia de seguimiento de tendencias basado en la nube de Ichimoku, el MACD y el estocástico

El autor:¿ Qué pasa?, Fecha: 2024-02-05 10:30:45
Las etiquetas:

img

Resumen general

Esta estrategia integra los indicadores Ichimoku Cloud, promedio móvil, MACD, estocástico y ATR para identificar y rastrear tendencias en múltiples marcos de tiempo.

Estrategia lógica

  1. La nube de Ichimoku juzga las direcciones de tendencia a mediano y largo plazo.

  2. El histograma MACD cruza por encima de la línea de señal MACD es una señal alcista, y cruzar por debajo es una señal bajista.

  3. El KD estocástico juzga las zonas sobrecompradas/sobrevendidas. Cruzar la línea K por encima de 20 es una señal alcista, y cruzar por debajo de 80 es una señal bajista.

  4. El precio cerrado por encima de MA es una señal alcista, y el cruce por debajo es una señal bajista.

  5. Integrar señales de los indicadores anteriores para filtrar algunas señales falsas y formar señales de tendencia sostenible de alta probabilidad.

  6. Utilice ATR para calcular el precio de stop loss y take profit.

Ventajas

  1. Identificar las tendencias en múltiples marcos de tiempo para mejorar la precisión de la señal.

  2. Utilice ampliamente combinaciones de indicadores para filtrar eficazmente las señales falsas.

  3. Los límites de stop loss y take profit basados en ATR significan pérdidas por operación.

  4. El rigor personalizable de las condiciones de entrada satisface diferentes apetitos de riesgo.

Los riesgos

  1. La tendencia natural no detecta las reversiones causadas por los eventos del cisne negro.

  2. El stop loss ATR idealizado es difícil de replicar completamente en el comercio en vivo.

  3. La configuración incorrecta de los parámetros puede dar lugar a un exceso o a una precisión insuficiente de la señal.

  4. El ajuste de parámetros es necesario para adaptarse a diferentes productos y entornos de mercado.

Áreas de mejora

  1. Introduzca el aprendizaje automático para ayudar a juzgar los puntos de inversión de tendencia.

  2. Optimizar los valores de los parámetros del multiplicador ATR para diferentes productos.

  3. Incorporar otros factores como cambios de volumen para mejorar la precisión de la señal de avance.

  4. Sigue optimizando los parámetros basados en los resultados de backtest para encontrar las mejores combinaciones de parámetros.

Resumen de las actividades

Esta estrategia aprovecha Ichimoku Cloud, MACD, Estocástico y más para la identificación de tendencias de múltiples marcos de tiempo, capturando tendencias mientras evita quedar atrapado por eventos de cisne negro.


/*backtest
start: 2024-01-05 00:00:00
end: 2024-02-04 00:00:00
period: 4h
basePeriod: 15m
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/
// © FXFUNDINGMATE

//@version=4
strategy(title="FXFUNDINGMATE TREND INDICATOR", overlay=true)

//Ichimoku Cloud
conversionPeriods = input(9, minval=1, title="Conversion Line Length")
basePeriods = input(26, minval=1, title="Base Line Length")
laggingSpan2Periods = input(52, minval=1, title="Lagging Span 2 Length")
displacement = input(26, minval=1, title="Displacement")
donchian(len) => avg(lowest(len), highest(len))
conversionLine = donchian(conversionPeriods)
baseLine = donchian(basePeriods)
leadLine1 = avg(conversionLine, baseLine)[displacement - 1]
leadLine2 = donchian(laggingSpan2Periods)[displacement - 1]


//macd
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=false)

fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal


//kd
periodK = input(5, title="%K Length", minval=1)
smoothK = input(3, title="%K Smoothing", minval=1)
periodD = input(3, title="%D Smoothing", minval=1)
k = sma(stoch(close, high, low, periodK), smoothK)
d = sma(k, periodD)


//atr
atrlength = input(title="Atr Length", defval=8, minval=1)
SMulti = input(title="Stop loss multi Atr", defval=1.0)
TMulti = input(title="Take profit multi Atr", defval=1.0)
smoothing = input(title="Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"])
ma_function(source, length) =>
	if smoothing == "RMA"
		rma(source, length)
	else
		if smoothing == "SMA"
			sma(source, length)
		else
			if smoothing == "EMA"
				ema(source, length)
			else
				wma(source, length)
atr = ma_function(tr(true), atrlength)


operation_type = input(defval = "Both", title = "Position side", options = ["Long", "Short", "Both"])
operation = operation_type == "Long" ? 1 : operation_type == "Short" ? 2 : 3
showlines = input(true,  title="Show sl&tp lines")

// MA
sma_len = input(100, title="MA Length", type=input.integer)
sma = sma(close, sma_len)

longCond = crossover(k, 20) and macd > 0 and close > sma and close > leadLine1 and close > leadLine2
shortCond = crossunder(k, 80)  and macd < 0 and close < sma and close < leadLine1 and close < leadLine2

entry_price  = float(0.0) //set float
entry_price := strategy.position_size != 0 or longCond or shortCond ? strategy.position_avg_price : entry_price[1]
entry_atr = valuewhen(longCond or shortCond, atr,0)
short_stop_level     = float(0.0)   //set float
short_profit_level   = float(0.0)   //set float
long_stop_level      = float(0.0)   //set float
long_profit_level    = float(0.0)   //set float
short_stop_level    := entry_price + SMulti * entry_atr
short_profit_level  := entry_price - TMulti * entry_atr
long_stop_level     := entry_price - SMulti * entry_atr
long_profit_level   := entry_price + TMulti * entry_atr


//  Strategy Backtest Limiting Algorithm
i_startTime = input(defval = timestamp("1 Jan 2020 00:00 +0000"), title = "Backtesting Start Time", type = input.time)
i_endTime = input(defval = timestamp("31 Dec 2025 23:59 +0000"), title = "Backtesting End Time", type = input.time)
timeCond = true

if (operation == 1 or operation == 3)
    strategy.entry("long" , strategy.long , when=longCond and timeCond, alert_message = "Long")
    strategy.exit("SL/TP", from_entry = "long" , limit = long_profit_level , stop = long_stop_level , alert_message = "Long exit")

if (operation == 2 or operation == 3)
    strategy.entry("short", strategy.short, when=shortCond and timeCond, alert_message="Short")
    strategy.exit("SL/TP", from_entry = "short", limit = short_profit_level , stop = short_stop_level , alert_message = "Short exit")
    
if time > i_endTime  
    strategy.close_all(comment = "close all", alert_message = "close all")
    
plot(showlines and strategy.position_size <= 0 ? na : long_stop_level,    color=color.red,  style=plot.style_linebr, linewidth = 2)
plot(showlines and strategy.position_size <= 0 ? na : long_profit_level,  color=color.lime, style=plot.style_linebr, linewidth = 2)
plot(showlines and strategy.position_size >= 0 ? na : short_stop_level,   color=color.red,  style=plot.style_linebr, linewidth = 2)
plot(showlines and strategy.position_size >= 0 ? na : short_profit_level, color=color.lime, style=plot.style_linebr, linewidth = 2)

//}



Más.