Como impedir que seja feita operações no mesmo Candle de entrada /TP /STP? - página 2

 
//---Variaveis Globais
bool Operamos_Nesta_Vela=false;
string TIME_Abertura_Ultimo_Candle;
string Hora_Ultimo_Negocio;
void OnTick()
  {
//+------------------------------------------------------------------+
//|Checagem se ja abrimos uma ordem no caldle atual                  |
//+------------------------------------------------------------------+   
    TIME_Abertura_Ultimo_Candle=TimeToString((SeriesInfoInteger(Symbol_Operar,PERIODO_PARA_OPERACOES,SERIES_LASTBAR_DATE)),TIME_SECONDS);
   
      //---se tempo de abertura da ultima ordem  for MENOR que o tempo de abertura da ultima barra 
       if(Hora_Ultimo_Negocio < TIME_Abertura_Ultimo_Candle)
         {
         //---resetamos a variavel
         Operamos_Nesta_Vela=false;
         }
         //---se tempo de abertura da ultima ordem NAO for MENOR que o tempo de abertura da ultima barra 
        if(Hora_Ultimo_Negocio > TIME_Abertura_Ultimo_Candle)
         {
         //---entao ele continua sendo true e impedindo outra abertura de ordem na barra atual
         Operamos_Nesta_Vela=true;
         }
   if(Setup_De_ Compra && Operamos_Nesta_Vela==false )
    {
    // ENVIAMOS A COMPRA AQUI >>>
   
   //---ARMAZENAMOS O TEMPO DE abertura da ordem na variavel
     Hora_Ultimo_Negocio=TimeToString(TimeCurrent(),TIME_SECONDS);
    
     //---Definimos nesta variavel que ja executamos uma ordem nesta vela
     Operamos_Nesta_Vela=true; 
    }
    
  if(Setup_De_ Venda && Operamos_Nesta_Vela==false )
    {
    // ENVIAMOS A VENDA AQUI >>>
   
   //---ARMAZENAMOS O TEMPO DE abertura da ordem na variavel
     Hora_Ultimo_Negocio=TimeToString(TimeCurrent(),TIME_SECONDS);
    
     //---Definimos nesta variavel que ja executamos uma ordem nesta vela
     Operamos_Nesta_Vela=true; 
    }
  }

Esse codigo resolve o problema

 

Eita que emoção! primeira vez que vou ajudar em algo mesmo que tardio, pois as poucas vezes que postei foi pedindo algo... rsrsrs

Vamos lá André, eu tava com o mesmo problema e fiz uma solução super-simples que não sei se é a mais "bonita", mas que ficou funcional ficou.

Meu GAIN está em 30 pontos, então o que fiz:  Comparei se o tamanho da "esticada" do candle atual é maior que 30. Se for maior que 30 significa que eu já realizei nesse candle então não quero entrar mais no candle atual.

O código ficou assim...


//Aqui pego as últimas 3 barras:

 MqlRates rates[];

   ArraySetAsSeries(rates,true);

   int copied=CopyRates(_Symbol,_Period,0,3,rates);


//Aqui defini as Variáveis:

int vb3hight=0;

int vb3low=0;

int vb3esticada=0;

 

//Aqui faço o cálculo para obter o tamanho do candle:

 vb3hight=rates[0].high;

    vb3low=rates[0].low;

    vb3esticada=vb3hight-vb3low;

 

Aqui é meu IF que diz se devo entrar ou não numa nova COMPRA... respectivamente fiz o mesmo para VENDA...

//SINAL DE COMPRA

    if(vb3esticada<=30)

      return 1;

else

    return 0;


e claro... por fim executo a compra ou venda apenas se "return  == 1;


Mesmo um pouco atrasado, espero que no meu humilde e pequeno conhecimento eu tenha ajudado em algo :) :) :)

 

Declara uma variavel do tipo global


datetime HoraCdePosicao;



No ontick

//Se tiver posição aberta atribui o horario do candle corrente a variavel global e sai da função
if(m_position.SelectByMagic(Symbol(), Inpt_number_magic)){
  HoraCdePosicao = rates[0].time;
  return;
}

//se não tiver posição aberta testa se o horario do candle atual é diferente do ultimo horario da variavel que foi atribuido quando havia posição aberta
if(HoraCdePosicao != rates[0].time){
    
  //aqui faz as outras testes de consições que você desejar e faz as entradas na operação

}


 Simples assim, dessa forma não será permitido entrar em uma operação no mesmo candle que esteve posicionado anteriormente, aguardando assim os proximos candles para entrar com as operações.
 

Olá,  Estou no meu primeiro EA e ao colocar na DEMO hoje, ele fez várias operaçoes no mesmo candle com loss. Podem me ajudar a corrigir. Peguei o programa do colega aí em cima e não deu certo.


      
         //---Variaveis Globais
bool POSSOOPERAR =false;
string TIME_Abertura_Ultimo_Candle;
string Hora_Ultimo_Negocio;


//+------------------------------------------------------------------+
//|Checagem se ja abrimos uma ordem no caldle atual                  |
//+------------------------------------------------------------------+   
   
  { 
    TIME_Abertura_Ultimo_Candle=TimeToString((SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE)),TIME_SECONDS);
   
      //---se tempo de abertura da ultima ordem  for MENOR que o tempo de abertura da ultima barra 
       if(Hora_Ultimo_Negocio < TIME_Abertura_Ultimo_Candle)
         {
         //---resetamos a variavel
         POSSOOPERAR=false;
         }
         //---se tempo de abertura da ultima ordem NAO for MENOR que o tempo de abertura da ultima barra 
        if(Hora_Ultimo_Negocio > TIME_Abertura_Ultimo_Candle)
         {
         //---entao ele continua sendo true e impedindo outra abertura de ordem na barra atual
         POSSOOPERAR=true;
         }
    }
             
     
     
     
      // execute a operacao do robô
     
      //+------------------------------------------------------------------+
      //|  OBTENCAO DE DADOS                                               |
      //+------------------------------------------------------------------+
      int copied1 = CopyBuffer(emahandle,0,0,3,stoch);
      int copied2 = CopyBuffer(rsihandle,0,0,3,rsi);
   
      //---
      
     {
     
      //---
      bool sinalCompra = false;
      bool sinalVenda = false;
      //--- se os dados tiverem sido copiados corretamente
      if(copied1==3 && copied2==3)
        {
         //--- sinal de compra
         if( rsi[0] < 10 && ask > ema[0])
           {
            sinalCompra = true;
           }
           
           //---ARMAZENAMOS O TEMPO DE abertura da ordem na variavel
              Hora_Ultimo_Negocio=TimeToString(TimeCurrent(),TIME_SECONDS);
    
            //---Definimos nesta variavel que ja executamos uma ordem nesta vela
               POSSOOPERAR=true; 
           
           
           
         //--- sinal de venda
           if( rsi[0] > 90  && bid<ema[0] )
           {
           sinalVenda = true;
           }
        }
       
      //+------------------------------------------------------------------+
      //| VERIFICAR SE ESTOU POSICIONADO                                   |
      //+------------------------------------------------------------------+
      bool comprado = false;
      bool vendido = false;
      if(PositionSelect(_Symbol))
        { 
          //--- se a posicao for comprada
          if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY )
            {
             comprado = true;
            }
           //--- se a posicao for vendida
           if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL )
             {
              vendido = true;
             }
          
         }
     
      //+------------------------------------------------------------------+
      //| LOGICA DE ROTEAMENTO                                             |
      //+------------------------------------------------------------------+
      //--- zerado
      ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
      bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);   
      
      if( !comprado && !vendido && HoraNegociacao() && !POSSOOPERAR )
        {
         //--- sinal de compra
         if( sinalCompra  )
          {
            double SL = ask -L;
            double TP = ask +G;
           trade.Buy(LOTE,_Symbol,0,SL, TP ,"Compra a mercado");
           
            
          }
        
       
         //--- sinal de venda
          //if( sinalVenda  )
          //{
            //double SL = bid +L;
            //double TP = bid -G;
           //trade.Sell(LOTE,_Symbol,0 , SL, TP,"Venda a mercado");
          //}
        }
        
     }  
    
  }
Porque a Hospedagem Virtual no MetaTrader 4 e no MetaTrader 5 são Melhores que os VPS Usuais
Porque a Hospedagem Virtual no MetaTrader 4 e no MetaTrader 5 são Melhores que os VPS Usuais
  • www.mql5.com
A rede de hospedagem virtual em nuvem foi desenvolvida especialmente para o MetaTrader 4 e o MetaTrader 5, possuindo todas as vantagens de uma solução nativa. Obtenha os benefícios de nossa oferta gratuita por 24 horas - teste um servidor virtual agora mesmo.
 

@genesiotrader!

ola tudo bem ?

alguem pode me ajudar, não consigo fazer meu EA parar de dar mais que 1 entrada no mesmo candle...

Grato!

 
genesiotrader:

@genesiotrader!

ola tudo bem ?

alguem pode me ajudar, não consigo fazer meu EA parar de dar mais que 1 entrada no mesmo candle...

Grato!

existem várias formas de fazer, isso vai depender de como seu robo opera, se ele só der uma entrada e mais nada então eu olharia o positionstotal, se existir posições abertas daquele robo e naquele papel, então não deixaria fazer mais entradas

 
genesiotrader:

@genesiotrader!

ola tudo bem ?

alguem pode me ajudar, não consigo fazer meu EA parar de dar mais que 1 entrada no mesmo candle...

Grato!

Dá uma olhada nesse EA que fiz, pois tem uma implementação bem simples sobre abertura de novos candles

Expert RSI
Expert RSI
  • www.mql5.com
Robô que utiliza o indicador RSI com entradas parciais e saídas parciais de acordo com a força estabelecida. v1.0.1 - Aprimoramentos sobre o uso de lotes para rodar em múltiplos mercados e papeis - Parametrização dos valores de RSI para saída parcial e final
Razão: