expert advisor - verschiedene Fragen - Seite 30

 
honest_knave:

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

Denken Sie daran, 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 wollen, um die OrderSelect zu behandeln, im Falle des Scheiterns)

Wow! Das habe ich nicht gewusst.

Also, du hast es zweimal erwähnt, und genau das habe ich nicht herausgefunden.
Jetzt werde ich es für mich selbst testen und es in meine Haupt-EA-Datei bringen.

Vielen Dank noch einmal.

 

Ich verwende OrderTicket() für andere Objekte, jetzt sehe ich, wenn ich auf diese Objekte klicke - Bestellung schließen.
Ich mochte Sie Methode, aber sieht aus wie es ist Einfluss andere Objekte.

Andere Objekte heißen so, hier ist eines davon.

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

Vielen Dank im Voraus.

 
Max Enrik:

Ich verwende OrderTicket() für andere Objekte, jetzt sehe ich, wenn ich auf diese Objekte klicke - Bestellung schließen.
Ich mochte Sie Methode, aber sieht aus wie es ist Einfluss auf andere Objekte.

Andere Objekte wie dieses hier sind eines davon.

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

Vielen Dank im Voraus.

Die elegantere Lösung ist, das Benennungssystem zu ändern.

Trotzdem können Sie die Bestellnummer weglassen. Es kommt nur auf das genaue Benennungsformat an.

Aber zunächst einmal: Was ist der OBJPROP_TEXT der Schaltfläche? Haben irgendwelche anderen Objekte denselben OBJPROP_TEXT?

 
honest_knave:

Die elegantere Lösung ist, das Benennungssystem zu ändern.
Trotzdem können Sie die Bestellnummer weglassen. Es kommt nur auf das genaue Benennungsformat an.
Aber zunächst einmal: Was ist der OBJPROP_TEXT der Schaltfläche? Gibt es andere Objekte, die denselben OBJPROP_TEXT haben?

Yeah! Ich weiß, dass ich die Namen von Button-Objekten ändern kann (ich verwende auch Prefix), wenn ich die Button-Namen ändere, könnte ich viele Dinge ändern, z.B. das Löschsystem und andere Dinge, die alle miteinander verbunden sind.

Unten sind Button und HLine Namen.

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

(Natürlich sind die Objektnamen ein wenig anders, aber die Methode ist die gleiche)

Vielen Dank im Voraus.

 

Markt geschlossen

Vielleicht habe ich es gefunden, aber ich bin mir nicht sicher.
Wenn dies nicht gut ist, lassen Sie es mich bitte wissen.

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

Vielen Dank im Voraus.

//--- 2. Mal bearbeitet

Hey! Mann!

Vielen Dank! Bis jetzt keine Probleme. Funktioniert einwandfrei!

 

#Crossover-Objekte - Offen

Ich habe mehrmals mit diesem Problem konfrontiert, manchmal habe ich bestanden, manchmal habe ich aufgegeben, jetzt möchte ich nicht noch einmal aufgeben.
Ich habe 2 Objekte " HLine und Button " sie überkreuzen sich, d.h. wenn ich auf eines von ihnen klicke, werden beide ausgewählt, was nicht gut für mich ist. ( BUTTON Breite = 20, HLINE Breite = wie Sie wissen )

F: Was kann ich tun, wenn ich auf das BUTTON-Objekt klicke und das HLINE-Objekt nicht ausgewählt wird, während sie sich überkreuzen, bitte?
(Ich kann einfach HLINE auswählen, wo sie sich nicht überkreuzen)

Vielen Dank im Voraus.

(Ich arbeite daran, jeder gute Kommentar wäre besser, bitte).

 

#Gewinn in Pips - Offen |#Gewinn in Pips - Vorläufig geschlossen - Ich habe es gelöst

Mr. William- Ich benutze Ihre "Pip, Point ... " Berechnungscodes.
Jetzt versuche ich, den Gewinn in Pips mit den folgenden Codes zu berechnen. Ich habe 2 Orders, eine davon zeigt korrekt an (OP_BUY), die zweite zeigt nicht korrekt an - 399 - eigentlich 400 (OP_SELL).

F: Mache ich bei der Berechnung des Gewinns in Pips etwas falsch, bitte?

change_to_pips( OrderTakeProfit() - OrderOpenPrice() )

Vielen Dank im Voraus.

(ich habe gestern in verschiedenen Foren nachgeschaut - das war nicht hilfreich für mich)

 

Forum über Handel, automatisierte Handelssysteme und das Testen von Handelsstrategien

MetaTrader 4 Build 574 mit aktualisierter MQL4 Sprache und Market of Applications veröffentlicht

whroeder1, 2014.01.27 14:11

  1. Schreiben Sie nicht so einen unlesbaren, unverständlichen Code.
    if (MyOrdersTotal() == 0 && (Hour()​>=​StartHour ​&& Hour()​<​EndHour && StartHour​<​EndHour) || (Hour()​>=​StartHour || Hour()​<​EndHour && StartHour​>​EndHour))
    Machen Sie lesbar und vereinfachen Sie und klammern Sie immer, wenn Sie ands/ors mischen.
    bool    isHourOKnorm = StartHour < EndHour
                         && StartHour <= Hour() && Hour() < EndHour,
            isHourOKwrap = StartHour > EndHour
                         && (StartHour <= Hour() || Hour() < EndHour),
         isHourOK       = isHourOKnorm || isHourOKwrap;
    if(MyOrdersTotal() == 0 && isHourOK)
  2. Was ist mit dem Fall, in dem StartHour == EndHour (d.h. alle 24?) Siehe meinen Code und vermeiden Sie den 24-Stunden-Umbruch.

Eines der erstaunlichen " if " Operator Beispiele für eine komplexe Bedingung von Herrn William.
Einfach
danke!


Ich habe die letzten 2 Tage damit gekämpft, meine komplexe Bedingung mit dem "if"-Operator zu lösen, aber ich konnte mein Problem nicht lösen, bis ich das obige großartige Beispiel gefunden habe.

 

Bitte helfen Sie mir, ich habe wirklich Mühe, dieses Problem zu lösen.

#296

Vielen Dank im Voraus.

 

Der untenstehende Code funktioniert manchmal perfekt, manchmal nicht. Ich kann dieses Problem nicht lösen. Wenn ich eine einzelne Bestellung verwende, funktioniert es perfekt, aber wenn ich mehrere Bestellungen öffne, funktioniert diese Funktion nicht richtig.
Bitte helfen Sie mir, und ein wenig mehr erklärt (, dass das, was falsch ist an der unten Code ), die besser für mich sein würde.

(Jetzt arbeite ich daran.)

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

Vielen Dank im Voraus.