Estrategia de reversión múltiple basada en el promedio de tendencia


Fecha de creación: 2023-11-21 14:53:48 Última modificación: 2023-11-21 14:53:48
Copiar: 0 Número de Visitas: 604
1
Seguir
1621
Seguidores

Estrategia de reversión múltiple basada en el promedio de tendencia

Descripción general

La estrategia calcula varios indicadores de tendencia y realiza operaciones de compra y venta cuando se producen inversiones. Los principales indicadores de tendencia son TDI, TCF, TTF y TII. La estrategia elige en la configuración cuál de los indicadores utilizar para generar una señal de negociación.

Principio de estrategia

  • ### Indicadores del TDI

El indicador de TDI se basa en el momento de cambio del precio para calcular. Se construye a través de técnicas de suma y suavizado. Cuando el indicador de dirección de TDI cruza la curva de TDI, se hace más y cuando se cruza la curva de TDI, se elimina.

  • ### Indicadores del TCF

El indicador TCF calcula los cambios positivos y negativos en el precio para juzgar la fuerza de los pronósticos y los pronósticos vacíos. Cuando la fuerza de cambio positivo es mayor que la fuerza de cambio negativo, se hace más, o se liquida.

  • ### Indicadores de la TTF

El indicador TTF juzga la tendencia comparando la fuerza de los puntos altos y bajos. La señal de hacer más es pasar 100 en el indicador TTF y, por el contrario, liquidar.

  • ### Indicadores del TII

El indicador TII combina la línea media y el intervalo de precios para determinar la reversión de la tendencia. Considera las tendencias a corto y largo plazo al mismo tiempo.

Entrar en la lógica de hacer múltiples posiciones de paz para seleccionar las señales de negociación adecuadas de acuerdo con los indicadores configurados.

Ventajas estratégicas

La estrategia combina una variedad de indicadores de comercio de tendencias de uso común, lo que permite la flexibilidad para adaptarse al entorno del mercado. Las ventajas concretas son:

  1. El uso de señales de cambio de tendencia para capturar oportunidades de cambio de tendencia a tiempo
  2. Configuración de diferentes indicadores para una optimización específica
  3. Una rica combinación de indicadores que se pueden combinar para confirmar la señal

Riesgo estratégico

La estrategia enfrenta los siguientes riesgos:

  1. Los indicadores de tendencia pueden generar señales falsas que pueden causar pérdidas.
  2. Los indicadores individuales no pueden determinar las tendencias y son vulnerables al ruido del mercado.
  3. La configuración incorrecta de los parámetros del indicador y los parámetros de la transacción puede llevar a una distorsión del mercado y a una transacción errónea

Los siguientes pasos pueden ayudar a reducir el riesgo:

  1. Optimización de los parámetros del indicador para encontrar la mejor combinación de parámetros
  2. Combinación de señales de indicadores múltiples para negociar y mejorar la calidad de la señal
  3. Ajuste de la estrategia de gestión de posiciones para controlar las pérdidas individuales

Dirección de optimización de la estrategia

La estrategia puede ser optimizada en los siguientes aspectos:

  1. Prueba de las combinaciones óptimas de indicadores y parámetros para diferentes ciclos de mercado
  2. Añadir o eliminar indicadores para encontrar la combinación óptima
  3. Se filtran las señales de negociación para eliminar señales falsas
  4. Optimización de las estrategias de gestión de posiciones, como posiciones variables, seguimiento de paradas, etc.
  5. Aumentar los indicadores de puntuación de aprendizaje automático para ayudar a juzgar la calidad de la señal

Resumir

La estrategia combina las ventajas de una variedad de indicadores de reversión de tendencia, optimizados mediante la configuración de indicadores y parámetros, que se pueden adaptar a diferentes entornos de mercado y operar en los puntos de reversión de tendencia. La clave es encontrar la combinación óptima de parámetros e indicadores, mientras se controla el riesgo.

Código Fuente de la Estrategia
/*backtest
start: 2023-11-13 00:00:00
end: 2023-11-15 03:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © kruskakli
//
// Here is a collection of Trend Indicators as defined by M.H Pee and presented
// in various articles of the "STOCKS & COMMODITIES Magazine"
//
// The actual implementation of the indicators here are made by: everget
//
// I have gather them here so that they easily can be tested.
//
// My own test was made using 15 companies from the OMXS30 list
// during the time period of 2016-2018, and I only went LONG.
//
// The result was as follows:
//
//        Average    Std.Dev
//        profit
//  TDI    3.04%      5.97
//  TTF    1.22%.     5.73
//  TII    1.07%      6.2
//  TCF    0.32%      2.68
//
strategy("M.H Pee indicators", overlay=true)


use = input(defval="TDI", title="Use Indicator", type=input.string,
             options=["TDI","TCF","TTF","TII"])

src = close


//
// TDI
//
length = input(title="Length", type=input.integer, defval=20)
mom = change(close, length)
tdi = abs(sum(mom, length)) - sum(abs(mom), length * 2) + sum(abs(mom), length)
// Direction Indicator
tdiDirection = sum(mom, length)
tdiLong = crossover(tdiDirection, tdi)
tdiXLong = crossunder(tdiDirection, tdi)

//
// TCF
//
tcflength = input(title="Length", type=input.integer, defval=35)

plusChange(src) =>
    change_1 = change(src)
    change(src) > 0 ? change_1 : 0.0
minusChange(src) =>
    change_1 = change(src)
    change(src) > 0 ? 0.0 : -change_1

plusCF = 0.0
plusChange__1 = plusChange(src)
plusCF := plusChange(src) == 0 ? 0.0 : plusChange__1 + nz(plusCF[1])

minusCF = 0.0
minusChange__1 = minusChange(src)
minusCF := minusChange(src) == 0 ? 0.0 : minusChange__1 + nz(minusCF[1])

plusTCF = sum(plusChange(src) - minusCF, tcflength)
minusTCF = sum(minusChange(src) - plusCF, tcflength)

tcfLong = plusTCF > 0 
tcfXLong = plusTCF < 0

//
// TTF
//
ttflength = input(title="Lookback Length", type=input.integer, defval=15)

hh = highest(length)
ll = lowest(length)

buyPower = hh - nz(ll[length])
sellPower = nz(hh[length]) - ll

ttf = 200 * (buyPower - sellPower) / (buyPower + sellPower)

ttfLong = crossover(ttf, 100)
ttfXLong = crossunder(ttf, -100)

//
// TII
//
majorLength = input(title="Major Length", type=input.integer, defval=60)
minorLength = input(title="Minor Length", type=input.integer, defval=30)
upperLevel = input(title="Upper Level", type=input.integer, defval=80)
lowerLevel = input(title="Lower Level", type=input.integer, defval=20)

sma = sma(src, majorLength)

positiveSum = 0.0
negativeSum = 0.0

for i = 0 to minorLength - 1 by 1
    price = nz(src[i])
    avg = nz(sma[i])
    positiveSum := positiveSum + (price > avg ? price - avg : 0)
    negativeSum := negativeSum + (price > avg ? 0 : avg - price)
    negativeSum

tii = 100 * positiveSum / (positiveSum + negativeSum)

tiiLong = crossover(tii, 80)
tiiXLong = crossunder(tii,80)

//
// LOGIC 
//
enterLong = (use == "TDI" and tdiLong) or (use == "TCF" and tcfLong) or (use == "TTF" and ttfLong) or (use == "TII" and tiiLong)
exitLong = (use == "TDI" and tdiXLong) or (use == "TCF" and tcfXLong) or (use == "TTF" and ttfXLong) or (use == "TII" and tiiXLong)


// Time range for Back Testing
btStartYear  = input(title="Back Testing Start Year",  type=input.integer, defval=2016)
btStartMonth = input(title="Back Testing Start Month", type=input.integer, defval=1)
btStartDay   = input(title="Back Testing Start Day",   type=input.integer, defval=1)
startTime = timestamp(btStartYear, btStartMonth, btStartDay, 0, 0)

btStopYear  = input(title="Back Testing Stop Year",  type=input.integer, defval=2028)
btStopMonth = input(title="Back Testing Stop Month", type=input.integer, defval=12)
btStopDay   = input(title="Back Testing Stop Day",   type=input.integer, defval=31)
stopTime  = timestamp(btStopYear, btStopMonth, btStopDay, 0, 0)

window() => time >= startTime and time <= stopTime ? true : false


riskPerc     = input(title="Max Position  %", type=input.float, defval=20, step=0.5)
maxLossPerc  = input(title="Max Loss Risk %", type=input.float, defval=5, step=0.25)

// Average True Range (ATR) measures market volatility.
// We use it for calculating position sizes.
atrLen   = input(title="ATR Length", type=input.integer, defval=14)
stopOffset = input(title="Stop Offset", type=input.float, defval=1.5, step=0.25)
limitOffset = input(title="Limit Offset", type=input.float, defval=1.0, step=0.25)
atrValue = atr(atrLen)


// Calculate position size
maxPos = floor((strategy.equity * (riskPerc/100)) / src)
// The position sizing algorithm is based on two parts:
// a certain percentage of the strategy's equity and
// the ATR in currency value.
riskEquity  = (riskPerc / 100) * strategy.equity
// Translate the ATR into the instrument's currency value.
atrCurrency = (atrValue * syminfo.pointvalue)
posSize0    = min(floor(riskEquity / atrCurrency), maxPos)
posSize     = posSize0 < 1 ? 1 : posSize0

if (window())
    strategy.entry("Long", long=true, qty=posSize0, when=enterLong)
    strategy.close_all(when=exitLong)