expert advisor - verschiedene Fragen - Seite 29

 
honest_knave:
Post up Ihren Code, wo Sie die OrderTicket, um den Namen zu machen.

( Wenn jemand einen Code braucht - ich zögere, ihn schnell zu posten - weil ich OBJECT_****-Funktionen verwende, unterscheidet sich das wenig von Objektdokumentationen )

Untenstehender Code ist in 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);
  }

Jetzt versuche ich, dieses Objekt durch OnChartEvent() wie unten aufzurufen.

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

Vielen Dank im Voraus.

 
Es befindet sich nicht innerhalb der Bestellschleife, so dass es das OrderTicket() nicht kennen würde.
 
Marco vd Heijden:
Es befindet sich nicht innerhalb der Auftragsschleife, so dass es das OrderTicket() nicht kennen würde.
Gibt es also keine Möglichkeit?
 
Max Enrik:
Gibt es also keine Möglichkeit?

Die meisten Dinge sind möglich. Aber mir ist nicht klar, was Sie erreichen wollen. Was ist diese Schaltfläche? Was wollen Sie tun, wenn sie angeklickt wird?

Wahrscheinlich können Sie das gewünschte Ergebnis erzielen, aber möglicherweise müssen Sie Ihren Ansatz ändern.

 
honest_knave:

Die meisten Dinge sind möglich. Aber mir ist nicht klar, was Sie erreichen wollen. Was ist diese Schaltfläche? Was wollen Sie tun, wenn sie angeklickt wird?

Wahrscheinlich können Sie das gewünschte Ergebnis erzielen, aber möglicherweise müssen Sie Ihren Ansatz ändern.


Mein Ziel ist es, dass diese Schaltfläche Tickets und deren Gewinn anzeigt, wenn ich sie anklicke, um die Cloud zu schließen.

Ich habe diesen Kommentar von einem mobilen Gerät aus geschrieben. Ich werde also nach 10 Stunden mit der Recherche zu diesem Thema beginnen. Danke für Ihre Kommentare.
 
Max Enrik:

Mein Ziel ist es, diese Schaltfläche Objekt könnte zeigt Tickets nubers und deren Gewinn, wenn ich sie anklicken, dass um Wolke zu schließen.

Ich habe diesen Kommentar von einem mobilen Gerät aus geschrieben. Also, ich werde anfangen, über dieses Problem nach 10 Stunden später zu forschen. Danke für Ihre Kommentare.

Verwenden Sie einen eindeutigen Tag in den Objektnamen, der diese Schaltflächen kennzeichnet. Sie scheinen "#" zu verwenden.

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

Dann extrahieren Sie die Bestellnummer entweder aus dem Rest des Objektnamens oder aus dem Text der Schaltfläche.

Keine Notwendigkeit, OrderTicket() in diesem Stadium zu verwenden.

 

Seine Objekte werden durch das Auftragsticket identifiziert.

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

So hat jedes Objekt die Ticketnummer in seinem Stringnamen, um herausfinden zu können, zu welchem Auftrag das Objekt gehört.

Das bedeutet, dass jedes Objekt "#" in seinem Stringnamen enthält.

Bei einem Klick auf eine Schaltfläche muss er also zunächst die Nummer des Bestellscheins aus dem Stringnamen des Objekts extrahieren und dann die Orderselect-Schleife ausführen, und wenn das ausgewählte Bestellschein mit der aus dem Stringnamen der Schaltfläche extrahierten Bestellscheinnummer übereinstimmt, hat er die Bestellung gefunden.

Oder er kann einfach nur

SELECT_BY_TICKET

Um die Bestellung innerhalb des Chart-Ereignisses auszuwählen.

Nun wäre es viel einfacher, wenn er dem Objekt nur die Ticketnummer/den Ticketnamen geben würde und sonst nichts.

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

Denn dann kann er einfach direkt das Ticket auswählen oder die Nummern vergleichen.

 

Ich habe gestern die OrderSelect() Schleife ausprobiert. Nun werde ich es demnächst noch einmal versuchen.
Dann werde ich Ihre letzten Kommentare gründlich untersuchen.

Vielen Dank für Ihre wertvolle Zeit.

 

Ich habe den unten stehenden Code in meiner test.mq4-Datei ausprobiert, so dass der unten stehende Code perfekt funktioniert, und bisher habe ich keine Probleme, aber ich teste ihn noch.

F: Können Sie den unten stehenden Code verbessern, wenn er schlecht ist, bitte?

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());
           }
        }
     }
  }

Vielen Dank im Voraus.

( Ich arbeite daran )

 

Eine flüchtige Prüfung zeigt, dass es funktionieren sollte. Aber Sie könnten die Effizienz verbessern.

Überlegen Sie, wie viele verschiedene Objekte Sie in Ihrem Diagramm gezeichnet haben. Wenn Sie auf *ein* dieser Objekte klicken, müssen Sie eine Schleife durch jede einzelne Order ziehen und versuchen, eine Übereinstimmung zu finden. Viele Objekte haben wahrscheinlich nichts mit Aufträgen zu tun. Das ist ineffizient.

Deshalb habe ich vorgeschlagen, das erste Zeichen von sparam auf "#" zu überprüfen. Dadurch wird das Objekt automatisch als mit einem Auftrag verbunden identifiziert.

Außerdem ist es nicht nötig, eine Schleife durch die Aufträge zu ziehen. Der Objektname und/oder der Objekttext enthält bereits die Ticketnummer. Extrahieren Sie also die Ticketnummer von dort und schließen Sie den Auftrag

Beispiel:

Sie öffnen einen Auftrag. Er erhält die Ticketnummer 12345

Erstellen Sie einen OBJ_BUTTON mit dem Namen"#12345".

Der Code in OnChartEvent() würde etwa so aussehen (unkompiliert, ungetestet, spät in der Nacht...):

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());
        }
     }
  }
(Sie werden wahrscheinlich auch die OrderSelect behandeln wollen, für den Fall eines Fehlers)
Grund der Beschwerde: