Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   for loop - Erklärung für dummys (http://www.expert-advisor.com/forum/showthread.php?t=6759)

MarkusWilhelm89 28.08.20 08:12

for loop - Erklärung für dummys
 
Hallo,
kann mir jemand die Funktionsweise von einem for-loop erklären, mit dem man die Anzahl der offenen Aufträge zählt?
Ich verstehe nicht, warum es OrdersTotal()-1 heißt


for(int b=OrdersTotal()-1;b>=0;b--)

Indikator-Trading 28.08.20 08:32

Der Rückgabewert von OrdersTotal() ist z.b. 1 wenn eine Order offen ist. In der For-Abfrage wird ja gecheckt ob b>=0 ist. Das ist somit gegeben sobald min. Eine Order im Markt ist. Da in vielen weiteren Anfragen (z.b. OrderSelect) die Abfrage der jeweiligen Order mit 0 beginnt, und nicht mit 1, wird hier direkt am Anfang -1 abgezogen. Die Liste der Orders rückwärts durchzugehen ist auch nötig, da sich sonst beim Schließen einer Order die Reihenfolge der nächsten ändert.
Gruß Timo

MarkusWilhelm89 28.08.20 08:53

Das heißt also für die Denklogik,
die erste gefundene Order hat den Wert 0 und nicht den Wert 1?

Indikator-Trading 28.08.20 09:02

Die Orders werden in der Reihenfolge durchlaufen, in der sie im Markt platziert worden sind. Es werden auch PendingOrders mitgezählt!

Hier als Beispiel:

Drei Order sind aktiv:
OrdersTotal() ist 3
For-Schleife läuft von 2 bis 0

Eine Order ist aktiv:
OrdersTotal() ist 1
For-Schleife läuft von 0 bis 0, also nur einmal durch!

keine Order ist im Markt (auch keine PendingOrder!):
OrdersTotal() ist 0
For-Schleife läuft nicht durch, da b=-1 und somit nicht >=0 ist!

MarkusWilhelm89 28.08.20 10:03

D.h. in diesem Beispiel:

ich initiiere "orders" mit dem Wert 0 --> solange OrdersTotal <=0 ist, erhöhe um 1. Bei dem nächsten Durchlauf wieder... also ist es eine Endlosschleife, oder?

Was ich auch nicht verstehe, warum er mit der Formel mit im Comment nicht zählt wie viele Buy-Orders offen sind:confused:


//___Offene Aufträge zählen___
int buyCount=0, sellCount=0, totalCount=buyCount+sellCount;

for(int orders=0; orders<=OrdersTotal()-1;orders++)
{ if (OrderSelect(orders,SELECT_BY_TICKET)==true)
if (OrderSymbol()==_Symbol)
if (OrderMagicNumber()==MagicNumber)
{ if(OrderType()==OP_BUY) buyCount++;
else if(OrderType()==OP_SELL) sellCount++;
}
}

Comment("Aufträge: ", buyCount);

Indikator-Trading 28.08.20 11:41

Du solltest dich allgemein erstmal vielleicht mit C-Programmierung beschäftigen, also ein C-Buch kaufen und durchlesen.

Dann wird das auch mit der For-Schleife kein Problem mehr sein.

Außerdem hast du hier jetzt eine andere For-Schleife genommen, welche eben hochzählt und nicht runterzählt. Die Schleifenbedingung ist bei diesem Beispiel "orders<=OrdersTotal()-1". In dem ersten Fall war es "b>=0".

Bleib also am besten erstmal bei einer Variante und versuche diese richtig zu verstehen, Gruß Timo

AVT 28.08.20 13:36

Zitat:

Zitat von MarkusWilhelm89 (Beitrag 44314)
kann mir jemand die Funktionsweise von einem for-loop erklären, mit dem man die Anzahl der offenen Aufträge zählt?
Ich verstehe nicht, warum es OrdersTotal()-1 heißt
for(int b=OrdersTotal()-1;b>=0;b--)

In vielen Sprachen, wie hier in MQL auch, beginnt eine Zählung mit 0, das heißt der 1. Wert hat die Zählnummer 0 - und nicht wie bei uns im Leben die Nummer 1.
Hast Du also 6 Werte, dann wird so gezählt:
Zählnummer 0 = 1. Wert
Zählnummer 1 = 2. Wert
Zählnummer 2 = 3. Wert
Zählnummer 3 = 4. Wert
Zählnummer 4 = 5. Wert
Zählnummer 5 = 6. Wert
Willst Du also alle Werte in einer Schleife abfragen, dann beginnst Du bei einer "Rückwärtsschleife" bei dem letzten Wert, das ist hier der 6. Wert und der hat eine Zählnummer 5 (nämlich genau 6-1) und zählst runter bis einschließlich 0.
Bei einer "Vorwärtsschleife" beginnst Du beim 1. Wert, der hat die Zählnummer 0 und zählst rauf bis zum 6. Wert mit der Zählnummer 5.
AVT

AVT 28.08.20 13:43

Zitat:

Zitat von MarkusWilhelm89 (Beitrag 44319)
Was ich auch nicht verstehe, warum er mit der Formel mit im Comment nicht zählt wie viele Buy-Orders offen sind:confused:

Code:

//___Offene Aufträge zählen___
int  buyCount=0,  sellCount=0, totalCount=0; //KennenWirNochNicht

  for(int  orders=0; orders<=OrdersTotal()-1;orders++)
  {  if (OrderSelect(orders,SELECT_BY_TICKET)==true)
      if (OrderSymbol()==_Symbol)
      if (OrderMagicNumber()==MagicNumber)
      {  if(OrderType()==OP_BUY) buyCount++;
        else if(OrderType()==OP_SELL) sellCount++;
      }
    }
    totalCount=buyCount+sellCount; //NunAlleGefundenenAddieren
Comment("Aufträge: ", IntegerToString(totalCount)); //UndAnzeigen

AVT

traderdoc 28.08.20 14:14

Und auch dieser wird nicht richtig funktionieren, weil bei
OrderSelect die falschen Parameter benutzt werden.
orders steht für die Position von 0 bis OrdrrsTotal() -1
und nicht für die Ticketnummer.

traderdoc

MarkusWilhelm89 30.08.20 21:54

Jetzt hab ich's kapiert...
Klar, es muss heißten:
if (OrderSelect(OrderTicket(),SELECT_BY_TICKET)==true)

Danke für die Hilfe :-)


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:58 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum