Ajuda: Por que a EA não fecha um negócio

 

Olá freinds,

Eu preciso de sua ajuda.

Eu construí uma EA que parte de seu processo tem que fechar um comércio usando um leilão. Aqui estão as fileiras relevantes do Kod.

Alguns podem me ajudar por que a EA não fecha o comércio? Obrigado.

(Talvez, já que enquanto eu uso o ORDERSELECT na parte principal, ele não pode usar o ORDERSELECT na função, também????)

for(int cnt=0; cnt < OrderTotal(); cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if ( OrderSymbol() == Par && OrderType() == OP_BUY )

{

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )

{

CLOSE_Single_P(Par, "LONG", OrderTicket(), OrderLots());

}

}

}

//-----------------------------------------------+

void CLOSE_Single_P(string SYMB, string TREN, int TICKET, double LOTT)

{

int Code, sig;

duplo PRC;

se ( TREN == "LONG" )

Código = 0;//OP_BUY

senão

se ( TREN == "CURTO" )

Código = 1;//OP_SELL

para ( int k=0; k < OrdensTotal(); k++ )

{

OrderSelect(k, SELECT_BY_POS, MODE_TRADES);

if( OrderSymbol() == SYMB && OrderType() == Code && OrderLots() == LOTT && OrderTicket() == TICKET )

{

se ( OrderType() == OP_BUY )

PRC = MarketInfo(OrderSymbol(),MODE_BID);

mais

se ( OrderType() == OP_SELL )

PRC = MarketInfo(OrderSymbol(),MODE_ASK);

OrderClose(TICKET,LOTT,PRC,Slippage,Yellow);

break;

}

}

retornar;

}

 

Use o botão SRC para exibir seu código para uma melhor leitura, por favor :)

You OrderSelect() está codificado de forma errada. Compare seu código com este. Depois, escreva de volta se você ainda tiver o problema ou não :)

   for(int cnt=0; cnt<OrdersTotal(); cnt++)
     {
      if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) == true &&
          OrderSymbol()==Pair && 
          OrderType()==OP_BUY)
          {
          // code to close
          }
      }
 
crossy:

Olá freinds,

Eu preciso de sua ajuda.

Eu construí uma EA que parte de seu processo tem que fechar um negócio usando um leilão. Aqui estão as fileiras relevantes do Kod.

Alguns podem me ajudar por que a EA não fecha o comércio? Obrigado.

Quando você tem um loop e está fechando ou apagando (Pendente) ordens, você DEVE contar para baixo e NÃO para cima ...

Por que você tem um loop na Função Close_Single_P ? não é projetado para fechar um único pedido ? quando você chama a Função você passa o símbolo, número do ticket, tipo de pedido e tamanho da posição . . . é tudo o que você precisa para fechar o pedido . . bem quase, você precisa do preço para fechar e para isso você pode usar OrderClosePrice() e então você não precisa se preocupar se for uma Buy or Sell . . na verdade, basta se livrar da Função e usar esta linha no lugar da chamada da função . .

OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow);

. . a propósito, onde você está ajustando a Slippage ? e está compensando os corretores de 4/5 dígitos ?

Quando você usa as funções de Ordem eles retornam um valor . . . este valor de retorno lhe diz se a função funcionou ou não . . . aprenda a usar este valor de retorno e se ele lhe diz que houve um problema, use uma declaração impressa para relatar as informações liberadas aos logs . . . então você saberá o que deu errado ao invés de adivinhar . . .

Caso seu pedido seja fechado ... você já verificou que isto . .

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )

. . é verdade?

Por que não adicionar uma declaração impressa que é executada se essa linha for verdadeira . . . então você saberá se ela é ou não . .

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )
   {
   Print("Trying to close Order: ", OrderTicket());                             // <---- tells you that the   if  returned true
   if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow)
      Print("OrderClose failed, error # ", GetLastError());                          // <------- reports the error if the OrderClose failed . . 
   }
 
onewithzachy:

Use o botão SRC para exibir seu código para uma melhor leitura, por favor :)

Qual é o retorno de GetLastError() então ?


O código tem cerca de 4.000 linhas...

De qualquer forma, não recebo nenhuma massagem de erro.

 
crossy:


O código tem cerca de 4.000 linhas...

De qualquer forma, não recebo nenhuma massagem de erro.

Você não tem que postar TODO o seu código . . mas quando você postar QUALQUER código por favor use o botão SRC. .

Você não recebe nenhuma mensagem de erro porque você não as reporta ao log . . você deve verificar os valores de retorno e informar os erros.

 
RaptorUK:

Quando você tem um loop e está fechando ou apagando (Pendente) ordens, você DEVE contar para baixo e NÃO para cima ...

Por que você tem um loop na Função Close_Single_P ? não é projetado para fechar um único pedido ? quando você chama a Função você passa o símbolo, número do ticket, tipo de pedido e tamanho da posição . . é tudo o que você precisa para fechar o pedido . . bem quase, você precisa do preço para fechar e para isso você pode usar OrderClosePrice() e então você não precisa se preocupar se for uma compra ou venda . . na verdade, basta se livrar da Função e usar esta linha no lugar da chamada da função . .

. . a propósito, onde você está ajustando o Slippage ? e está compensando os corretores de 4/5 dígitos ?

Quando você usa as funções de Ordem eles retornam um valor . . . este valor de retorno lhe diz se a função funcionou ou não . . . aprenda a usar este valor de retorno e se ele lhe diz que houve um problema, use uma declaração impressa para relatar as informações liberadas aos logs . . . então você saberá o que deu errado ao invés de adivinhar . . .

Caso seu pedido seja fechado ... você já verificou que isto . .

. . é verdade?

Por que não adicionar uma declaração impressa que é executada se essa linha for verdadeira . . . então você saberá se ela é ou não . .


Obrigado Raptor por suas ofertas de tamanho. SEMPRE, você me ajuda de forma sábia e clara.

Vou tentar o que você acabou de sugerir.

Felicidades.

 

Você já tem o bilhete selecionado, por que passar por um loopSelect de segunda ordem para encontrar o mesmo bilhete?

Por que você não está verificando o valor de retorno do pedidoFechar e imprimir o erro para descobrir o PORQUÊ?

 
WHRoeder:

Você já tem o bilhete selecionado, por que passar por um loopSelect de segunda ordem para encontrar o mesmo bilhete?

Por que você não está verificando o valor de retorno do pedidoFechar e imprimir o erro para descobrir o PORQUÊ?


Bem, obrigado por seus esforços.

Eu fiz algumas mudanças e nada foi útil, até ver o comentário do WHRoeder.

Você é geniose, eu acho que você é rigth.

Vou tentar o EA modificado na segunda-feira.

Tenha um bom fim de semana.

 
crossy:


Bem, obrigado por seus esforços.

Fiz algumas mudanças e nada foi útil, até que vi o comentário de WHRoeder.

Você é geniose, eu acho que você é rigth.

Vou tentar a EA modificada na segunda-feira.

Tenha um bom fim de semana.


Bem, meus freinds,

Eu fiz todas as suas sugestões - e a EA falhou.

Mais alguma idéia?

 

Vamos fazer isso novamente

  #include "..\libraries\stdlib.mq4" // drag and drop from libraries to very top of your code
  
  for(int cnt = OrdersTotal(); cnt >= 0; cnt--)  // from RaptorUK, count it down to zero 
     {
     if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) == true && OrderSymbol() == Pair) // this is how to write OrderSelect()
        {
        if(OrderType()== OP_BUY) // the code below is to close buy position only
          {
          
          //---
           if(MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT) * factor * TP) // from RaptorUK, is this statemement true ?
             {
              //CLOSE_Single_P(Pair,"LONG",OrderTicket(),OrderLots()) // From RaptorUK & WHRoeder, you don't have to do OrderSelect() twice
             Print("Trying to close buy position : ", OrderTicket());                            
             if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow)) // From Raptor UK, are you doing the slippage correctly ?
                Print("failed to close buy position ", ErrorDescription(GetLastError())  ); 
             }
             else
             {
             Print ("Not qualify to close buy position ", OrderTicket()); // from RaptorUK, is this statemement true ?, if not this print will tell you
             }
          //---
             
           }
           /*
           else
           {
           if (OrderType() == OP_SELL)
              {
              
              }
           }
           */
        }
     }
      

Enquanto ainda estou lendo o segundo pódio do MotoGP Le Mans de Valentino Rossi, espero escrever isto corretamente :)

 
onewithzachy:

Vamos fazer isso novamente

Enquanto ainda estou lendo o segundo pódio do MotoGP Le Mans de Valentino Rossi, espero escrever isto corretamente :)


Obrigado onewewzachy,

Primeiro, acho que você tem um pequeno erro:

for(int cnt = OrdersTotal() -1 ; cnt >= 0; cnt--)

Você tem que adicionar a correção verde e ousada.

Mas, eu não entendo como a seguinte linha pode nos ajudar?

#incluindo "...\iBibliotecas\iB.mq4".

Obrigado, Y.