Neo traderBot

Neo traderBot

Você sabia?

A NeoTraderBot é a primeira comunidade aberta no Brasil com foco em compartilhar informações sobre automatização de estratégias

leaf leftleaf right
Notifications
Clear all

Inversão de mão em um Snippet já disponibilizado

4 Posts
2 Usuários
0 Reactions
187 Visualizações
(@eafonsopereira)
Membro eminente
Registrou: 2 anos atrás
Posts: 12
Iniciador do tópico  

Pessoal, boa tarde.

Estou com uma dúvida: peguei um snippet e gostaria de saber como colocar uma inversão de mão caso a condição ocorra, mas não estou conseguindo. Fiz abaixo como exemplo: fechamento maior que a media de 80 (compra) o inverso é a venda. Entretanto, como esse código possui um stop fixo, como ficaria a parte "ReversePosition" e em qual parte do código?

A ideia é inverter a mão caso a condição ocorra e ainda não chegou no alvo de gain ou stop...

obrigado...

const
 //Relação risco/ganho de 3:1
 cStopEmTicks = 40;
 cAlvoEmTicks = 150;
 cStopOffsetEmTicks = 50;

input
  bGestaoDeRiscoPelaEstrategia(true);
  bModuloAutomacao(false);
  iHorarioInicioAberturaPosicao(0905);
  iHorarioFimAberturaPosicao(1630);
  iHorarioEncerramentoDaytrade(1645);

var
  vCompra, vVenda: boolean;
  bSinalCompra, bSinalVenda, bPosicionado: boolean;
  fPrecoStop, fPrecoAlvo, fPrecoStopOffset: float;
  bConfigurouRisco: boolean;

begin

  bSinalCompra := false;
  bSinalVenda := false;
  bPosicionado := hasPosition;

  if Not bPosicionado
  and (Time >= iHorarioInicioAberturaPosicao)
  and (Time <= iHorarioFimAberturaPosicao)
  then

  begin
  /////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////
    
    vCompra := Fechamento > media(80,close);
    vVenda := Fechamento < media(80,close);
    if vCompra and vVenda[1] then bSinalCompra := true;
    if vVenda and vCompra[1] then bSinalVenda := true;

  end;
  /////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////

  //Gera ordem de compra a mercado quando há um Sinal de COMPRA
  //e define ordem stoploss e take profit
  if bSinalCompra then BuyAtMarket;

  //Gera ordem de venda a mercado quando há um Sinal de VENDA
  //e define ordem stoploss e take profit
  if bSinalVenda then SellShortAtMarket;

  if bGestaoDeRiscoPelaEstrategia then
  begin
    //POSIÇÃO COMPRADA
    //Código responsável pela manutenção das ordens de stoploss e take profit     
    if isBought then
    begin
      if not bConfigurouRisco then
      begin
        fPrecoStop := BuyPrice - cStopEmTicks*MinPriceIncrement;
        fPrecoAlvo := BuyPrice + cAlvoEmTicks*MinPriceIncrement;
        fPrecoStopOffset := fPrecoStop - cStopOffsetEmTicks*MinPriceIncrement;
        bConfigurouRisco := true;
      end;

      if Not bModuloAutomacao then
      begin
        SellToCoverStop(fPrecoStop,fPrecoStopOffset);
        if isBought then SellToCoverLimit(fPrecoAlvo);
      end
      else
      begin
        SellShortStop(fPrecoStop,fPrecoStopOffset);
        if isBought then SellShortLimit(fPrecoAlvo);  
      end;
    end;

    //POSIÇÃO VENDIDA
    //Código responsável pela manutenção das ordens de stoploss e take profit
    if isSold then
    begin
      if not bConfigurouRisco then
      begin
        fPrecoStop := SellPrice + cStopEmTicks*MinPriceIncrement;
        fPrecoAlvo := SellPrice - cAlvoEmTicks*MinPriceIncrement;
        fPrecoStopOffset := fPrecoStop + cStopOffsetEmTicks*MinPriceIncrement;
        bConfigurouRisco := true;
      end;

      if Not bModuloAutomacao then
      begin
        BuyToCoverStop(fPrecoStop,fPrecoStopOffset);
        if isSold then BuyToCoverLimit(fPrecoAlvo);
      end
      else
      begin
        BuyStop(fPrecoStop,fPrecoStopOffset);
        if isSold then BuyLimit(fPrecoAlvo);
      end;
    end;

    //Encerra posicao
    if (Time >= iHorarioEncerramentoDaytrade)
    and HasPosition
    then ClosePosition;

    if Not HasPosition then bConfigurouRisco := false;

  end;


  // Plot de Stop e Alvo para inspeção visual do código
  bPosicionado := hasPosition;
  if bPosicionado or bPosicionado[1] or bPosicionado[2] then
  begin
    //PlotN(1,fPrecoStop);
    //PlotN(2,fPrecoStopOffset);
    //PlotN(3,fPrecoAlvo);
    SetPlotColor(1,clRed);
    SetPlotColor(2,clRed);
    SetPlotColor(3,clGreen);
    SetPlotStyle(1,psDash);
    SetPlotStyle(2,psDash);
    SetPlotStyle(3,psDash);
    SetPlotWidth(1,2);
    SetPlotWidth(2,2);
    SetPlotWidth(3,2);

end;


end;

   
Citar
Credson
(@m4tr1xbr)
Membro Moderator
Registrou: 2 anos atrás
Posts: 45
 

Você tentou usar a função RevesePosition:

Função ReversePosition

Descrição:
A função ReversePosition tem como funcionalidade realizar o envio de ordens, a fim de inversão da
posição. Esta função cancela todas ordens enviadas até o momento de sua chamada, no fluxo atual de
execução, e as ordens abertas. Após confirmação do cancelamento das ordens, será enviada uma
ordem para reverter a posição.
Sintaxe:

if (Low < Low[1]) and (IsBought = True) then
ReversePosition;

No exemplo, caso a mínima do candle atual for menor a do candle anterior, e exista uma posição de
compra, será realizada a reversão


   
ReplyCitar
(@eafonsopereira)
Membro eminente
Registrou: 2 anos atrás
Posts: 12
Iniciador do tópico  

@m4tr1xbr 

Montei esse código, mas infelizmente algumas reversões ele zera no lugar de reverter a mão. Tentei limpar o máximo possível para não dar errado, mas não consegui. É só um padrão de código para eu colocar as estratégias dentro.

Fiz com DIPDIM para ter uma ideia. Em anexo a foto do problema encontrado.

 

Const
  cAlvoEmPontos       = 200;
  cStopEmPontos       = 200;
  cStopOffsetEmPontos = 10;
input
  iHorarioInicioAberturaPosicao(0900);
  iHorarioFimAberturaPosicao(1640);
  iHorarioEncerramentoDaytrade(1700);
Var
  vSinalCompra,vSinalVenda,vPosicionado    : boolean;
  fPrecoStop,fPrecoAlvo,fPrecoStopOffset   : float;
  bConfigurouRiscoInicial                  : boolean;
  bReversao                                : boolean;
  iIndicadoresCompra,iIndicadoresVenda     : integer;
  bCompra, bVenda, bPosicionado            : boolean;
  
  begin
  vSinalCompra := false;
  vSinalVenda := false;
  vPosicionado := hasPosition;
  /////DEFINIÇÕES DOS SINAIS DE VENDA E COMPRA
  If (Time >= iHorarioInicioAberturaPosicao) And (Time <= iHorarioFimAberturaPosicao) Then
    Begin
      iIndicadoresCompra := 0;
      iIndicadoresVenda := 0;
    End;
  //INSERIR LÓGICA
  //INDICADORES
  If DIPDIM(9)|0| > DIPDIM(9)|1| then    iIndicadoresCompra := iIndicadoresCompra + 1;
  If DIPDIM(9)|0| < DIPDIM(9)|1| then    iIndicadoresVenda := iIndicadoresVenda + 1;

  vSinalCompra := iIndicadoresCompra > iIndicadoresVenda;
  vSinalVenda := iIndicadoresVenda > iIndicadoresCompra;
  
  bCompra:= vSinalCompra and vSinalVenda[1];
  bVenda:= vSinalVenda and vSinalCompra[1];


  If bCompra then
    begin
      If IsSold then ReversePosition
      else if not IsBought then BuyAtMarket;
    end;

  If bVenda then
    begin
      If IsBought then ReversePosition
      else if not IsSold then SellShortAtMarket;
    end;
   

//
  If isBought Then
    Begin
      fPrecoStop := BuyPrice - cStopEmPontos;
      fPrecoAlvo := BuyPrice + cAlvoEmPontos;
      fPrecoStopOffset := fPrecoStop - cStopOffsetEmPontos;
      SellToCoverLimit(fPrecoAlvo);
      SellToCoverStop(fPrecoStop,fPrecoStopOffset);
    End;
  If isSold Then
    Begin
      fPrecoStop := SellPrice + cStopEmPontos;
      fPrecoAlvo := SellPrice - cAlvoEmPontos;
      fPrecoStopOffset := fPrecoStop + cStopOffsetEmPontos;
      BuyToCoverLimit(fPrecoAlvo);
      BuyToCoverStop(fPrecoStop,fPrecoStopOffset);
    End;

  If vSinalCompra then Paintbar(clLime);
  If vSinalVenda then Paintbar(clRed);


  /////ENCERRAMENTO POR HORÁRIO
  If (Time >= iHorarioEncerramentoDaytrade) And HasPosition Then
    Begin
      ClosePosition;
    End;

end;

   
ReplyCitar
(@eafonsopereira)
Membro eminente
Registrou: 2 anos atrás
Posts: 12
Iniciador do tópico  

Pessoal, consegui chegar num código pra resolver a questão.

Infelizmente, se colocar alvo, o Bacteste da Nelogica da pau e cancela as operações. Vou abrir outro tópico para combinar o ReversePosition com a possibilidade de alvos.

abs

/////////////////////////////////////////////////////////////////////////////////////////////////////
//  PARÂMETROS                                                                                     //
/////////////////////////////////////////////////////////////////////////////////////////////////////

input
  {Perdas e Ganhos}
  iObjetivoGanhoDiario            (500);
  iLimitePerdaDiaria              (500);

  {Horário de Operação}
  iHorarioInicioAberturaPosicao   (0905);
  iHorarioFimAberturaPosicao      (1640);
  iHorarioEncerramentoDaytrade    (1700);
  
  {Booleano que determina se a estratégias terá os alvos de ganho e/ou perda}
  iAlvos                          (false);
  
  {Alvos das operações se iAlvos = true} 
  iAlvoEmPontos                   (200);
  iStopEmPontos                   (500);
  iStopOffsetEmPontos             (10); 

  {inputs operacionais da estratégia}
  iPeriodo                        (9);

  {Entrada de Parâmetros de Dia de operação}
  OperaSegunda               (true);
  OperaTerca                 (true);
  OperaQuarta                (true);
  OperaQuinta                (true);
  OperaSexta                 (true);


/////////////////////////////////////////////////////////////////////////////////////////////////////
//  VARIÁVEIS                                                                                      //
/////////////////////////////////////////////////////////////////////////////////////////////////////

var
  fResultado                                                                             : float;
  fResultadoDiario                                                                       : float;
  nIndicadoresCompra,nIndicadoresVenda                                                   : integer;
  nIndicadoresCompra2,nIndicadoresVenda2                                                 : integer;
  nIndicadoresCompra3,nIndicadoresVenda3                                                 : integer;
  nIndicadoresCompra4,nIndicadoresVenda4                                                 : integer;
  nIndicadoresCompra5,nIndicadoresVenda5                                                 : integer; 
  nIndicadoresCompraTotal,nIndicadoresVendaTotal                                         : integer;
  fPrecoStop,fPrecoAlvo,fPrecoStopOffset                                                 : float;
  bCompra, bVenda, bPosicionado                                                          : boolean;
  vSinalCompra,vSinalVenda,vPosicionado                                                  : boolean;
  
  DiaDaSemana              : Integer;
  OperaHoje                : Boolean;
  PullBackFinder           : Float;
  BottomFinder             : Float;
  SomaFinder               : Float;
  Habilita                 : Boolean;
  somafindermax,somafindermin : real;



/////////////////////////////////////////////////////////////////////////////////////////////////////
//  INICIO                                                                                         //
/////////////////////////////////////////////////////////////////////////////////////////////////////

begin
  fResultadoDiario := DailyResult(true);

  if (fResultadoDiario >= -1*iLimitePerdaDiaria) and
  (fResultadoDiario <= iObjetivoGanhoDiario) then
  begin
 
  If (Time >= iHorarioInicioAberturaPosicao) And (Time <= iHorarioFimAberturaPosicao) Then
    Begin
      nIndicadoresCompra          := 0;
      nIndicadoresVenda           := 0;
      nIndicadoresCompra2         := 0;
      nIndicadoresVenda2          := 0;
      nIndicadoresCompra3         := 0;
      nIndicadoresVenda3          := 0;
      nIndicadoresCompra4         := 0;
      nIndicadoresVenda4          := 0;
      nIndicadoresCompra5         := 0;
      nIndicadoresVenda5          := 0;
      nIndicadoresCompraTotal     := 0;
      nIndicadoresVendaTotal      := 0;
    End;

         
/////////////////////////////////////////////////////////////////////////////////////////////////////
//  CÁLCULOS INICIAIS                                                                              //
/////////////////////////////////////////////////////////////////////////////////////////////////////


  {Calcula do dia da Semana}
  DiaDaSemana               := DayOfWeek(Date);

  {Verifica se vai operar hoje}
       if (DiaDaSemana = 1) and (OperaSegunda) then     OperaHoje := true
  else if (DiaDaSemana = 2) and (OperaTerca)   then     OperaHoje := true
  else if (DiaDaSemana = 3) and (OperaQuarta)  then     OperaHoje := true
  else if (DiaDaSemana = 4) and (OperaQuinta)  then     OperaHoje := true
  else if (DiaDaSemana = 5) and (OperaSexta)   then     OperaHoje := true 
  else   

  {Verifica o horário limite para a primeira operação} 
  Habilita := (time >= iHorarioInicioAberturaPosicao) and (time <= iHorarioFimAberturaPosicao) and (OperaHoje);
  
  //Contagem de indicadores e determinação de suas posições
  //INDICADOR 
  If Fechamento > hiloactivator(20) then nIndicadoresCompra := nIndicadoresCompra + 1;
  If Fechamento < hiloactivator(20) then nIndicadoresVenda  := nIndicadoresVenda  + 1;  
  
  nIndicadoresCompraTotal:=  nIndicadoresCompra;
  nIndicadoresVendaTotal:=  nIndicadoresVenda;

  
  //Determina os Sinais de Compra e Venda
  vSinalCompra := nIndicadoresCompraTotal > nIndicadoresVendaTotal;
  vSinalVenda := nIndicadoresCompraTotal < nIndicadoresVendaTotal;
  
  
  bCompra:= vSinalCompra and vSinalVenda[1];
  bVenda:= vSinalVenda and vSinalCompra[1];
   

  {COLORAÇÃO DOS CANDLES}
  If bCompra then Paintbar(clLime);
  If bvenda then Paintbar(clRed);


/////////////////////////////////////////////////////////////////////////////////////////////////////
//  EXECUÇÃO DE OPERAÇÕES                                                                          //
/////////////////////////////////////////////////////////////////////////////////////////////////////

  {Execução de Compra - Reversão e Compra}
  If bCompra then
    begin
      If IsSold then ReversePosition
      else if not IsBought then BuyAtMarket;
    end;

  {Execução de Venda - Reversão e Venda}
  If bVenda then
    begin
      If IsBought then ReversePosition
      else if not IsSold then SellShortAtMarket;
    end;
   
  {Determina os Alvos da Operação, caso iAlvos seja verdadeiro}
  If iAlvos = true then
    begin
      If isBought Then
        Begin
          fPrecoStop := BuyPrice - iStopEmPontos;
          fPrecoAlvo := BuyPrice + iAlvoEmPontos;
          fPrecoStopOffset := fPrecoStop - iStopOffsetEmPontos;
          SellToCoverLimit(fPrecoAlvo);
          SellToCoverStop(fPrecoStop,fPrecoStopOffset);
        End;
      If isSold Then
        Begin
          fPrecoStop := SellPrice + iStopEmPontos;
          fPrecoAlvo := SellPrice - iAlvoEmPontos;
          fPrecoStopOffset := fPrecoStop + iStopOffsetEmPontos;
          BuyToCoverLimit(fPrecoAlvo);
          BuyToCoverStop(fPrecoStop,fPrecoStopOffset);
        End;
    end;


/////////////////////////////////////////////////////////////////////////////////////////////////////
//  FIM                                                                                            //
/////////////////////////////////////////////////////////////////////////////////////////////////////

  end

  {Se resultado excedeu objetivo de ganho ou limite de perda e houver posição aberta, então encerra a posição.}
  else if hasPosition then ClosePosition;


end;

   
ReplyCitar