conseiller expert - questions diverses - page 30

 
honest_knave:

Un examen superficiel suggère que ça devrait fonctionner. Mais vous pourriez en améliorer l'efficacité.

Pensez au nombre d'objets différents que vous avez dessinés sur votre graphique. Si vous cliquez sur *n'importe lequel* de ces objets, vous allez parcourir en boucle chaque ordre et essayer de trouver une correspondance. De nombreux objets n'ont probablement rien à voir avec les commandes. C'est inefficace.

C'est pourquoi j'ai suggéré de vérifier le premier caractère de sparam pour "#". Cela permet d'identifier automatiquement l'objet comme étant lié à une commande.

En outre, il n'est pas nécessaire de parcourir les commandes en boucle. Le nom de l'objet et/ou le texte de l'objet contient déjà le numéro de ticket. Il suffit donc d'en extraire le numéro de ticket et de fermer la commande.

Exemple :

Vous ouvrez une commande. Le numéro de ticket 12345 lui est attribué.

Créez un OBJ_BUTTON avec le nom"#12345".

Le code dans OnChartEvent() serait quelque chose comme ceci (non compilé, non testé, tard dans la nuit...) :

if(id==CHARTEVENT_OBJECT_CLICK && StringSubstr(sparam,0,1)=="#") // this is an order button
  {
   int ticket=(int)StringSubstr(sparam,1); // extract the ticket number
   if(OrderSelect(ticket,SELECT_BY_TICKET)) // select the order
     {
      if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,CLR_NONE)) // close the order
        {
         Print("# Error ",GetLastError());
        }
     }
  }
(vous voudrez probablement gérer le OrderSelect aussi, en cas d'échec)

Wow ! Je ne savais pas cela.

Donc, vous l'avez mentionné deux fois, et je n'ai exactement pas compris cela.
Je vais maintenant le tester moi-même et l'intégrer à mon fichier EA principal.

Merci beaucoup plus.

 

J'utilise OrderTicket() pour les autres objets, maintenant je vois que lorsque je clique sur ces objets, la commande se ferme.
J'ai aimé votre méthode, mais il semble qu'elle influence d'autres objets.

D'autres objets portent le même nom, en voici un.

"#"+IntegerToString(OrderTicket())+" -"+"Object HLine"

Merci d'avance.

 
Max Enrik:

J'utilise OrderTicket() pour d'autres objets, maintenant je vois que lorsque je clique sur cet objet, la commande se ferme.
J'ai aimé votre méthode, mais il semble qu'elle influence d'autres objets.

D'autres objets portent le même nom, en voici un.

"#"+IntegerToString(OrderTicket())+" -"+"Object HLine"

Merci d'avance.

La solution la plus élégante consiste à modifier votre système de dénomination.

Néanmoins, vous pouvez toujours supprimer le numéro de commande. Cela dépend simplement du format de dénomination exact.

Mais avant tout cela, quel est l'OBJPROP_TEXT du bouton ? D'autres objets ont-ils le même OBJPROP_TEXT ?

 
honest_knave:

La solution la plus élégante est de changer votre système de dénomination.
Néanmoins, vous pouvez toujours supprimer le numéro de commande. Cela dépend simplement du format de nommage exact.
Mais avant tout cela, quel est l'OBJPROP_TEXT du bouton ? D'autres objets ont-ils le même OBJPROP_TEXT ?

Je sais que je peux changer les noms des objets Bouton (j'utilise aussi Prefix). Je sais que je peux changer les noms des objets Bouton (j'utilise aussi le Préfixe) si je change les noms des boutons alors je pourrais changer beaucoup de choses, par exemple supprimer le système et d'autres choses qui sont toutes liées les unes aux autres.

Ci-dessous, les noms des boutons et des lignes aériennes.

"#"+IntegerToString(OrderTicket())+" -"+"Object HLine"
"#"+IntegerToString(OrderTicket())+" -"+"Object Button"

(Bien sûr, les noms des objets sont un peu plus différents, mais la méthode est la même).

Merci d'avance.

 

Marché fermé

J'ai peut-être trouvé, mais je ne suis pas sûr.
Si ce n'est pas bon, faites-le moi savoir.

if(id==CHARTEVENT_OBJECT_CLICK && StringFind(sparam,"close order button",0)>=0)

Merci d'avance.

//--- 2ème fois édité

Hé ! Mec !

Merci beaucoup. Jusqu'à présent, aucun problème. Ça marche correctement !

 

#Objets croisés - Ouvrir

J'ai été confronté plusieurs fois à ce problème, parfois j'ai réussi, parfois j'ai abandonné, maintenant je ne voudrais pas abandonner une fois de plus.
J'ai 2 objets " HLine et Button " ils se croisent, je veux dire que lorsque je clique sur l'un d'entre eux, les deux sont sélectionnés ce qui n'est pas une bonne chose pour moi. ( BUTTON Width = 20, HLINE Width = comme vous le savez )

Q : Comment puis-je faire en sorte que lorsque je clique sur l'objet BUTTON, l'objet HLINE ne soit pas sélectionné alors qu'ils se croisent, s'il vous plaît ?
( Je peux facilement sélectionner HLINE là où ils ne se croisent pas )

Merci d'avance.

(Je suis en train de travailler dessus, tout bon commentaire serait le bienvenu).

 

#Profit in Pips - Open |#Profit in Pips - Closed for now - Je l'ai résolu

M. William- J'utilise vos codes de calcul " Pip, Point ... J'utilise vos codes de calcul " Pip, Point ... ".
J'essaie maintenant d'obtenir le profit en valeur de pips avec les codes ci-dessous. J'ai 2 ordres, l'un d'entre eux s'affiche correctement ( OP_BUY ), le second ne s'affiche pas correctement - 399 - 400 réel ( OP_SELL ).

Q : Est-ce que je me trompe dans le calcul du profit en pips, s'il vous plaît ?

change_to_pips( OrderTakeProfit() - OrderOpenPrice() )

Merci d'avance.

(La journée dernière, j'ai consulté des forums sur différents sites Web - ce qui ne m'a pas été bénéfique).

 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Publication de la version 574 de MetaTrader 4 avec mise à jour du langage MQL4 et du marché des applications

whroeder1, 2014.01.27 14:11

  1. N'écrivez pas du code illisible et incompréhensible comme ça.
    if (MyOrdersTotal() == 0 && (Hour()​>=​StartHour ​&& Hour()​<​EndHour && StartHour​<​EndHour) || (Hour()​>=​StartHour || Hour()​<​EndHour && StartHour​>​EndHour))
    Rendez-le lisible et simplifiez-le et mettez toujours entre parenthèses lorsque vous mélangez des et/ou.
    bool    isHourOKnorm = StartHour < EndHour
                         && StartHour <= Hour() && Hour() < EndHour,
            isHourOKwrap = StartHour > EndHour
                         && (StartHour <= Hour() || Hour() < EndHour),
         isHourOK       = isHourOKnorm || isHourOKwrap;
    if(MyOrdersTotal() == 0 && isHourOK)
  2. Qu'en est-il du cas où StartHour == EndHour (c'est-à-dire tous les 24 ?) Voir mon code et éviter les 24 heures.

Un des étonnants exemple d'opérateur " si " d'une condition complexe de monsieur William.
Juste
merci !


J'ai lutté ces deux derniers jours pour corriger ma condition complexe de l'opérateur " if ", mais je ne pouvais pas résoudre mon problème jusqu'à ce que je trouve l'excellent exemple ci-dessus.

 

S'il vous plaît, que quelqu'un m'aide, j'ai vraiment du mal à résoudre ce problème.

#296

Merci d'avance.

 

Le code ci-dessous fonctionne parfois parfaitement, parfois non. Je n'arrive pas à résoudre ce problème. Lorsque j'utilise une seule commande, cela fonctionne parfaitement, mais lorsque j'ouvre plusieurs commandes, cette fonction ne fonctionne pas correctement.
S'il vous plaît aidez-moi, et un peu un peu plus d'explications (que ce qui est faux à la ci-dessous code) qui serait mieux pour moi.

( Maintenant, j'y travaille. )

if(id==CHARTEVENT_OBJECT_CLICK && (StringFind(sparam,Button_1,0)>=0 || StringFind(sparam,Button_2,0)>=0))
  {
   ticketnumber=(int) StringSubstr(sparam,1);

   if(OrderSelect(ticketnumber,SELECT_BY_TICKET))
     {
      if(StringFind(sparam,Button_1,0)>=0)
        {
         // ...
        }

      if(StringFind(sparam,Button_2,0)>=0)
        {
         //...
        }

      for(i=OrdersTotal()-1; i>=0; i--)
        {
         if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
         if(Symbol()!=OrderSymbol()) continue;

         update_1();
         update_2();
         update_3();
        }
     }
  }

Merci d'avance.