Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4973
Beiträge: 43248
Benutzer: 7.219
Aktive Benutzer: 81
Links: 84
Wir begrüßen unseren neuesten Benutzer: Hopfen&Malz
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einem Tag
- Hopfen&Mal...
vor 2 Tagen
- frankmicha...
vor einer Woche
- DFeck
vor einer Woche
- bb1107
vor 2 Wochen
- rg-trader

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 795
Gesamt: 795
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 05.08.17
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 20
icepick1661 befindet sich auf einem aufstrebenden Ast
Standard 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++;
         }
      }
  #2 (permalink)  
Alt 05.08.17
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

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();
   }
}
  #3 (permalink)  
Alt 05.08.17
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.733
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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;
      }         
   }
}
traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #4 (permalink)  
Alt 05.08.17
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

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;
   }
}
  #5 (permalink)  
Alt 05.08.17
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 20
icepick1661 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von traderdoc Beitrag anzeigen
Wenn tatsächlich nur die letzte PendingOrder gesucht wird, dann geht das ganz einfach:

traderdoc
Danke für Eure Antworten. Es geht allerdings nicht um genau die letzte Order sondern um die Frage, welche der letzten beiden (oder 6?) die gelöschte BUYSTOP ist.

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...
  #6 (permalink)  
Alt 05.08.17
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von icepick1661 Beitrag anzeigen
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.
Falls dein Code durchgehend läuft, so könntest du einfach die OrderNummer der zu löschenden Order speichern.
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:
Zitat von icepick1661 Beitrag anzeigen
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.
Falsch. Traderdocs Code "sucht" die zuletzt gelöschte Order in der ganzen Orderhistorie und prüft nicht nur die allerletzte Stelle.
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:
Zitat von icepick1661 Beitrag anzeigen
P.S. für next user: Habe im Körper iPos_H++ in iPos_H-- geändert, nützte aber nichts...
Das ist sinnlos. In der Schleife selbst definierst du ja, das nach jedem Durchgang iPos_H verringert wird. Im Körper
brauchst du es garnicht zu machen. So wie du es jetzt gemacht hast, verringerst du iPos_H jedesmal um 2.
  #7 (permalink)  
Alt 05.08.17
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 20
icepick1661 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von next user Beitrag anzeigen
Das ist sinnlos. In der Schleife selbst definierst du ja, das nach jedem Durchgang iPos_H verringert wird. Im Körper
brauchst du es garnicht zu machen. So wie du es jetzt gemacht hast, verringerst du iPos_H jedesmal um 2.
Danke, dann ist mir klar, dass es da nicht rausspringen konnte.

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!!
  #8 (permalink)  
Alt 05.08.17
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

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;
  #9 (permalink)  
Alt 05.08.17
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 20
icepick1661 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von next user Beitrag anzeigen
Ich versteh grad nicht, wieso du in einer Schleife lastopenprice solange um 10 erhöhen willst, bis es über ask ist.
Weil noch offene Longorders da sind. Einfach ausgedrückt wird (beispielhaft) alle 10 Punkte eine Longorder eröffnet, da soll die neue ins Gefüge passen. Longorder neu basiert auf Longorder alt, nicht auf aktuellem Ask. Deshalb muss es immer um 10 rauf, bis der Wert über Ask liegt. Die Erhöhung kann auch prozentual erfolgen...

Unabhängig davon, ob man das für dumm erachtet: Wie erhöht man den Wert...?

THX!!
  #10 (permalink)  
Alt 05.08.17
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 20
icepick1661 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von icepick1661 Beitrag anzeigen
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...)?
Danke, hab's gefunden, schon oft gelesen; do while-Schleife...
Thema geschlossen

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
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 20:57 Uhr.





Suchmaschine - Reisen - Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------