Abrir ordem oposta

 

Olá a todos,

Gostaria de receber de você ajuda para lidar com esta questão;

Quando uma ordem está aberta e o preço está abaixo do preço da ordem aberta, eu quero abrir uma ordem oposta.

Neste caso particular, estou tentando usar este código, mas sem sucesso. Alguém poderia dar uma ajuda aqui?

Agradecemos antecipadamente.

Luis

double OpenOppositeOrder() 
 {
  int Op;  
 // for(int Counter=0;Counter<=OrdersTotal()-1;Counter++)
  for(int Counter=OrdersTotal()-1;Counter>=0;Counter--)
  {
   OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES);
   {
    if(OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNumber)
    {
     Op=OrderType();
     if(Op==OP_BUY && NormalizeDouble(Bid,Digits)*UsePoint<OpenPrice)
     {      
     SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,NormalizeDouble(Bid,Digits),UseSlippage,0,0,"Sell Order",MagicNumber,0,Red);
     if(SellTicket>0)AddLimitsSell();
      }
     if(Op==OP_SELL && NormalizeDouble(Ask,Digits)*UsePoint>OpenPrice)
     {      
     BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,NormalizeDouble(Ask,Digits),UseSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(BuyTicket>0)AddLimitsBuy();
      }
     }
    }
   }
  }
 
luisneves:

Olá a todos,

Gostaria de receber de você ajuda para lidar com esta questão;

Quando uma ordem está aberta e o preço está abaixo do preço da ordem aberta, eu quero abrir uma ordem oposta.

Neste caso particular, estou tentando usar este código, mas sem sucesso. Alguém poderia dar uma ajuda aqui?

Agradecemos antecipadamente.

Luis

Você poderia responder a esta pergunta, ela o ajudará muito:

1. Qual é o valor de retorno da OrderSelect() - leia a documentação da OrderSelect irá ajudá-lo a responder a esta pergunta.

2. Qual erro quando você não envia o pedido?

 
luisneves:

Olá a todos,

Gostaria de receber de você ajuda para lidar com esta questão;

Quando uma ordem está aberta e o preço está abaixo do preço da ordem aberta, eu quero abrir uma ordem oposta.

Neste caso particular, estou tentando usar este código, mas sem sucesso. Alguém poderia dar uma ajuda aqui?

Qual é a finalidade da variável chamadaUsePoint? se você puder explicar porque a está usando, provavelmente entenderá qual é o seu problema . . . também . . . de onde vem o valor doOpenPrice ?


Você não quer saber se seu OrderSend() funciona ou não ? e se ele falha, você não quer saber por quê ? você não quer saber quais eram as variáveis relevantes quando ele falhou ?

Leia isto:O que são valores de retorno de função ? Como eu os utilizo ?

 

Olá RaptorUK;

Obrigado por sua pronta resposta;

UsePoint é para ajustar para 5 pontos decimais assim como o Ponto*10

OpenPrice é OrderOpenPrice()

Obrigado

Luis

 
luisneves:

Olá RaptorUK;

Obrigado por sua pronta resposta;

UsePoint é para ajustar para 5 pontos decimais assim como o Ponto*10

Você pode explicar por que você está usando-o nesta situação?

 

Olá RaptorUK,

Você está certo. Eu só preciso usar isso para TakeProfit e Stoploss (acho que...)

 
luisneves:

Olá RaptorUK,

Você está certo. Eu só preciso usar isso para TakeProfit e Stoploss (acho que...)

Obrigado por responder e pensar sobre isso :-)
 

Olá RaptorUK,

Dei uma olhada no link que você forneceu e coloquei no código a rotina de erro e o erro que acabou de retornar diz 2012.11.06 06:40 ordem de mercado ecn v1 EURUSDi,M5: Ordem de envio falhou, erro # 4051.

Então no código eu fiz algumas mudanças no OrderSelect e uso Ticket, mas as coisas ainda não funcionam. Também fiz uma busca pelo significado e o que encontrei foiERR_INVALID_FUNCTION_PARAMVALUE (4051) e infelizmente não sei

como chegar a partir daqui...

double OpenOppositeOrder() 
 {
  int Op;  
 // for(int Counter=0;Counter<=OrdersTotal()-1;Counter++)
  for(int Counter=OrdersTotal()-1;Counter>=0;Counter--)
  {
   //OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES);
   OrderSelect(Ticket,SELECT_BY_TICKET);
   {
    if(OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNumber)
    {
     Op=OrderType();
     if(Op==OP_BUY && NormalizeDouble(Bid,Digits)<OpenPrice)
     {      
     Ticket = OrderSend(Symbol(),OP_SELL,LotSize,NormalizeDouble(Bid,Digits),UseSlippage,0,0,"Sell Order",MagicNumber,0,Red);
     if(Ticket>0)AddLimitsSell();
      } 
      if( Ticket > 0 )
   {
   Print("Order placed # ", Ticket);
   }
else
   {
   Print("Order Send failed, error # ", GetLastError() );
   }
     if(Op==OP_SELL && NormalizeDouble(Ask,Digits)>OpenPrice)
     {      
     Ticket = OrderSend(Symbol(),OP_BUY,LotSize,NormalizeDouble(Ask,Digits),UseSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(Ticket>0)AddLimitsBuy();
      }
      if( Ticket > 0 )
   {
   Print("Order placed # ", Ticket);
   }
else
   {
   Print("Order Send failed, error # ", GetLastError() );
   }
      
      
     }
    }
   }
  }


 
luisneves:

Olá RaptorUK,

Dei uma olhada no link que você forneceu e coloquei no código a rotina de erro e o erro que acabou de retornar diz 2012.11.06 06:40 ordem de mercado ecn v1 EURUSDi,M5: Ordem de envio falhou, erro # 4051.

Então no código eu fiz algumas mudanças no OrderSelect e uso Ticket, mas as coisas ainda não funcionam. Também fiz uma busca pelo significado e o que encontrei foiERR_INVALID_FUNCTION_PARAMVALUE (4051) e infelizmente não sei

como chegar a partir daqui...

Você precisa verificar os valores que você está enviando para a função OrderSend(). . são os tipos corretos ? por exemplo,UseSlippage deve ser um int, soa como um bool .. é LotSize um duplo? está na faixa correta ? maior que Min Lot e menor que Max Lot e um múltiplo de Lot Step ?
 
RaptorUK:
Você precisa verificar os valores que você está enviando para a função OrderSend() . . são os tipos corretos ? por exemplo,UseSlippage deve ser um int, soa como um bool .. é LotSize um duplo? está na faixa correta ? maior que Min Lot e menor que Max Lot e um múltiplo de Lot Step ?


Olá RaptorUK,

Desculpe por tomar seu tempo, provavelmente você começa a ficar cansado de mim. Portanto, Slippage é uma int e LotSize é uma dupla.... e as coisas ainda são más....

Eu ainda me esforço muito para entender isto, mas parece que minha ignorância está tirando vantagem(...)

Por vezes parece que isso pode ser um problema com o Testador e então eu o tento na Demo. E aqui eu não posso ter uma abertura de ordem oposta se o preço estiver abaixo (para Comprar) do OrderOpenPrice.

Por favor, você poderia dar uma olhada no código que está anexado?

Eu não quero que você codifique para mim, mas apenas uma pequena ajuda.

obrigado antecipadamente por qualquer ajuda fornecida e por sua paciência também

Luis

Arquivos anexados:
 
luisneves:


Olá RaptorUK,

Desculpe por tomar seu tempo, provavelmente você começa a ficar cansado de mim. Portanto, Slippage é uma int e LotSize é uma dupla.... e as coisas ainda são más....

Eu ainda me esforço muito para entender isto, mas parece que minha ignorância está tirando vantagem(...)

Por vezes parece que isso pode ser um problema com o Testador e então eu o tento na Demo. E aqui eu não posso ter uma abertura de ordem oposta se o preço estiver abaixo (para Comprar) do OrderOpenPrice.

Por favor, você poderia dar uma olhada no código que está anexado?

Eu não quero que você codifique para mim, mas apenas uma pequena ajuda.

obrigado antecipadamente por qualquer ajuda fornecida e por sua paciência também

Por que você mudou o código correto para código incorreto?

Você fazia looping em todas as ordens que no Trades Pool ( ordens abertas e pendentes) . . agora este código não faz sentido, de onde vem o ingresso no primeiro passe do loop ?

 for(int Counter=OrdersTotal()-1; Counter>=0; Counter--)
  {
   //OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES);
   OrderSelect( Ticket,  SELECT_BY_TICKET);


Outra pergunta para você . . por que este tipo de função é duplo quando não retorna nada?