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

 
wishmast:

Bitte sagen Sie mir, warum die Funktion OrdersTotal() bei der Suche nach Bestellungen -1 schreibt.

Beispiel: for (i=OrdersTotal()-1 ;i>=0; i--)

warum nicht einfach OrdersTotal()?

Beginnt die Anzahl der Aufträge in dieser Funktion bei 0 oder bei 1? Das heißt, wenn es eine Bestellung gibt, ist OrdersTotal() gleich 0 oder 1?

Zählen von Null
 
wishmast:

Bitte sagen Sie mir, warum die Funktion OrdersTotal() bei der Suche nach Bestellungen -1 schreibt.

Beispiel: for (i=OrdersTotal()-1 ;i>=0; i--)

warum nicht einfach OrdersTotal()?

Beginnt die Zählung der Aufträge in dieser Funktion bei 0 oder bei 1? Das heißt, wenn es eine Bestellung gibt, ist OrdersTotal() gleich 0 oder 1?

Die FunktionOrdersTotal() zeigt die Menge an, d.h. wenn es eine Bestellung gibt,ist die Funktion OrdersTotal() gleich 1, aber in der Liste der Bestellungen beginnt der Bericht mit 0

0 - erste Ordnung

1 - zweiter Ordnung

2 - dritte

und so weiter.

Wenn wir also die Suche am Ende der Liste beginnen, müssen wir von der Gesamtzahl vonOrdersTotal() eins abziehen.

 
Sergey Gritsay:

OrdersTotal() zeigt die Menge an, d.h. wenn es eine Bestellung gibt, dannist OrdersTotal() eins, aber in der Liste der Bestellungen beginnt der Bericht bei null

0 - erste Ordnung

1 - zweiter Ordnung

2 - dritte

und so weiter.

Wenn wir also die Suche am Ende der Liste beginnen, müssen wir von der Gesamtzahl vonOrdersTotal() eins abziehen.

Wenn wir aber nicht eins vom ersten Ausdruck subtrahieren, ist das kein Fehler, denn wenn wir eine Reihenfolge haben, gibt es zwei Iterationen. Es sei denn, wir brauchen nicht zwei Iterationen, wenn wir alles, was wir brauchen, in einer einzigen machen können, also -1, richtig?
 
wishmast:
Aber wenn der erste Ausdruck nicht eins subtrahiert, ist es kein Fehler, wenn wir eine Reihenfolge haben, werden zwei Iterationen stattfinden. Es sei denn, es besteht keine Notwendigkeit, zwei Iterationen durchzuführen, wenn alles, was wir brauchen, in einer erledigt werden kann, also -1, richtig?
Ja, das ist richtig.
 
Sergey Gritsay:
Ja, richtig

Nicht ganz richtig.

Sie können das Präfix Dekrement verwenden.

for(int i = OrdersTotal(); i >= 0; --i)
 
trader781:
Da wir einen Stapel von Aufträgen haben, warum können wir nicht einfach einen herausnehmen, den wir brauchen? (Die richtigen) und mit ihnen machen, was wir wollen? z.B. Bestellung (i-4)
Denn es funktioniert nur im MT4-Tester. Oder beim Handel mit nur einem Symbol und nur einem EA.
 
Vitalie Postolache:
Denn das funktioniert nur im MT4-Tester. Oder beim Handel mit nur einem Symbol und nur einem EA.

Wenn Sie darüber nachdenken, ist der EA für jedes Paar derselbe, nur der Kontostand ist gemeinsam (der Wechsel wird der letzte sein)

der Filter geht auf alle Aufträge, die die Bedingung market-open des Expert Advisors erfüllen, wenn das Symbol übereinstimmt

Was ist los?

 
trader781:

Wenn Sie darüber nachdenken, ist der EA für jedes Paar derselbe, nur der Kontostand ist gemeinsam (der Wechsel wird der letzte sein)

der Filter geht auf alle Orders, die die Bedingung market-open durch den EA erfüllen, wenn die Simulation passt

Was ist los?

Nun, es wurde Ihnen oben bereits erklärt, was falsch ist. Wir können die Bestellungen nur als unsere zählen und die Array-Indizes nach der Gesamtmenge nehmen - wir erhalten ein Array mit leeren Zellen. Und wofür ist das gut? Und wenn das Array nicht leer war, enthalten die "unnötigen" Felder unnötigen Müll, der zu Fehlern führt, und wir reden hier von Geld.
 
Vitalie Postolache:
Nun, es wurde Ihnen bereits oben erklärt, was falsch ist. Aufträge zählen nur ihre eigenen, und nehmen Sie die Array-Indizes für die Gesamtzahl - Sie erhalten ein Array mit leeren Zellen. Und wofür ist das gut? Und wenn das Array nicht leer war, werden die "unnötigen" Felder unnötigen Müll enthalten, der zu Fehlern führt, und wir reden hier von Geld.

OK, so funktioniert es.

struct myorder
{
int    Ticket;
double orderopenprice;
int   ordertype;
double profit;
double stoploss;
double  lot;
};

myorder orders[];

int i;
int count1=0;
void CalcOrders()
{
for(i=OrdersTotal()-1; i>=0; i--)
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
         && (OrderMagicNumber()==Magic) && (OrderType()<2))
         orders[count1].Ticket=OrderTicket();
         orders[count1].lot=OrderLots();
         orders[count1].orderopenprice=OrderOpenPrice();
         orders[count1].ordertype=OrderType();
         orders[count1].profit=OrderProfit();
         orders[count1].stoploss=OrderStopLoss();
         count1++;
     }
}    


oder?

 
Helfen Sie mir, die Bedingung aufzuschreiben: Wenn das verfügbare Guthaben auf dem Konto weniger als 50% der Einlage beträgt, dann {action} MT5