Como colocar o STOP em contagem de candle?

 

Olá,

Gostaria de por o STOP no tempo, poderia ser feito pela contagem de candles, poderiam me ajudar?

Sou iniciante, então caso vejam coisas abisurdas, peço paciência, vou acertando pouco a pouco, o objetivo é por o Take Profit na máxima dos ultimos 2 candles e/ou o Stop em um paramentro.


//+------------------------------------------------------------------+
//|                                                Primeiro Robo.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Includes
//+------------------------------------------------------------------+
#include <trade/trade.mqh>

//+------------------------------------------------------------------+
//| Inputs  |
//+------------------------------------------------------------------+

   input int lote = 100;
   CTrade trade ;
    
//+------------------------------------------------------------------+
//| Funções                                 |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  if(isNewBar())
  {
   // Tratamento dos dados
   double MaxPrice = iHigh(_Symbol,PERIOD_CURRENT,2);
   double MinPrice = iLow (_Symbol, PERIOD_CURRENT,2);
   bool sinalcompra = false;
   bool comprado = false;
      
      if(MinPrice<iLow(_Symbol,PERIOD_CURRENT,2))
        {
         sinalcompra = true ;
        }   
      if(PositionSelect(_Symbol))
        {
         //--- se a posição for comprada
         if( PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY )
           {
            comprado = true;
           }
        }
      //+------------------------------------------------------------------+
      //| LÓGICA DE ROTEAMENTO                                             |
      //+------------------------------------------------------------------+          
       if( !comprado )
        {
         //--- sinal de compra
         if( sinalcompra )
           {
            trade.Buy(lote,_Symbol,0,0,0,"Compra a mercado");       
           }
        }     
     }
  }
//+------------------------------------------------------------------


bool isNewBar()  // Função que faz o robo calcular apenas uma vez por candle
  {
//--- memorize the time of opening of the last bar in the static variable
   static datetime last_time=0;
//--- current time
   datetime lastbar_time=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);

//--- if it is the first call of the function
   if(last_time==0)
     {
      //--- set the time and exit
      last_time=lastbar_time;
      return(false);
     }

//--- if the time differs
   if(last_time!=lastbar_time)
     {
      //--- memorize the time and return true
      last_time=lastbar_time;
      return(true);
     }
//--- if we passed to this line, then the bar is not new; return false
   return(false);
}

 

e o que não esta acontecendo ?

vc ja conseguiu pegar o valor das 2 velas anteriores?

se sim, é só colocar no trade.Buy e preencher onde é stop loss..no seu está tudo zerado

 

. . . E se quiser incluir a opção de encerrar (stop) por tempo e pela contagem de candles, acho que o código abaixo pode ajudar:

input int inpBarsClose = 12;   // Bars To Close Positions (0 = Off)

// . . .

ulong MAGICNUM = 123;

// . . .

ulong TICKET;
int   Cnt;

//--- Checks positions
for(Cnt = PositionsTotal() - 1; Cnt >= 0; Cnt--)
  {
   TICKET = PositionGetTicket(Cnt);
   if(TICKET > 0)
     {
      if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == MAGICNUM)
        {
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
           {
            //--- Checks if close positions
            if(inpBarsClose > 0 && inpBarsClose <= (iTime(_Symbol, PERIOD_CURRENT, 0) - PositionGetInteger(POSITION_TIME)) / PeriodSeconds(PERIOD_CURRENT))
              {
               //--- encerra posição compra
              }
           }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
           {
            //--- Checks if close positions
            if(inpBarsClose > 0 && inpBarsClose <= (iTime(_Symbol, PERIOD_CURRENT, 0) - PositionGetInteger(POSITION_TIME)) / PeriodSeconds(PERIOD_CURRENT))
              {
               //--- encerra posição venda
              }
           }
        }
     }
  }
 
No seu código você define que: 
   double MinPrice = iLow (_Symbol, PERIOD_CURRENT,2);


E na sequência testa a condição:

if(MinPrice<iLow(_Symbol,PERIOD_CURRENT,2))


A condição acima nunca vai ocorrer. É o mesmo que testar:

if(MinPrice < MinPrice)
 
Daria ao inves de fazer o calculo das barras na mao usar a funcao iBarShift. Mas dai vai do gosto.
 
Vinicius de Oliveira:

. . . E se quiser incluir a opção de encerrar (stop) por tempo e pela contagem de candles, acho que o código abaixo pode ajudar:


. . . Se quiser usar iBarShift(), no exemplo acima, onde tem:

            //--- Checks if close positions
            if(inpBarsClose > 0 && inpBarsClose <= (iTime(_Symbol, PERIOD_CURRENT, 0) - PositionGetInteger(POSITION_TIME)) / PeriodSeconds(PERIOD_CURRENT))


. . . Substituir por:

            //--- Checks if close positions
            if(inpBarsClose > 0 && inpBarsClose <= iBarShift(_Symbol, PERIOD_CURRENT, PositionGetInteger(POSITION_TIME), false))


A diferença entre os dois modos surge no caso de paralisação do mercado: no primeiro, o tempo decorrido desde a abertura continua sendo considerado para o encerramento da posição; no segundo, é considerado somente o número de barras desde a abertura da posição.

 
Vinicius de Oliveira:


. . . Se quiser usar iBarShift(), no exemplo acima, onde tem:


. . . Substituir por:


A diferença entre os dois modos surge no caso de paralisação do mercado: no primeiro, o tempo decorrido desde a abertura continua sendo considerado para o encerramento da posição; no segundo, é considerado somente o número de barras desde a abertura da posição.

Cara, agradeço muito, me deu um norte excelente, agradeço sua interação.
 
Eduardo Putka:
Cara, agradeço muito, me deu um norte excelente, agradeço sua interação.

Beleza! Bom estudo!