conseiller expert - questions diverses - page 23

 

Je le recommande.

Lorsque vous aurez résolu tous ces problèmes, vous pourrez vous considérer comme un pro.

Rendez les choses aussi difficiles que possible, c'est ainsi que vous apprendrez le plus.

Sinon, vous vous débattez sans cesse avec les choses les plus simples.

 

Tout d'abord, merci beaucoup pour vos commentaires.

Après vos commentaires, j'ai décidé de créer à nouveau des blocs de code de modification de commande pour être sûr et pour les tester.

 

Monsieur @Marco vd Heijden

Après vos plus grands commentaires / exemples - j'ai déjà écrit un code pour les drags pour les prix Take Profit.
Mais en fait, je suis contre les mises à jour continues. Pourquoi ? Depuis que j'ai écrit des blocs de code pour les drags de Take Profit, je vois que mon graphique devient lent. Peut-être ai-je fait des erreurs dans cette partie du code. Je le vérifierai après avoir résolu ce problème.

( pendant que j'essayais de résoudre mon problème par moi-même, après avoir essayé plusieurs fois, j'ai pensé qu'il n'y avait aucune chance d'arrêter le calcul si j'utilisais l'opérateur de boucle " for " ).

Je voudrais mentionner que j'ai déjà calculé les tailles de Take Profit et de Stop Loss, c'est pourquoi j'ai supprimé l'opérateur " Switch " du code ci-dessous.
J'essaie simplement de savoir quand le prix du Take Profit sera égal au prix de la " Ligne " - alors le stop calcule / met à jour jusqu'à la prochaine fois que le prix du Take Profit " != " prix de la Ligne.
Q : J'ai
du mal à corriger le code ci-dessous pour mon problème. Que puis-je faire, s'il vous plaît ?
Q : Est-ce que je fais une erreur en n'utilisant pas l'opérateur " Switch " pour ce problème ?

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   for(int order=OrdersTotal(); order>=0; order--)
     {
      bool selected=OrderSelect(order,SELECT_BY_POS);
        {
         if(selected==1)
           {
            if(Symbol()==OrderSymbol()) // only for current chart symbol
              {
               /* I just try for - if price not equal != "Line OBJPROP_PRICE "
                  stop updates */


               // if objects not found - create them
               // ...
               // if objects exist
               // ...
               while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
                 {
                  PlaySound("ok.wav");
                  price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
                  Comment(price);
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+

Bien que j'ai lu la documentation et le livre pour OrderModify() avec des exemples, je n'ai pas vu d'exemple correspondant exactement à mon problème.

Je vous souhaite bonne chance !

 

Je n'ai pas suivi le fil de discussion, donc j'ai peut-être manqué ce que vous faites.

Tout d'abord, simplifiez :

for(int order=OrdersTotal(); order>=0; order--)
     {
      bool selected=OrderSelect(order,SELECT_BY_POS);
        {
         if(selected==1)
Ça devrait devenir.. :
for(int order=OrdersTotal()-1; order>=0; order--)
     {
      if(OrderSelect(order,SELECT_BY_POS)

Pensez aussi à la fréquence à laquelle vous déplacez la ligne. Est-ce une fois par seconde ? Probablement pas.

Mettez votre code dans OnChartEvent() :

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
  {
   if(id==CHARTEVENT_OBJECT_DRAG && sparam=="line") // the chart event of dragging the line

Vous appelez la même fonction plusieurs fois pour chaque ordre ouvert que vous avez :

while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
  {
   PlaySound("ok.wav");
   price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
   Comment(price);
  }

Appelez-la une fois avant d'entrer dans la boucle d'ordre :

double lineprice=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
for(int order=OrdersTotal()-1; order>=0; order--)
  {  
 

Assurez-vous de bien comprendre le principe des boucles while.

C'est dangereux car si, pour une raison quelconque, un autre EA tente de modifier la valeur du prix de la ligne, ce morceau de code sera bloqué dans une boucle sans fin et votre terminal se bloquera très probablement.

Cela se termine généralement par une terminaison anormale.

Puisque vous utilisez l'objet "line", le danger n'est cependant pas aussi grand que lorsque vous parlez des niveaux tp et sl qui sont envoyés au serveur par OrderModify(), donc à moins que vous ne prévoyiez d'écrire un autre EA qui interfère avec "line", cela ne devrait pas être un problème.

 
honest_knave:

Je n'ai pas suivi le fil de discussion, donc j'ai peut-être manqué ce que vous faites.


Appelez-le une fois avant d'entrer dans la boucle de l'ordre :

double lineprice=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
for(int order=OrdersTotal(); order>=0; order--)
  {  

Comprenez bien ce qu'il essaie de faire.

Il doit appeler deux fois et comparer les valeurs afin de voir si la ligne a été déplacée.

C'est impossible à faire sans lire la valeur deux fois.

while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))// if price differs from "line" value do:
  {
   PlaySound("ok.wav");
   price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);// now overwrite old line value with new line value.
   Comment(price);
  }
 
Marco vd Heijden:

Veuillez comprendre ce qu'il essaie de faire.

Il doit appeler deux fois et comparer les valeurs afin de voir si la ligne a été déplacée.

C'est impossible à faire sans lire la valeur deux fois.

Il faut que vous m'expliquiez cela à nouveau.

Si vous avez un CHARTEVENT_OBJECT_DRAG et que le sparam est "ligne", alors la ligne s'est déplacée.

Dans les rares cas où elle se déplace dans le temps le long du même cours, la pénalité n'est pas très importante.

 

Il existe de nombreuses façons de faire la même chose.

Si vous décidez d'utiliser le CHARTEVENT, n'oubliez pas qu'il ne fonctionne pas dans le testeur.

 
OK, je m'en remets à vous. Bonne chance.
 

J'ai déjà lu vos commentaires bénéfiques, M. Marco, M. Knave, M. William, merci beaucoup pour tous ces commentaires !

Maintenant, j'ai déjà vérifié certaines choses et j'ai décidé que je pouvais écrire ( / et vérifier) OrderModify() étape par étape. Parce que cet OrderModify() est vraiment très dangereux pour moi.
Plusieurs fois, j'ai déjà été confronté à des modifications erronées. Mais quand j'essaie de faire face aux mêmes problèmes / questions, que je sais avec certitude d'où vient le problème, même si j'essaie les mêmes choses dans le tableau que les problèmes / questions ne se sont pas reproduits. Après quelques heures, j'ai été confronté au même problème à nouveau.
Je ne sais toujours pas exactement quelle est la cause de ce problème. Quel est le problème que je veux dire. J'ai déjà partagé l'un d'eux avec vous dans mes commentaires précédents. J'ai également ouvert une position par l'EA de mon Trade Panel, c'est OK ! puis j'ai essayé d'ouvrir une limite de vente par la méthode de commerce manuel. (mon Trade Panel n'a pas encore d'ordres en attente de limite de vente ou d'arrêt de vente).

Donc, je pense que je devrais partager ce code de bloc avec vous, mais je ne peux pas le partager pour le moment parce que je travaille encore dessus. Je veux déplacer ces codes de bloc vers OnChartEvent() - parce que je vais aussi y ajouter des boutons.

Problème : Je n'arrive pas à écrire un code si l'ordre est fermé, alors je supprime ses objets, comme ceci, Stop Loss, Take Profit, Open, Close ou quelque chose comme ça, s'il vous plaît aidez-moi.
Question : Les lignes Stop Loss et Take Profit se trouvent également devant les objets du Trade Panel. Je sais que cela est dû à la création d'un objet la dernière fois. Mais si vous me comprenez, dites-moi comment faire pour que l'objet Trade Panel soit devant tous les autres objets sans les lignes " Stop Loss et Take Profit ".

Merci d'avance.