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

 
Nachmittags. Hilfe mit Funktion bitte, Summen Verlust von geschlossenen Aufträgen, wenn mit close orders Funktion metatrader stürzt, ich denke, es gibt einige Fehler in dieser Funktion.
double ClosProfit()
{
double summa=0;
int orders=OrdersHistoryTotal();
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Fehler im Verlauf!");
break;
}
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
continue;
//---
if(OrderProfit()>0) break;
If(OrderProfit()<0)i++;
}
If(i<0)
summa=OrderProfit()+summa;
}
If(AuftragGewinn()>summa)
summa=OrderProfit()+summa;
return(summa);
}
 
Lowech:
Hallo. Bitte helfen Sie mir mit dieser Funktion, sie fasst die Verluste geschlossener Orders zusammen. Metatrader stürzt ab, wenn er mit der Funktion für geschlossene Orders verwendet wird, ich denke, es gibt eine Art Fehler in dieser Funktion.

Es ist besser, sich fertige Vorlagen anzusehen und sie bei Bedarf anzupassen. GewinnVonDatumInWährungErzielen()

 
Lowech:
Nachmittags. Hilfe mit Funktion bitte, fasst den Verlust von geschlossenen Aufträgen, wenn mit close orders Funktion verwendet metatrader abstürzt, ich denke, es gibt eine Art von Fehler in dieser Funktion.

Was meinen Sie mit "Metatrader stürzt ab"? Das Programm kompiliert mit Fehlern!!!

An drei Stellen heißt es statt If mit Kleinbuchstaben If mit Großbuchstaben

ein Paar geschweifte Klammern ist eindeutig unnötig: die erste nach int orders=OrdersHistoryTotal(); und ihr Paar nach summa=OrderProfit()+summa; - aber das ist unwichtig

Es gibt auch...

 
Lowech:
Nachmittags. Hilfe mit dieser Funktion bitte, es summiert den Verlust von geschlossenen Aufträgen, wenn mit der Funktion close orders verwendet Metatrader stürzt ab, ich denke, es gibt eine Art Fehler in dieser Funktion.

Versuchen Sie dies:

double ClosProfit()
{ double summa=0;
  int orders=OrdersHistoryTotal(); 
  for(int i=orders-1;i>=0;i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()<0.0) summa=OrderProfit()+summa;
  }
  return(summa);
}
 
Ich habe 2 Minuten zu spät geschrieben ... Lassen Sie uns diesen Teil sorgfältig prüfen:
  for(int i=orders-1;i>=0;i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
    {
      Print("Error in history!");
      break;
    }
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()>0) break;
    if(OrderProfit()<0)i++;
  }
  if(i<0)

Kompiliert mit der #property strict Direktive - es ist die letzte Zeile: i' - nicht deklarierter Bezeichner. Der Punkt ist, dass die Variable in einer Schleife deklariert wird und nur in der Schleife gültig ist. Ohne die #property strict-Direktive kompiliert es ohne Fehler, aber das ist schlecht. Die Richtlinie muss verwendet werden.

Es ist einfacher, if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) anstelle von if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) zu schreiben. Der nächste Schritt ist ein Break - das ist der Ausstieg aus der Schleife. Aber wir müssen die anderen Aufträge bearbeiten. In der Geschichte ist dies jedoch nicht notwendig. Der Fehler tritt bei Börsenaufträgen und schwebenden Aufträgen auf, wenn der Auftrag zum Zeitpunkt der Bearbeitung bereits geschlossen ist und er fehlt. Die allgemeine Faustregel lautet: if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue; - mit der Verarbeitung der nächsten Aufträge fortfahren

Ersetzen Sie aus demselben Grund if(OrderProfit()>0) break; durch if(OrderProfit()>0) continue;

Und hier ist der Grund für den Fehler: if(OrderProfit()<0)i++; - if(OrderProfit()>0; - der Index wird erhöht. Und der Schleifenkopf for(int i=orders-1;i>=0;i--) verringert sie. Die Bearbeitung desselben Auftrags wird wiederholt und das Programm gerät in eine Schleife. Das ist wahrscheinlich auch richtig so:

#property   strict
double ClosProfit()
{
  double summa=0;
  for(int i=OrdersHistoryTotal()-1; i>=0; i--)
  {
    if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()<0) summa+=OrderProfit();
  }
  return(summa);
}
 
STARIJ:
2 Minuten Verspätung beim Schreiben ... Überlegen wir uns diesen Teil genau:

Kompiliert mit der #property strict Direktive - es ist die letzte Zeile: i' - nicht deklarierter Bezeichner. Der Punkt ist, dass die Variable in einer Schleife deklariert wird und nur in der Schleife gültig ist. Ohne die #property strict-Direktive kompiliert es ohne Fehler, aber das ist schlecht. Die Richtlinie muss verwendet werden.

Es ist einfacher, if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) anstelle von if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) zu schreiben. Der nächste Schritt ist ein Break - das ist der Ausstieg aus der Schleife. Aber wir müssen die anderen Aufträge bearbeiten. In der Geschichte ist dies jedoch nicht notwendig. Der Fehler tritt bei Börsenaufträgen und schwebenden Aufträgen auf, wenn der Auftrag zum Zeitpunkt der Bearbeitung bereits geschlossen ist und er fehlt. Die allgemeine Faustregel lautet: if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue; - mit der Verarbeitung der nächsten Aufträge fortfahren

Aus demselben Grund if(OrderProfit()>0) break; ersetzen durch if(OrderProfit()>0) continue;

Und hier ist der Grund für den Fehler: if(OrderProfit()<0)i++; - if(OrderProfit()>0; der Index wird hochgezählt. Und der Schleifenkopf for(int i=orders-1;i>=0;i--) verringert sie. Die Bearbeitung desselben Auftrags wird wiederholt und das Programm gerät in eine Schleife. Das ist wahrscheinlich auch richtig so:


Vielen Dank, keine Metatrader-Abstürze mehr) Betreffend

if(OrderProfit()>0) break; ersetzen durch if(OrderProfit()>0) continue;

Ich möchte, dass diese Funktion den Gewinn ignoriert, wenn ein Auftrag mit Gewinn geschlossen wird, und nur den Verlustbetrag berücksichtigt, bevor der erste Auftrag mit Gewinn geschlossen wird. D.h.

if(OrderProfit()>0) break;


Ich sollte den Zähler stoppen, wenn der Auftrag mit Gewinn geschlossen wurde, sehe ich das richtig?
 
Lowech:

Danke, keine Metatrader-Abstürze mehr) Was ich brauche, ist, dass, wenn eine Order mit Gewinn schließt, die Funktion diesen Gewinn nicht berücksichtigt, sondern nur die Höhe des Verlustes und bis zur ersten Order, die mit Gewinn geschlossen wurde. D.h.
Ich sollte den Zähler stoppen, wenn der Auftrag mit Gewinn geschlossen wurde, sehe ich das richtig?
Ihre Argumentation ist fast richtig. Es gibt keine Garantie für eine Auftragserteilung in der Geschichte. Für sich selbst können Sie, aber für den Verkauf - schlecht.
 
STARIJ:
Ihre Argumentation ist fast richtig. Es gibt keine Garantie für eine Ordnung in der Geschichte. Für Sie selbst - ja, aber für den Verkauf - schlecht.
Berechnet die auftragsbezogene Schleife die Aufträge nicht der Reihe nach?
 
STARIJ:

Wenn es eine Quelle gibt - DROW_NONE - keine Zeichnung

Hat nicht geholfen, zeigt immer noch Zahlen in der Ecke an

 
Lowech Zählt die Auftragsschleife die Aufträge nicht der Reihe nach?

In der Reihenfolge der Reihenfolge in der Liste. Es gibt jedoch keine Garantie für eine bestimmte Reihenfolge in dieser Liste.