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--) |
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 |
Das heißt also für die Denklogik,
die erste gefundene Order hat den Wert 0 und nicht den Wert 1? |
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! |
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); |
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 |
Zitat:
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 |
Zitat:
Code:
//___Offene Aufträge zählen___ |
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 |
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 00:07 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