Estratégia dinâmica de posição de adição bidirecional

Autora:ChaoZhang, Data: 2023-11-27 11:33:11
Tags:

img

Resumo

Esta é uma estratégia que toma posições em ambas as direções usando sinais de fortes avanços em ambas as direções.

Princípio da estratégia

Esta estratégia julga a direção do mercado com base nos sinais de dois velas fortes consecutivas. Especificamente, calcula a porcentagem de aumento / diminuição de cada velas. Quando a porcentagem de aumento / diminuição de dois velas consecutivas exceder o limiar definido pelo usuário (como 6%), determina que a direção é forte e abre uma posição longa / curta no terceiro velas.

Condição longa: os preços de fechamento de dois candelabros consecutivos aumentam mais de 6% em relação ao preço de fechamento anterior

Condição curta: os preços de fechamento de dois candelabros consecutivos caem mais de 6% em relação ao preço de fechamento anterior

Após a abertura de posições, ele irá definir distâncias de stop profit e stop loss para controlar os riscos.

Esta estratégia tem também algumas funções auxiliares para controlar os riscos, tais como permitir apenas a abertura de posições durante períodos de tempo específicos, fixar o montante máximo de perdas, etc.

Análise das vantagens

Trata-se de uma estratégia de negociação relativamente estável e fiável em duas direcções.

  1. A negociação bidirecional pode obter lucros quando o mercado sobe e desce, melhorando a estabilidade.

  2. A avaliação da tendência com base em dois sinais fortes pode efetivamente filtrar ruídos e melhorar a qualidade das posições abertas.

  3. As definições de stop profit e stop loss são razoáveis, o que é benéfico para o controlo do risco e limita as perdas.

  4. As funções auxiliares são abrangentes, tais como controlo do tempo, controlo das perdas máximas, etc. Podem controlar os riscos muito bem.

  5. É fácil testar e otimizar esta estratégia, pois a lógica é simples e clara.

Análise de riscos

Os principais riscos desta estratégia são:

  1. Podemos ajustar adequadamente o parâmetro do primeiro sinal para garantir a qualidade do sinal.

  2. A probabilidade de três velas super fortes consecutivas é relativamente pequena, o que pode levar a menos oportunidades de abrir posições.

  3. Comportamentos irracionais causados por eventos repentinos podem levar a perdas enormes que excedam a distância de stop loss.

  4. Para a implementação da negociação de duas direcções, precisamos prestar atenção aos problemas de alocação de fundos, caso contrário, pode levar a obter lucros sem stop losses.

Orientações de otimização

Esta estratégia pode ser melhorada nos seguintes aspectos:

  1. Otimizar a lógica do julgamento do primeiro sinal para melhorar a qualidade do sinal. Mais fatores podem ser considerados, como mudança no volume de transações, taxa de volatilidade, etc.

  2. Otimizar padrões de stop profit e stop loss. Ajustar parâmetros baseados em diferentes mercados para tornar a relação risco-recompensa mais razoável. A distância de stop loss também pode ser definida como stop loss dinâmico.

  3. Adicionar mais módulos de controlo de riscos, por exemplo, perda máxima diária, perda máxima consecutiva, etc., para assegurar uma utilização eficiente e segura dos fundos.

  4. Otimizar a relação de alocação de fundos, para tornar a alocação de capital da negociação bidirecional mais razoável, evitando obter lucros sem parar as perdas.

  5. Definir diferentes combinações de parâmetros para a otimização de backtesting para diferentes variedades de negociação, para melhorar a adaptabilidade.

Resumo

Esta estratégia é uma estratégia de posição de adição relativamente robusta de duas direções. Tem alta qualidade de sinal e certas capacidades de controle de risco. Também tem grande espaço para otimização para melhorar ainda mais a estabilidade dos lucros. A estratégia é adequada para mercados de tendência de médio e longo prazo, e também pode aproveitar oportunidades durante consolidações de mercado.


/*backtest
start: 2022-11-20 00:00:00
end: 2023-11-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="GAVAD", shorttitle="GAVAD", overlay=false, initial_capital=36000)

////////////////////////////////////////////////////////
//                                                    //
//                                                    //
//                     GAVAD %                        //
//                                                    //
//                                                    //
////////////////////////////////////////////////////////
Sinal = input(6, title="Sinal", type=input.integer, minval=1, maxval=150)
//Objetivo = input(6, title="Objetivo", type=input.integer, minval=1, maxval=100)
Multip = input(10000, title="Sinal", type=input.integer, minval=1, maxval=100000)



//GavadEntrada1 = (close - low [1])/close[1]
//plot(GavadEntrada1, style=plot.style_line, linewidth=3, color=color.yellow)

//sombra
//DownOL = (low - open ) / open * -10000
//plot(DownOL, style=plot.style_area, linewidth=3, color=color.silver)


// imprime o GAVAD
GavadEntrada = (close - close [1])/close[1] * Multip
plot(GavadEntrada, style=plot.style_histogram, linewidth=3, color=color.purple)

//linha do Sinal
plot(Sinal, style=plot.style_line, linewidth=1, color=color.yellow)
//linha do Objetivo
//plot(Objetivo, style=plot.style_line, linewidth=1, color=color.white)

Fura1 = GavadEntrada [0] >= Sinal
Fura2 = GavadEntrada [1] >= Sinal

Alert = Fura1
plotshape(Alert, style=shape.circle,  location = location.top, color= color.yellow)

SinalON = Fura1 and Fura2
plotshape(SinalON, style=shape.circle,  location = location.bottom, color= color.green)



////////////////////////////////////////////////////////
//                                                    //
//                                                    //
//              CONDIÇÕES DE OPERACAO                 //
//                                                    //
//                                                    //
////////////////////////////////////////////////////////



Sell_Forte2 = SinalON
//plotshape(Sell_Forte2, style=shape.xcross, color=color.yellow, location=location.bottom)

//Call_Forte2 = SinalON
//plotshape(Call_Forte2, style=shape.xcross, color=color.yellow, location=location.top)


////////////////////////////////////////////////////////
//                                                    //
//                                                    //
//                    CALENDARIO                      //
//                                                    //
//                                                    //
////////////////////////////////////////////////////////

//052)
// trading view solicita que se ja informado data para gerar backtest a partir de tal data
//começa backtest do trading sistem em qual data ?

ano = input(2021, minval=1, title="Ano")
mes = input(1, minval=1, maxval=12, title="Mes")
dia = input(1, minval=1, maxval=30, title="Dia")
hora = input(0, minval=1, maxval=23, title="hora")
minuto = input(0, minval=1, maxval=59, title="minuto")
horaabertura = input(10, minval=1, maxval=23, title="hora Inicio Operacao Robo")
minutoabertura = input(40, minval=1, maxval=59, title="Minuto Encerra Tudo")
horaencerra = input(17, minval=1, maxval=23, title="hora Fechamento")
minutoencerra = input(50, minval=1, maxval=59, title="Minuto Encerra Novas Operacoes")
minutofinaliza = input(50, minval=1, maxval=59, title="Minuto Encerra Tudo")


//valida se o dia de hoje é posterior ao dia informado acima
Validadia = year >= ano and month >= mes and dayofmonth >= dia


//cria horario de abertura de negociaçao, considerar default 10 hs, pois os indicadores ja estarão corrigidos
abreloja = year >= ano and month >= mes and dayofmonth >= dia and hour >= horaabertura
//and minute >= minutoabertura)


//cria horario de fechamento de todas as negociaçoes, considerar default 17:00 hs
//nenhuma ordem pode ser aberta depois dessa data e as abertas devem ser fechadas
fechaloja = year >= ano and month >= mes and dayofmonth >= dia and hour >= horaencerra
//and minute >= minutoencerra)

fechaloja2 = year >= ano and month >= mes and dayofmonth >= dia and hour >= horaencerra
//and minute >= minutofinaliza)


//valida horario de negociação, pra liberar as operacoes.
lojaaberta = abreloja == true and fechaloja == false and fechaloja2 == false


////////////////////////////////////////////////////////
//                                                    //
//                                                    //
//             GERENCIAMENTO DE RISCO                 //
//                                                    //
//                                                    //
////////////////////////////////////////////////////////

//seta meta mensal
meta = input(150000, "Meta de Lucro")
Contratos= input(5, "Contratos")

//seta tamanho do lote (ordem inicial-unica)
tamanhodolote = Contratos

//seta stop gain final em pontos (metade da barra anterior)
//gaintotal = input(30, "Gain")
gaintotal = input(3, "Gain")

//seta stop loss final em pontos
lossmaximo = input(8, "Loss")
//lossmaximo = (open- close)*100

////////////////////////////////////////////////////////
//                                                    //
//                     Checkbox                       //
//                                                    //
////////////////////////////////////////////////////////

//ativacomprasretorno = input(title="Ativar Compras Retorno", type=input.bool , defval=true)
//ativavendasretorno = input(title="Ativar Vendas Retorno", type=input.bool , defval=true)


////////////////////////////////////////////////////////
//                                                    //
//                                                    //
//                  COMPRA E VENDA                    //
//                                                    //
//                                                    //
////////////////////////////////////////////////////////

Tradenumber = strategy.closedtrades + 1
Batemeta = strategy.netprofit < meta

//COMPRA RETORNO
//longcondition2 = Validadia and Call_Forte2 and Batemeta


//strategy.entry("Comprar", strategy.long, tamanhodolote, when=longcondition2, comment="[Oper=" + tostring(Tradenumber) + "]win=" + tostring(strategy.wintrades) + " | Loss=" + tostring(strategy.losstrades))
//strategy.exit("Saida Compra", "Comprar", profit=gaintotal, loss=lossmaximo)
//if (CruzamentoFechaCallGG)
    //strategy.close(id="Comprar")
//if (EscapeFechaCall)
  // strategy.close(id="Comprar")   
   
    
//plotchar(longcondition2, char="C", location=location.bottom, color=color.lime, transp=0)
//alertcondition(longcondition2, "Comprar", "Compra Rápida!")

//VENDA RETORNO
Shortcondition2 = Validadia and Sell_Forte2 and Batemeta

strategy.entry("Vender", strategy.short, tamanhodolote, when=Shortcondition2)
strategy.exit("Fecha Venda", "Vender", profit=gaintotal, loss=lossmaximo)
//if (CruzamentoFechaSellGG)
   // strategy.close(id="Vender")
//if (EscapeFechaSell)
   // strategy.close(id="Comprar")  
//plotchar(CruzamentoFechaSellGG, char="Y", location=location.top, color=color.lime, transp=0) 

//plotchar(longcondition2, char="S", location=location.bottom, color=color.lime, transp=0)
//alertcondition(longcondition2, "Vender", "Venda Rápida!")

//fim do codigo

Mais.