Ouvrir un ordre opposé

 

Bonjour à tous,

J'aimerais que vous m'aidiez à résoudre ce problème ;

Lorsqu'un ordre est ouvert et que le prix est inférieur au prix d'ouverture de l'ordre, je veux ouvrir un ordre opposé.

Dans ce cas particulier, j'essaie d'utiliser ce code mais sans succès. Quelqu'un peut-il m'aider ?

Merci d'avance

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:

Bonjour à tous,

J'aimerais que vous m'aidiez à résoudre ce problème ;

Quand un ordre est ouvert et que le prix est inférieur au prix d'ouverture de l'ordre, je veux ouvrir un ordre opposé.

Dans ce cas particulier, j'essaie d'utiliser ce code mais sans succès. Quelqu'un peut-il m'aider ?

Merci d'avance

Luis

Pourriez-vous répondre à cette question, cela vous aidera beaucoup :

1. Quelle est la valeur de retour de OrderSelect() - lire la documentation de OrderSelect vous aidera à répondre à cette question.

2. Quelle est l'erreur lorsque vous ne parvenez pas à envoyer un ordre ?

 
luisneves:

Bonjour à tous,

J'aimerais que vous m'aidiez à résoudre ce problème ;

Lorsqu'un ordre est ouvert et que le prix est inférieur au prix d'ouverture de l'ordre, je veux ouvrir un ordre opposé.

Dans ce cas particulier, j'essaie d'utiliser ce code mais sans succès. Quelqu'un peut-il m'aider ?

Quel est le but de la variable appeléeUsePoint? Si vous pouvez expliquer pourquoi vous l'utilisez, vous comprendrez probablement quel est votre problème... également... d'où vient la valeur deOpenPrice ?


Ne voulez-vous pas savoir si votre OrderSend() fonctionne ou non ? et s'il échoue, ne voulez-vous pas savoir pourquoi ? ne voulez-vous pas savoir quelles étaient les variables pertinentes quand il a échoué ?

Lisez ceci :Quelles sont les valeurs de retour des fonctions ? Comment les utiliser ?

 

Bonjour RaptorUK ;

Merci pour votre réponse rapide ;

UsePoint est pour ajuster pour 5 points décimaux donc c'est Point*10

OpenPrice est OrderOpenPrice()

Merci de votre réponse.

Luis

 
luisneves:

Bonjour RaptorUK ;

Merci pour votre réponse rapide ;

UsePoint sert à ajuster pour 5 points décimaux, donc Point*10.

Pouvez-vous expliquer pourquoi vous l'utilisez dans cette situation ?

 

Bonjour RaptorUK,

Vous avez raison. J'ai juste besoin d'utiliser cela pour TakeProfit et Stoploss (je pense...)

 
luisneves:

Bonjour RaptorUK,

Vous avez raison. J'ai juste besoin d'utiliser cela pour TakeProfit et Stoploss (je pense...)

Merci d'avoir répondu et d'y avoir réfléchi :-)
 

Salut RaptorUK,

J'ai regardé sur le lien que vous avez fourni et mis sur le code la routine d'erreur et l'erreur qui vient de retourner dit 2012.11.06 06:40 market order ecn v1 EURUSDi,M5 : Order Send failed, error # 4051.

Ensuite, sur le code, j'ai fait quelques changements sur OrderSelect et utiliser Ticket, mais les choses ne fonctionnent toujours pas. J'ai également fait une recherche pour la signification et ce que j'ai trouvé estERR_INVALID_FUNCTION_PARAMVALUE (4051) et malheureusement je ne sais pas

malheureusement, je ne sais pas comment m'y prendre...

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:

Salut RaptorUK,

J'ai regardé sur le lien que vous avez fourni et mis sur le code la routine d'erreur et l'erreur qui vient de retourner dit 2012.11.06 06:40 market order ecn v1 EURUSDi,M5 : Order Send failed, error # 4051.

Ensuite, sur le code, j'ai fait quelques changements sur OrderSelect et utiliser Ticket, mais les choses ne fonctionnent toujours pas. J'ai également fait une recherche pour la signification et ce que j'ai trouvé estERR_INVALID_FUNCTION_PARAMVALUE (4051) et malheureusement je ne sais pas

malheureusement, je ne sais pas comment m'y prendre...

Vous devez vérifier les valeurs que vous envoyez à la fonction OrderSend()... sont-elles du bon type ? par exemple,UseSlippage doit être un int, on dirait un bool... LotSize est-il un double? est-il dans la bonne fourchette ? supérieur à Min Lot et inférieur à Max Lot et un multiple de Lot Step ?
 
RaptorUK:
Vous devez vérifier les valeurs que vous envoyez à la fonction OrderSend()... sont-elles du bon type ? par exemple,UseSlippage doit être un int, on dirait un bool... LotSize est-il un double? est-il dans la bonne fourchette ? supérieur à Min Lot et inférieur à Max Lot et un multiple de Lot Step ?


Bonjour RaptorUK,

Désolé de prendre votre temps, vous commencez probablement à en avoir assez de moi. Donc, Slippage est un int et LotSize est un double.... et les choses vont toujours mal....

J'essaie vraiment de comprendre mais il semble que mon ignorance prenne l'avantage (...)

Pendant quelques temps, j'ai pensé qu'il y avait un problème avec le testeur, puis je l'ai essayé sur la démo. Et là, je ne peux pas avoir un ordre opposé qui s'ouvre si le prix est inférieur (pour l'achat) au OrderOpenPrice.

S'il vous plaît, pourriez-vous jeter un coup d'oeil au code qui est joint ?

Je ne veux absolument pas que vous codiez pour moi mais juste un peu d'aide.

Merci d'avance pour toute aide et pour votre patience.

Luis

Dossiers :
 
luisneves:


Bonjour RaptorUK,

Désolé de prendre votre temps, vous commencez probablement à en avoir assez de moi. Donc, Slippage est un int et LotSize est un double.... et les choses vont toujours mal....

J'essaie vraiment de comprendre mais il semble que mon ignorance prenne l'avantage (...)

Pendant quelques temps, j'ai pensé qu'il y avait un problème avec le testeur, puis je l'ai essayé sur la démo. Et là, je ne peux pas avoir un ordre opposé qui s'ouvre si le prix est inférieur (pour l'achat) au OrderOpenPrice.

S'il vous plaît, pourriez-vous jeter un coup d'oeil au code qui est joint ?

Je ne veux absolument pas que vous codiez pour moi mais juste un peu d'aide.

Je vous remercie par avance pour toute aide apportée et pour votre patience.

Pourquoi avez-vous changé le code correct en code incorrect ?

Votre boucle passait par tous les ordres qui se trouvaient dans le Trades Pool ( ordres ouverts et en attente) .... . maintenant ce code n'a aucun sens, d'où vient le ticket lors du premier passage dans la boucle ?

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


Une autre question pour vous . ... pourquoi cette fonction est-elle de type double alors qu'elle ne renvoie rien ?

Raison: