Estrategia de trading con momentum y filtro de intervalo doble


Fecha de creación: 2024-04-01 10:54:47 Última modificación: 2024-04-01 10:54:47
Copiar: 3 Número de Visitas: 590
1
Seguir
1617
Seguidores

Estrategia de trading con momentum y filtro de intervalo doble

Descripción general

La estrategia es una estrategia de comercio de dinámica basada en un filtro de doble intervalo. La estrategia obtiene un filtro de intervalo integral para determinar el movimiento del precio actual mediante el cálculo de un intervalo de suavización de dos ciclos de alta y baja velocidad. La estrategia genera una señal de compra/venta cuando el precio atraviesa este intervalo.

Principio de estrategia

  1. Calcula el intervalo liso de los dos ciclos rápido y lento. El intervalo rápido usa ciclos más cortos y múltiplos más pequeños, y el intervalo lento usa ciclos más largos y múltiplos más grandes.
  2. Utiliza el promedio entre el rango rápido y el rango lento como un filtro de rango integral (TRF) [2].
  3. Calcula la relación entre el precio actual y el precio anterior para determinar la tendencia ascendente (upward) y la tendencia descendente (downward).
  4. Calcular la dinámica de las vías ascendentes (FUB) y descendentes (FLB) como referencia de tendencia.
  5. Se generan señales de compra y venta de acuerdo con la relación entre el precio de cierre y el TRF.
  6. Se establecen cuatro paradas de escala y un parón de pérdida para diferentes proporciones de posiciones y porcentajes de ganancias/pérdidas.

Análisis de las ventajas

  1. El filtro de doble intervalo combina los ciclos rápido y lento para adaptarse a los diferentes ritmos del mercado y capturar más oportunidades de negociación.
  2. El diseño dinámico de subida y bajada ayuda a seguir las tendencias actuales y a reducir las señales falsas.
  3. La configuración de cuatro paradas de gradiente permite obtener más ganancias si la tendencia continúa, y también puede bloquear parte de las ganancias a tiempo si la tendencia se invierte.
  4. La configuración de stop loss ayuda a controlar el máximo de pérdidas en una sola transacción y protege la seguridad de la cuenta.

Análisis de riesgos

  1. La estrategia puede generar más señales falsas cuando hay movimientos de mercado o de intervalo, lo que lleva a la pérdida de operaciones frecuentes y comisiones.
  2. La configuración de la barrera de gradiente puede causar que parte de las ganancias se bloqueen de antemano y no se pueda disfrutar completamente de los beneficios de la tendencia.
  3. La configuración para detener el daño puede no evitar completamente los daños extremos causados por el evento de los cisnes negros.

Dirección de optimización

  1. Se puede considerar la introducción de más indicadores técnicos o de sentimiento de mercado como condición auxiliar para el juicio de tendencias y reducir las falsas señales.
  2. Las configuraciones de stop y stop loss pueden ajustarse dinámicamente según los diferentes entornos de mercado y variedades de transacciones, lo que mejora la adaptabilidad de la estrategia.
  3. En base a la retrospectiva, se puede optimizar aún más la configuración de los parámetros, como la selección de ciclos entre rápidos y lentos, la configuración del porcentaje de paradas y paradas, etc., para mejorar la estabilidad y la rentabilidad de la estrategia.

Resumir

La estrategia de comercio de fluctuaciones de la barra de dos bandas construye un filtro integrado a través de la zona de nivelación de dos ciclos rápidos y lentos, al mismo tiempo que combina el ascenso y el descenso dinámico para juzgar el movimiento de los precios y generar señales de compra y venta. La estrategia también establece cuatro paradas de escala y un stop loss para controlar el riesgo y bloquear las ganancias.

Código Fuente de la Estrategia
/*backtest
start: 2024-03-01 00:00:00
end: 2024-03-31 23:59:59
period: 1h
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/
//@version=5
strategy(title='2"Twin Range Filter', overlay=true)
strat_dir_input = input.string(title='İşlem Yönü', defval='Alis', options=['Alis', 'Satis', 'Tum'])
strat_dir_value = strat_dir_input == 'Alis' ? strategy.direction.long : strat_dir_input == 'Satis' ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)

////////////////////////////

// Backtest inputs
BaslangicAy = input.int(defval=1, title='İlk ay', minval=1, maxval=12)
BaslangicGun = input.int(defval=1, title='İlk Gün', minval=1, maxval=31)
BaslangicYil = input.int(defval=2023, title='İlk Yil', minval=2000)
SonAy = input.int(defval=1, title='Son Ay', minval=1, maxval=12)
SonGun = input.int(defval=1, title='Son Gün', minval=1, maxval=31)
SonYil = input.int(defval=9999, title='Son Yıl', minval=2000)

start = timestamp(BaslangicYil, BaslangicAy, BaslangicGun, 00, 00)  // backtest start window
finish = timestamp(SonYil, SonAy, SonGun, 23, 59)  // backtest finish window
window() => true

source = input(defval=close, title='Source')
showsignals = input(title='Show Buy/Sell Signals ?', defval=true)
per1 = input.int(defval=27, minval=1, title='Fast period')
mult1 = input.float(defval=1.6, minval=0.1, title='Fast range')
per2 = input.int(defval=55, minval=1, title='Slow period')
mult2 = input.float(defval=2, minval=0.1, title='Slow range')
smoothrng(x, t, m) =>
    wper = t * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.ema(avrng, wper) * m
    smoothrng
smrng1 = smoothrng(source, per1, mult1)
smrng2 = smoothrng(source, per2, mult2)
smrng = (smrng1 + smrng2) / 2
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r : x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r
    rngfilt
filt = rngfilt(source, smrng)
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])
STR = filt + smrng
STS = filt - smrng
FUB = 0.0
FUB := STR < nz(FUB[1]) or close[1] > nz(FUB[1]) ? STR : nz(FUB[1])
FLB = 0.0
FLB := STS > nz(FLB[1]) or close[1] < nz(FLB[1]) ? STS : nz(FLB[1])
TRF = 0.0
TRF := nz(TRF[1]) == FUB[1] and close <= FUB ? FUB : nz(TRF[1]) == FUB[1] and close >= FUB ? FLB : nz(TRF[1]) == FLB[1] and close >= FLB ? FLB : nz(TRF[1]) == FLB[1] and close <= FLB ? FUB : FUB
al = ta.crossover(close, TRF)
sat = ta.crossunder(close, TRF)
plotshape(showsignals and al, title='Long', text='BUY', style=shape.labelup, textcolor=color.white, size=size.tiny, location=location.belowbar, color=color.rgb(0, 19, 230))
plotshape(showsignals and sat, title='Short', text='SELL', style=shape.labeldown, textcolor=color.white, size=size.tiny, location=location.abovebar, color=color.rgb(0, 19, 230))
alertcondition(al, title='Long', message='Long')
alertcondition(sat, title='Short', message='Short')
Trfff = plot(TRF)
mPlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0)
longFillColor = close > TRF ? color.green : na
shortFillColor = close < TRF ? color.red : na
fill(mPlot, Trfff, title='UpTrend Highligter', color=longFillColor, transp=90)
fill(mPlot, Trfff, title='DownTrend Highligter', color=shortFillColor, transp=90)

//////////////////////



renk1 = input(true, "Mum Renk Ayarları?")
mumrenk = input(true,title="Trend Bazlı Mum Rengi Değişimi?")
htaColor = renk1 ? (al ? color.rgb(224, 230, 57) : #E56337) : #c92626
barcolor(color = mumrenk ? (renk1 ? htaColor : na) : na)
if (al) and window()
    strategy.entry("Al", strategy.long)
if (sat) and window()
    strategy.entry("Sat", strategy.short)


per1(pcnt) =>
    strategy.position_size != 0 ? math.round(pcnt / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)
zarkesmgb = input.float(title='Zarar Kes Yüzdesi', defval=100, minval=0.01)
zarkeslos = per1(zarkesmgb)
q1 = input.int(title='Satış Lot Sayısı 1.Kısım %', defval=5, minval=1)
q2 = input.int(title='Satış Lot Sayısı 2.Kısım %', defval=8, minval=1)
q3 = input.int(title='Satış Lot Sayısı 3.Kısım %', defval=13, minval=1)
q4 = input.int(title='Satış Lot Sayısı 4.Kısım %', defval=21, minval=1)
tp1 = input.float(title='Kar Yüzdesi 1.Kısım', defval=13, minval=0.01)
tp2 = input.float(title='Kar Yüzdesi 2.Kısım', defval=21, minval=0.01)
tp3 = input.float(title='Kar Yüzdesi 3.Kısım', defval=29, minval=0.01)
tp4 = input.float(title='Kar Yüzdesi 4.Kısım', defval=34, minval=0.01)
strategy.exit('✨KS1', qty_percent=q1, profit=per1(tp1), loss=zarkeslos)
strategy.exit('✨KS2', qty_percent=q2, profit=per1(tp2), loss=zarkeslos)
strategy.exit('✨KS3', qty_percent=q3, profit=per1(tp3), loss=zarkeslos)
strategy.exit('✨KS4', qty_percent=q4, profit=per1(tp4), loss=zarkeslos)