Encerrar posição - página 5

 
Ricardo Rodrigues Lucca #Acredito que não fez errado, o PLOT_SHOW_DATA é pra ocultar dados da janela de dados. [ . . . ]

Você está certo... Na verdade, o que inibe a plotagem no gráfico é:

PlotIndexSetInteger(plot_index, PLOT_DRAW_TYPE, DRAW_NONE);


Ricardo Rodrigues Lucca #: [ . . . ] Se tu quiser ocultar isso num expert que faz uso do indicador, tu so precisa ocultar no testador. Quando o EXPERT é colocado na conta real, os indicadores para aparecerem tem que ser adicionados manualmente com ChartIndicatorAdd.

Eu também sempre entendi dessa forma, mas eu não utilizo indicadores personalizados nos meus EAs. Como o @Na Onda relatou que o dele está plotando ao utilizar iCustom(), propus essa alternativa...

 

boa noite 


agora estou tentando coloca um stop barra a barra estou pegando como referencia um EA criado segue o codigo

//+------------------------------------------------------------------+
//|                                       Projeto_Rompimento_WDO.mq5 |
//|                         Copyright 2021, Julian Rodrigues Valério |
//|                        https://www.instagram.com/julianrvalerio/ |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>

CTrade DayTrade;

input string Inicio = "09:16";
input string Termino = "10:00";
input string Fechamento = "16:00";


   if(PosicaoTotal()==false){
         Reset();
      if(BB2==true && HorarioEntrada()==true && flagStopDiario==false && candleTime!=rates[0].time) {
         BollingerOperacao();
      }
      


   }
//Armazenar data e hora MqlDateTime horario_inicio, horario_termino, horario_fechamento, horario_atual, dia; bool operacao_diaria = false; int contarCandle = 0; int barraOperacao = 0; int OnInit(){       //conversao para mql    TimeToStruct(StringToTime(Inicio), horario_inicio);    TimeToStruct(StringToTime(Termino), horario_termino);    TimeToStruct(StringToTime(Fechamento), horario_fechamento);       if(horario_inicio.hour > horario_termino.hour || (horario_inicio.hour == horario_termino.hour && horario_inicio.min > horario_termino.min)){       printf("Parametros de entrada inválidos!");       return INIT_FAILED;            }      if(horario_termino.hour > horario_fechamento.hour || (horario_termino.hour == horario_fechamento.hour && horario_termino.min > horario_fechamento.min)){       printf("Parametros de entrada inválidos!");       return INIT_FAILED;                }    return INIT_SUCCEEDED;       EventSetTimer(60);       return(INIT_SUCCEEDED);   } //+------------------------------------------------------------------+ //| Expert deinitialization function                                 | //+------------------------------------------------------------------+ void OnDeinit(const int reason)   { //--- destroy timer    EventKillTimer();      } //+------------------------------------------------------------------+ //| Expert tick function                                             | //+------------------------------------------------------------------+ void OnTick(){    //Obter ultimo valor negociado    MqlTick ultimoTick;    SymbolInfoTick(_Symbol,ultimoTick);       if(HorarioFechamento()){       operacao_diaria = false;       contarCandle = 0;       barraOperacao = 0;    }       //    //Contar Candles      MqlRates preco[];    ArraySetAsSeries(preco,true);    CopyRates(_Symbol, PERIOD_M15,0,3,preco);    static datetime ultimaVerificacaoTempo;    datetime tempoCandleCorrente;    tempoCandleCorrente = preco[0].time;    if(tempoCandleCorrente != ultimaVerificacaoTempo){       ultimaVerificacaoTempo = tempoCandleCorrente;       contarCandle++;       //Comment("Candle = "+contarCandle);    }       //Ordem de compra    if(PositionsTotal()==0 && ultimoTick.last > iHigh(_Symbol,PERIOD_M15,1) && HorarioEntrada()== true     && contarCandle > barraOperacao && operacao_diaria==false){       double stopLoss = NormalizarPreco(iLow(_Symbol,PERIOD_M15,1));       DayTrade.Buy(1,_Symbol,ultimoTick.last,stopLoss,ultimoTick.last+30);         operacao_diaria = true;           barraOperacao = contarCandle;    }       //Ordem de Venda    if(PositionsTotal()==0 && ultimoTick.last < iLow(_Symbol,PERIOD_M15,1) && HorarioEntrada()== true    && contarCandle > barraOperacao && operacao_diaria==false){       double stopLoss = NormalizarPreco(iHigh(_Symbol,PERIOD_M15,1));       DayTrade.Sell(1,_Symbol,ultimoTick.last,stopLoss,ultimoTick.last-30);             operacao_diaria = true;       barraOperacao = contarCandle;    }       for (int i = PositionsTotal(); i>=0; i--){//Cataloga todas as operações abertas       if(PositionGetSymbol(i)==_Symbol){//Filtra pelo ativo atual          //Verificar posições Compradas          if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY){//Filtra operações de compra             //Mover stop para a mínima da próxima barra             if(contarCandle > barraOperacao){                double StopLoss = NormalizarPreco(iLow(_Symbol,PERIOD_M15,1));                DayTrade.PositionModify(_Symbol,StopLoss,0);             }          }          //Verificar posições vendidas          if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL){             //Mover Stop para a máxima da próxima barra             if(contarCandle > barraOperacao){                double StopLoss = NormalizarPreco(iHigh(_Symbol,PERIOD_M15,1));                DayTrade.PositionModify(_Symbol,StopLoss,0);             }          }       }          }                } bool HorarioEntrada()       {        TimeToStruct(TimeCurrent(),horario_atual);       if(horario_atual.hour >= horario_inicio.hour && horario_atual.hour <= horario_termino.hour){       // Hora atual igual a de início       if(horario_atual.hour == horario_inicio.hour)          // Se minuto atual maior ou igual ao de início => está no horário de entradas          if(horario_atual.min >= horario_inicio.min)             return true;          // Do contrário não está no horário de entradas          else             return false;              // Hora atual igual a de término       if(horario_atual.hour == horario_termino.hour)          // Se minuto atual menor ou igual ao de término => está no horário de entradas          if(horario_atual.min <= horario_termino.min)             return true;          // Do contrário não está no horário de entradas          else             return false;              // Hora atual maior que a de início e menor que a de término       return true;    }       // Hora fora do horário de entradas    return false; } bool HorarioFechamento(){    TimeToStruct(TimeCurrent(),horario_atual);               // Hora dentro do horário de fechamento    if(horario_atual.hour >= horario_fechamento.hour){       // Hora atual igual a de fechamento       if(horario_atual.hour == horario_fechamento.hour)          // Se minuto atual maior ou igual ao de fechamento => está no horário de fechamento          if(horario_atual.min >= horario_fechamento.min)             return true;          // Do contrário não está no horário de fechamento          else             return false;              // Hora atual maior que a de fechamento       return true;    }       // Hora fora do horário de fechamento    return false; } //Função normalizadora double NormalizarPreco(double preco){    //Pegar o tamanho do tick    double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);       if(tickSize == 0.0){       return (NormalizeDouble(preco,_Digits));    }       return(NormalizeDouble(MathRound(preco/tickSize)*tickSize, _Digits)); }

porem a minha estrutura e totalmente diferente e nao estou conseguindo adaptar

em meu ontick eu chamo a operação pelo void

ai estou perdido onde e como fazer a chamada para mover o stop barra a barra

   if(PosicaoTotal()==false){
         Reset();
      if(BB2==true && HorarioEntrada()==true && flagStopDiario==false && candleTime!=rates[0].time) {
         BollingerOperacao();
      }
      


   }

e meu void 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void BollingerOperacao()
{
   
   CopyBuffer(bb_Handle,2,0,5,BufferBandUP);
   CopyBuffer(bb_Handle,3,0,5,BufferBandDN);
   CopyRates(_Symbol,periodo,0,5,rates);
   

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   for(int i=0;i<levels_values.Size();i++){
      if( rates[0].close>=BufferBandUP[0] && rates[1].close<BufferBandUP[1] && tocarBB==true){//toque venda   
         EntryOperation(rates[0].close,2);
         candleTime = rates[0].time;
         barraOperacao = contarCandle;
         break;
      }
      if(rates[0].close<=BufferBandDN[0] && rates[1].close>BufferBandDN[1] && tocarBB==true){// toque Compra
         EntryOperation(rates[0].close,1);
         candleTime = rates[0].time;
         barraOperacao = contarCandle;
         break;
      }
   }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   
   for(int i=0;i<levels_values.Size();i++){
      if(rates[2].open<BufferBandUP[2] && rates[2].close<BufferBandUP[2] &&  rates[1].close>BufferBandUP[1] && BBrompimento==true){// rompimento Compra
         EntryOperation(rates[0].close,1);
         candleTime = rates[0].time;
         barraOperacao = contarCandle;
         break;
      }
      if(rates[2].open>BufferBandDN[2] && rates[2].close>BufferBandDN[2] && rates[1].close<BufferBandDN[1] && BBrompimento==true){// rompimento venda
         EntryOperation(rates[0].close,2);
         candleTime = rates[0].time;
         barraOperacao = contarCandle;
         break;
      }
   }
   
   
   for(int i=0;i<levels_values.Size();i++){
      if( rates[2].open<BufferBandDN[2] && rates[2].close<BufferBandDN[2] &&  rates[1].close>BufferBandDN[1] && BBrompimentoinverso==true){// rompimento Compra
         EntryOperation(rates[0].close,1);
         candleTime = rates[0].time;
         barraOperacao = contarCandle;
         break;
      }
      
      
      if( rates[2].open>BufferBandUP[2] && rates[2].close>BufferBandUP[2] && rates[1].close<BufferBandUP[1] && BBrompimentoinverso==true){// rompimento venda
         EntryOperation(rates[0].close,2);
         candleTime = rates[0].time;
         barraOperacao = contarCandle;
         break;
      }
      

   }   



   for(int i=0;i<levels_values.Size();i++){
      if( rates[2].open>BufferBandDN[2] && rates[2].close<BufferBandDN[2] &&  rates[1].close>BufferBandDN[1] && BBrompimentoinverso==true){// rompimento Compra
         EntryOperation(rates[0].close,1);
         candleTime = rates[0].time;
         barraOperacao = contarCandle;
         break;
      }
      
      
      
      if( rates[2].open<BufferBandUP[2] && rates[2].close>BufferBandUP[2] && rates[1].close<BufferBandUP[1] && BBrompimentoinverso==true){// rompimento venda
         EntryOperation(rates[0].close,2);
         candleTime = rates[0].time;
         barraOperacao = contarCandle;
         break;
      }

   }   
   
   
   
   
  /* for(int i=0;i<levels_values.Size();i++){
      if(rates[2].open>ExtMapBufferUp[2] && rates[2].open<BufferBandDN[2] && rates[2].close<BufferBandDN[2] &&  rates[1].close>BufferBandDN[1]  && BBrompimentoinversof==true){// rompimento Compra
         EntryOperation(rates[0].close,2);
         candleTime = rates[0].time;
         break;
      }
      if(rates[2].open<ExtMapBufferDown[2] && rates[2].open>BufferBandUP[2] && rates[2].close>BufferBandUP[2] && rates[1].close<BufferBandUP[1] && BBrompimentoinversof==true){// rompimento venda
         EntryOperation(rates[0].close,1);
         candleTime = rates[0].time;
         break;
      }
   }   */
   
   for(int i=0;i<levels_values.Size();i++){
      if( rates[2].open>BufferBandDN[2] && rates[2].close<BufferBandDN[2] &&  rates[1].close>BufferBandDN[1] && BBrompimentoinversof==true){// rompimento Compra
        
         EntryOperation(rates[0].close,2);
         candleTime = rates[0].time;
         barraOperacao = contarCandle;
         break;
      }
      if( rates[2].open<BufferBandUP[2] && rates[2].close>BufferBandUP[2] && rates[1].close<BufferBandUP[1] && BBrompimentoinversof==true){// rompimento venda
         EntryOperation(rates[0].close,1);
         candleTime = rates[0].time;
         barraOperacao = contarCandle;
         break;
      }
   }   
   
   
}
//==========================================================================================================

e o void de entrar na operação

//===========================================================================================================
void EntryOperation(double lastValue, int flag) {
   double tp = 0;
   double sl = 0;

   if(operation<=1 && flag==1) { //Buy
      if(takeProfit>0) tp = takeProfit + lastValue;
      if(stopLoss>0) sl = lastValue - stopLoss;
      trade.Buy(multiplicador*lote,NULL,lastValue,sl,tp,NULL);
      entryValue = lastValue;
      flagBuySell = 1;
      tps = tp;
      sls = sl;
   }
   if(operation>=1 && flag==2) { //Sell
      if(takeProfit>0) tp = lastValue - takeProfit;
      if(stopLoss>0) sl = lastValue + stopLoss;
      trade.Sell(multiplicador*lote,NULL,lastValue,sl,tp,NULL);
      entryValue = lastValue;
      flagBuySell = 2;
      tps = tp;
      sls = sl;      
   }
}
//=============================================================================  

tentei algumas formas mas sem sucesso, se puderem me auxiliar em mais essa ^^

ou me dar um norte, 

eu tentei coloca direto em ontick mais nao funcionou

ai coloquei no void tbm não, qual seria a forma correta para colocar 

 
Na Onda #boa noite agora estou tentando coloca um stop barra a barra estou pegando como referencia um EA criado segue o codigo porem a minha estrutura e totalmente diferente e nao estou conseguindo adaptar em meu ontick eu chamo a operação pelo void ai estou perdido onde e como fazer a chamada para mover o stop barra a barra e meu void e o void de entrar na operação tentei algumas formas mas sem sucesso, se puderem me auxiliar em mais essa ^^ ou me dar um norte, eu tentei coloca direto em ontick mais nao funcionou ai coloquei no void tbm não, qual seria a forma correta para colocar 

Sugestão: renomear a função CloseAllPositions() que lhe enviei no comentário #28 e utilizar aquele loop para toda a parte de gerenciamento de posições, como no modelo abaixo:

//+--------------------------------------------------------------------------------------------------------------------+
//| Manage positions                                                                                                   |
//+--------------------------------------------------------------------------------------------------------------------+
bool ManagePositions()
  {
//--- Local variables
   ulong  TICKET;
   double Trail;
   int    Cnt;

//--- Checks positions
   for(Cnt = PositionsTotal() - 1; Cnt >= 0; Cnt --)
     {
      //--- Gets the ticket and selects the position
      TICKET = PositionGetTicket(Cnt);
      if(TICKET == 0)
        {
         Print("Failed to get position ticket...");
         return(false);
        }
      //--- Checks symbol | magic number
      if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == TF0_MAGIC)
        {
         //--- Checks POSITION_TYPE_BUY
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
           {
            //--- Checks if closes position
            if(/* incluir verificações para encerramento de posições */)
              {
               if(Check_SL_TP(POSITION_TYPE_BUY, PositionGetDouble(POSITION_SL), PositionGetDouble(POSITION_TP)))
                 {
                  if(!m_trade.PositionClose(TICKET))
                    {
                     Print(m_trade.ResultRetcode(), " ", m_trade.ResultRetcodeDescription());
                     return(false);
                    }
                 }
              }
            else
              {
               //--- Checks trailing stop loss
               Trail = NormalizePrice(rates[1].low);
               if(Trail > PositionGetDouble(POSITION_SL))
                 {
                  if(Check_SL_TP(POSITION_TYPE_BUY, Trail, PositionGetDouble(POSITION_TP)))
                    {
                     if(!m_trade.PositionModify(TICKET, Trail, PositionGetDouble(POSITION_TP)))
                       {
                        Print(m_trade.ResultRetcode(), " ", m_trade.ResultRetcodeDescription());
                        return(false);
                       }
                    }
                 }
              }
           }
         //--- POSITION_TYPE_SELL
         else
           {
            //--- Checks if closes position
            if(/* incluir verificações para encerramento de posições */)
              {
               if(Check_SL_TP(POSITION_TYPE_SELL, PositionGetDouble(POSITION_SL), PositionGetDouble(POSITION_TP)))
                 {
                  if(!m_trade.PositionClose(TICKET))
                    {
                     Print(m_trade.ResultRetcode(), " ", m_trade.ResultRetcodeDescription());
                     return(false);
                    }
                 }
              }
            else
              {
               //--- Checks trailing stop loss
               Trail = NormalizePrice(rates[1].high);
               if(Trail < PositionGetDouble(POSITION_SL) || PositionGetDouble(POSITION_SL) == 0.0)
                 {
                  if(Check_SL_TP(POSITION_TYPE_SELL, Trail, PositionGetDouble(POSITION_TP)))
                    {
                     if(!m_trade.PositionModify(TICKET, Trail, PositionGetDouble(POSITION_TP)))
                       {
                        Print(m_trade.ResultRetcode(), " ", m_trade.ResultRetcodeDescription());
                        return(false);
                       }
                    }
                 }
              }
           }
        }
     }

//--- Successful management
   return(true);
  }
 
Vinicius de Oliveira #:

Sugestão: renomear a função CloseAllPositions() que lhe enviei no comentário #28 e utilizar aquele loop para toda a parte de gerenciamento de posições, como no modelo abaixo:

Muito obrigado, custei um pouco entender kkkk mais entende kkkk


 
Uma dúvida 
Como eu faria para ele opera uma determinada estratégia somente um ou 2 vezes, sempre após o rompimento de um buffer(linha)

Ex rompeu a linha pra baixo, após 3 candles habilitar operação, ai ele opera 2 ou 3 vezez se ocorrer condições, e quando voltar a romper pra cima a msm coisa

Se puderem me dá um norte 
 
Vinicius de Oliveira #:

Sugestão: renomear a função CloseAllPositions() que lhe enviei no comentário #28 e utilizar aquele loop para toda a parte de gerenciamento de posições, como no modelo abaixo:

na verdade ainda nao consegui kkk, oq eu quero e mover o stoploss ou breackeven para o fundo da barra anterior, nao quero fechar ja a operaçao, e todas as maneira que faço aqui ele ja fecha na msm barra que abre operaçao

 
Na Onda #na verdade ainda nao consegui kkk, oq eu quero e mover o stoploss ou breackeven para o fundo da barra anterior, nao quero fechar ja a operaçao, e todas as maneira que faço aqui ele ja fecha na msm barra que abre operaçao

Boa noite, o SL está sendo movido pros extremos da barra anterior, então muitas vezes a operação será fechada na barra em que foi aberta mesmo... Outra coisa: com esse novo gerenciamento do SL, aquela condição, incluída anteriormente, para encerramento de posições, perdeu o sentido, né?...

 
Vinicius de Oliveira #:

Boa noite, o SL está sendo movido pros extremos da barra anterior, então muitas vezes a operação será fechada na barra em que foi aberta mesmo... Outra coisa: com esse novo gerenciamento do SL, aquela condição, incluída anteriormente, para encerramento de posições, perdeu o sentido, né?...

Sim rsrs, mas acho que está tanto conflito, me explica uma coisa eu só preciso chamar esse novo void direto na operacao correto? E nesse managenposition eu coloco a condição do encerramento né

Só pra saber se estou fazendo corretamente
 
Na Onda #Sim rsrs, mas acho que está tanto conflito, me explica uma coisa eu só preciso chamar esse novo void direto na operacao correto? . . .

Qual novo void?

 
Na Onda #: [ . . . ] E nesse managenposition eu coloco a condição do encerramento né Só pra saber se estou fazendo corretamente

Exato.