Tendencia siguiendo una estrategia a largo plazo basada en SuperTrend y Fisher Transform

El autor:¿ Qué pasa?, Fecha: 2023-11-03 15:42:16
Las etiquetas:

img

Resumen general

Esta estrategia combina los indicadores SuperTrend y Fisher Transform para implementar una tendencia relativamente estable después de una estrategia de negociación a largo plazo. Genera señales de compra cuando el indicador SuperTrend da una señal de compra y el indicador Fisher Transform cae por debajo de -2.5 y sube. La estrategia gestiona las posiciones adecuadamente con stop loss y take profit.

Estrategia lógica

  1. El indicador SuperTrend se utiliza para determinar la dirección de la tendencia del precio. Cuando el precio cruza por encima de la banda superior, es una señal alcista; cuando el precio cruza por debajo de la banda inferior, es una señal bajista. Esta estrategia emite una señal de compra cuando la SuperTrend es alcista.

  2. El indicador Fisher Transform refleja el impacto de las fluctuaciones de precios en la psicología del consumidor. Los valores de Fisher entre (-2.5, 2.5) representan un mercado neutral, por debajo de -2.5 representa un mercado de pánico, y por encima de 2.5 representa un mercado eufórico.

  3. La estrategia gestiona las posiciones correctamente con stop loss y take profit. La stop loss se establece en el precio de entrada menos el valor ATR multiplicado por el multiplicador ATR, y la take profit se establece en el precio de entrada más el valor ATR multiplicado por el multiplicador ATR. La amplitud de stop loss es mayor que la amplitud de take profit, lo que refleja la idea de control de riesgos de la estrategia de tendencia siguiente.

  4. El importe de la posición se calculará basándose en el ATR y en el importe del riesgo de modo que el riesgo por unidad no exceda del importe del riesgo establecido.

Análisis de ventajas

  1. La combinación de múltiples indicadores evita el comercio frecuente causado por un solo indicador. SuperTrend determina la dirección de la tendencia y Fisher Transform determina la psicología del mercado para formar señales comerciales estables.

  2. El establecimiento adecuado de un stop loss y un take profit es propicio para captar las tendencias de las tenencias a largo plazo, controlando al mismo tiempo los riesgos.

  3. El uso de la gestión de la cantidad de riesgo y el tamaño mínimo de la ficha hace que el riesgo de cada operación sea controlado, evitando grandes pérdidas más allá de la asequibilidad.

  4. Las señales comerciales son estables y adecuadas para la tenencia a largo plazo.

  5. Gran espacio de optimización para los parámetros del indicador. el período y el multiplicador de SuperTrend ATR, y la suavidad de Fisher pueden ajustarse de acuerdo con diferentes productos y marcos de tiempo para encontrar la combinación óptima de parámetros.

Análisis de riesgos

  1. Como estrategia de seguimiento de tendencias, se acumularán pequeñas pérdidas durante períodos de rango.

  2. Cuando el mercado permanece en un estado durante mucho tiempo, los valores de Fisher seguirán desviándose de la zona neutral, en cuyo caso la estrategia debe suspenderse.

  3. El período ATR y el multiplicador ATR deben fijarse razonablemente para garantizar un amortiguador suficiente para el stop loss.

  4. El hecho de ignorar los costos de transacción hará que las operaciones rentables pierdan dinero.

  5. Se requiere una participación en el mercado a largo plazo para que la estrategia obtenga su ventaja.

Direcciones de optimización

  1. Ajuste el período ATR, el multiplicador ATR para optimizar el stop loss y tomar ganancias.

  2. Pruebe diferentes parámetros de Fisher como el período suave para encontrar señales comerciales más estables.

  3. Añadir otros indicadores como filtros para evitar operaciones incorrectas cuando el mercado es incierto.

  4. Prueba diferentes estrategias de obtención de ganancias como mover, parcial, ATR, etc. para mejorar la rentabilidad.

  5. Optimizar las estrategias de gestión de capital como la fracción fija, la fórmula de Kelly, etc. para aumentar la relación rendimiento/riesgo.

  6. Optimizar los costos de transacción, mantener rentable para posiciones pequeñas.

Conclusión

Esta estrategia integra las ventajas de SuperTrend, Fisher Transform y otros indicadores para formar una tendencia estable siguiendo una estrategia de negociación a largo plazo. A través del stop loss, take profit y la gestión de riesgos, puede lograr una buena relación de recompensa por riesgo. La estrategia necesita una mayor optimización de los parámetros, filtración de señales, gestión de capital, etc. para mejorar el rendimiento práctico. Pero la lógica general es robusta y vale la pena la verificación práctica y la optimización continua.


/*backtest
start: 2023-10-26 00:00:00
end: 2023-11-02 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Supertrend and Fisher_LONG", overlay=true)

//This block is for  Fisher Transformation Calculation.
len = input.int(10, minval=1, title="Length") // Length is optional. 10 is good but is up to you.
high_ = ta.highest(hl2, len)
low_ = ta.lowest(hl2, len)
round_(val) => val > .99 ? .999 : val < -.99 ? -.999 : val
value = 0.0
value := round_(.66 * ((hl2 - low_) / (high_ - low_) - .5) + .67 * nz(value[1]))
fish1 = 0.0
fish1 := .5 * math.log((1 + value) / (1 - value)) + .5 * nz(fish1[1])
fish2 = fish1[1]

// Buy condition for Fisher transformation.
buy_signal = (fish1 < -2.5) and (fish1 > fish2)
durum = 0 //just for the situation.

if (buy_signal)
    durum := 1 // now it changes from 0 to 1.

// Supertrend indicator inputs and calculations (same as in the indicator)
Periods = input(title='ATR Period', defval=10) // period is 10, but you can change it
src = input(hl2, title='Source')
Multiplier = input.float(title='ATR Multiplier', step=0.1, defval=2) //atr multiplier is important. it is 2 for this strategy but you can find another for best performance 
RiskAmount = input.float(title='Risk Amount ($)', defval=10.0, minval=0.0, step=1.0) // ıf you use risk-reward method, risk is 10$ for each position. you can also change it
changeATR = input(title='Change ATR Calculation Method ?', defval=true)

atr2 = ta.sma(ta.tr, Periods)
atr = changeATR ? ta.atr(Periods) : atr2
up = src - Multiplier * atr
up1 = nz(up[1], up)
up := close[1] > up1 ? math.max(up, up1) : up
dn = src + Multiplier * atr
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? math.min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend

// Calculate position size based on risk amount
riskPerContract = atr * Multiplier
contracts = RiskAmount / (riskPerContract * syminfo.mintick)

//short signal condition
buySignal = trend == 1 and trend[1] == -1 and durum == 1

plotshape(buySignal, title='Buy Signal', location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)

// variables
var float entryPrice = na
var float stopLoss = na
var float takeProfit = na
var float atr1 = na
var float takeProfit2 = na
var float takeProfit3 = na

//it calculates the stop level and reward profit levels using atr.
if (buySignal)
    entryPrice := close
    atr1 := atr
    stopLoss := entryPrice - atr1 * Multiplier
    contracts := entryPrice / (entryPrice - stopLoss) * RiskAmount / entryPrice
    takeProfit := entryPrice + atr1 * Multiplier
    takeProfit2 := entryPrice + 2 * atr1 * Multiplier
    takeProfit3 := entryPrice + 3 * atr1 * Multiplier

if (buySignal)
    strategy.entry("Buy", strategy.long, qty=contracts)

// 
if (close <= stopLoss)
    strategy.close("Buy", comment="Stop Loss Hit")
else if (close >= takeProfit)
    strategy.close("Buy", comment="Take Profit Hit")

// draw the stop, entry and profit levels
plot(stopLoss, title="Stop Loss", color=color.red, linewidth=1, style=plot.style_linebr)
plot(entryPrice, title="Entry Price", color=color.orange, linewidth=1, style=plot.style_linebr)
plot(takeProfit, title="Take Profit", color=color.green, linewidth=1, style=plot.style_linebr)
plot(takeProfit2, title="Take Profit 2", color=color.blue, linewidth=1, style=plot.style_linebr)
plot(takeProfit3, title="Take Profit 3", color=color.purple, linewidth=1, style=plot.style_linebr)


Más.