Comment ouvrir correctement un ordre au marché ?

 

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'ouverture supplémentaire 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 ?

 
Je suppose que l'information sur l'accord n'est pas encore arrivée. Ici (surligné en rouge), vous comptez sur la chance. Et c'est une dame capricieuse :-))

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);
}
 
Gennady Mazur:

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

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'ouverture supplémentaire 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.

Pouvez-vous expliquer ce qui ne va pas et comment résoudre ce problème ?

Mauvais héritage du forex.

Vous devriez vérifier lesrésultats.l'ordre.

Si la commande est passée, cela ne signifie pas que l'affaire est déjà conclue.

 
Sergey Chalyshev:

Mauvais héritage du forex.

Nous devons vérifier.l'ordre.

Si un ordre est passé, cela ne signifie pas qu'une transaction a déjà été exécutée.

Vous auriez raison si je plaçais des ordres en suspens, mais je travaille par marché et ici le ticket est obtenu avecResults.deal
 
Dennis Kirichenko:
Je suppose que l'information sur l'accord n'est pas encore arrivée. Ici (surligné en rouge), vous comptez sur la chance. Et c'est une dame capricieuse :-))

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);
}
Non, ce résultat est présent, ce n'est pas une commande de ticket sur le serveur, c'est une opération temporaire de ticket, qui sera remplacée plus tard par une position de ticket.
 
Dennis Kirichenko:
Je suppose que l'information sur l'accord n'est pas encore arrivée. Ici (surligné en rouge), vous comptez sur la chance. Et c'est une dame capricieuse :-))

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);
}
Et on m'a assuré dans un fil de discussion précédent, le gourou de ce forum, que cette information arrive toujours ... presque instantanément ... et si le serveur a répondu positivement, le ticket n'est pas émis, la commande a échoué.
 

Vous devez enregistrer toutes les transactions. Par exemple, comme ceci :

Tout d'abord, dans l'en-tête, nous connectons la classe de commerce CTrade.

#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object

et voici un exemple de l'opération Buy :

   if(m_trade.Buy(lots,NULL,m_symbol.Ask(),sl,tp))
     {
      if(m_trade.ResultDeal()==0)
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

      else
         Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

vous pouvez donc obtenir deux erreurs : premier niveau - l'opération n'a pas passé le contrôle de base et deuxième niveau - contrôle du ticket de l'opération.

Ensuite, s'il y a un problème, vous pouvez utiliser les journaux pour le résoudre.

Ajouté : ce qui précède est vrai pour le mode de fonctionnement SYNC.

 

Maintenant, les gourous d'ici vont vous apprendre aussi ;))

Объясните что не так, как решить данную проблему? 

Avec votre expérience, il est inconvenant de poser de telles questions ici.

 
Vladimir Karputov:

Vous devez enregistrer toutes les transactions. Par exemple, comme ceci :

Tout d'abord, dans l'en-tête, nous connectons la classe de commerce CTrade.

#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object

et voici un exemple de l'opération Buy :

   if(m_trade.Buy(lots,NULL,m_symbol.Ask(),sl,tp))
     {
      if(m_trade.ResultDeal()==0)
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

      else
         Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

vous pouvez donc obtenir deux erreurs : premier niveau - l'opération n'a pas passé le contrôle de base et deuxième niveau - contrôle du ticket de l'opération.

Ensuite, s'il y a un problème, vous pouvez utiliser les journaux pour le résoudre.

Ajouté : ce qui précède est vrai pour le mode de fonctionnement SYNC.

C'est exactement comme ça que j'ai fait.

  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
seulement avec mon propre code
 
Vladimir Karputov:

Vous devez enregistrer toutes les transactions. Par exemple, comme ceci :

Tout d'abord, dans l'en-tête, nous connectons la classe de commerce CTrade.

#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object

et voici un exemple de l'opération Buy :

   if(m_trade.Buy(lots,NULL,m_symbol.Ask(),sl,tp))
     {
      if(m_trade.ResultDeal()==0)
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

      else
         Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

vous pouvez donc obtenir deux erreurs : premier niveau - l'opération n'a pas passé le contrôle de base et deuxième niveau - contrôle du ticket de l'opération.

Ensuite, s'il y a un problème, vous pouvez utiliser les journaux pour le résoudre.

Ajouté : ceci est vrai pour le mode de fonctionnement SYNC.

Oh et une autre chose, est-ce que la fonction standard supporte l'exécution des ordres, leur classement, parce que j'avais l'habitude d'utiliser SeaTrade pour l'ouverture, jusqu'à ce que j'arrive à un échange où les ordres ne voulaient pas être exécutés car il était impossible de déterminer le classement.
 
Gennady Mazur:
C'est exactement ce que j'ai fait.

  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
mais avec mon propre code.
Et l'exploitation forestière ? Vous devez sortir à la fois le succès de l'opération et, surtout, l'échec avec le code d'erreur.
Raison: