Estratégia de paragem de lucros da Sawtooth baseada na média móvel

Autora:ChaoZhang, Data: 21-12-2023 12:26:18
Tags:

img

Resumo

Esta estratégia abre posições baseadas na cruz de ouro e cruz de morte das médias móveis, e os conjuntos tomam lucros e param perdas de uma forma que cruza o chão.

  1. Usar o sistema de média móvel para filtrar choques
  2. Adotar a mudança para obter lucros e parar perdas para uma gestão dinâmica do capital
  3. Filtragem de posição configurável para evitar a abertura unidirecional

Princípio da estratégia

A estratégia consiste em quatro partes:

  1. Sistema de médias móveis

    Utilize a cruz de ouro e a cruz de morte das médias móveis para determinar tendências e filtrar choques.

  2. Mudar-se é lucrativo e não é prejudicial

    Utilize o take profit e o stop loss com uma certa percentagem para bloquear os lucros e controlar os riscos, realizando uma gestão dinâmica do capital.

  3. Filtragem de posição

    Se a posição anterior for longa, o próximo sinal deve ser curto para abrir a posição, evitando a retenção unilateral.

  4. ATR Stop Loss

    Utilize o ATR para limitar a gama máxima de perdas de parada e evitar perdas de parada excessivas.

Especificamente, a estratégia primeiro calcula a média móvel, os longs na cruz dourada e os shorts na cruz da morte. Após a entrada, defina as linhas móveis de lucro e stop loss com uma certa porcentagem. Se o preço tocar a linha de lucro, então tire lucro; se tocar a linha de stop loss ou exceder a faixa de stop loss ATR, então pare de perder.

Vantagens

As principais vantagens desta estratégia são:

  1. Alta configurabilidade

    Muitos parâmetros da estratégia são configuráveis para que os usuários ajustem com base em seus estilos de negociação.

  2. Boa gestão de capitais

    A adoção de movimentos de take profit e stop loss e de ATR stop loss pode controlar eficazmente a amplitude de um único stop loss e alcançar uma excelente gestão de capital.

  3. Adequado para o mercado de tendências

    A própria estratégia da média móvel é mais adequada para mercados com tendências fortes para filtrar os choques de forma eficaz.

Riscos e contramedidas

Esta estratégia apresenta também alguns riscos:

  1. A tendência é um equívoco

    O julgamento das médias móveis em mercados complexos não é perfeito e podem ocorrer erros de julgamento.

  2. Excesso de Stop Loss

    Os parâmetros ATR devem ser combinados para definir o intervalo de stop loss.

  3. Riscos de abertura unidireccionais

    A possibilidade de filtragem de posições terá um certo impacto na frequência de negociação.

Orientações de otimização

As principais direcções de otimização são:

  1. Optimização de parâmetros

    Ajustar o ciclo da média móvel, os parâmetros ATR, os rácios de lucro e stop loss e outros parâmetros para otimizar o desempenho da estratégia.

  2. Adição de indicadores

    Adicionar indicadores como CMF, OBV para julgar o fluxo de capital e evitar stop loss excessivos.

  3. Combinação com outras estratégias

    Combine com estratégias de ruptura para seguir tendências após a estabilização da tendência para obter melhores resultados.

Resumo

Em resumo, por meio do filtro de média móvel e do take profit e stop loss móvel, esta estratégia realiza uma gestão dinâmica de capital baseada em tendências.


/*backtest
start: 2023-11-20 00:00:00
end: 2023-12-11 00:00:00
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/
// © MGULHANN

//@version=5

//İchimoku Leading Span 2 Hesaplaması ve Girişleri
strategy("Stairs Gain Strategy - MG", overlay=true, margin_long=100, margin_short=100)
laggingSpan2Periods = input.int(52, minval=1, title="Leading Periot")
displacement = input.int(1, minval=1, title="Displacement")
donchian(len) => math.avg(ta.lowest(len), ta.highest(len))
leadLine2 = donchian(laggingSpan2Periods)
p2 = plot(leadLine2, offset = displacement - 1, color=#EF9A9A,
	 title="Leading Span B")

// İşlem Tekrarını Filtrele	 
filtreUygula = input.bool(true,title="Pozisyon Sıra Filtresi Uygula")

//Kar Al / Zarar Durdur Seviyeleri Girişleri
zararDurdurmaYuzde = input.float(1.0, title='Zarar Durdurma %', step=0.01) / 100
karAlmaYuzde = input.float(2.0, title='Kar Alma %', step=0.01) / 100

//ATR Hesaplaması
atrCarpani = input.float(0.3, title="ATR Çarpanı", step= 0.01)
atrDegeri = ta.atr(14) * atrCarpani

//ATR Değer Girişleri
atrbuyukdeger = input.float(0.01, title="ATR Üst Limit", step=0.01)
atrkucukdeger = input.float(0.06, title="ATR Alt Limit", step=0.01)

//Buy ve Sell Şartları
buycross =   ta.crossover(close,leadLine2[displacement-1]) ? atrDegeri > atrbuyukdeger : strategy.position_size == 0
sellcross = ta.crossover(leadLine2[displacement-1],close) ? atrDegeri < atrkucukdeger : strategy.position_size == 0

//KONTROL
var sonPozisyonYonu = 0
//Son kapanan pozisyon long ise degiskenin degerini 1 olarak ata
if strategy.position_size[1] > 0 and strategy.position_size == 0
    sonPozisyonYonu := 1

//Son kapanan pozisyon short ise degiskenin degerini -1 olarak ata
if strategy.position_size[1] < 0 and strategy.position_size == 0
    sonPozisyonYonu := -1
    
//eger filtre uygulama seçiliyse ve son pozisyon yönü long ise 'longFiltreSonuc' degiskenine false degeri ata ve bir sonraki pozisyonun long olmasını engelle
longFiltreSonuc = filtreUygula ? sonPozisyonYonu == 1 ? false : true : true

//eger filtre uygulama seçiliyse ve son pozisyon yönü short ise 'shortFiltreSonuc' degiskenine false degeri ata ve bir sonraki pozisyonun short olmasını engelle
shortFiltreSonuc = filtreUygula ? sonPozisyonYonu == -1 ? false : true : true

//LONG GİRİŞ
strategy.entry("Long", strategy.long, when=buycross and longFiltreSonuc)
longKarAl = strategy.position_avg_price * (1 + karAlmaYuzde)
longZararDurdur = strategy.position_avg_price * (1 - zararDurdurmaYuzde)
strategy.exit("Long Exit","Long",limit=longKarAl, stop=longZararDurdur)

//SHORT GİRİŞ
strategy.entry("Short", strategy.short, when=sellcross and shortFiltreSonuc)
shortKarAl = strategy.position_avg_price * (1 - karAlmaYuzde)
shortZararDurdur = strategy.position_avg_price * (1 + zararDurdurmaYuzde)
strategy.exit("Short Exit","Short",limit=shortKarAl, stop=shortZararDurdur)

//Kar Al ve Zarar Durdur Seviyelerinin Grafikte İşaretlenmesi
plot(strategy.position_size != 0 ? strategy.position_avg_price : na, color=color.navy, linewidth=2, style=plot.style_linebr, title="İşleme Giriş Seviyesi")
plot(strategy.position_size > 0 ? longKarAl : na, color=color.green, linewidth=2, style=plot.style_linebr, title="Long Kar Alım Seviyesi")
plot(strategy.position_size > 0 ? longZararDurdur : na, color=color.red, linewidth=2, style=plot.style_linebr, title="Long Zarar Durdurma Seviyesi")
plot(strategy.position_size < 0 ? shortKarAl : na, color=color.green, linewidth=2, style=plot.style_linebr, title="Short Kar Alım Seviyesi")
plot(strategy.position_size < 0 ? shortZararDurdur : na, color=color.red, linewidth=2, style=plot.style_linebr, title="Short Zarar Durdurma Seviyesi")

//plotshape(buycross,size=size.small,style=shape.labelup,location=location.belowbar,color=color.green,text="Al", offset = displacement-1, textcolor=color.white)
//plotshape(sellcross,size=size.small,style=shape.labeldown,location=location.abovebar,color=color.red,text="Sat", offset = displacement-1, textcolor=color.white)


Mais.