Comment ouvrir correctement un ordre au marché ? - page 5

 
Gennady Mazur:

J'ai récemment soulevé un sujet sur la réouverture des commandes. Je pensais avoir résolu le problème, car tout a fonctionné sans problème pendant une semaine. Mais aujourd'hui, j'ai rencontré un problème similaire uniquement à l'ouverture.
Beaucoup d'ordres ont été ouverts sur Finam, et 9 sur Otkritie... alors qu'un seul ordre aurait dû être ouvert dans tous les cas.

Voici un extrait de code de l'EA

    if(OpenOrders<1)
    {
        Coment="Open Sell "+string(OpenOrders+1);
        ret=OpenSellPosition(_Symbol,volume,Coment,Sleeppage,Filling);
    }
    
    
  if(ret)
  {
    OpenOrders++;
    PriceLastOpen=price;
  }

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
}

c'est-à-dire que nous pouvons voir dans le code que si l'opération est réussie, la variableOpenOrders augmente, qui est initialement égale à 0

S'il est supérieur à 0, il ne devrait pas y avoir d'autre ouverture de l'ordre, mais la pile entière d'ordres est ouverte avec le commentaire Ordre1.

Je vérifie s'il y a une réponse positive dans la fonction d'ouverture de la commande et si le ticket de commande a été reçu, mais pour une raison quelconque, cette fonction renvoie faux, même si la commande est effectivement établie.

Expliquez ce qui ne va pas, comment résoudre ce problème ?

En outre, vous pouvez vérifier l'ouverture d'une position en essayant de la sélectionner. Et il est préférable d'essayer plusieurs fois.

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
Il y a à la fois un retard et une confirmation que la position est déjà en place.

J'ai également remarqué qu'il n'y a pas de contrôle OrderCheck(Request, checkResult), ce qui est mauvais.
 

Oh, et aussi en ordre de marché - prix = 0

Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID) ; oubliez-le.

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
   order_ticket=0;
   request.action = TRADE_ACTION_DEAL;
   request.magic  = 9876543211;
   request.symbol = Symbol();
   request.volume = 1;
   request.price  = 0;
   request.type=ORDER_TYPE_BUY;
   request.comment="Sync mode";
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time=ORDER_TIME_DAY;
   if(OrderSend(request,result))
     {
      if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
        {
         if(result.order>0)
           {
            order_ticket=result.order;
            Print(__FUNCTION__," Order sent in sync mode");
            return(true);
           }
         else
           {
            Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
           }
        }
      else
        {
         Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
        }
     }
   else
     {
      Print(__FUNCTION__," Order not sent in sync mode.");
     }
   return(false);
  }
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   switch(trans.type)
     {
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket > 0) && (trans.order == order_ticket))
      {
        //Вот здесь и смотрим что произошло
      }
      break;
     }
  }
 
Alexey Viktorov:
En outre, il est possible de vérifier l'ouverture de la position en essayant de la sélectionner. Et il est préférable d'essayer plusieurs fois

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
Il y a à la fois retard et confirmation que la position a déjà été ouverte.

J'ai également remarqué qu'il n'y a pas de contrôle OrderCheck(Request, checkResult), ce qui est mauvais.

Et si le poste existait déjà ?

Ou s'il existe déjà une position mais que la commande n'est pas entièrement remplie ?

 
Alexey Viktorov:
En outre, on peut vérifier l'ouverture de la position en essayant de la sélectionner. Et plusieurs tentatives sont meilleures.

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
Il y a à la fois retard et confirmation que la position est déjà en place.

J'ai également remarqué qu'il n'y a pas de vérification OrderCheck(Request, checkResult) et c'est mauvais.

Je vais peut-être insérerOrderCheck(Request, checkResult)
Merci
.

Mais je n'aime pas particulièrement une telle boucle.

 
prostotrader:

Oh, et aussi en ordre de marché - prix = 0

Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID) ; oubliez-le.

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
   order_ticket=0;
   request.action = TRADE_ACTION_DEAL;
   request.magic  = 9876543211;
   request.symbol = Symbol();
   request.volume = 1;
   request.price  = 0;
   request.type=ORDER_TYPE_BUY;
   request.comment="Sync mode";
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time=ORDER_TIME_DAY;
   if(OrderSend(request,result))
     {
      if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
        {
         if(result.order>0)
           {
            order_ticket=result.order;
            Print(__FUNCTION__," Order sent in sync mode");
            return(true);
           }
         else
           {
            Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
           }
        }
      else
        {
         Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
        }
     }
   else
     {
      Print(__FUNCTION__," Order not sent in sync mode.");
     }
   return(false);
  }
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   switch(trans.type)
     {
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket > 0) && (trans.order == order_ticket))
      {
        //Вот здесь и смотрим что произошло
      }
      break;
     }
  }
Merci beaucoup pour cette description si détaillée... et cette explication.....
Et à propos du prix.... oui, plus habitué à MT4, et là il faut toujours mettre le prix....
 
Sergey Chalyshev:

Répéter

En outre, vous devez également vérifier le statut de la commande et voir si elle est déjà apparue dans l'historique ou non.

L'échange ne fonctionne pas avec des positions, mais uniquement avec des ordres.

Vraiment ?
 
Gennady Mazur:
Vous auriez raison si je plaçais des ordres en attente, mais je travaille par marché, et ici le ticket est obtenu avecResults.deal
Pourtant, l'ordre est d'abord envoyé, puis il est exécuté.
 
Sergey Chalyshev:

Je ne comprends pas ce que signifie votre sourire ?

Je ne m'attendais pas à vous entendre dire ça. Quelles pauses, ou vous plaisantez ?

Pause après OrderSend() pour que les informations sur le marché et l'historique puissent être mis à jour.
 
Sergey Chalyshev:

Mauvais héritage du forex.

...

Tu devrais faire attention à la façon dont tu le dis. Sinon, nous pourrions tout aussi bien parler de la mutation génétique des adeptes des FOORTS.
 
Sergey Chalyshev:

Et si le poste existait déjà ?

Ou bien il y a déjà une position mais la commande n'est pas entièrement remplie ?

Ouais. Et je suis à fond dans ma couverture. J'admets que je n'avais pas tout à fait raison. Ou totalement faux. :-)