Problemas de fechamento, por favor, ajude

 

Olá a todos
Espero que a sintaxe seja melhor do que antes. Na última semana, venho lendo os Codersguru.

O programa abaixo, embora não tenha nenhum erro, o compilador registrará apenas uma ordem. Mas meu código não irá fechá-lo.
O programa declara --- ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",Blue), eu tenho
não inseriu o stoploss ou o takeprofit, como você pode ver. Motivo, há uma condição StopLoss já codificada como tal ---
if(OrderTicket() == OrderOpenPrice() - (ATR*2))
{
OrderClose(OrderTicket(), OrderLots(), 3, Azul)
Então não há necessidade de inserir outro o StopLoss, não? No que diz respeito ao TakeProfit
Vou codificar isso quando este outro problema for resolvido.
É assim que eu codifiquei a condição de fechamento, ou há novamente problemas com a sintaxe?
Obrigado a todos por sua ajuda, e que meu problema ajude outros,
Abraço

-----------------------------------------------------------------+
//|                                         Opening and Closeing.mq4 |
//|                                      Copyright © 2010, Ben banta |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Ben banta"
//+------------------------------------------------------+
//|                   Closing My Way                     |
//+------------------------------------------------------+



double ATR;
double Slippage = 3;
double StopLoss_Buy;
double StopLoss_Sell;
double Lots=0.4;
double MagicNumber;

int ticket;
int order;

//----------------- Closing Sell ---------------

int start() 
  {                                                          
    for(int index = OrdersTotal() -1; index >= 0; index--)                              
  {                                                               
    if (OrderSelect(index, SELECT_BY_TICKET)                    // existing orders
&&  OrderMagicNumber()  == MagicNumber                          // with my MN    
&&  OrderSymbol()       == Symbol())                            // with my symbol
  {                                                                                                                                                    
    if(OrderType() == OP_SELL)
    order = OrderTicket(); 
                       
    if(OrderTicket() == OrderOpenPrice() + (ATR*2))     // ATR*2 above Sell. Hard Stop
  {
      OrderClose(OrderTicket(),OrderLots(),3,Blue);   
      Print("Sell order closed with Hard Stop"); 
     }     
  else
  {
      Print("Error closing Sell Hard Stop", GetLastError()); 
   }   
//---------- Closeing Buy -------------
           
    if(OrderType() == OP_BUY) 
    order = OrderTicket(); 
    
    if(OrderTicket() == OrderOpenPrice() - (ATR*2))     // ATR*2 below Buy. Hard Stop
  {
      OrderClose(OrderTicket(),OrderLots(),3,Red); 
      Print("Buy order closed with Hard Stop");
     }     
  else 
  {
      Print("Error closing Buy Hard Stop", GetLastError());                                      
      return(0); 
    }                                              
  } 
}


//------------ Opening Buy -----------------

if(OrdersTotal() < 1)                                        // Checking for any working orders
   {                                   
     if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)])         // When this condition is true, 
                                                               // with no working orders  
   {                                                                                     
        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue);
                                                               // Buy! Useing these parameters  
     if(ticket>0)
   { 
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))                                                       
      Print ("Buy Order Was a Big Success :" , OrderOpenPrice());
    }
  else
      Print ("Error Opening Buy Order :" , GetLastError()); 
      return(0);                                                  
  }  
                                                      
//--------------- Opening Sell ----------------
                                                                         
  if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)])                //When this condition is true, 
                                                               //with no working orders
    {   
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red);  
                                                               //Sell! Useing these parameters
   if(ticket>0)
     {     
       if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))                                                
       Print ("Sell Order Was a Big Success :" , OrderOpenPrice());
     }
    else
       Print ("Error Opening Sell Order :" ,GetLastError());
       return(0);
     }  
    return(0); 
  }
}
 
-----------------------------------------------------------------+
//|                                         Opening and Closeing.mq4 |
//|                                      Copyright © 2010, Ben banta |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Ben banta"
//+------------------------------------------------------+
//|                   Closing My Way                     |
//+------------------------------------------------------+



double ATR;
double Slippage = 3;
double StopLoss_Buy;
double StopLoss_Sell;
double Lots=0.4;
double MagicNumber;

int ticket;
int order;

//----------------- Closing Sell ---------------

int start() 
  {                                                          
    for(int index = OrdersTotal() -1; index >= 0; index--)                              
       {                                                               
        if (
           OrderSelect(index, SELECT_BY_TICKET)                    // existing orders
           &&  OrderMagicNumber()  == MagicNumber                  // with my MN    
           &&  OrderSymbol()       == Symbol()                     // with my symbol
           )                     
           {                                                                                                                                                    
            if(OrderType() == OP_SELL) order = OrderTicket(); 
                       
            if(OrderTicket() == OrderOpenPrice() + (ATR*2))     // ATR*2 above Sell. Hard Stop
              {
               OrderClose(OrderTicket(),OrderLots(),3,Blue);   
               Print("Sell order closed with Hard Stop"); 
              }     
              else
              {
               Print("Error closing Sell Hard Stop", GetLastError()); 
              } //ENDif (OrderTicket() == OrderOpenPrice() + (ATR*2))
                                 
                                                              //---------- Closeing Buy -------------
                     
              if(OrderType() == OP_BUY) order = OrderTicket(); 
               
              if(OrderTicket() == OrderOpenPrice() - (ATR*2))     // ATR*2 below Buy. Hard Stop
                {
                 OrderClose(OrderTicket(),OrderLots(),3,Red); 
                 Print("Buy order closed with Hard Stop");
                }     
                else 
                {
                 Print("Error closing Buy Hard Stop", GetLastError());                                      
                 return(0); 
                }//ENDif (OrderTicket() == OrderOpenPrice() - (ATR*2))                                              
           }//ENDIf ( OrderSelect(index, SELECT_BY_TICKET) etc
       }// END for loop               
                     
                             
                                        //------------ Opening Buy -----------------
                       
    if(OrdersTotal() < 1)                                        // Checking for any working orders
      {                                   
       if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)])         // When this condition is true, 
                                                               // with no working orders  
        {                                                                                     
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue);
                                                               // Buy! Useing these parameters  
         if(ticket>0)
           { 
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Buy Order Was a Big Success :" , OrderOpenPrice());
           }
           else
           Print ("Error Opening Buy Order :" , GetLastError()); //ENDif (ticket>0)
             
         return(0);                                                  
        }//ENDif (Ask > High[iHighest(NU... etc  
                                                      
                                                             //--------------- Opening Sell ----------------
                                                                         
       if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)])                //When this condition is true, 
                                                                    //with no working orders
          {   
           ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red);  
                                                               //Sell! Useing these parameters
           if(ticket>0)
             {     
              if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Sell Order Was a Big Success :" , OrderOpenPrice());
             }//ENDif (ticket>0)
             else
             Print ("Error Opening Sell Order :" ,GetLastError()); 
             //ENDif (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                                 
           return(0);
          }//ENDif (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)])  
       return(0); 
      }//ENDif  (OrdersTotal() < 1)
}//ENDint start()
Deve tornar os blocos de código mais fáceis de ler
 
if(OrderTicket() == OrderOpenPrice() - (ATR*2)) 
Obilhete de pedido é um inteiro muito grande (provavelmente nos bilhões), a chave do pedido.
OOP - 2ATR é um preço.
Os dois NUNCA serão iguais
se você quis dizer OrderClosePrice() == OOP-2ATR números reais quase nunca se compararão iguais. use em seu lugar:
 if( OrderClosePrice() - OrderOpenPrice()-ATR*2 <= 0)//...

OrderSelect(index, SELECT_BY_TICKET)                    // existing orders
           &&  OrderMagicNumber()  == MagicNumber                  // with my MN    
           &&  OrderSymbol()       == Symbol() 
Seu pedidoSendereço não está definindo um número mágico
 
Ickyrus wrote >>
Deve tornar os blocos de código mais fáceis de ler


Sim. Você está correto. A cada tentativa e pergunta, eu aprendo um pouco mais. Obrigado pela limpeza. Foram apenas os últimos dias em que pude colocar os aparelhos nos lugares apropriados. Quanto mais simplicidade, melhor.
Saúde
 
WHRoeder wrote >>
O bilhete de pedido é um inteiro muito grande (provavelmente nos bilhões), a chave do pedido.
OOP - 2ATR é um preço.
Os dois NUNCA serão iguais
se você quis dizer OrderClosePrice() == OOP-2ATR números reais quase nunca se compararão iguais. use em seu lugar:

Seu pedidoSend não está definindo um número mágico


Olá WHRoeder
Obrigado por procurar e dar as sugestões. Mas devo dizer que não entendi imediatamente o OOP -2ATR.
OOP = OrderOpenPrice. Isso passou por cima da minha cabeça no início. Sua explanação é absolutamente correta. Eu fui pego pelo sinal ==. O OrderClosePrice() pode nunca ser igual a OrderOpenPrice() menos o (ATR*2). Obrigado por ter pegado isso.
Deixe-me ver se entendi sua sugestão. Vou reafirmá-la aqui. if(OrderClosePrice()-OOP()-ATR*2 <= 0)
Isto parece ler-se (usarei aqui figuras arborizadas) OCP = 1,4361, OOP = 1,4321, ATR = 20. Assim, a expressão pareceria:
se (1.4321 - 1.4361 - (20*2) <= 0), sinto muito, mas não entendo.
Talvez eu possa usar os mesmos números para reordenar a expressão, para mostrar o que eu quis dizer. Mas isto também não funcionou quando eu os introduzi no programa.
O novo arranjo se parece com isto.

if (1.4361 >= 1.4321 + (20*2)).

Onde o OCP >=OOP + ATR*2, o controle passa para:
OrderClose (OrderTicket(), OrderLots(), etc.

Sua outra observação foi que o OrderSend não está definindo um número mágico.
Eu poderia simplesmente retirar esta parte do programa: && OrderMagicNumber == MagicNumber,
Mais uma vez obrigado, e se você puder ver outras melhorias, eu gostaria de aprender.
Abraço
 

Olá, Ais
Obrigado por sua resposta. Espero que você esteja indo bem.
A sugestão foi inserida esta manhã. Lamento dizer que o compilador não gosta do que eu codifiquei. Não tenho certeza de qual afirmação no programa está incorreta. As sugestões que eu acredito que estão bem. Eu vou reposicionar o programa e sinalizar a área que eu acredito que talvez seja o problema. Também vou declarar a estratégia para o fechamento.

A posição de venda será interrompida acima do preço de abertura do pedido pela Atr*2. Tal como, OOP é 1,4321, Atr =20, e OCP = 1,4361.
Portanto, codifiquei a expressão como,

if(OrderClosePrice >= OrderOpenPrice(), - (ATR*2)) // condição é cumprida, o controle passa para....
OrderClose (OrderTicket(), OrderLots(), OrderClosePrice(),Blue) ;

Nota: Não há StopLoss(), ou TakeProfit() na declaração OrderSend, se isso tiver alguma relevância.

Mais uma vez, obrigado por toda ajuda
Abraço
double ATR;
double Slippage = 3;
double StopLoss_Buy;
double StopLoss_Sell;
double Lots=0.4;
double MagicNumber;

int ticket;
int order;

//----------------- Closing Sell ---------------

int start() 
  {                                                          
    for(int index = OrdersTotal() -1; index >= 0; index--)                              
  {                                                               
    if (OrderSelect(index, SELECT_BY_TICKET)                  // existing orders
//&&  OrderMagicNumber()  == MagicNumber                      // with my MN    
&&  OrderSymbol()       == Symbol())                          // with my symbol
  {                                                                                                                                                    
    if(OrderType() == OP_SELL) order = OrderTicket(); 
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<                       
    if(OrderClosePrice() >= OrderOpenPrice() + (ATR*2)) // condition to be met,
                                                        // control then passes to...
  {                                                     
      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue); // OrderClose
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      Print("Sell order closed with Hard Stop"); 
     }     
  else
  {
      Print("Error closing Sell Hard Stop", GetLastError()); 
   }   
//---------- Closeing Buy -------------
           
    if(OrderType() == OP_BUY)  order = OrderTicket(); 
    
    if(OrderClosePrice() <= OrderOpenPrice() - (ATR*2))        // ATR*2 below Buy. Hard Stop
  {
      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Red); 
      Print("Buy order closed with Hard Stop");
     }     
  else 
  {
      Print("Error closing Buy Hard Stop", GetLastError());                                      
      return(0); 
    }                                              
  } 
}


//------------ Opening Buy -----------------

if(OrdersTotal() < 1)                                        // Checking for any working orders
   {                                   
     if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)])         // When this condition is true, 
                                                               // with no working orders  
   {                                                                                     
        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue);
                                                               // Buy! Useing these parameters  
     if(ticket>0)
   { 
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))                                                       
      Print ("Buy Order Was a Big Success :" , OrderOpenPrice());
    }
  else
      Print ("Error Opening Buy Order :" , GetLastError()); 
      return(0);                                                  
  }  
                                                      
//--------------- Opening Sell ----------------
                                                                         
  if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)])                //When this condition is true, 
                                                               //with no working orders
    {   
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red);  
                                                               //Sell! Useing these parameters
   if(ticket>0)
     {     
       if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))                                                
       Print ("Sell Order Was a Big Success :" , OrderOpenPrice());
     }
    else
       Print ("Error Opening Sell Order :" ,GetLastError());
       return(0);
     }  
    return(0); 
  }
}
 

Olá Huckleberry,
Vou reformular ligeiramente o seu programa.
Tchau por enquanto

 

Por que fazer "order = OrderTicket();" e não usar este valor na função orderclose()?
Embora a chance da ordem selecionada ter mudado seja pequena, não seria mais seguro usar o valor da ordem positivamente identificado?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue);
OrderTicket() será o bilhete atualmente selecionado - nesta etapa do meu aprendizado
Eu não posso dizer qual é o bilhete de pedido selecionado quando você faz o OrderClose().

//// Editar
Na verdade, não tenho certeza se "Order= OrderTicket()" é o bilhete que você identificou no Se Statment precedente.

 
Ais wrote >>

Olá Huckleberry,
Vou reformular ligeiramente o seu programa.
Tchau por enquanto


Muito obrigado. Ficarei esperando sua resposta.
Abraço
 
Ickyrus wrote >>

Por que fazer "order = OrderTicket();" e não usar este valor na função orderclose()?
Embora a chance da ordem selecionada ter mudado seja pequena, não seria mais seguro usar o valor da ordem positivamente identificado?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue);
OrderTicket() será o bilhete atualmente selecionado - nesta etapa do meu aprendizado
Eu não posso dizer qual é o bilhete de pedido selecionado quando você faz o OrderClose().

//// Editar
Na verdade, não tenho certeza se "Order= OrderTicket()" é o bilhete que você identificou no Se Statment precedente.


Olá Ickyrus
Obrigado por sua observação e sugestão. Seu tempo é valioso.
Seu raciocínio faz todo o sentido. Não estou mais certo como você no que diz respeito à ordem selecionada. Vou tentar a sua sugestão.
Obrigado novamente
Abraço