Abrir la orden contraria

 

Hola a todos,

Me gustaría que me ayudaran a resolver este problema;

Cuando una orden está abierta y el precio está por debajo del precio de apertura de la orden, quiero abrir una orden opuesta.

En este caso particular estoy tratando de usar este código pero sin éxito. ¿Alguien podría ayudarme?

Gracias de antemano

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:

Hola a todos,

Me gustaría que me ayudaran a resolver este problema;

Cuando una orden está abierta y el precio está por debajo del precio de apertura de la orden, quiero abrir una orden opuesta.

En este caso particular estoy tratando de usar este código pero sin éxito. ¿Alguien podría ayudarme?

Gracias de antemano

Luis

Podrías responder a esta pregunta, te ayudará mucho:

1. Cuál es el valor de retorno de OrderSelect() - leer la documentación de OrderSelect te ayudará a responder esto.

2. ¿Qué error se produce cuando no se puede enviar el pedido?

 
luisneves:

Hola a todos,

Me gustaría que me ayudaran a resolver este problema;

Cuando una orden está abierta y el precio está por debajo del precio de apertura de la orden, quiero abrir una orden opuesta.

En este caso particular estoy tratando de usar este código pero sin éxito. ¿Alguien podría ayudarme?

¿Cuál es el propósito de la variable llamadaUsePoint? si usted puede explicar por qué lo está utilizando probablemente entenderá cuál es su problema ... también ... ¿de dónde viene el valor deOpenPrice ?


¿No quiere saber si su OrderSend() funciona o no? y si falla ¿no quiere saber por qué? ¿no quiere saber cuáles eran las variables relevantes cuando fallaba?

Lea esto:¿Qué son los valores de retorno de las funciones? ¿Cómo los utilizo?

 

Hola RaptorUK;

Gracias por su pronta respuesta;

UsePoint es para ajustar 5 puntos decimales por lo que es Point*10

OpenPrice es OrderOpenPrice()

Gracias

Luis

 
luisneves:

Hola RaptorUK;

Gracias por su pronta respuesta;

UsePoint es para ajustar 5 puntos decimales por lo que es Point*10

¿Puede explicar por qué lo utiliza en esta situación?

 

Hola RaptorUK,

Tienes razón. Sólo tengo que usar eso para TakeProfit y Stoploss (creo...)

 
luisneves:

Hola RaptorUK,

Tienes razón. Sólo tengo que usar eso para TakeProfit y Stoploss (creo...)

Gracias por responder y pensar en ello :-)
 

Hola RaptorUK,

He echado un vistazo en el enlace que has proporcionado y he puesto en el código la rutina de error y el error que acaba de devolver dice 2012.11.06 06:40 orden de mercado ecn v1 EURUSDi,M5: Order Send failed, error # 4051.

Luego en el código he hecho algunos cambios en OrderSelect y use Ticket, pero las cosas siguen sin funcionar. También he hecho una búsqueda del significado y lo que he encontrado esERR_INVALID_FUNCTION_PARAMVALUE (4051) y por desgracia no sé

cómo llegar desde aquí...

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:

Hola RaptorUK,

He echado un vistazo en el enlace que has proporcionado y he puesto en el código la rutina de error y el error que acaba de devolver dice 2012.11.06 06:40 orden de mercado ecn v1 EURUSDi,M5: Order Send failed, error # 4051.

Luego en el código he hecho algunos cambios en OrderSelect y use Ticket, pero las cosas siguen sin funcionar. También he hecho una búsqueda del significado y lo que he encontrado esERR_INVALID_FUNCTION_PARAMVALUE (4051) y por desgracia no sé

cómo llegar desde aquí...

Tienes que comprobar los valores que estás enviando a la función OrderSend()... ¿son de los tipos correctos? por ejemplo,UseSlippage debe ser un int, suena como un bool... ¿es LotSize un double? ¿está en el rango correcto? mayor que Min Lot y menor que Max Lot y un múltiplo de Lot Step?
 
RaptorUK:
Tienes que comprobar los valores que estás enviando a la función OrderSend() ... ¿son de los tipos correctos? por ejemplo,UseSlippage debe ser un int, suena como un bool... ¿es LotSize un double? ¿está en el rango correcto ? mayor que Min Lot y menor que Max Lot y un múltiplo de Lot Step ?


Hola RaptorUK,

Perdonad que os quite el tiempo, probablemente os empiece a cansar. Así que Slippage es un int y LotSize es un doble....y las cosas siguen mal....

Realmente sigo intentando entender esto pero parece que mi ignorancia se está aprovechando(...)

Por momentos parece que podría ser algún problema con el Tester y luego lo pruebo en la Demo. Y aquí no puedo tener una orden de apertura contraria si el precio está por debajo (para la compra) del OrderOpenPrice.

Por favor, ¿podría echar un vistazo al código que se adjunta?

No quiero en absoluto que me codifiquen pero si una pequeña ayuda.

Gracias de antemano por la ayuda que me den y por su paciencia.

Luis

Archivos adjuntos:
 
luisneves:


Hola RaptorUK,

Perdonad que os lleve tiempo, probablemente os empiece a cansar. Así que Slippage es un int y LotSize es un doble....y las cosas siguen mal....

Realmente sigo intentando entender esto pero parece que mi ignorancia se está aprovechando(...)

Por momentos parece que podría ser algún problema con el Tester y luego lo pruebo en la Demo. Y aquí no puedo tener una orden de apertura contraria si el precio está por debajo (para la compra) del OrderOpenPrice.

Por favor, ¿podría echar un vistazo al código que se adjunta?

No quiero en absoluto que me codifiquen pero si una pequeña ayuda.

Gracias de antemano por la ayuda que me den y por su paciencia.

¿Por qué has cambiado el código correcto por el incorrecto?

Tu bucle estaba recorriendo todas las órdenes que hay en el Trades Pool ( órdenes abiertas y pendientes) . . ahora este código no tiene sentido, ¿de dónde sale el ticket en la primera pasada del bucle?

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


Otra pregunta para ti. . . ¿por qué esta función es de tipo doble cuando no devuelve nada?

Razón de la queja: