Estrategia de media móvil con trailing stop


Fecha de creación: 2023-10-24 11:21:57 Última modificación: 2023-10-24 11:21:57
Copiar: 0 Número de Visitas: 699
1
Seguir
1617
Seguidores

Estrategia de media móvil con trailing stop

Descripción general

La idea central de la estrategia es diseñar un sistema de comercio automático que utilice las medias móviles y el mecanismo de seguimiento de los stop-losses para obtener ganancias en situaciones de tendencia, mientras controla los retrocesos.

Principio de estrategia

  1. La estrategia permite a los usuarios elegir entre diferentes tipos de promedios móviles, incluyendo promedios móviles simples, promedios móviles de índices, promedios móviles de costos, etc. Los usuarios pueden elegir los tipos de promedios móviles según sus propias preferencias.

  2. El usuario necesita configurar la duración de los períodos de las medias móviles. Generalmente, en las operaciones de línea media y corta, los períodos de las medias móviles están entre 20 y 60 años.

  3. Una vez seleccionado el promedio móvil, la estrategia calcula el promedio móvil en tiempo real. Cuando el precio sube y rompe el promedio móvil, haga más; cuando el precio baja y rompe el promedio móvil, haga un descuento.

  4. La estrategia utiliza un mecanismo de seguimiento de la parada. Una vez abierta la posición, la estrategia continuamente monitorea la relación entre la media móvil y el precio, ajustando dinámicamente la posición de la línea de parada. En concreto, la posición de la línea de parada equivale al porcentaje de parada establecido por el usuario más / menos la media móvil.

  5. El usuario puede configurar el porcentaje de stop loss. El mayor valor, el mayor alcance de stop loss, para evitar que el stop loss sea demasiado sensible; el menor valor, el stop loss más estricto, para reducir el riesgo. El porcentaje de stop loss generalmente se configura entre el 2% y el 5%.

  6. Después de abrir una posición, si el precio vuelve a romper la media móvil, la posición cerrada se detiene.

Ventajas estratégicas

  • La ventaja de esta opción es que se puede abrir posiciones en la tendencia y obtener ganancias.
  • Un mecanismo de seguimiento de la parada de pérdidas que permite ajustar la posición de la parada en función de la situación, evitando que la parada de pérdidas sea demasiado pequeña y se encierre
  • Puede elegir diferentes promedios móviles y porcentajes de stop loss según sus preferencias de riesgo
  • Soporta varios tipos de medias móviles para encontrar el mejor parámetro mediante pruebas
  • La lógica de la estrategia es simple y clara, fácil de entender y modificar

Análisis de riesgos

  • En el ajuste de la situación, los precios pueden repetirse cerca de las medias móviles, lo que lleva a la apertura frecuente de posiciones cerradas.
  • Si el límite de pérdidas es demasiado alto, puede causar pérdidas masivas
  • Los parámetros óptimos para las medias móviles y los porcentajes de stop loss pueden variar según la variedad y el período de tiempo
  • La estrategia debe evitarse antes de los acontecimientos de noticias importantes

El riesgo puede ser optimizado y controlado de la siguiente manera:

  • Usar esta estrategia en variedades y períodos de tiempo con tendencias evidentes
  • Ajuste de las medias móviles periódicas a medias móviles periódicas de línea media y larga
  • Reducir adecuadamente el porcentaje de pérdidas y controlar el riesgo
  • Pruebas individuales de diferentes variedades para encontrar los mejores parámetros
  • Suspensión de las transacciones antes de noticias importantes

Dirección de optimización

La estrategia puede ser mejorada en los siguientes aspectos:

  1. Añadir confirmación de otros indicadores para evitar el comercio frecuente en la liquidación. Se pueden agregar indicadores como MACD, KD, y abrir posiciones solo cuando emitan señales al mismo tiempo.

  2. Utiliza varias medias móviles para la combinación. Por ejemplo, usa la línea de 5 días y la línea de 20 días al mismo tiempo, solo abre una posición cuando dos medias móviles emiten una señal en la misma dirección.

  3. Los parámetros de prueba para las diferentes variedades, estableciendo los parámetros óptimos. Los parámetros de cada variedad y ciclo son diferentes, por lo que se requieren pruebas separadas.

  4. Aumentar las estrategias de gestión de posiciones. Por ejemplo, establecer una cantidad fija para abrir una posición y luego agregar una posición con un parón de pérdidas.

  5. Establezca el número máximo de posiciones abiertas al día o el intervalo de apertura de posiciones. Limite las operaciones demasiado frecuentes.

  6. Añadir algoritmos de aprendizaje automático para optimizar los parámetros dinámicamente en función de los datos históricos. Evitar la configuración estática de los parámetros.

  7. El uso de modelos de aprendizaje profundo para predecir tendencias de precios puede ayudar a determinar la dirección de las tendencias de mercado.

Resumir

La estrategia en su conjunto es una estrategia de seguimiento de tendencias muy práctica. Utilizando las medias móviles para determinar la dirección de la tendencia y el seguimiento de las paradas para controlar el riesgo, se obtienen mejores rendimientos en situaciones de tendencia. La estabilidad y la rentabilidad de la estrategia se pueden mejorar aún más a través de la optimización de los parámetros y la combinación con otros indicadores o modelos.

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

//@version=3
//attoCryp, @HikmetSezen58
strategy("MOST Multi MAs", overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
sx=input(defval = "close" ,title="Fiyat sec", options=[ "close", "high", "low", "open", "hl2", "hlc3", "hlco4", "hlcc4", "hlccc5"])
smox=input(defval = "HulleMA", title = "Hareketli Ortalama: ", options=["T3", "SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "EVWMA", "HullMA", "HulleMA", "LSMA", "ALMA", "TMA", "SSMA"])
timeFramemost = input(title="++++++++++++++++++++++++++++++++++++", defval="MOST Ayarlari:")
yuzde=input(defval=3.8, minval=0, step=0.1, title="Yuzde Oran")/100
ortalamauzunluk=input(defval=28, title="Periyot Uzunlugu", minval=1)
f=input(defval=0.4, step=0.1, title="T3 icin Factor", minval=0.01)
timeFrameadd=input(title="++++++++++++++++++++++++++++++++++++", defval="Diger Orta.Ayar:")
offsig=input(defval=4, title="LSMA icin Offset veya ALMA icin Sigma", minval=0)
offalma=input(defval=0.6, title="ALMA icin Offset", minval=0, step=0.01)
timeFramess=input(title="++++++++++++++++++++++++++++++++++++", defval="Baslangic-Bitis:")
gun_baslangic=input(defval=1, title="Baslangic Gunu", minval=1, maxval=31)
ay_baslangic=input(defval=1, title="Baslangic Ayi", minval=1, maxval=12)
yil_baslangic=input(defval=2017, title="Baslangic Yili", minval=2010)
gun_bitis=input(defval=1, title="Bitis Gunu", minval=1, maxval=31)
ay_bitis=input(defval=1, title="Bitis Ayi", minval=1, maxval=12)
yil_bitis = input(defval=2019, title="Bitis Yili", minval=2010)

// backtest icin baslangic ve bitis zamanlarini belirleme
baslangic=timestamp(yil_baslangic, ay_baslangic, gun_baslangic, 00, 00)
bitis=timestamp(yil_bitis, ay_bitis, gun_bitis, 23, 59) 
zamanaraligi() => true

//guncel fiyatti belirleme
guncelfiyat=sx=="high"?high : sx=="close"?close : sx=="low"?low : sx=="open"?open : sx=="hl2"?(high+low)/2 : sx=="hlc3"?(high+low+close)/3 : sx=="hlco4"?(high+low+close+open)/4 : sx=="hlcc4"?(high+low+close+close)/4 : sx=="hlccc5"?(high+low+close+close+close)/5 : close 

/////Ortalama Hesaplamalari/////
// Tillson T3
sm0(guncelfiyat,ortalamauzunluk,f) =>
    t3e1=ema(guncelfiyat, ortalamauzunluk)
    t3e2=ema(t3e1, ortalamauzunluk)
    t3e3=ema(t3e2, ortalamauzunluk)
    t3e4=ema(t3e3, ortalamauzunluk)
    t3e5=ema(t3e4, ortalamauzunluk)
    t3e6=ema(t3e5, ortalamauzunluk)
    c1=-f*f*f
    c2=3*f*f+3*f*f*f
    c3=-6*f*f-3*f-3*f*f*f
    c4=1+3*f+f*f*f+3*f*f
    s0=c1 * t3e6 + c2 * t3e5 + c3 * t3e4 + c4 * t3e3

// Basit ortalama
sm1(guncelfiyat,ortalamauzunluk) =>
    s1=sma(guncelfiyat, ortalamauzunluk)

// Ustel ortalama
sm2(guncelfiyat,ortalamauzunluk) =>
    s2=ema(guncelfiyat, ortalamauzunluk)

// Cift Ustel ortalama
sm3(guncelfiyat,ortalamauzunluk) =>
    s3=2*ema(guncelfiyat, ortalamauzunluk) - ema(ema(guncelfiyat, ortalamauzunluk), ortalamauzunluk)

// Uclu Ustel ortalama
sm4(guncelfiyat,ortalamauzunluk) =>
    s4=3*(ema(guncelfiyat, ortalamauzunluk) - ema(ema(guncelfiyat, ortalamauzunluk), ortalamauzunluk)) + ema(ema(ema(guncelfiyat, ortalamauzunluk), ortalamauzunluk), ortalamauzunluk)

// Agirlikli Ortalama  
sm5(guncelfiyat,ortalamauzunluk) =>
    s5=wma(guncelfiyat, ortalamauzunluk)

// Hacim Agirlikli Ortalama
sm6(guncelfiyat,ortalamauzunluk) =>
    s6=vwma(guncelfiyat, ortalamauzunluk)

// Smoothed
sm7(guncelfiyat,ortalamauzunluk) =>
    s7=0.0
    s7:=na(s7[1]) ? sma(guncelfiyat, ortalamauzunluk) : (s7[1] * (ortalamauzunluk - 1) + guncelfiyat) / ortalamauzunluk

// Hull Ortalama
sm8(guncelfiyat,ortalamauzunluk) =>
    s8=wma(2 * wma(guncelfiyat, ortalamauzunluk / 2) - wma(guncelfiyat, ortalamauzunluk), round(sqrt(ortalamauzunluk)))
    
// Hull Ustel Ortalama
sm81(guncelfiyat,ortalamauzunluk) =>
    s8=ema(2 * ema(guncelfiyat, ortalamauzunluk / 2) - ema(guncelfiyat, ortalamauzunluk), round(sqrt(ortalamauzunluk)))

// Least Square
sm9(guncelfiyat,ortalamauzunluk,offsig) =>
    s9=linreg(guncelfiyat, ortalamauzunluk, offsig)

// Arnaud Legoux
sm10(guncelfiyat, ortalamauzunluk, offalma, offsig) =>
    s10=alma(guncelfiyat, ortalamauzunluk, offalma, offsig)

// Triangular
sm11(guncelfiyat, ortalamauzunluk) =>
    s11=sma(sma(guncelfiyat, ortalamauzunluk),ortalamauzunluk)

// SuperSmoother filter
sm12(guncelfiyat,ortalamauzunluk) =>
    a1=exp(-1.414*3.14159 / ortalamauzunluk)
    b1=2*a1*cos(1.414*3.14159 / ortalamauzunluk)
    c2=b1
    c3=(-a1)*a1
    c1=1 - c2 - c3
    s12=0.0
    s12:=c1*(guncelfiyat + nz(guncelfiyat[1])) / 2 + c2*nz(s12[1]) + c3*nz(s12[2])
    
//Elastic Volume Weighted Moving Average
sm13(guncelfiyat,ortalamauzunluk) =>
    hacimtoplam=sum(volume, ortalamauzunluk)
    s13=0.0
    s13:=(nz(s13[1]) * (hacimtoplam - volume)/hacimtoplam) + (volume*guncelfiyat/hacimtoplam)

ortalamafiyat=smox=="T3"?sm0(guncelfiyat,ortalamauzunluk,f) : smox=="SMA"?sm2(guncelfiyat,ortalamauzunluk) : smox=="EMA"?sm2(guncelfiyat,ortalamauzunluk) : smox=="DEMA"?sm3(guncelfiyat,ortalamauzunluk) : smox=="TEMA"?sm4(guncelfiyat,ortalamauzunluk) : smox=="WMA"?sm5(guncelfiyat,ortalamauzunluk) : smox=="VWMA"?sm6(guncelfiyat,ortalamauzunluk) : smox=="SMMA"?sm7(guncelfiyat,ortalamauzunluk) : smox=="HullMA"?sm8(guncelfiyat,ortalamauzunluk) : smox=="HulleMA"?sm81(guncelfiyat,ortalamauzunluk) : smox=="LSMA"?sm9(guncelfiyat,ortalamauzunluk,offsig) : smox=="ALMA"?sm10(guncelfiyat, ortalamauzunluk, offalma, offsig) : smox=="TMA"?sm11(guncelfiyat,ortalamauzunluk) : smox=="SSMA"?sm12(guncelfiyat,ortalamauzunluk) : smox=="EVWMA"?sm13(guncelfiyat,ortalamauzunluk) : guncelfiyat

/////MOST'u hesaplama/////
stopfiyat=ortalamafiyat*yuzde
mostfiyat=0.0
mostfiyat:=iff(ortalamafiyat>nz(mostfiyat[1],0) and ortalamafiyat[1]>nz(mostfiyat[1],0),max(nz(mostfiyat[1],0),ortalamafiyat-stopfiyat),iff(ortalamafiyat<nz(mostfiyat[1],0) and ortalamafiyat[1]<nz(mostfiyat[1],0),min(nz(mostfiyat[1],0),ortalamafiyat+stopfiyat),iff(ortalamafiyat>nz(mostfiyat[1],0),ortalamafiyat-stopfiyat,ortalamafiyat+stopfiyat)))

mostcolor=ortalamafiyat>mostfiyat?lime:fuchsia
plot(mostfiyat, color=mostcolor, linewidth=4, title="Most-fiyat")

/////AL-SAT LONG-SHORT girislerini belirleme/////
long=ortalamafiyat>mostfiyat and ortalamafiyat[1]<mostfiyat[1]
short=ortalamafiyat<mostfiyat and ortalamafiyat[1]>mostfiyat[1]
if (long) 
    strategy.entry("AL-Long", strategy.long, when = zamanaraligi())
if (short) 
    strategy.entry("SAT-Short", strategy.short, when = zamanaraligi())