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

 
Vadim Novikov:

Bonjour à tous ceux qui se sentent concernés !


Je suis un utilisateur avancé. Mais je n'écris pas souvent. C'est pourquoi je ne peux pas suivre certaines innovations. Et parfois j'oublie des choses.


S'il te plaît, aide-moi à répondre à une question. Je n'arrive pas à me souvenir d'une chose.


Voici la situation. J'ai défini des variables externes. J'en ai défini beaucoup. 20 variables.Ils sont affichés dans le menu de saisie du programme, lorsque vous attachez ce programme au graphique.


Voici la question. Je ne me souviens pas. Comment séparer les blocs de ces variables avec des commentaires ? Dans le menu de saisie. Par exemple :


Il s'agit d'un blocage sur la modification des variables MA (commentaire)

Période MA

Méthode de réglage MA

Prix MA

Il s'agit d'un bloc sur la modification des variables MACD (commentaire)

..........................

...........................

...........................

Il s'agit d'un blocage sur la modification des variables BB (commentaire)

.........................

..............................

...........................


Il semble qu'avant je saisissais de tels commentaires avec la fonction commentaire du code.C'est-à-dire que j'ai écrit // ou /* */. Mais maintenant quelque chose ne fonctionne pas.

   extern string     a1             = "Это  блок  по  изменению   переменных   MA (комментарий)";
   ..............
   ..............
   ..............
   extern string     a2             = "Это  блок  по  изменению  переменных   MACD (комментарий)";

Comme ceci

 
OrderStopLoss() affiche deux décimales. Puis-je le forcer à afficher trois décimales ?
 
Alekseu Fedotov:

Comme ça.

Merci, ça me fait penser ! !!

 
Igor Golieniev:

Essayez comme ça :

Print("SL: ", DoubleToString(OrderStopLoss(), Digits()));

Ceci afin de montrer tous les chiffres significatifs de la citation. Si un autre nombre de chiffres est nécessaire, remplacez Digits() par un nombre spécifique.

 
Bonsoir, des conseils s'il vous plaît. Dans la fonction OnInit, on crée deux lignes horizontales, dans OnTick deux fonctions, l'une envoie une notification push et mail si Bid > première ligne, la seconde si Bid < deuxième ligne. Bid=line ne l'a pas fait, pour éviter les lacunes. Bien sûr, j'ai aussi été confronté au fait que si la condition est remplie, la notification arrive à chaque cochage, ce qui est mauvais. Comment résoudre ce problème ? Vous pouvez définir le délai ou le nombre de notifications dans les paramètres d'alerte standard.
 
Ihor Herasko:

Essayez comme ça :

Ceci afin de montrer tous les chiffres significatifs de la citation. Si vous avez besoin d'un autre nombre de chiffres, remplacez Digits() par un nombre spécifique.

Maintenant il imprime correctement 15,155, cependant - stoploss invalide pour la fonction OrderModify.

Ce problème ne concerne que Silver dans OrderModify.

void Trailing()
  {
   if(Digits==3 || Digits==5)
     {
      TrailingStep *= 10;
      TrailingOpen *= 10;
      TrailingStop *= 10;
     }
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid>OrderOpenPrice()+TrailingOpen*Point)
                 {
                  if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep)*Point)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),0,0))
                        Print("Oshibka =", DoubleToString(OrderStopLoss(), Digits()));
                    }
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(Ask<OrderOpenPrice()-TrailingOpen*Point)
                 {
                  if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep)*Point)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*Point,Digits),0,0))
                        Print("Oshibka", DoubleToString(OrderStopLoss(), Digits()));
                    }
                 }
              }
           }
        }
     }
  }
 
Igor Golieniev:

L'impression est maintenant correcte : 15 155 dans Print, mais le stoploss n'est pas valide pour la fonction OrderModify.

Ce problème ne concerne que Silver dans OrderModify.

Deux erreurs peuvent être observées dans ce code :

  1. Absence de vérification de la taille minimale autorisée des arrêts (appelée niveau d'arrêt).
  2. Comparaison incorrecte de nombres réels.

Pour résoudre le premier problème, nous devons obtenir le niveau d'arrêt actuel :

double fStopLevel = SymbolInfoInteger(Symbol(), SYMBOL_TRADE_STOPS_LEVEL) * Point();

Si fStopLevel s'avère être zéro et que le type de compte n'est pas ECN, alors fStopLevel doit être forcé à être égal à trois spreads.

Avant de fixer des stops (à la fois Stop Loss et Take Profit), vérifiez que le nouveau niveau est égal ou supérieur au Stop Level à partir du prix de clôture de l'ordre. Pour vérifier le stop d'un ordre d'achat, il faut procéder comme suit :

if (Bid - fNewSL - fStopLevel < -Point() / 10)
{
  // Такой стоп ставить нельзя. Ближайший возможный уровень: Bid - fStopLevel
}

Pour un ordre de vente stop :

if (fNewSL - Ask - fStopLevel < -Point() / 10)
{
   // Stop Loss на цене fNewSL ставить нельзя. Ближайший возможный уровень: Ask + fStopLevel
}


La solution au second problème: comparer des valeurs réelles avec une certaine précision, car l'égalité des nombres réels ne peut pas être atteinte toujours et partout. J'ai déjà donné un exemple de comparaison ci-dessus dans le code de validation du niveau d'arrêt.

 
Ihor Herasko:

Il y a deux erreurs dans ce code qui sont frappantes :

  1. Absence de contrôle de la taille minimale autorisée des arrêts (appelée niveau d'arrêt).
  2. Comparaison incorrecte de nombres réels.

Pour résoudre le premier problème, nous devons obtenir le niveau d'arrêt actuel :

Si fStopLevel s'avère être zéro et que le type de compte n'est pas ECN, alors fStopLevel doit être forcé à être égal à trois spreads.

Avant de fixer des stops (à la fois Stop Loss et Take Profit), vérifiez que le nouveau niveau est égal ou supérieur au Stop Level à partir du prix de clôture de l'ordre. Pour vérifier le stop d'un ordre d'achat, il faut procéder comme suit :

Pour un ordre de vente stop :


La solution au second problème: comparer des valeurs réelles avec une certaine précision, car l'égalité des nombres réels ne peut pas être atteinte toujours et partout. J'ai déjà donné un exemple de comparaison ci-dessus dans le code de validation du niveau d'arrêt.

Merci.

Cependant, la question n'est pas close. OrderModify commence à se déclencher immédiatement lorsqu'un ordre est ouvert. Où se trouve l'erreur ? (Je répète - sur toutes (toutes) les devises/futures cela fonctionne, sur l'argent cela ne fonctionne pas)

 
Igor Golieniev:

Merci.

Cependant, la question n'est pas close. OrderModify commence à se déclencher immédiatement lorsqu'un ordre est ouvert. Où se trouve l'erreur ? (Je répète - sur toutes (toutes) les devises/futures cela fonctionne, sur l'argent cela ne fonctionne pas)

1. Directive

#property strict

utilisez-vous ?

2) Cela se produit-il avec la vente et l'achat, ou seulement avec la vente ?

3. Le Stop Loss est-il fixé à l'ouverture de la position ou le trader doit-il le fixer si possible ?

Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Igor Golieniev:

Merci.

Cependant, la question n'est pas close. OrderModify commence à fonctionner dès qu'une commande est ouverte. Où se trouve l'erreur ? (Je répète - il fonctionne sur toutes les devises/futures, il ne fonctionne pas sur l'argent)

Affichez l'extrait de journal (si vous êtes en ligne, l'onglet Experts) où vous pouvez voir l'ouverture et les modifications de l'ordre au marché et indiquer quelles valeurs de TrailingStop et de TrailingStep ont été utilisées.

Raison: