conseiller expert - questions diverses - page 29

 
honest_knave:
Postez votre code où vous obtenez le OrderTicket pour faire le nom.

( Quand quelqu'un a besoin d'un code - je tarde à le poster rapidement - parce que j'utilise les fonctions OBJECT_****, c'est un peu différent des documentations d'objets).

Le code ci-dessous est dans OnTick().

for(i=OrdersTotal()-1;i>=0;i--)
  {
   if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
   if(Symbol()!=OrderSymbol()) continue;
   ObjectCreate(0,"#"+IntegerToString(OrderTicket())+" -"+"Object Button",OBJ_BUTTON,0,0,0);
  }

Maintenant, j'essaie d'appeler cet objet par le OnChartEvent() comme ci-dessous.

if(id==CHARTEVENT_OBJECT_CLICK && sparam=="#"+IntegerToString(OrderTicket())+" -"+"Object Button")
  {
   // when click this button - do something...
  }

Merci d'avance.

 
Il n'est pas à l'intérieur de la boucle de commande, donc il ne connaît pas l'OrderTicket().
 
Marco vd Heijden:
Il n'est pas à l'intérieur de la boucle de commande, il ne connaît donc pas la fonction OrderTicket().
Alors, n'y a-t-il aucune chance ?
 
Max Enrik:
Alors, n'y a-t-il aucune chance ?

La plupart des choses sont possibles. Mais je ne comprends pas bien ce que vous essayez de faire. Quel est ce bouton ? Que voulez-vous faire lorsqu'il est cliqué ?

Vous pouvez probablement obtenir le résultat souhaité, mais votre approche devra peut-être être modifiée.

 
honest_knave:

La plupart des choses sont possibles. Mais je ne comprends pas bien ce que vous essayez de faire. Quel est ce bouton ? Que voulez-vous faire lorsqu'il est cliqué ?

Vous pouvez probablement obtenir le résultat souhaité, mais votre approche devra peut-être être modifiée.


Mon but est que cet objet bouton puisse montrer les billets nubers et leur profit quand je clique dessus, que le nuage de commande ferme.

J'ai écrit ce commentaire depuis un appareil mobile. Donc, je vais commencer à faire des recherches sur ce problème après 10 heures plus tard. Merci pour vos commentaires.
 
Max Enrik:

Mon but est que cet objet bouton puisse montrer les numéros de tickets et leur profit lorsque je clique dessus, ce nuage de commande se ferme.

J'ai écrit ce commentaire depuis un appareil mobile. Donc, je vais commencer à faire des recherches sur ce problème après 10 heures plus tard. Merci pour vos commentaires.

Avoir une balise unique dans les noms d'objets qui identifie ces boutons. Vous semblez utiliser "#"

if(id==CHARTEVENT_OBJECT_CLICK && StringSubstr(sparam,0,1)=="#") // this is one of your order buttons being clicked

Puis extraire le numéro de commande soit du reste du nom de l'objet, soit du texte du bouton.

Il n'est pas nécessaire d'utiliser OrderTicket() à ce stade.

 

Ses objets sont identifiés par le ticket de commande.

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

Ainsi, chaque objet a le numéro de ticket dans son nom de chaîne pour pouvoir trouver à quelle commande l'objet appartient.

Cela signifie que chaque objet contiendra "#" dans son nom de chaîne.

Ainsi, lors d'un clic sur un bouton, il doit d'abord extraire le numéro du ticket de commande du nom de la chaîne de l'objet, puis exécuter la boucle orderselect, et lorsque le ticket de commande sélectionné correspond au numéro du ticket de commande extrait du nom de la chaîne du bouton, il a trouvé la commande.

Ou il peut simplement

SELECT_BY_TICKET

Pour sélectionner l'ordre à l'intérieur de l'événement graphique.

Maintenant, ce serait beaucoup plus facile s'il donnait simplement à l'objet le numéro/nom du ticket et rien d'autre.

ObjectCreate(0,"IntegerToString(OrderTicket()),OBJ_BUTTON,0,0,0);

Parce qu'il peut alors sélectionner directement le ticket ou comparer les numéros.

 

Le jour dernier, j'ai essayé la boucle OrderSelect(). Maintenant, je vais d'abord l'essayer une fois de plus bientôt.
Ensuite, je vais faire des recherches approfondies sur vos derniers commentaires.

Merci pour votre temps précieux.

 

J'ai essayé le code ci-dessous dans mon fichier test.mq4 et le code ci-dessous fonctionne parfaitement, et jusqu'à présent je n'ai pas rencontré de problèmes, mais je suis toujours en train de le tester.

Q : Pouvez-vous améliorer le code ci-dessous s'il est mauvais, s'il vous plaît ?

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

      if(sparam=="#"+IntegerToString(OrderTicket())+" -"+"Object Button")
        {
         if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,CLR_NONE))
           {
            Print("# Error ",GetLastError());
           }
        }
     }
  }

Merci d'avance.

(Je travaille dessus)

 

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)