Loop "while" para verificação de ordens.

GiulioC  

Prezados, boa tarde!

Estou com um problema no meu EA.

O loop que verifica o sinal e envia a ordem estava ocorrendo mais rápido que a própria execução da ordem a mercado e em algumas situações a ordem era enviada novamente, ficando duplicada.

Para corrigir isso fiz um loop while que vai ficar "preso" enquanto a ordem não for executada.

trade.Buy(lote,_Symbol); //Ordem a mercado
while (tipo_posicao != "comprado") {
         posicao();
      }

Esse loop vai entrar na função posicao() que verifica se está comprado ou vendido e seta a variável tipo_posicao. Se estiver posicionado, a ordem foi enviada corretamente e ele vai sair do while.

Isso resolveu o meu problema. Tanto na conta real como na simulação, o EA está enviando apenas uma ordem.

Minha dúvida é a seguinte: e se a ordem for rejeita, por exemplo? O EA vai ficar preso no while. Eu tentei algumas soluções para sair do while mas não deram certo. 

Alguém poderia me sugerir uma implementação que funcione nesta situação?

Obrigado desde já.

Vinicius de Oliveira  

Olá, boa tarde!!


Acredito que algum dos exemplos abaixo pode lhe trazer alguma luz com a sua dúvida...


O primeiro exemplo verifica se já existe posição aberta antes de enviar nova ordem:

//--- Local variables
   int   Cnt, pos_nr = 0;
   ulong TICKET;

//--- 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;
        }
      if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == MAGIC)
        {
         //--- Increase the positions number
         pos_nr ++;
         break;
        }
     }


// . . .


//--- Open position - Buy
   if(pos_nr == 0)
     {
      if(!m_trade.Buy(Lot, _Symbol, ASK, SL, TP, COMMENT))
        {
         Print(m_trade.ResultRetcode(), " ", m_trade.ResultRetcodeDescription());
         return;
        }
     }


// . . .


//--- Open position - Sell
   if(pos_nr == 0)
     {
      if(!m_trade.Sell(Lot, _Symbol, BID, SL, TP, COMMENT))
        {
         Print(m_trade.ResultRetcode(), " ", m_trade.ResultRetcodeDescription());
         return;
        }
     }
  }



Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Como garantir que o EA não fará mais de uma operação no mesmo Candle operando no M1

Vinicius de Oliveira, 2022.09.28 22:58


Boa tarde!!


Pra esse caso em que o sinal pode ocorrer a qualquer momento (e não apenas na abertura de nova barra), uma forma bem simples de saber se já foi aberta posição na barra atual seria armazenando iTime(0) sempre que uma posição for aberta, e verificando essa informação antes de abrir nova posição...

//--- Global
   datetime open_time = 0;

   . . .

//--- Open position
   if(open_time != iTime(_Symbol, PERIOD_CURRENT, 0))
     {
      if(!m_trade.Buy(Lot, _Symbol, ASK, SL, TP, COMMENT))
        {
         Print(m_trade.ResultRetcode(), " ", m_trade.ResultRetcodeDescription());
         return;
        }
      open_time = iTime(_Symbol, PERIOD_CURRENT, 0);
     }


Acho que essa solução deve funcionar se o EA não for encerrado e reiniciado durante a execução da mesma barra... Para um maior controle (independente de encerramento/reinício do EA), verifique o horário de abertura da última posição no histórico de operações (por exemplo).


. . .