Estratégia de média móvel Trailing Stop


Data de criação: 2023-10-24 11:21:57 última modificação: 2023-10-24 11:21:57
cópia: 0 Cliques: 699
1
focar em
1617
Seguidores

Estratégia de média móvel Trailing Stop

Visão geral

A ideia central da estratégia é projetar um sistema de negociação automático que utilize a média móvel e o mecanismo de rastreamento de stop loss para lucrar em situações de tendência, mas que controle as retrações.

Princípio da estratégia

  1. A estratégia permite aos usuários escolher entre vários tipos diferentes de médias móveis, incluindo médias móveis simples, médias móveis de índices, médias móveis de custo, etc. Os usuários podem escolher os tipos de médias móveis de acordo com suas preferências.

  2. Os usuários precisam configurar o comprimento do ciclo da média móvel. Geralmente, em transações de linha curta e média, o ciclo da média móvel está entre 20 e 60.

  3. Depois de selecionar uma média móvel, a estratégia calcula essa média móvel em tempo real. Quando o preço sobe e quebra a média móvel, faça mais; Quando o preço desce e quebra a média móvel, faça um vazio.

  4. A estratégia usa um mecanismo de rastreamento de stop loss. Depois de abrir uma posição, a estratégia monitora continuamente a relação entre a média móvel e o preço, ajustando dinamicamente a posição da linha de stop loss. Concretamente, a posição da linha de stop loss é igual à média móvel mais / menos a porcentagem de stop loss definida pelo usuário.

  5. O usuário pode definir uma porcentagem de parada. Quanto maior o valor, maior o alcance do parada, evitando que o parada seja muito sensível; quanto menor o valor, o parada é mais rigorosa, reduzindo o risco. A porcentagem de parada geralmente é definida entre 2% e 5%.

  6. Após a abertura da posição, se o preço voltar a quebrar a média móvel, a posição será parada.

Vantagens estratégicas

  • O que você pode fazer é abrir uma posição em uma tendência e ganhar mais dinheiro.
  • Um mecanismo de rastreamento de stop loss, que permite ajustar a posição de stop loss de acordo com a situação, para evitar que o stop loss seja pequeno demais e seja preso
  • Pode escolher diferentes médias móveis e percentagens de stop loss de acordo com as suas preferências de risco
  • Suporte para vários tipos de médias móveis, com testes para encontrar o melhor parâmetro
  • A lógica da estratégia é simples, clara, fácil de entender e modificar.

Análise de Riscos

  • Na correção de tendências, os preços podem se repetiu perto da média móvel, levando a frequentes posições baixas
  • Se a margem de parada for muito grande, pode causar um aumento nos prejuízos
  • Os melhores parâmetros de média móvel e percentual de parada podem ser diferentes em diferentes variedades e períodos de tempo
  • Esta estratégia deve ser evitada antes de eventos importantes.

Os riscos podem ser otimizados e controlados através dos seguintes métodos:

  • Usar a estratégia em variedades e períodos de tempo com tendências evidentes
  • Ajustar a média móvel periódica usando média móvel periódica de linha média longa
  • Reduzir apropriadamente a percentagem de suspensão e controlar rigorosamente os riscos
  • Testes em diferentes variedades para encontrar os melhores parâmetros
  • Parar de negociar antes de notícias importantes

Direção de otimização

A estratégia pode ser melhorada em alguns aspectos:

  1. Adicionar a confirmação de outros indicadores para evitar a negociação frequente durante a liquidação. Indicadores como MACD, KD e outros podem ser adicionados e apenas podem ser abertos quando emitem sinais ao mesmo tempo.

  2. A combinação de várias médias móveis é usada. Por exemplo, se a linha de 5 dias e a linha de 20 dias forem usadas simultaneamente, apenas duas médias móveis serão abertas quando o sinal for emitido na mesma direção.

  3. Parâmetros de teste para diferentes variedades, definindo os parâmetros ótimos. Os parâmetros de cada variedade e ciclo são diferentes e precisam ser testados separadamente.

  4. Aumentar a estratégia de gerenciamento de posições. Por exemplo, configure o número fixo de posições abertas e depois o aumento de posição com o Stop Loss.

  5. Configure o número máximo de posições abertas por dia ou o intervalo entre as posições abertas.

  6. Adicionar algoritmos de aprendizagem de máquina para otimizar os parâmetros de forma dinâmica com base nos dados históricos.

  7. A utilização de modelos de aprendizagem profunda para a previsão de tendências de preços pode auxiliar na determinação da direção das tendências.

Resumir

A estratégia é, em geral, uma estratégia de acompanhamento de tendências muito prática. Usando médias móveis para determinar a direção da tendência e rastrear o stop loss para controlar o risco, pode obter melhores retornos em situações de tendência. A estabilidade e a taxa de retorno da estratégia podem ser ainda mais aprimoradas através da otimização de parâmetros e da combinação com outros indicadores ou modelos.

Código-fonte da estratégia
/*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())