Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1620

 
Une variable, pas une citation. Il y a un compte dans une variable chaîne, et le double est converti en une variable chaîne avec la précision spécifiée. C'est bien sûr fort.
 
Soit dit en passant, il s'agit d'une citation en cinq chiffres qui arrive avec plus de cinq décimales. Je voulais faire une vérification automatique, il s'avère que ce n'est pas si facile dans ce langage. En attendant, je l'ai vérifié manuellement avec une imprimante. Il n'y a pas plus de cinq décimales, combien de fois cela arrive-t-il ? Peut-être que c'était au terminal 4 ?
 
OK, il y a une ignorance systématique des messages. Nous devrions recommencer un fil de discussion.
 
pribludilsa #:
Ok, il y a une ignorance systématique des messages. Nous devrions recommencer un fil de discussion.

il y a déjà eu des sujets sur ce thème. dans une chaîne et le nombre de chaînes à compter. Il faut d'abord compter le nombre de chiffres avant la virgule. Vous pouvez le convertir en un nombre entier. Et c'est tout aussi gênant de string)))).

 
Alexey Viktorov #:

Dans le testeur mt4 il n'est pas possible d'ouvrir des ordres sur d'autres paires, tout le reste est disponible sans problèmes.

Merci, il est en effet possible de récupérer les valeurs des indicateurs d'un autre instrument dans le testeur.
Alexander # :

Vérifiez la disponibilité des cotations sur AUDUSD, sur la bonne TF.

C'était exactement le problème. Le problème est que je testais un jour de congé (dimanche) et que j'ai "téléchargé" une archive de cotation pour le symbole requis (AUDUSD), mais il s'est avéré qu'elles ne pouvaient pas être téléchargées le jour de congé, car les serveurs de mon courtier en devises étaient indisponibles ce jour-là. Et aujourd'hui lundi, le téléchargement de l'archive des citations et le test ont réussi.
MakarFX #:
Je suis désolé, j'avais tort, je ne le savais pas moi-même.
Ce n'est pas grave, vos réponses dans les messages privés étaient beaucoup plus précieuses.

C'est vraiment bien que les gens répondent et s'entraident ici. Toutes les réponses ne se trouvent pas dans la documentation)
 
Valeriy Yastremskiy #:

il y a déjà eu des sujets sur ce thème. dans une chaîne et le nombre de chaînes à compter. Il faut d'abord compter le nombre de chiffres avant la virgule. Vous pouvez le convertir en un nombre entier. Et il est un peu délicat d'apporter)))) à une chaîne de caractères, aussi.

Oui, je voulais faire cela aussi, seulement la conversion de double en chaîne est faite avec la précision spécifiée, si la précision n'est pas spécifiée, 8 chiffres par défaut.

 
Valeriy Yastremskiy #:

il y a déjà eu des sujets sur ce thème. dans une chaîne et le nombre de chaînes à compter. Il faut d'abord compter le nombre de chiffres avant la virgule. Vous pouvez le convertir en un nombre entier. Et c'est tout aussi gênant de string)))).

La conversion des entiers, oui, c'est probablement la seule. J'y ai pensé aussi, mais ça me semblait trop compliqué de faire une sorte de cycle de multiplication ou de division par 10. Je n'y ai pas encore réfléchi.
 
MakarFX #:
//+----------------------------------------------------------------------------+
//| Модификация ордеров                           |
//+----------------------------------------------------------------------------+
void ModifyOrders(int otype)
{
 double
   BuyPriceMax = 0, BuyPriceMin = 0, BuyPriceMaxLot = 0, BuyPriceMinLot = 0, 
   SelPriceMin = 0, SelPriceMax = 0, SelPriceMinLot = 0, SelPriceMaxLot = 0;

   int
   BuyPriceMaxTic = 0, BuyPriceMinTic = 0, SelPriceMaxTic = 0, SelPriceMinTic = 0;

   double
   op = 0, lt = 0, order_lots = 0;

   int
   tk = 0, b = 0, s = 0;
   price = 0;tp = 0;

   for(int i = OrdersTotal() - 1; i >= 0; i--)
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         if(OrderMagicNumber() == Magic)
            if(OrderSymbol() == Symbol() &&  OrderType() == otype)
              {
               op = NormalizeDouble(OrderOpenPrice(), Digits());
               lt = NormalizeDouble(OrderLots(), 2);
               tk = OrderTicket();
               if(otype == OP_BUY)
                 {
                  b++;
                  if(op > BuyPriceMax || BuyPriceMax == 0)
                    {
                     BuyPriceMax    = op;
                     BuyPriceMaxLot = lt;
                     BuyPriceMaxTic = tk;
                    }
                  if(op < BuyPriceMin || BuyPriceMin == 0)
                    {
                     BuyPriceMin    = op;
                     BuyPriceMinLot = lt;
                     BuyPriceMinTic = tk;
                    }
                 }
               
               if(otype == OP_SELL)
                 {
                  s++;
                  if(op > SelPriceMax || SelPriceMax == 0)
                    {
                     SelPriceMax    = op;
                     SelPriceMaxLot = lt;
                     SelPriceMaxTic = tk;
                    }
                  if(op < SelPriceMin || SelPriceMin == 0)
                    {
                     SelPriceMin    = op;
                     SelPriceMinLot = lt;
                     SelPriceMinTic = tk;
                    }
                 }
               if (otype == OP_BUY || otype == OP_SELL) 
                  {
                   price += OrderOpenPrice() * OrderLots();
                   order_lots += OrderLots();
                  }
              }
//*************************************************************//
double   AwerageBuyPrice = 0, AwerageSelPrice = 0, avg_price = 0;
      if(b >= 2 && Drawdown >= DrawdownClosingMinMaxOrder)
         AwerageBuyPrice = NormalizeDouble((BuyPriceMax*BuyPriceMaxLot + BuyPriceMin*BuyPriceMinLot)/
         (BuyPriceMaxLot + BuyPriceMinLot) + TakeProfitMinMaxOrder* Point(), Digits());
      if(s >= 2 && Drawdown >= DrawdownClosingMinMaxOrder)
         AwerageSelPrice = NormalizeDouble((SelPriceMax * SelPriceMaxLot + SelPriceMin * SelPriceMinLot)/ 
         (SelPriceMaxLot + SelPriceMinLot) - TakeProfitMinMaxOrder* Point(), Digits());
      if (Drawdown < DrawdownClosingMinMaxOrder) 
         avg_price = NormalizeDouble(price / order_lots, Digits);
//*************************************************************//
   for(int i = OrdersTotal() - 1; i >= 0; i--)
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         if(OrderMagicNumber() == Magic)
            if(OrderSymbol() == Symbol())
              {
               op  = NormalizeDouble(OrderOpenPrice(), Digits());
               tp = NormalizeDouble(OrderTakeProfit(), Digits());
               lt  = NormalizeDouble(OrderLots(), 2);
               tk  = OrderTicket();

                  if(otype == OP_BUY && b >= 2 && Drawdown >= DrawdownClosingMinMaxOrder)
                    {
                     if(tk == BuyPriceMaxTic || tk == BuyPriceMinTic)
                        if(Bid < AwerageBuyPrice && tp != AwerageBuyPrice)
                           if(!OrderModify(tk, op, OrderStopLoss(), AwerageBuyPrice, 0, clrRed))
                              Print("OrderModify error #", GetLastError());

                     if(tk != BuyPriceMaxTic && tk != BuyPriceMinTic && tp != 0)
                        if(!OrderModify(tk, op, 0, 0, 0, clrRed))
                           Print("OrderModify error #", GetLastError());
                    }
                  if(otype == OP_SELL && s >= 2  && Drawdown >= DrawdownClosingMinMaxOrder)
                    {
                     if(tk == SelPriceMaxTic || tk == SelPriceMinTic)
                        if(Ask > AwerageSelPrice && tp != AwerageSelPrice)
                           if(!OrderModify(tk, op, OrderStopLoss(), AwerageSelPrice, 0, clrRed))
                              Print("OrderModify error #", GetLastError());

                     if(tk != SelPriceMaxTic && tk != SelPriceMinTic && tp != 0)
                        if(!OrderModify(tk, op, 0, 0, 0, clrRed))
                           Print("OrderModify error #", GetLastError());
                    }
                 if (Drawdown < DrawdownClosingMinMaxOrder)    
                 if (otype == OP_BUY) tp = NormalizeDouble (avg_price + TakeProfitGroupOrder*Point, Digits);
                 if (otype == OP_SELL) tp = NormalizeDouble (avg_price - TakeProfitGroupOrder*Point, Digits); 
                    {
                    if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
                      Print("Ордера успешно модифицированы!");
                      else Print("Ошибка модификации ордеров!");
                    } 
             } 
}
 
Valeriy Yastremskiy #:

Y a-t-il quelque chose que je ne sais pas ? De même, il n'est pas possible d'obtenir les données de barre des autres instruments en fonction de l'heure du testeur, elles seront reçues en fonction de l'heure actuelle. C'est pourquoi je ne peux pas tester la multidevise même juste dans la partie calcul dans 4ka.

J'ai toujours pensé que le testeur MT4 émule entièrement l'environnement d'un seul instrument, et MT5 l'environnement entier disponible.

Ou bien est-ce que ce n'est pas le cas ?

Valery, faites attention à la ligne

  sd = (int)MarketInfo("EURJPY", MODE_DIGITS);

dans mon code... J'utilise les fonctions hexa depuis longtemps, mais voici une fonction similaire

SymbolInfoInteger("EURJPY", SYMBOL_DIGITS);

a donné un stackey 0.

Donc, pensez à l'endroit où se trouve le bug... Et puisque mt4 refuse de le supporter, vous pouvez supposer qu'il ne sera jamais corrigé...

Tout le reste doit être vérifié. Je ne m'en suis pas occupé depuis si longtemps que je ne veux même pas m'en souvenir.

 

Alexey Viktorov #:

J'utilise les fonctions du vendredi depuis longtemps.

Pouvez-vous me suggérer où je peux apprendre MQL5 (en russe) ?