Questions des débutants MQL4 MT4 MetaTrader 4 - page 91

 
Jenya77769:

Bonjour ! Les deux nombres moins q et w sont comparés de manière incorrecte, alors qu'ils sont égaux, l'opérateur if pense que l'un est plus grand que l'autre.Quelle est l'erreur ? Lorsque q = -0.0002 et que w est également -0.0002, res12=faux, pourquoi ?

parce que c'est un double et qu'ils ne sont pas exactement égaux.

FIGURE : comparer les valeurs normalisées

 
Jenya77769:

Bonjour ! Les deux nombres moins q et w sont comparés de manière incorrecte, alors qu'ils sont égaux, l'opérateur if pense que l'un est plus grand que l'autre.Quelle est l'erreur ? Lorsque q = -0.0002 et que w est également -0.0002, res12=faux, pourquoi ?


Comparez leur différence à zéro, c'est plus correct et fonctionne pour les nombres de tout type.

 

Les gens, voici une question -

Il y a une ligne horizontale, d'une journée.

Il a une étiquette de texte, un objet étiquette.

Comment faire pour que cette étiquette texte soit toujours au milieu de la ligne (au milieu de la journée), quel que soit le zoom du graphique ?

 
John Smith:

Les gens, voici une question -

Il y a une ligne horizontale, d'une journée.

Il a une étiquette de texte, un objet étiquette.

Comment faire pour que cette étiquette texte soit toujours au milieu de la ligne (au milieu de la journée), quel que soit le zoom du graphique ?

Changez la coordonnée X de l'étiquette, c'est-à-dire calculez-la comme le milieu de la ligne.
 
Renat Akhtyamov:
Modifiez la coordonnée X du marqueur, c'est-à-dire calculez-la comme le milieu de la ligne.

C'est compréhensible, mais comment faire ?


J'avais une deuxième option - avec un marqueur lié au début de la journée, en utilisant une variable texte pour insérer des espaces devant la valeur du marqueur, en fonction du zoom du graphique.

En gros, je veux que l'étiquette soit à gauche en cas de zoom rapproché, et qu'en cas de zoom arrière, l'étiquette soit déplacée au milieu. Comme les niveaux de zoom dans mt4 sont standard, il n'est pas si difficile de trouver le bon nombre d'espaces pour chaque niveau de zoom. Mais voici une question : mql4 dispose-t-il d'une telle fonction qui déterminerait le niveau de zoom actuel du graphique ?

Ensuite, tout sera simple, quelque chose comme ceci : "si chartzoom = 50% alors spacesnumber = 10", etc.

Où spacesnumber est une variable de type chaîne qui définit le nombre d'espaces avant le texte de l'étiquette, comme __________1.23456 - il y a 10 espaces avec le signe _.

 
John Smith:

C'est compréhensible, mais comment faire ?


J'avais une deuxième option - avec un marqueur lié au début de la journée, en utilisant une variable texte pour insérer des espaces devant la valeur du marqueur, en fonction du zoom du graphique.

En gros, je veux que l'étiquette soit à gauche en cas de zoom rapproché, et qu'en cas de zoom arrière, l'étiquette soit déplacée au milieu. Comme les niveaux de zoom dans mt4 sont standard, il n'est pas si difficile de trouver le bon nombre d'espaces pour chaque niveau de zoom. Mais voici une question : mql4 dispose-t-il d'une telle fonction qui déterminerait le niveau de zoom actuel du graphique ?

Ensuite, tout sera simple, quelque chose comme ceci : "si chartzoom = 50% alors spacesnumber = 10", etc.

Où spacesnumber est une variable de type chaîne qui définit le nombre d'espaces avant le texte de l'étiquette, comme __________1.23456 - il y a 10 espaces avec le signe _.

Lisez mes commentairesici
 

Bonjour à tous, j'ai encore besoin d'aide. Je n'arrive pas à comprendre quelle est l'erreur. Chalutage à nouveau. Chalut par MA. Je dois passer en revue plusieurs commandes. Il peut y avoir des boucles. Tant qu'il y a un ordre ouvert, tout fonctionne parfaitement. Dès qu'un ordre supplémentaire est ouvert, la bacchanale commence - modification constante (avec un seul et même paramètre) du premier ordre (l'erreur 1 n'est pas montrée). Dans ce cas, le second ordre est modifié comme il se doit - lorsque les conditions appropriées sont réunies (le premier ordre, lorsque les conditions changent, modifie ses paramètres et poursuit sa modification constante avec de nouveaux paramètres). Je ne trouve pas la raison. Qui serait en mesure de me donner un indice ?

void TrailingStop()
{
   int i;
   int k          = OrdersTotal(); 
   double Ma      = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORLIPS, 1); 
   int MinDistans = int(MarketInfo(Symbol(), MODE_STOPLEVEL));
   
   double lips1  = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORLIPS, 1); 
   double lips2  = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORLIPS, 2);
   double teeth1 = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORTEETH, 1);
   double teeth2 = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORTEETH, 2);
   double jaw1   = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW , 1);
   double jaw2   = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW , 2);
   
   for (i = 0; i < k; i++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if(OrderType() == OP_BUY)
            {
               if(lips2 < teeth2 && teeth2 < jaw2 && lips1 < teeth1 && teeth1 < jaw1)
                  break;
               
               if(lips2 > teeth2 && teeth2 > jaw2 && lips1 > teeth1 && teeth1 > jaw1)
               {   
                  if((OrderStopLoss() + TrailingStep*Point) < Ma)
                  {
                     double Sl = NormalizeDouble(Ma, Digits);                 
                     
                     if((Bid - MinDistans) > Sl && (OrderStopLoss() + TrailingStep*Point) < Sl)
                     { 
                        OrderModifyX(OrderTicket(), OrderOpenPrice(), Sl, OrderTakeProfit(), OrderExpiration(), 0);
                     }
                  }
               }
            }
         }
      }     
 
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))  
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if(OrderType() == OP_SELL)
            {
               if(lips2 > teeth2 && teeth2 > jaw2 && lips1 > teeth1 && teeth1 > jaw1)
                  break;
                  
               if(lips2 < teeth2 && teeth2 < jaw2 && lips1 < teeth1 && teeth1 < jaw1)
               {
                  if(MathAbs(OrderStopLoss() - TrailingOpen*Point) > Ma)
                  {
                     double Sl = NormalizeDouble(Ma, Digits);
                 
                     if((Ask + MinDistans) < Sl && (OrderStopLoss() - TrailingStep*Point) > Sl)
                     {
                        OrderModifyX(OrderTicket(), OrderOpenPrice(), Sl, OrderTakeProfit(), OrderExpiration(), 0);
                     }
                  }
               }
            }
         }
      }
   }
}



 
Youri Lazurenko:

Bonjour à tous, j'ai encore besoin d'aide. Je n'arrive pas à comprendre quelle est l'erreur. Chalutage à nouveau. Chalut par MA. Je dois passer en revue plusieurs commandes. Il peut y avoir des boucles. Tant qu'il y a un ordre ouvert, tout fonctionne parfaitement. Dès qu'un ordre supplémentaire est ouvert, la bacchanale commence - modification constante (avec un seul et même paramètre) du premier ordre (l'erreur 1 n'est pas montrée). Dans ce cas, le second ordre est modifié comme il se doit - lorsque les conditions appropriées sont réunies (le premier ordre, lorsque les conditions changent, modifie ses paramètres et poursuit sa modification constante avec de nouveaux paramètres). Je ne trouve pas la raison. Qui peut m'aider ?


1. Le cycle devrait être inversé.

2. à quoi sert la pause ?

 
Artyom Trishkin:

1. Le cycle doit être inversé.

2. à quoi sert la pause ?


Bonjour.

1 - "La boucle doit être inverse" - voulez-vous dire for(i = k ; i > 0 ; i--) ?

2. "C'est pour quoi la pause ?" - Pour sortir. En général, au début, après avoir sélectionné le type d'ordre et s'il s'agit d'une rupture de tendance. Ensuite, nous sélectionnons à nouveau le type d'ordre et s'il est en tendance, nous le modifions.

Cette variante de rupture m'a déjà aidé auparavant. Lorsque vous avez suggéré une solution pour le chalutage par MA. Si, par exemple, sur une transaction d'achat, le stop était au-dessus de la MA, j'obtenais l'erreur 1 jusqu'à ce que la MA soit au-dessus du stop, après quoi l'erreur disparaissait. Lorsque j'ai introduit la condition selon laquelle si le stop est au-dessus de la MA, alors il faut casser, tout est revenu à la normale.

 
Youri Lazurenko:

Bonjour.

1 - "La boucle doit être inversée" - voulez-vous dire for(i = k ; i > 0 ; i--) ?

2. "C'est pour quoi la pause ?" - Pour sortir. En général, au début, après avoir sélectionné le type d'ordre et s'il s'agit d'une rupture de tendance. Ensuite, nous sélectionnons à nouveau le type d'ordre et s'il est en tendance, nous le modifions.

Cette variante de rupture m'a déjà aidé auparavant. Lorsque vous avez suggéré une solution pour le chalutage par MA. Si, par exemple, sur une transaction d'achat, le stop était au-dessus de la MA, j'obtenais l'erreur 1 jusqu'à ce que la MA soit au-dessus du stop, après quoi l'erreur disparaissait. Lorsque je pose la condition que si le stop est au-dessus de la MA, tout s'est normalisé.

La rupture complète la boucle. Qu'en est-il du reste des postes alors ?
Vérifiez où se trouve le stop par rapport à son nouveau niveau.
La boucle inverse de OrdersTotal()-1 à >=0
Raison: