expert advisor - verschiedene Fragen - Seite 23

 

Ich empfehle es.

Wenn du all diese Probleme gelöst hast, kannst du dich zu den Profis zählen.

Mach die Dinge so schwierig wie möglich, dann lernst du am meisten.

Andernfalls kämpfst du die ganze Zeit mit den einfachen Dingen.

 

Zunächst einmal vielen Dank für Ihre Kommentare.

Nach Ihren Kommentaren, entschied ich mich, ich sollte noch einmal erstellen Order Modification Code-Blöcke für sicher und für Test.

 

Herr @Marco vd Heijden

Nach Ihren tollen Kommentaren / Beispielen - schreibe ich bereits einen Code für Drags für Take Profit Preise.
Aber eigentlich bin ich gegen ständige Updates. Warum eigentlich? Seit ich Codeblöcke für Take Profit Drags schreibe, sehe ich, dass mein Chart langsam wird. Vielleicht habe ich in diesem Teil des Codes Fehler gemacht. Ich werde es überprüfen, nachdem ich dieses Problem gelöst habe.

(während ich versuchte, mein Problem selbst zu lösen, dachte ich nach mehreren Versuchen, dass es keine Möglichkeit gibt, die Berechnung zu stoppen, wenn ich den Operator "for" Schleife verwende)

Ich möchte erwähnen, dass ich bereits Berechnungen für Take-Profit- und Stop-Loss-Größen habe, weil ich den Operator "Switch" aus dem unten stehenden Code entfernt habe.
Ich versuche nur, wenn Take Profit Preis gleich " Linie " Preis - dann stoppt berechnet / aktualisiert bis zum nächsten Mal Take Profit Preis " != " Linie Preis.
F: Ich
habe Mühe, den unten stehenden Code für mein Anliegen zu korrigieren. Was kann ich dafür tun, bitte?
F: Mache ich etwas falsch, wenn ich den Operator "Switch" nicht für mein Problem verwende?

//+------------------------------------------------------------------+
//| 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);
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+

Während ich die Dokumentation und das Buch für OrderModify() mit Beispiel gelesen habe, habe ich kein Beispiel für mein Anliegen gefunden.

Alles Gute für Sie!

 

Ich habe mich nicht auf dem Laufenden gehalten, daher kann es sein, dass ich verpasst habe, was Sie tun.

Zuallererst: Vereinfachen:

for(int order=OrdersTotal(); order>=0; order--)
     {
      bool selected=OrderSelect(order,SELECT_BY_POS);
        {
         if(selected==1)
Sollte werden:
for(int order=OrdersTotal()-1; order>=0; order--)
     {
      if(OrderSelect(order,SELECT_BY_POS)

Überlegen Sie auch, wie oft Sie die Linie bewegen. Ist es einmal pro Sekunde? Wahrscheinlich nicht.

Legen Sie Ihren Code in 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

Sie rufen dieselbe Funktion mehrmals für jede offene Order auf:

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

Rufen Sie sie einmal auf, bevor Sie in die Auftragsschleife einsteigen:

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

Vergewissern Sie sich, dass Sie das Prinzip der while-Schleifen verstanden haben.

Es ist gefährlich, denn wenn aus irgendeinem Grund ein anderer EA versucht, den Wert des Zeilenkurses zu ändern, wird dieser Teil des Codes in einer Endlosschleife stecken bleiben und Ihr Terminal wird höchstwahrscheinlich einfrieren.

Dies führt in der Regel zu einem abnormalen Abbruch.

Da Sie das Objekt "line" verwenden, ist die Gefahr jedoch nicht so groß, wie wenn Sie über tp- und sl-Levels sprechen, die von OrderModify() an den Server gesendet werden.

 
honest_knave:

Ich habe den Thread nicht auf dem Laufenden gehalten, daher kann es sein, dass ich verpasst habe, was Sie tun.


Rufen Sie es einmal auf, bevor Sie in die Bestellschleife einsteigen:

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

Verstehen Sie bitte, was er zu tun versucht.

Er muss zweimal aufrufen und die Werte vergleichen, um festzustellen, ob die Zeile verschoben wurde.

Das ist unmöglich, ohne den Wert zweimal zu lesen.

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:

Bitte verstehen Sie, was er zu tun versucht.

Er muss zwei Mal anrufen und die Werte vergleichen, um zu sehen, ob die Linie verschoben wurde.

Das ist unmöglich, ohne den Wert zweimal zu lesen.

Das müssen Sie mir noch einmal erklären.

Wenn Sie ein CHARTEVENT_OBJECT_DRAG haben und das Sparam "line" ist, dann hat sich die Linie bewegt.

In den seltenen Fällen, in denen sie sich zeitlich entlang desselben Kurses bewegt, ist die Strafe nicht sehr hoch.

 

Es gibt viele Möglichkeiten, das Gleiche zu tun.

Wenn Sie sich für den CHARTEVENT entscheiden, denken Sie daran, dass er im Prüfgerät nicht funktioniert.

 
OK, ich überlasse es euch. Viel Glück!
 

Ich habe bereits Ihre nützlichen Kommentare gelesen, Herr Marco, Herr Knave, Herr William, vielen Dank für all diese Kommentare!

Jetzt habe ich schon ein paar Dinge überprüft und auch beschlossen, dass ich OrderModify() Schritt für Schritt schreiben ( / und überprüfen) könnte. Denn diese OrderModify() ist wirklich sehr gefährlich für mich.
Mehrere Male habe ich schon falsche Änderungen vorgenommen. Aber wenn ich versuche, die gleichen Probleme / Fragen konfrontiert, dass ich sicher wissen, wo das Problem kommt aus, auch ich versuchen, die gleichen Dinge in der Tabelle, die Probleme / Fragen war nicht wieder passiert. Nach einigen Stunden stand ich wieder vor demselben Problem.
Ich bin immer noch nicht genau wissen, was für diese Probleme verursacht. Was ist das Problem, das ich meine. Ich habe bereits eine von ihnen mit Ihnen in meinem vorherigen Kommentare geteilt. Auch ich öffne eine Position durch die meine Trade Panel EA, das ist OK! dann versuche ich, Sell Limit durch den manuellen Handel Methode zu öffnen. (mein Trade Panel hat noch keine Sell Limit oder Sell Stop Pending Orders)

Also, ich denke, ich sollte den Code des Blocks mit Ihnen teilen, aber ich kann ihn im Moment nicht teilen, weil ich noch daran arbeite. Ich möchte die Codes des Blocks zu OnChartEvent() verschieben - weil ich auch einige Schaltflächen darin einfügen werde.

Problem: Ich kann keinen Code schreiben, wenn die Order geschlossen ist, und dann die Objekte entfernen, wie z.B. Stop Loss, Take Profit, Open, Close Pfeile oder ähnliches, bitte helfen Sie mir.
Frage: Auch Stop Loss, Take Profit Linien vor den Trade Panel Objekten. Ich weiß, dass dies durch das letzte Mal erstellte Objekt verursacht wurde. Aber wenn Sie mich verstehen, bitte lassen Sie mich wissen, wie kann ich tun, Trade Panel Objekt sollte vor allen anderen Objekten ohne "Stop Loss und Take Profit" Linien sein.

Vielen Dank im Voraus.