EMA sigue la tendencia de supresión de la oscilación

El autor:¿ Qué pasa?, Fecha: 2023-12-12 15:52:37
Las etiquetas:

img

Resumen general

Esta estrategia combina las ventajas de tres indicadores: EMA, Estrategia de seguimiento de tendencias (TTS) y Ciclo de tendencias de Schaff (STC) para formar una estrategia de seguimiento de tendencias a corto plazo fuerte. Específicamente, la estrategia juzgará si las señales de compra y venta de los tres indicadores son consistentes. Si son consistentes, se generarán señales comerciales; de lo contrario, no se realizarán operaciones. Esto filtra algunas señales falsas y hace que la estrategia sea más confiable.

Principio de la estrategia

La estrategia consta de tres partes principales: el indicador EMA, la estrategia de seguimiento de tendencias TTS y el indicador STC.

En primer lugar, se calcula la línea de la media móvil exponencial EMA de 200 períodos. Si el precio está por debajo de esta línea EMA, el indicador EMA da una señal de venta: -1; si el precio está por encima de la línea, el indicador EMA da una señal de compra: 1.

En segundo lugar, se calculan los parámetros relevantes de la estrategia de seguimiento de tendencias TTS. De acuerdo con las rupturas de precios de los rieles superior e inferior, se determina la dirección de la tendencia del mercado. Si el precio rompe el rieles superior, se genera una señal de compra 1; si el precio rompe el rieles inferior, se genera una señal de venta -1.

Por último, se calcula el indicador del ciclo de tendencia de Schaff (STC), que refleja la tendencia de cambio de la consolidación de precios.

Después de obtener las señales de juicio de los tres indicadores, la estrategia determinará si son consistentes. Solo cuando las tres señales de juicio de los indicadores sean consistentes, se generarán señales comerciales reales. Esto puede filtrar efectivamente algunas señales falsas y hacer que la estrategia sea más confiable.

Una vez que se determine que se generarán señales comerciales, se abrirán posiciones largas o cortas y se establecerán puntos de stop-profit/stop-loss.

Ventajas

  1. La estrategia combina tres tipos diferentes de indicadores para determinar eficazmente la dirección de la tendencia del mercado.

  2. El uso de la consistencia de las señales de juicio de tres indicadores para filtrar las señales falsas puede reducir las operaciones innecesarias y hacer que la estrategia sea más confiable.

  3. El establecimiento de puntos razonables de stop-profit/stop-loss puede bloquear las ganancias y evitar que las pérdidas se expandan.

  4. Los parámetros optimizados son adecuados para la mayoría de las acciones y productos de divisas.

  5. Lógica de negociación simple y fácil de entender.

Los riesgos

  1. La incongruencia entre los juicios de los indicadores puede provocar la pérdida de oportunidades de negociación.

  2. El indicador STC es sensible a los parámetros.

  3. En las tendencias bajistas, el stop loss puede penetrar, causando enormes pérdidas.

  4. Las consolidaciones laterales no pueden identificarse de manera efectiva, lo que conduce a posiciones de trampa.

Mejoras

  1. Prueba más combinaciones de indicadores para encontrar reglas de juicio más estrictas, por ejemplo, añadiendo el indicador RSI.

  2. Optimizar los parámetros STC para una mejor adaptación entre diferentes productos.

  3. Aumentar el módulo de stop loss adaptativo para optimizar los puntos de stop loss dinámicamente.

  4. Mejorar el módulo de cierre de posición para identificar rangos laterales y evitar trampas.

  5. Optimizar los algoritmos para el comercio de alta frecuencia, reducir la latencia y mejorar las tasas de cumplimiento de pedidos.

Conclusión

La estrategia combina los indicadores EMA, TTS y STC para determinar la dirección del mercado, con juicios consistentes de las tres operaciones desencadenantes, filtrando efectivamente las señales falsas. Todavía hay un amplio margen para optimizaciones, por ejemplo, probar más combinaciones de indicadores, agregar algoritmos adaptativos, optimizar módulos de negociación de alta frecuencia, etc., para fortalecer aún más la capacidad de seguimiento de tendencias. En comparación con las estrategias tradicionales que simplemente siguen los promedios móviles, esta estrategia puede juzgar los mercados de manera más inteligente, capturar tendencias y evitar trampas.


/*backtest
start: 2022-12-05 00:00:00
end: 2023-04-14 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/
// © ajahanbin1374

//@version=5
strategy(title = "EMA + TTS + STC", shorttitle = "EMA + TTS + STC", overlay = true, calc_on_order_fills=false, calc_on_every_tick = false, initial_capital = 100, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.01)

////////////////////////////////////////////////////////////
// Strategy entry
////////////////////////////////////////////////////////////
profit = input.float(defval = 0.1, minval = 0.0, title="Profit %", step=0.01, group = "Strategy") * 0.01

////////////////////////////////////////////////////////////
// Emponential Moving Average
////////////////////////////////////////////////////////////
ema = ta.ema(close, 200)
posEma = close < ema ? -1 : 1

////////////////////////////////////////////////////////////
// Trend Trader Strategy
////////////////////////////////////////////////////////////
Length = input.int(21, minval=1, group="Trend Trader Strategy")
Multiplier = input.float(3, minval=0.000001, group="Trend Trader Strategy")
avgTR = ta.wma(ta.atr(1), Length)
highestC = ta.highest(Length)
lowestC = ta.lowest(Length)
hiLimit = highestC[1] - avgTR[1] * Multiplier
loLimit = lowestC[1] + avgTR[1] * Multiplier
ret = 0.0
posTts = 0.0
ret:= close > hiLimit and close > loLimit ? hiLimit :
         close < loLimit and close < hiLimit ? loLimit : nz(ret[1], close)
posTts:=  close > ret ? 1 :close < ret ? -1 : nz(posTts[1], 0)


////////////////////////////////////////////////////////////
// Schaff Trend Cycle (STC)
////////////////////////////////////////////////////////////
EEEEEE = input.int(12, 'Length', group ="Schaff Trend Cycle")
BBBB = input.int(26, 'FastLength', group ="Schaff Trend Cycle")
BBBBB = input.int(50, 'SlowLength', group ="Schaff Trend Cycle")

AAAA(BBB, BBBB, BBBBB) =>
    fastMA = ta.ema(BBB, BBBB)
    slowMA = ta.ema(BBB, BBBBB)
    AAAA = fastMA - slowMA
    AAAA

AAAAA(EEEEEE, BBBB, BBBBB) =>
    AAA = input.float(0.5, group ="Schaff Trend Cycle")
    var CCCCC = 0.0
    var DDD = 0.0
    var DDDDDD = 0.0
    var EEEEE = 0.0
    BBBBBB = AAAA(close, BBBB, BBBBB)
    CCC = ta.lowest(BBBBBB, EEEEEE)
    CCCC = ta.highest(BBBBBB, EEEEEE) - CCC
    CCCCC := CCCC > 0 ? (BBBBBB - CCC) / CCCC * 100 : nz(CCCCC[1])
    DDD := na(DDD[1]) ? CCCCC : DDD[1] + AAA * (CCCCC - DDD[1])
    DDDD = ta.lowest(DDD, EEEEEE)
    DDDDD = ta.highest(DDD, EEEEEE) - DDDD
    DDDDDD := DDDDD > 0 ? (DDD - DDDD) / DDDDD * 100 : nz(DDDDDD[1])
    EEEEE := na(EEEEE[1]) ? DDDDDD : EEEEE[1] + AAA * (DDDDDD - EEEEE[1])
    EEEEE

mAAAAA = AAAAA(EEEEEE, BBBB, BBBBB)
mColor = mAAAAA > mAAAAA[1] ? color.new(color.green, 20) : color.new(color.red, 20)
posStc = mAAAAA > mAAAAA[1] ? 1 : -1

////////////////////////////////////////////////////////////
// Strategy entry
////////////////////////////////////////////////////////////
pos = posEma == 1 and posTts == 1 and posStc == 1 ? 1 : posEma == -1 and posTts == -1 and posStc == -1 ? -1 : 0

currentPostition = strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0
noOpenPosition = strategy.position_size == 0

signal = pos != pos[1] and pos == 1 and noOpenPosition ? 1 : pos != pos[1] and pos == -1 and noOpenPosition ? -1 : 0

stopPriceForLong = math.min(close * (1 - profit), low[1] * 0.9998, low[2] * 0.9998)
limitPriceForLong = close + (close - stopPriceForLong)
stopPriceForShort = math.max(close * (1 + profit), high[1] * 1.0002, high[2] * 1.0002)
limitPriceForShort = close - (stopPriceForShort - close)

if signal == 1
    strategy.entry(id="L", direction=strategy.long)
    strategy.exit(id='EL', from_entry='L', limit=limitPriceForLong, stop=stopPriceForLong)
if signal == -1
    strategy.entry(id="S", direction=strategy.short)
    strategy.exit(id='ES', from_entry='S', limit=limitPriceForShort, stop=stopPriceForShort)

////////////////////////////////////////////////////////////
// Plots - Debuger
////////////////////////////////////////////////////////////
plotchar(signal, title='singal', char = '')
plotchar(posEma, title='posEma', char = '')
plotchar(posTts, title='posTts', char = '')
plotchar(pos, title='pos', char = '')
plotchar(currentPostition, title = 'currentPostition', char='')
plotchar(stopPriceForLong, title = "stopPriceForLong", char ='')
plotchar(limitPriceForLong, title = 'limitPriceForLong', char='')
plotchar(stopPriceForShort, title = "stopPriceForShort", char ='')
plotchar(limitPriceForShort, title = 'limitPriceForShort', char='')

////////////////////////////////////////////////////////////
// Plots
////////////////////////////////////////////////////////////
plot(ret, color=color.new(color.black, 0), title='Trend Trader Strategy')
plotchar(mAAAAA, color=mColor, title='STC', location = location.bottom, char='-', size=size.normal)
plot(series = ema, title = "ema")


Más.