Estrategia de negociación de impulso de filtro de doble rango

El autor:¿ Qué pasa?, fecha: 2024-04-01 10:54:47
Las etiquetas:

img

Resumen general

Esta estrategia es una estrategia de comercio de impulso basada en un filtro de rango dual. La estrategia calcula rangos suaves para períodos rápidos y lentos para obtener un filtro de rango completo, que se utiliza para determinar la tendencia del precio actual. Cuando el precio cruza por encima / por debajo de este rango, la estrategia genera señales de compra / venta. Además, la estrategia establece cuatro niveles de toma de beneficios de gradiente y un nivel de stop-loss para controlar el riesgo y bloquear las ganancias.

Principio de la estrategia

  1. Calcular intervalos suaves para períodos rápidos y lentos. El intervalo rápido utiliza un período más corto y un múltiplo más pequeño, mientras que el intervalo lento utiliza un período más largo y un múltiplo más grande.
  2. Utilice el promedio de los rangos rápido y lento como filtro de rango completo (TRF).
  3. Determine las tendencias al alza y a la baja comparando el precio actual con el precio anterior.
  4. Calcular las bandas dinámicas superior (FUB) e inferior (FLB) como referencias para la tendencia.
  5. Generar señales de compra y venta basadas en la relación entre el precio de cierre y el TRF.
  6. Establecer cuatro niveles gradientes de toma de ganancias y un nivel de stop-loss, correspondientes a diferentes porcentajes de posición y porcentajes de ganancia/pérdida.

Análisis de ventajas

  1. El filtro de doble rango combina períodos rápidos y lentos, lo que permite a la estrategia adaptarse a los diferentes ritmos del mercado y captar más oportunidades comerciales.
  2. El diseño de bandas superiores e inferiores dinámicas ayuda a la estrategia a alinearse con la tendencia actual y reduce las señales falsas.
  3. Los cuatro niveles de toma de ganancias de gradiente permiten a la estrategia asegurar más ganancias cuando la tendencia continúa mientras se bloquean ganancias parciales cuando la tendencia se invierte.
  4. La configuración de stop-loss ayuda a controlar la pérdida máxima por operación y protege la seguridad de la cuenta.

Análisis de riesgos

  1. Durante las fluctuaciones del mercado o las condiciones de rango, la estrategia puede generar muchas señales falsas, lo que conduce a pérdidas frecuentes de operaciones y comisiones.
  2. La configuración del gradiente de toma de ganancias puede hacer que algunas ganancias se bloqueen prematuramente, impidiendo que la estrategia se beneficie plenamente de los movimientos de tendencia.
  3. La configuración de stop-loss puede no evitar completamente las pérdidas extremas causadas por eventos de cisne negro.

Dirección de optimización

  1. Considere la posibilidad de incorporar más indicadores técnicos o indicadores del sentimiento del mercado como condiciones auxiliares para la determinación de la tendencia para reducir las señales falsas.
  2. En el caso de los ajustes de toma de ganancias y stop-loss, ajustarlos dinámicamente según los diferentes entornos de mercado e instrumentos comerciales para mejorar la adaptabilidad de la estrategia.
  3. Basándose en los resultados de las pruebas de retroceso, optimizar aún más la configuración de parámetros, como la selección de períodos de rango rápido y lento, y la configuración porcentual de los niveles de toma de ganancias y stop-loss, para mejorar la estabilidad y la rentabilidad de la estrategia.

Resumen de las actividades

La estrategia de comercio de impulso de filtro de doble rango construye un filtro integral utilizando rangos suaves de períodos rápidos y lentos, combinados con bandas superiores e inferiores dinámicas para determinar las tendencias de precios y generar señales de compra / venta. La estrategia también establece cuatro niveles de toma de ganancias de gradiente y un nivel de stop-loss para controlar el riesgo y bloquear las ganancias.


/*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)



Más.