|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Letzte Werte aus der History
Hallo,
ich möchte die letzten paar Werte der History überprüfen. Gesucht wird dabei der OpenPrice der (je nachdem!) letzten OP_BUYSTOP oder OP_SELLSTOP-Order. Beide werden immer vorliegen. Meine Idee ist, ein Array über z. B. die letzten sechs Werte zu erstellen, aus dem dann je nach erfüllter Bedingung die Buy- oder Sell-Order selektiert wird. Die Situation im Tester ist so, dass es zwei Deleted-Positionen gibt (ein OP_BUYSTOP und eine OP_SELLSTOP-Position). Das Problem: die for-Schleife wird nicht verlassen. Wenn ich die Daten nach der Schleife printe, sehe ich, dass er immer wieder nur eine der beiden Orders listet... Anbei der Code und Danke im Voraus! Code:
int ArOrdersHistory[]; for (int iPos_H=OrdersHistoryTotal()-1; iPos_H> OrdersHistoryTotal() - 6; iPos_H--) { if (OrderSelect(iPos_H, SELECT_BY_POS, MODE_HISTORY)) { ArrayResize (ArOrdersHistory, iPos_H+1); ArOrdersHistory[iPos_H]=OrderOpenPrice(); iPos_H++; } } |
|
|||
Du kannst iPos_H doch nicht NACH jedem Schleifendurchlauf verringern und gleichzeitig im Schleifenkörper jedesmal erhöhen.
Außerdem ist dein Array unnötig groß. Beim ersten Durchlauf ist er so groß wie OrderHistoryTotal() und bei jedem weiteren +1. Alle vorherigen Plätze im Array (also 0 - OrdersHistoryTotal()-1) sind bei dir leer. Das ist echte Verschwendung. Dein Code würde so "richtiger" sein. Code:
int ArOrdersHistory[], arr_count = 0; for (int iPos_H=OrdersHistoryTotal()-1; iPos_H > OrdersHistoryTotal() - 6; iPos_H--) { if (OrderSelect(iPos_H, SELECT_BY_POS, MODE_HISTORY)) { arr_count++; ArrayResize(ArOrdersHistory, arr_count); ArOrdersHistory[arr_count-1] = OrderOpenPrice(); } } |
|
|||
Wenn tatsächlich nur die letzte PendingOrder gesucht wird, dann geht das ganz einfach:
Code:
double lastopenprice; for (int iPos_H=OrdersHistoryTotal()-1; iPos_H>=0; iPos_H--) { if (OrderSelect(iPos_H, SELECT_BY_POS, MODE_HISTORY)) { if (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP) { lastopenprice = OrderOpenPrice(); break; } } }
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Naja, wenn er immer die letzte BUY und SELL meint, so könnte man deinen Code
z.B. so erweitern Code:
double lastopenprice_b = 0, lastopenprice_s = 0; for(int iPos_H=OrdersHistoryTotal()-1; iPos_H>=0; iPos_H--) // 0, oder OrdersHistoryTotal() - 6 halt { if(OrderSelect(iPos_H, SELECT_BY_POS, MODE_HISTORY)) { if(OrderType() == OP_BUYSTOP) lastopenprice_b = OrderOpenPrice(); else if(OrderType() == OP_SELLSTOP) lastopenprice_s = OrderOpenPrice(); if(lastopenprice_b && lastopenprice_s) break; } } |
|
|||
Zitat:
Anders beschrieben (also das, was ich am Ende eigentlich will): Jeden Abend soll die jeweils eine bestehende SELLSTOP und BUYSTOP gelöscht werden. Beim Handelsbeginn sollen beide wieder geöffnet werden, abhängig davon, wo der Eröffnungskurs liegt. Also z. B. Ask>OpenPrice der gel. BUYSTOP, dann BUYSTOP x Punkte höher in den Markt legen. Letzteres krieg ich schon hin. Was ich nicht hinkriege: Ich dachte, aus der Long-Richtung lösche ich einfach zuerst den SELL, dann den BUY und habe den BUY als letzte Position in der History. Aber Pustekuchen: obwohl die Delete-Anweisungen chronologisch nacheinander im Code stehen, wird zuerst die BUY gelöscht... (also grob: for-Schleife über OrdersTotal, dann OrderSelect, if SELL dann löschen, danach if BUY dann löschen. Gelöscht wird aber in der Reihenfolge des Anlegens der STOPs. Wenn ich sicherstellen kann, dass zuletzt die eigentlich gewünschte STOP-Order gelöscht wird, dann, TraderDoc, ist dein Code der richtige. Gelöst werden muss also das eine oder das andere Problem... Danke nochmal für eure Hilfe. P.S. für next user: Habe im Körper iPos_H++ in iPos_H-- geändert, nützte aber nichts... |
|
|||
Zitat:
Wenn hier Handelsbeginn ein Neustart heißt, könntest du die Ordernummern vielleicht auch einfach in einer Datei speichern, wobei bei dieser Kleinigkeit auch einfach in einer Schleife abgefragt werden kann. Zitat:
Somit macht der Code genau das, was er soll. Er ermittelt den Preis der letzten gelöschten Order entsprechenden Typs. Also nochmal kurz mit Kommentar Code:
double lastopenprice; // Schleife geht die GANZE Orderhistorie durch... for(int iPos_H=OrdersHistoryTotal()-1; iPos_H>=0; iPos_H--) { if(OrderSelect(iPos_H, SELECT_BY_POS, MODE_HISTORY)) { // Die Schleife arbeitet sich von der letzten Stelle in der // Historie zur ersten durch. // Der folgende Code speichert den OrderPrice der ZULETZT // gelöschten Buystop-Order und bricht die Schleife ab. if(OrderType() == OP_BUYSTOP) {lastopenprice = OrderOpenPrice(); break;} } } Zitat:
brauchst du es garnicht zu machen. So wie du es jetzt gemacht hast, verringerst du iPos_H jedesmal um 2. |
|
|||
Zitat:
Jetzt steh ich aber doch wegen der vorhin beschriebenen Absicht auf dem Schlauch: "if ask>lastopenprice" dann "lastopenprice+10" und nochmal gucken, wenn wieder ask>[lastopenprice+10] dann wieder +10, alles bis ask<lastopenprice, dann OrderSend BUYSTOP...: Wie macht man das (ich dachte, ich hätt ne Schleife, hab ich aber nicht...)? OrderSend kann ich dabei selber schon prima erstellen! Danke wieder im Voraus!! |
|
|||
Ich versteh grad nicht, wieso du in einer Schleife lastopenprice solange um 10 erhöhen willst, bis es über ask ist.
Wieso machst du nicht einfach sowas wie Code:
if(Ask > lastopenprice) lastopenprice = Ask + DEIN_ABSTAND; |
|
|||
Zitat:
Unabhängig davon, ob man das für dumm erachtet: Wie erhöht man den Wert...? THX!! |
|
|||
Zitat:
|
Lesezeichen |
Stichworte |
for-schleife hängt, historie, history, letzte historische daten prüfen, loop hängt, mql4, programmierung, programmierung metatrader, programmierung mql4 |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|