Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1739

 
Artyom Trishkin #:

Der erste Aufruf von CopyRates() löste den Austausch historischer Daten aus (führen Sie ihn eine Woche lang nicht aus, und Sie werden wieder das Gleiche erhalten, nun, vielleicht nicht eine Woche, aber einige Zeit).
Sie müssen nur prüfen, wie viele Daten auf dem Server vorhanden sind, und die verfügbare Menge mit dem Expert Advisor vergleichen. Wenn es weniger ist als erforderlich - lassen Sie den EA bis zum nächsten Tick. Prüfen Sie beim nächsten Häkchen erneut. Wenn die erforderliche Anzahl von Versuchen nicht erreicht wird, sollte dieser Fehler entsprechend bearbeitet werden.

Vielen Dank für die Informationen!

Wenn Sie Zeit haben, geben Sie mir bitte einen Tipp, wie ich das Problem beheben kann:

Zwei entgegengesetzte Ziele sind in der Historie vor N Kerzen gesetzt: Close[N]+50*Point und Close[N]-50*Point.
Dann gibt es eine Bedingung, dass der Kurs eines der Ziele erreicht (wenn (High[i]> Close[N]+50*Point) oder (wenn (Low[i]<Close[N]-50*Point)
Wenn die Bedingung erfüllt ist, wird der Abstand von Close[N] zu High[i] in das Array x[high]=High[i] geschrieben.
Dann wird er jederzeit willkürlich auf einen der Graphen geworfen.

Und bei der Überprüfung mit Print(x[high]) zeigen 1-2 von zehn Werten weniger als 50! Einer hat 12, der andere 49. Obwohl es streng genommen+50*Punkte sind. 8-9 sind richtig (über 50) und 1-2 sind abnormal. Nicht durch den Tester, sondern mit einem echten Chart platziere ich einen Expert Advisor (ohne Handelsfunktionen); er arbeitet mit der Historie und zeigt falsche Ergebnisse an.

Je größer der Wert ist, desto weniger solcher Fehler treten auf. Ich dachte, es könnte die Streuung sein, die stört, aber... MT4 scheint keinen Spread in der Geschichte zu haben

 
Artis98 #:

Hallo liebe Forumsnutzer und erfahrene Programmierer! Ich brauche Hilfe bei der Fertigstellung des EA)). Bitte beraten Sie mich, wie ich 2 Dinge in den Code Advisor einfügen kann:

1. Folgende Situation: Ich eröffne einen Auftrag (1.) mit TP und SL und einem bestimmten Lot (wahrscheinlich 0,01). Wenn dieser Auftrag bei Gewinnmitnahme geschlossen wird, ändert sich nichts. Aber wenn dieser (1.) Auftrag bei SL geschlossen wird, wird der nächste Auftrag unmittelbar danach (2.) mit einem 2-mal größeren Lot (0,01*2=0,02) eröffnet. Wenn dieser 2. Auftrag mit Take Profit geschlossen wird, wird der nächste Auftrag (3. Auftrag) mit einem regulären Lot eröffnet, d.h. ein doppelt so großes Lot wird nur für den nächsten Auftrag (2. Auftrag) benötigt, nachdem der vorherige (1.) mit SL geschlossen wurde. Wenn der 3. Auftrag zum zweiten Mal in Folge in SL geschlossen wird, wird das Lot um 2x erhöht, bis es keinen Abschluss in TP mehr gibt. Ich hoffe, dass ich die Logik dessen, was hinzugefügt werden muss, im Detail beschrieben habe;


2. und die zweite Sache, die wir hinzufügen müssen, ist die SL-Bewegung. Lassen Sie mich das anhand eines Beispiels erklären: Nehmen wir an, wir haben einen Auftrag mit den Basisparametern T.p. + 300, S.l. - 500. Der Kurs bewegt sich in die gewünschte Richtung und übersteigt den Eröffnungskurs des Auftrags um 100 Pips. Sobald der Preis +100 vom Eröffnungskurs der Order erreicht, sollte sich SL von der Basis -500 auf +90 bewegen. D.h. wenn der Preis +100 Pips vom Eröffnungskurs der Order erreicht, übertragen wir die Order zum Breakeven, indem wir S,L auf +90 Pips setzen. Danach, wenn der Preis geht weiter in die gewünschte Richtung und geht durch eine andere + 50 Pips - S.L. wird um 50 Pips verschoben => es sollte jetzt bei + 140 Pips aus dem Eröffnungskurs der Bestellung. D.h. der S.L. bewegt sich zuerst von seiner Basisposition bis + 90 Pips vom Eröffnungskurs der Order und bewegt sich dann, wenn er + 50 Pips passiert ( - 500 => + 90 => + 140 => + 190 usw.). Und so geht es weiter, bis der Preis T.P. erreicht. oder wenn sich der Trend umkehrt und auf die S.L. trifft.


Ich hoffe, ich habe alles ausführlich beschrieben, und ich hoffe wirklich auf Ihre Hilfe, denn durch das Hinzufügen dieser fehlenden Elemente wird der Expert Advisor fertig sein)) Wenn Sie Fragen haben, fragen Sie bitte))) Ich füge unten einen Teil des Codes des Expert Advisors ein:

Zum ersten Punkt: Bevor Sie eine Position eröffnen, sollten Sie sich ansehen, wie die vorherige Position geschlossen wurde. Wenn Sie die SL nehmen, dann sollte das Los doppelt so hoch sein. Die Menge sollte nicht um die Hälfte der Menge der vorherigen Position erhöht werden, sondern in den Einstellungen oder irgendwo im Code festgelegt werden. Vor der Eröffnung prüfen Sie dann die Bedingung: Wenn die vorherige Position durch den SL geschlossen wurde, dann eröffnen Sie eine Position mit dem doppelten Lot.

Was den zweiten betrifft: Ich habe in diesem Thread schon vor langer Zeit ein Beispiel für einen Trailing-Stop gepostet. Suchen Sie danach. Besser in meinem Profil in den Nachrichten - dort finden Sie es schneller, als wenn Sie hier 100+ Seiten durchblättern. Anhand des gefundenen Beispiels werden Sie dann versuchen, Ihr eigenes Schleppnetz zu erstellen.

 
Artyom Trishkin #:

Der erste Aufruf von CopyRates() leitete das Paging historischer Daten ein (führen Sie es eine Woche lang nicht aus, und Sie werden wieder dasselbe erhalten, nun, vielleicht nicht eine Woche, aber einige Zeit).
Sie müssen nur prüfen, wie viele Daten auf dem Server vorhanden sind, und die verfügbare Menge mit dem Expert Advisor vergleichen. Wenn es weniger ist als erforderlich - lassen Sie den EA bis zum nächsten Tick. Prüfen Sie beim nächsten Häkchen erneut. Wenn die erforderliche Anzahl von Versuchen nicht erreicht wird, wird der Fehler wie erforderlich behandelt.

Kann man die Anzahl der geladenen Takte programmatisch ermitteln?

Ich selbst schaue nur auf das Datum im Archiv der Notierungen für jede TF und versuche, bei den Berechnungen nicht darüber hinauszugehen.

Diese Aufgabe kann in dieser Form unnötig sein. Es wäre korrekter, ein Flag zu erhalten, wenn die richtige Anzahl von Balken geladen ist, aber es kann sein, dass es für das eine oder andere Symbol nie geladen wird.

 
Artyom Trishkin #:

Zum ersten Punkt: Bevor Sie eine Position eröffnen, sollten Sie sich ansehen, wie die vorherige Position geschlossen wurde. Wenn durch SL, dann sollte das Los doppelt sein. Das Los sollte nicht aus dem Los der vorherigen Position verdoppelt werden, sondern aus dem in den Einstellungen oder irgendwo im Code festgelegten. Vor der Eröffnung prüfen Sie dann die Bedingung: Wenn die vorherige Position durch den SL geschlossen wurde, dann eröffnen Sie eine Position mit dem doppelten Lot.

Ich glaube, ich habe es bereits im Code geändert:

//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
 double Lots()  // Расчет объема лота
  {
   int n=0;
   double Lotscount;
   double OL=Lot;
   
   
   if(Lot>0) return(LOT());          // "если во внешней переменной "Lot" стоит число больше 0 => будет фиксированный лот без авт. расчёта" 
   Lotscount=AccountFreeMargin()/10000;  // раcчёт лота - свободная маржа/9000 => 100/9000=0.01 лота 
   Lotscount=MathMin(15,MathMax(0.01,Lotscount));
    if(Lotscount<0.1) Lotscount=NormalizeDouble(Lotscount,2);
    else 
     {
       if(Lotscount<1) Lotscount=NormalizeDouble(Lotscount,1);
      else       Lotscount=NormalizeDouble(Lotscount,0);
     }
     
     for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
          if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
            if (OrderProfit()<0) 
             {
               if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot);
               n++; 
               if (OrderProfit()>0) return(Lotscount);
            }
            else
            {
               if (n==0) {Comment("2");return(Lotscount);}
               else {Comment("3");return(OL);}
            }
         }
      }
   }
      return(Lotscount);
 }
//------------------------------------------------------------------
double LOT()
{
   int n=0;
   double OL=Lot;
   for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
            if (OrderProfit()<0) 
            {
               if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot);
               n++; 
               if (OrderProfit()>0) return(Lot);}
            }
            else
            {
               if (n==0) {Comment("2");return(Lot);}
               else {Comment("3");return(OL);}
            }
         }
      }
   }
   return(OL);
}

Oder ist das falsch? Außerdem weiß ich nicht, wie ich zwei Dinge in Bezug auf das Los ändern kann. Die erste ist, dass ein Auftrag mit einem verdoppelten Los nur einmal und nur für einen Auftrag eröffnet werden darf (der nächste Auftrag nach dem Auftrag mit S.L.). Und die zweite, die ich nicht weiß, wie ich sie hinzufügen soll, ist, dass im Falle von zwei S.L.'s in einer Reihe (zwei Aufträge, die in einer Reihe durch S.L. geschlossen werden) der dritte Auftrag nicht mit einer um 2 (2*2*2) erhöhten Menge eröffnet wird, sondern nur einmal (2*2) wie der zweite Auftrag.

 
Artis98 #:

Ich glaube, ich habe das bereits im Code geändert:

Oder ist das falsch? Außerdem weiß ich nicht, wie ich zwei Dinge am Los ändern kann. Die erste besteht darin, einen Auftrag mit doppeltem Los nur einmal und nur für einen Auftrag (den nächsten Auftrag nach dem Auftrag mit S.L.) zu eröffnen. Der zweite Punkt, den ich nicht hinzufügen kann, ist, dass im Falle von zwei S.L.'s in einer Reihe (zwei Aufträge, die mit S.L. in einer Reihe geschlossen wurden) der dritte Auftrag nicht mit einer um 2 erhöhten Menge (2*2*2) eröffnet wird, sondern nur einmal (2*2) wie der zweite Auftrag.

Sie haben ZWEI Auftragsarten - Auftragsnummer 1 - ein Auftrag mit einem normalen Los, und Auftragsnummer 2 - ein Auftrag mit einem größeren Los. Die Lose werden nur um den SL-Typ #1 erhöht.

Speichern Sie die Auftragsart zum Beispiel in einem "Kommentar". Es ist eine gute Angewohnheit, sich alles über Ihre Aufträge einzuprägen.

 
Maxim Kuznetsov #:

Sie haben ZWEI Auftragsarten - Auftragsnummer 1 - ein Auftrag mit einem regulären Los, und Auftragsnummer 2 - ein Auftrag mit einem erhöhten Los. Die Lose werden nur um den SL-Typ #1 erhöht.

Speichern Sie die Auftragsart zum Beispiel in einem "Kommentar". Es ist eine gute Angewohnheit, sich alles über Ihre Aufträge zu merken.

Wir brauchen nichts auswendig zu lernen (zumal das Auswendiglernen eine weitere Wiederholung erfordert). Es reicht aus, wenn er weiß, wie die vorherige Position geschlossen wurde. Das ist alles. Man muss weder zwei, noch drei, noch hundert in einer Reihe oder hundert nicht durch Stoploss geschlossene Positionen kennen, sondern nur die letzte Position. Wenn er durch Stop Loss geschlossen wurde, dann sollte der nächste mit doppeltem Lot geschlossen werden. Das Los sollte aber nicht aus dem Los der vorherigen Position verdoppelt werden, sondern aus dem im Programm eingestellten normalen Los. Wenn die Position dann nicht mit dem Stop Loss geschlossen wird, sollte die nächste Position mit demselben Lot eröffnet werden. Wenn die Position durch Stop Loss geschlossen wird, verdoppeln Sie das Lot für die nächste Position. Das ist alles. Mehr brauchen Sie nicht zu wissen.

 
Artyom Trishkin #:

Er braucht nichts auswendig zu lernen (zumal das Auswendiglernen eine spätere Erholung erfordert). Sie muss nur wissen, wie die letzte Position geschlossen wurde. Das ist alles. Er muss nicht wissen, ob zwei oder drei oder hundert hintereinander oder nicht aufeinanderfolgend durch Stoploss geschlossen wurden, sondern nur die letzte Position. Wenn er durch Stop Loss geschlossen wurde, dann sollte der nächste mit doppeltem Lot geschlossen werden. Das Los sollte aber nicht aus dem Los der vorherigen Position verdoppelt werden, sondern aus dem im Programm eingestellten normalen Los. Wenn die Position dann nicht mit dem Stop Loss geschlossen wird, sollte die nächste Position mit demselben Lot eröffnet werden. Wenn die Position durch Stop Loss geschlossen wird, verdoppeln Sie das Lot für die nächste Position. Das ist alles. Mehr brauchen Sie nicht zu wissen.

Sagen Sie den Leuten nicht, was sie tun sollen.

Sie müssen sich Ihre Daten merken und mit ihnen arbeiten

 
Artyom Trishkin #:

Alles, was er wissen muss, ist, wie die letzte Position abgeschlossen wurde. Das ist alles. Sie brauchen nicht zu wissen, ob zwei, drei oder hundert Positionen in Folge mit Stoploss geschlossen wurden, sondern nur die letzte Position. Wenn die Position mit Stop Loss geschlossen wurde, sollte die nächste mit Double Lot eröffnet werden. Wenn die Position mit Stop Loss geschlossen wurde, sollte die nächste mit Double Lot eröffnet werden.

Das ist, was ich brauche, das ist eigentlich die Frage - wie man es in den Code zu schreiben?

 

Hallo!
Kann mir bitte jemand sagen, wie ich den Compiler zwingen kann, für MT4 und nicht für MT5 zu kompilieren?

Wenn die Datei die Erweiterung *.mq4 hat, ist alles in Ordnung, wenn sie die Erweiterung *.mqh hat, akzeptiert der Compiler sie als *.mq5 und es treten Fehler auf.

 
Sergey Zhukov #:

Hallo!
Kann mir bitte jemand sagen, wie ich den Compiler zwingen kann, für MT4 und nicht für MT5 zu kompilieren?

Wenn die Datei die Erweiterung *.mq4 hat, ist alles in Ordnung, wenn sie die Erweiterung *.mqh hat, akzeptiert der Compiler sie als *.mq5 und es treten Fehler auf.

Geben Sie uns die Datei. Das ist etwas Neues, das habe ich noch nie gehört.
Grund der Beschwerde: