[ARCHIV!] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen - 4. - Seite 129

 
borilunad:


Wie einfach das ist! M5 ist offen und sein oberer Teil ist ein wenig beschmutzt, und M1 darunter zeigt die gewünschten Kommentare.

Wie man so schön sagt: Morgens ist es immer besser! Guten Morgen!


Hier werden Fragen gestellt und Antworten zur Softwareimplementierung gegeben.

Und Sie können die Kommentare auf einem Blatt Papier lesen ;)

 
Können Sie mir sagen, wo der Fehler liegt - ich kann ihn nicht finden.
Ich habe den Code für die Auftragsänderung bereits umgeschrieben, aber der Fehler bleibt.
Ich betone, dass der Fehler nicht aus dem Protokoll stammt - es gibt keinen einzigen Fehler im Protokoll.
Ich habe den Fehler in den Ergebnissen gefunden, als ich einen Test durchführte.
Beispiel:
Ich habe eine Kaufposition (Ordernummer 1) zum Preis von 1,4654 eröffnet
dann steht in den Ergebnissen: "Ändern (Ordernummer 1) Preis 1,4654 und TakeProfit 1,4752"
dann steht in den Ergebnissen: "Schließen (Ordernummer 1) Preis 1,4704 und TakeProfit 1,4752"
Gewinn = 50,00

Beispiel für eine Verlustposition, obwohl ich nur zum TakeProfit schließen sollte, weil ich keinen Stop Loss gesetzt habe.
Ich habe eine Kaufposition (Auftragsnummer 271) bei 1,4820
eröffnet und in den Ergebnissen steht: Ändern (Auftragsnummer 271) Preis 1,4820 und TakeProfit 1,4918
und in den Ergebnissen steht: Schließen (Auftragsnummer 1) Preis 1,4737 und TakeProfit 1,4918
Gewinn = - 83,46

Ich habe überall einen TakeProfit von 100 gesetzt.

Ich habe keinen StopLoss gesetzt.

Ich weiß nicht, wie man das repariert.

Beim Kompilieren dieses EA-Codes = 0 Fehler und 0 Warnungen.

Ich habe diesen Code zum Ändern von Aufträgen verwendet:

//|  Описание : Модификация ордера. Версия функции для тестов на истории.      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена открытия позиции, установки ордера                            |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    ex - дата истечения                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0){
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er;
  double op=NormalizeDouble(OrderOpenPrice() , dg);
  double os=NormalizeDouble(OrderStopLoss()  , dg);
  double ot=NormalizeDouble(OrderTakeProfit(), dg);
  color  cl;

  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);

  if (pp!=op || sl!=os || tp!=ot) {
    if (MathMod(OrderType(), 2)==0) cl=clModifyBuy;
    if (!OrderModify(OrderTicket(), pp, sl, tp, ex, cl)) {
      er=GetLastError();
      Print("Error(",er,") modifying order: ",Error(error_code));
      Print("Ask=",Ask," Bid=",Bid," sy=",OrderSymbol(),
            " op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp);
    }
  }
}
 
Ich habe vergessen zu erwähnen, dass dieser EA über eine Excel-Tabelle funktioniert - die Datei Orders.csv , die in der Datei \experts\ gespeichert ist
 
alex12:
Können Sie mir sagen, wo der Fehler liegt - ich kann ihn nicht finden.
Ich habe den Code für die Auftragsänderung bereits umgeschrieben, aber der Fehler bleibt bestehen.
Ich betone, dass der Fehler nicht aus dem Protokoll stammt - es gibt keinen einzigen Fehler im Protokoll.
Ich habe den Fehler in den Ergebnissen während des Tests gefunden.
Beispiel:
Ich habe eine Kaufposition (Auftragsnummer 1) bei 1,4654 eröffnet.
Als Nächstes wird in den Ergebnissen angezeigt, dass (Auftragsnummer 1) der Preis 1,4654 und der TakeProfit 1,4752 geändert wurde.
Als nächstes wird in den Ergebnissen der Schlusskurs (Auftragsnummer 1) von 1,4704 und der TakeProfit von 1,4752 angezeigt.
Gewinn = 50,00

Ein Beispiel für eine Verlustposition, die ich aber nur bei Take Profit schließen sollte, weil ich keinen Stop Loss gesetzt habe.
Ich habe eine Kaufposition (Auftragsnummer 271) bei 1,4820 eröffnet.
Als Nächstes steht in den Ergebnissen ändern (Auftragsnummer 271) Preis 1,4820 und TakeProfit 1,4918
Als nächstes wird in den Ergebnissen der Schlusskurs (Auftragsnummer 1) von 1,4737 und der TakeProfit von 1,4918 angezeigt.
Gewinn = - 83,46

Ich habe den TakeProfit überall auf 100 gesetzt.

Ich habe keinen StopLoss gesetzt.

Ich weiß nicht, wie man das repariert.

Beim Kompilieren dieses EA-Codes = 0 Fehler und 0 Warnungen.

Ich habe diesen Code zum Ändern von Aufträgen verwendet:

Wenn das Schließen von Geschäften im Tester wie hier gezeigt geschrieben wird, ist dies höchstwahrscheinlich das Ergebnis der orderclose-Funktion (TP und SL haben nichts damit zu tun)
 

Bitte helfen Sie mir, die Werte von

1 Maximale tägliche Volatilität (Tageshöchstwert minus Tiefstwert) während der letzten X=5 Tage .

2 Durchschnittliche tägliche Volatilität über dieletzten X=130 Tage

3 Und wie können diese Werte in die Bedingung geschrieben werden, wenn die maximale tägliche Volatilitätim Bereich A=75 bis B=150- durchschnittliche tägliche Volatilitätliegt ?

double Dmax= 0.0; 
double DAvg= 0.0;
int a = 0; 
int d =d+1;  
while(a < 5) 
  { 
    Dmax = iHigh(Symbol(),PERIOD_D1,d)-iLow(Symbol(),PERIOD_D1,d); 
    a++; 
  } 
//Comment( "T ("+Dmax+")");

while(a < 130) 
   {  
 
DAvg += (iHigh(Symbol(),PERIOD_D1,d-1)-iLow(Symbol(),PERIOD_D1,d-1))/130; 
    a++; 
}
Comment( "T ("+DAvg+")");
 
sergeev:

1. Ermitteln Sie zunächst, wie viele Balken Sie im Fenster https://docs.mql4.com/ru/windows/WindowBarsPerChart benötigen .

2. Dann erhalten Sie das Datum des ersten Balkens https://docs.mql4.com/ru/windows/WindowFirstVisibleBar.

3. Wenn Sie diesen Anfangsbalken und die Anzahl der Balken kennen, gehen Sie diese Balken durch und bestimmen den Höchst- und Tiefstwert unter ihnen.

4. Gewinn


Variante 2

https://docs.mql4.com/ru/windows/WindowPriceMaxтво

https://docs.mql4.com/ru/windows/WindowPriceMinВторой Variante

Ich neigte zur ersten Option, aber ich wusste nicht, wie ich die Anzahl der Balken im Fenster berechnen sollte. Die zweite Option ist lakonischer.

Aber wie kann man das letzte Maximum und Minimum des vorherigen Balkens "abfangen"? Vielen Dank im Voraus!

 
MK07:


Aber wie kann man den letzten Höchst- und Mindestwert des vorherigen Balkens "abfangen"?

Sie brauchen sich nur den Höchst- und Tiefstwert des aktuellen Balkens zu merken, und wenn ein neuer Balken erscheint und zum vorherigen Balken wird, übernehmen Sie den Höchst- und Tiefstwert aus den gespeicherten Variablen.

 
sergeev:

Sie brauchen sich nur den Höchst- und Tiefstwert des aktuellen Balkens zu merken, und wenn ein neuer Balken erscheint und zum vorherigen Balken wird, übernehmen Sie den Höchst- und Tiefstwert aus den gespeicherten Variablen.


Aber wie? Angenommen, wir weisen der Variablen Z einen Maximalwert zu und es erscheint ein neuer Balken (der überprüft werden kann) und Z wird sofort ein neuer Wert zugewiesen, während der Wert (Z-1) "verloren" geht. Wahrscheinlich sollte es eine Überprüfung geben, wenn Z ein neuer Wert zugewiesen wird (vielleicht erscheint ein neuer Balken), ich verlasse mich auf Ihre Professionalität und Geduld! Ich danke Ihnen für Ihre Bemühungen.
 

deklarieren Sie die zet-Variable als statisch oder deklarieren Sie sie in der globalen Zone.

Bevor Sie ihm einen neuen Wert zuweisen, prüfen Sie, ob ein neuer Balken vorhanden ist, und prüfen Sie die Differenz zwischen seinem Wert und dem aktuellen Wert, und weisen Sie ihm dann einen neuen Wert zu.

 
smshev:
Wenn das Schließen von Trades im Tester so geschrieben wird, wie Sie es aufgelistet haben, ist es höchstwahrscheinlich das Ergebnis der Orderclose-Funktion (TP und SL haben nichts damit zu tun)

Danke, aber es scheint keine Fehler im Code zu geben:

int CloseOrder(int ticket, double lots)
              {
               int err,i1;
               double price;
               OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
               if (lots<MarketInfo(Symbol(),MODE_MINLOT))lots=MarketInfo(Symbol(),MODE_MINLOT);
               while(i1<10)
                   {
                    RefreshRates();
                    if (OrderType()==0)price=Bid;
                    if (OrderType()==1)price=Ask;
                    if (OrderType()>1){OrderDelete(ticket);return(0);}
                    OrderClose(ticket,lots,NormalizeDouble(price,Digits),Slippage,Goldenrod);
                    err = GetLastError();
                    if (err == 0) break;
                    Print(WindowExpertName(),Symbol(),Error(err),"  при закрытии ордера");
                    Sleep(100);
                    i1++;
                   }
               return(0);
              }
Grund der Beschwerde: