ajude-me por favor [resolvido]

 

Sou novo em mql4 e este código abre várias ordens, como posso evitá-lo? deve abrir apenas 1 ordem até fechar,

como posso fazer isso?

Obrigado

void OnTick()
  {

  
  double up= iIchimoku (NULL, 5,9,26,52,3,0);
  double down= iIchimoku (NULL,5,9,26,52,4,0);

  
  if (MathMin (up,down) < Bid )
  

  OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
    
    
  }
  
 
void OnTick()
  {

  if(OrdersTotal()==0)
    {
     double up= iIchimoku (NULL, 5,9,26,52,3,0);
     double down= iIchimoku (NULL,5,9,26,52,4,0);

     if (MathMin (up,down) < Bid )

     OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
    }
    
  }
 
muito obrigado senhor, você foi rigoroso ao ponto, não me mandando em círculos
 

É uma solução, mas não é a melhor solução, como você aprenderá se prosseguir.

Mas ela pode ajudá-lo neste momento.

 
Marco vd Heijden:

É uma solução, mas não é a melhor solução, como você aprenderá se prosseguir.

Mas ela pode ajudá-lo neste momento.

sim, ele resolveu o problema no tópico, mas quando fecha também cria uma nova ordem, se ainda estiver acima da nuvem. Você poderia me ajudar a resolver este novo problema?

Como bloquear todas as novas ordens depois de fechar com sucesso a primeira?

 

Bem, você pode criar uma bandeira.

bool order=0;


Então você pode definir o valor para uma quando o pedido for feito.

void OnTick()
  {

  if(order==0)
    {
     double up= iIchimoku (NULL, 5,9,26,52,3,0);
     double down= iIchimoku (NULL,5,9,26,52,4,0);

     if (MathMin (up,down) < Bid )

     OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
     order=1;
    }
    
  }

Mas isso lhe dará o aviso de que você precisa verificar o valor de retorno da função de fim de pedido para

void OnTick()
  {

  if(order==0)
    {
     double up= iIchimoku (NULL, 5,9,26,52,3,0);
     double down= iIchimoku (NULL,5,9,26,52,4,0);

     if (MathMin (up,down) < Bid )

     int ticket=OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
      {
       if(ticket!=-1)
        {
         order=1;
        }
      }
    }
  }

Por que não definir a bandeira dependendo se o pedido foi feito com sucesso ou não?

Nesse caso, se seu pedido falhar, ele continuará a tentar.

 
mrluck1:

sim, ele resolveu o problema no tópico, mas quando fecha também cria uma nova ordem, se ainda estiver acima da nuvem. Você poderia me ajudar a resolver este novo problema?

Como bloquear todas as novas ordens depois de fechar com sucesso a primeira?

Como Marco já aludiu, você provavelmente encontrará outros problemas.

E se houver uma ordem aberta em outro símbolo?

E se houver ordens sendo controladas por outro EA?

E se houver ordens pendentes?

E se o gatilho ainda estiver ativo quando você fechar a primeira?

Em resposta a esta última, você poderia usar uma bandeira, como sugerido por Marco. Basta lembrar que você precisa decidir quando reiniciar a bandeira ou a EA nunca mais aceita outra operação.

Alternativamente, você poderia verificar se há uma cruz / mudança de estado de baixo/na nuvem para cima.

 

eu coloquei seu código e disse que o bilhete não está apagado, então eu o declarei, mas agora o código abre várias ordens, assim como antes, como proceder agora?

void OnTick()
  {

bool order= 0;
int ticket;

  if(order==0)
    {
     double up= iIchimoku (NULL, 5,9,26,52,3,0);
     double down= iIchimoku (NULL,5,9,26,52,4,0);

     if (MathMax (up,down) < Bid )

    int ticket= OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
      {
       if( ticket!=1)
        {
         order=1;
        }
      }
    }
  }


E para os honestos knave: Neste exemplo, é um roteiro, então apenas 1 comércio está bem.
 
mrluck1:

eu coloquei seu código e disse que o bilhete não está apagado, então eu o declarei, mas agora o código abre várias ordens, assim como antes, como proceder agora?

void OnTick()
  {

bool order= 0;
int ticket;

  if(order==0)
    {
     double up= iIchimoku (NULL, 5,9,26,52,3,0);
     double down= iIchimoku (NULL,5,9,26,52,4,0);

     if (MathMax (up,down) < Bid )

    int ticket= OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
      {
       if( ticket!=1)
        {
         order=1;
        }
      }
    }
  }


Provavelmente, isso o ajudaria a ler sobre o escopo das variáveis.

O que acontece com o valor da ordem a cada tick?

 

Então você declara o bilhete com a bandeira booleana.

bool order=0;
int ticket;

E então

void OnTick()
  {

  if(order==0)
    {
     double up= iIchimoku (NULL, 5,9,26,52,3,0);
     double down= iIchimoku (NULL,5,9,26,52,4,0);

     if (MathMax (up,down) < Bid )

    ticket= OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
      {
       if( ticket>0)
        {
         order=1;
        }
      }
    }
  }

Você não pode declará-los no OnTick() porque seu valor será redefinido a cada tick, é claro.

Observe também que a OrderSend devolve o número do bilhete, ou -1 menos um, se falhar.

 

Eu coloquei

ordem de bool e

int ticket

sobre variáveis globais, e o resto do código no OnTick, mas ainda não faz nenhuma entrada agora