Neo traderBot

Neo traderBot

Você sabia?

Um backtesting adequado deve buscar simular situações práticas do mercado (slippage, custo de operação, etc...)

leaf leftleaf right
Notifications
Clear all

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

4 Posts
2 Usuários
0 Reactions
294 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