Questions des débutants MQL5 MT5 MetaTrader 5 - page 518

 
Sergey Gritsay:

Voici une autre option utilisant la classe

Résultat du test

Merci beaucoup, Sergei ! Si je comprends bien :
Dans le premier cas, un tableau de variables statiques est créé, chacune pour son propre symbole avec un délai fixe, c'est-à-dire qu'aucun autre délai ne peut être utilisé pour ce symbole ;
Dans le second cas, une classe pour chaque combinaison symbole + période.
 
MikeZv:
Merci beaucoup, Sergei ! Si je comprends bien :
Dans le premier cas, un tableau de variables statiques est créé, chacune pour son propre symbole avec un délai fixe, c'est-à-dire qu'aucun autre délai ne peut être utilisé pour ce symbole ;
Dans le second cas, une classe pour chaque combinaison symbole+temps.
Oui, c'est vrai, mais si vous réfléchissez un peu, vous pouvez remplacer le tableau unidimensionnel par un tableau bidimensionnel dans la variante tableau.
 
Une telle question. Quelqu'un a-t-il déjà vu un modèle de code pour l'ouverture, la vérification et la fermeture des ordres, sans condition d'ouverture et de fermeture ? Je vais essayer d'écrire une condition moi-même, mais erreur sur erreur lorsque je commence à écrire un ordre de fermeture... En particulier, je suis mauvais pour trouver et vérifier les ordres de fermeture.
 
Vitaliy Medvedev:
Voici une question. Quelqu'un d'autre a-t-il vu le code du modèle pour l'ouverture, la vérification et la fermeture des ordres sans aucune condition d'ouverture et de fermeture? J'ai essayé d'écrire une condition moi-même, mais quand je commence à écrire un ordre de fermeture erreur sur erreur... En particulier, je suis mauvais pour trouver et vérifier les commandes pour les fermer.

Il n'est pas surprenant que cela ne fonctionne pas bien. Après tout, s'il n'y a pas de conditions de clôture, alors la recherche et la vérification de ces ordres devraient se faire dans l'esprit suivant : trouver ceci, je ne sais quoi, et le clôturer.

Vous devez d'abord définir les conditions de choix de l'ordre à clôturer, et il sera ensuite beaucoup plus facile de l'analyser. Après tout, s'il y a un malentendu, nous n'aurons qu'à vérifier la conformité aux conditions connues.

 
Yury Reshetov:

Il n'est pas surprenant que cela ne fonctionne pas bien. Si nous n'avons pas de conditions de fermeture, alors la recherche et la vérification de ces ordres doivent se faire dans l'esprit suivant : trouver quelque chose et le fermer.

Tout d'abord, décidez des conditions de sélection des commandes pour la fermeture, et ensuite il sera plus facile de faire le tri. S'il y a un malentendu, nous n'aurons qu'à vérifier si les conditions dont nous sommes sûrs sont correctes.

Tout est clair, j'ai défini les conditions, mais l'ouverture des ordres selon les conditions (l'ouverture est toujours un déchet, j'arrive à peine à les ouvrir...),

Et d'autant plus, laclôture correctedes commandes ... Quel désordre !

 
Vitaliy Medvedev:

Tout est clair, j'ai élaboré les conditions, mais l'ouverture des ordres selon les conditions, (l'ouverture est encore un non-sens, l'ouverture, avec difficulté...),

Et d'autant plus, laclôture correctedes commandes ... Quel désordre !

Si vous savez quel ordre vous avez choisi de fermer, alors fermez-le par son numéro de ticket.
 
Vitaliy Medvedev:

Tout est clair, j'ai élaboré les conditions, mais l'ouverture des ordres selon les conditions, (l'ouverture est encore un non-sens, l'ouverture, avec un peu de peine...),

Et d'autant plus, laclôture correctedes commandes ... Quel désordre !

Voici comment elle est arrachée de mon cœur...

int Total_orders(int type)
  {
   int n=0;
   int total=OrdersTotal();

   for(int i=0; i<total; i++)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderType()!=type)continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      n++;
     }
   return(n);
  }
//+------------------------------------------------------------------+
void OrderOpen(int type,double sl)
  {
   double price=0.0;
   double lot;

   if(error>1)return;
   if(type==WRONG_VALUE) return;

   if(Risk!=0.0)lot=LotNormalize(LotVolume(Risk,sl));
   else lot=LotNormalize(Lot);

   do
     {
      if(type==OP_BUY)
        {
         RefreshRates();
         price=NormalizeDouble(Ask,_Digits);
         if(AccountFreeMarginCheck(_Symbol,type,lot)<=0)return;
        }
      if(type==OP_SELL)
        {
         RefreshRates();
         price=NormalizeDouble(Bid,_Digits);
         if(AccountFreeMarginCheck(_Symbol,type,lot)<=0)return;
        }

      int Ticket=OrderSend(_Symbol,type,lot,price,10000,0,0,CommentOrder,Magic);
      if(Ticket>0)
        {
         error=Fun_Error(_Symbol,GetLastError());
         Alert(__FUNCTION__,": open order ",StrToType(type)," ",_Symbol," :",Ticket);
        }
      else error=Fun_Error(_Symbol,GetLastError());
     }
   while(error==1 && !IsStopped());

  }
//+------------------------------------------------------------------+
void Order_Close(int type)
  {
   double price=0.0;
   int total=OrdersTotal();
   if(error>1)return;

   for(int i=total-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderType()!=type)continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      do
        {
         if(OrderType()==OP_BUY)
           {
            RefreshRates();
            price=NormalizeDouble(Bid,_Digits);
           }
         if(OrderType()==OP_SELL)
           {
            RefreshRates();
            price=NormalizeDouble(Ask,_Digits);
           }
         int res=OrderClose(OrderTicket(),OrderLots(),price,10000);
         if(res)
           {
            Alert(__FUNCTION__,": close order ",StrToType(OrderType())," ",OrderSymbol()," :",OrderTicket());
            error=Fun_Error(_Symbol,GetLastError());
           }
         else error=Fun_Error(_Symbol,GetLastError());
        }
      while(error==1 && !IsStopped());
     }
  }
//+------------------------------------------------------------------+
void ModifySL(int Stop_Loss)
  {
   if(Stop_Loss<=0)return;
   double sl=0.0;
   bool res;

   int total=OrdersTotal();

   for(int i=0; i<total; i++)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderStopLoss()!=0)continue;
      if(OrderType()==OP_BUY)  sl=NormalizeDouble(OrderOpenPrice()-(New_Stop(Stop_Loss)*_Point),_Digits);
      if(OrderType()==OP_SELL) sl=NormalizeDouble(OrderOpenPrice()+(New_Stop(Stop_Loss)*_Point),_Digits);
      res=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0);
      if(!res)Print(__FUNCTION__,": Error modifying StopLoss order ",StrToType(OrderType())," № - ",GetLastError()," ",OrderSymbol()," ",OrderTicket());
     }
  }
//+------------------------------------------------------------------+
void ModifyTP(int Take_Profit)
  {
   if(Take_Profit<=0)return;
   double tp=0.0;
   bool res;

   int total=OrdersTotal();

   for(int i=0; i<total; i++)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderTakeProfit()!=0)continue;
      if(OrderType()==OP_BUY) tp=NormalizeDouble(OrderOpenPrice()+(New_Stop(Take_Profit)*_Point),_Digits);
      if(OrderType()==OP_SELL) tp=NormalizeDouble(OrderOpenPrice() -(New_Stop(Take_Profit)*_Point),_Digits);
      res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),tp,0);
      if(!res)Print(__FUNCTION__,": Error modifying TakeProfit order ",StrToType(OrderType())," № - ",GetLastError()," ",OrderSymbol()," ",OrderTicket());
     }
  }
//+------------------------------------------------------------------+
double LotVolume(double procent,double sl)
  {
   double lot=0.0;
   double tv=MarketInfo(_Symbol,MODE_TICKVALUE);
   double minlot=MarketInfo(_Symbol,MODE_MINLOT);
   double maxlot=MarketInfo(_Symbol,MODE_MAXLOT);

   if(sl!=0 && tv!=0) lot=(AccountFreeMargin()*procent)/(sl*tv*100.0);

   if(lot < minlot)lot = minlot;
   if(lot > maxlot)lot = maxlot;
   return(lot);
  }
//+------------------------------------------------------------------+
double LotNormalize(double lot)
  {
   double minlot=MarketInfo(_Symbol,MODE_MINLOT);
   double maxlot=MarketInfo(_Symbol,MODE_MAXLOT);

   if(lot < minlot)lot = minlot;
   if(lot > maxlot)lot = maxlot;

   if(minlot==0.001) return(NormalizeDouble(lot,3));
   if(minlot==0.01)  return(NormalizeDouble(lot,2));
   if(minlot==0.1)   return(NormalizeDouble(lot,1));

   return(NormalizeDouble(lot,0));
  }
//+------------------------------------------------------------------+
string StrToType(int type)
  {
   if(type==OP_BUY)return("Buy");
   if(type==OP_SELL)return("Sell");
   return(NULL);
  }
//+------------------------------------------------------------------+
int New_Stop(int Parametr)
  {
   int Min_Dist=(int)MarketInfo(_Symbol,MODE_STOPLEVEL);
   if(Parametr<Min_Dist)
     {
      Parametr=Min_Dist*2+(int)MarketInfo(_Symbol,MODE_SPREAD);
      Alert(_Symbol," Увеличина дистанция стоп-приказа.");
     }
   return(Parametr);
  }
//+------------------------------------------------------------------+
int Fun_Error(string symbol,int Error)
  {
   switch(Error)
     {
      case 0:return(0);
      case 1:Alert(symbol," ",Error,":No error returned, but the result is unknown");return(2);
      case 2:Alert(symbol," ",Error,":Common error");return(2);
      case 3:Alert(symbol," ",Error,":Invalid trade parameters");return(2);
      case 4:Alert(symbol," ",Error,":Trade server is busy");Sleep(3000);return(1);
      case 5:Alert(symbol," ",Error,":Old version of the client terminal");return(2);
      case 6:Alert(symbol," ",Error,":No connection with trade server");Sleep(3000);return(1);
      case 7:Alert(symbol," ",Error,":Not enough rights");return(2);
      case 8:Alert(symbol," ",Error,":Too frequent requests");return(2);
      case 9:Alert(symbol," ",Error,":Malfunctional trade operation");return(2);
      case 64:Alert(symbol," ",Error,":Account disabled");return(2);
      case 65:Alert(symbol," ",Error,":Invalid account");return(2);
      case 128:Alert(symbol," ",Error,":Trade timeout");return(1);
      case 129:Alert(symbol," ",Error,":Invalid price");return(2);
      case 130:Alert(symbol," ",Error,":Invalid stops");return(2);
      case 131:Alert(symbol," ",Error,":Invalid trade volume");return(2);
      case 132:Alert(symbol," ",Error,":Market is closed");Sleep(10000);return(1);
      case 133:Alert(symbol," ",Error,":Trade is disabled");return(2);
      case 134:Alert(symbol," ",Error,":Not enough money");return(2);
      case 135:Alert(symbol," ",Error,":Price changed");return(1);
      case 136:Alert(symbol," ",Error,":Off quotes");Sleep(3000);return(1);
      case 137:Alert(symbol," ",Error,":Broker is busy");Sleep(3000);return(1);
      case 138:Alert(symbol," ",Error,":Requote");return(1);
      case 139:Alert(symbol," ",Error,":Order is locked");Sleep(10000);return(1);
      case 140:Alert(symbol," ",Error,":Buy orders only allowed");return(2);
      case 141:Alert(symbol," ",Error,":Too many requests");return(2);
      case 145:Alert(symbol," ",Error,":Modification denied because order is too close to market");Sleep(10000);return(1);
      case 146:Alert(symbol," ",Error,":Trade context is busy");Sleep(3000);return(1);
      case 147:Alert(symbol," ",Error,":Expirations are denied by broker");return(2);
      case 148:Alert(symbol," ",Error,":The amount of open and pending orders has reached the limit set by the broker");return(2);
      case 149:Alert(symbol," ",Error,":An attempt to open an order opposite to the existing one when hedging is disabled");return(2);
      case 150:Alert(symbol," ",Error,":An attempt to close an order contravening the FIFO rule");return(2);
      default:Alert(symbol,":Error - № ",Error);return(2);
     }
   return(0);
  }
 
Sergey Gritsay:

Voici comment je l'obtiens de mon coeur.

Oh... Sans déconner ! Je n'ai pas fait autant... ! Ouais, eh bien... Maintenant je sais pourquoi les choses ne fonctionnent pas comme elles le devraient.

Merci beaucoup, humainement.


 
Sergey Gritsay:

Tiens-le comme si ça venait de mon coeur.

Puis-je vous demander pourquoi vous faites ça ?

int total=OrdersTotal();

 
Vasyl Nosal:

Puis-je demander pourquoi cela est fait ?

int total=OrdersTotal();

En effet, pendant l'exécution de la boucle, la valeur deOrdersTotal(); peut changer et vous pouvez manquer un ordre ou le corps de la boucle peut avoir un problème.
Raison: