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)
-   -   High/Low NACH OrderOpenTime (http://www.expert-advisor.com/forum/showthread.php?t=6616)

fintrad0 19.03.20 15:25

High/Low NACH OrderOpenTime
 
Hallo,
kann mir jemand sagen, wie ich das High/Low NACH der Ordereröffnung ermitteln kann?
Das High/Low der laufenden Kerze kann genauso gut vor der Ordereröffnung gewesen sein, deswegen hilft mir das Beispiel aus der Hilfe nicht weiter.

Zitat:

BarsAfterOpen=iBarShift(symbol,PERIOD_M1,OrderOpen Time(),false);

PeriodHighest = iHigh(symbol,PERIOD_M1,iHighest(symbol,PERIOD_M1,M ODE_HIGH,BarsAfterOpen,0));

Beispiel:
Tmeframe M1
BarOpenTime: 10:27:00
OrderOpenTime: 10:27:32
High: 1,08500 vor oder nach OrderOpenTime?
Low: 1,08400 vor oder nach OrderOpenTime?

Es reicht also nicht, den Index der Kerze zu erhalten, in dem die Order eröffnet wurde.
Im Moment bin ich planlos. Meine spontane Idee wäre, die Uhrzeit des High/Low der laufenden Kerze festzustellen und diese mit der OrderOpenTime zu vergleichen. Nur, keine Ahnung, wie.

Es wäre super, wenn hier jemand eine Idee oder Lösung parat hätte.

Vielen Danke schon mal!

Gruß Werner

fintrad0 19.03.20 17:46

Zaghafter Lösungsansatz
 
Falls mal jemand über diesen Beitrag stolpert, ich teste gerade dieses Vorgehen: Es geht um eine Multicurrency-EA mit Ordermanagement (Hidden-SL, -Trailing, -BE, -Teilverkauf, -TP). Da sich die Variablen für die Preislinien sich ständig ändern (je nach selektierter Order) orientiere ich mich an iHighest, iLowest und OrderOpenPrice() der jeweiligen Order.

Die Ordermanagement-Funktion rufe ich auf und übergebe die Ticketnumber.

Code:

//Anzahl der M1-Bars seit Ordereröffnung

BarsAfterOpen=iBarShift(symbol,PERIOD_M1,OrderOpenTime(),false);

            if(BarsAfterOpen == 0) {                      // wenn innerhalb der selben Kerze der Ordereröffnung
              if(ask >= OrderOpenPrice()) {            // wenn momentaner Preis >= Eröffnungspreis ...
                  PeriodHighest = ask;                      // momentaner Preis ist der höchste
                  PeriodLowest = OrderOpenPrice();  // tiefster Preis ist Eröffnungspreis
              } 
             
              if(bid <= OrderOpenPrice()){            // siehe oben al reves
                  PeriodHighest = OrderOpenPrice();
                  PeriodLowest = bid;
            }
            else {                                              // wenn seit der Eröffnung mehr als 0 Kerzen vergangen sind
                PeriodHighest = iHigh(symbol,PERIOD_M1,iHighest(symbol,PERIOD_M1,MODE_HIGH,BarsAfterOpen,0));
                PeriodLowest = iLow(symbol,PERIOD_M1,iLowest(symbol,PERIOD_M1,MODE_LOW,BarsAfterOpen,0));
            }

Die Preislinien PeriodHighest / PeriodLowest verwende ich, um den Abstand zum OrderOpenPrice() zu messen und um festzustellen, ob ich mich über/unter den Werten für TrailingStart, TrailingDistance, MoveToBreakEven, PartialClose etc. befinde:

Code:

              if(PeriodHighest > OrderOpenPrice()+trailingstart*point)               
                {
                  buystoplossprice= PeriodHighest - trailingdistance * point;                                               
                }                 
           
              if(PeriodHighest > OrderOpenPrice() + breakevenpoints * point)
                {
                  if(buystoplossprice < OrderOpenPrice())                                     
                      buystoplossprice = OrderOpenPrice() + breakevengain * point;                                                 
                  } 

etc., etc., etc.

Am Ende der Funktion prüfe ich, ob mein aktueller Preis eine der Linien (buystoplossprice, sellstoplossprice) über-/unterschritten hat um die Order teilweise oder ganz zu schließen.

Code:


 //---- schließt Order wenn unter/über SL/TP-Linie -------- 
                             
                if((bid <= buystoplossprice) || (ask >= buytakeprofitprice))
                  {
                    bool ret=OrderClose(ticketnumber,OrderLots(),OrderClosePrice(),Slippage,Red);             
                  }


Falls es so nicht klappen sollte, kann es immer noch als Inspiration dienen:-)

Schönen Gruß

Werner

RetepM 23.03.20 12:08

Hi,
eine „quick and dirty“ Lösung. Schreibe das aktuelle High/Low parallel zum OrderSend in zwei Variablen. Danach brauchst Du nur zu prüfen, sind die danach auftretenden High/Low größer bzw. kleiner als die zuvor erfassten „OrderSend High/Low Variablen“.
Grüße

fintrad0 25.03.20 05:03

Zitat:

Zitat von RetepM (Beitrag 43433)
Hi,
eine „quick and dirty“ Lösung. Schreibe das aktuelle High/Low parallel zum OrderSend in zwei Variablen. Danach brauchst Du nur zu prüfen, sind die danach auftretenden High/Low größer bzw. kleiner als die zuvor erfassten „OrderSend High/Low Variablen“.
Grüße

Guter Hinweis, danke!
Jetzt bin ich endlich fertig und der Code scheint auch sauber zu arbeiten. Es mussten doch noch einige Änderungen vorgenommen werden, an die ich anfangs nicht dachte und die mich fast zur Verzweiflung getrieben hätten. Vielleicht hilfts jemandem...

Anzahl Kerzen nach Ordereröffnung:
Code:

int BarsAfterOpen=iBarShift(symbol,PERIOD_M1,OrderOpenTime(),false);

// Wenn BarsAfterOpen == 0 (also während der selben Minute der Eröffnung), liefert High/Low der Kerze einen unsinnigen Wert., Deswegen ...
           
if(BarsAfterOpen < 1) BarsAfterOpen=1; 

//...BarsAfterOpen mindestens 1, bevor High/Low ermittelt wird

 double BuyPeriodHighest = iHigh(symbol,PERIOD_M1,iHighest(symbol,PERIOD_M1,MODE_HIGH,BarsAfterOpen,0));

Hoch/Tief der Trailingstop-Linie muss mindestens bei OrderOpenPrice() +- trailingstart liegen.
Code:

  double BuyInitPeriodHighest = NormalizeDouble(OrderOpenPrice() + (trailingstart*point), digits);
  double BuyPeriodHighest = iHigh(symbol,PERIOD_M1,iHighest(symbol,PERIOD_M1,MODE_HIGH,BarsAfterOpen,0));           

  if(BuyInitPeriodHighest >= BuyPeriodHighest) BuyPeriodHighest = BuyInitPeriodHighest;  // wenn Candlehigh < trailingstart

Wie gesagt, vom Code meines Originalposts ist nicht mehr viel übrig geblieben. Dafür ist meine Erkenntnis gewachsen.

Schönen Gruß
Werner


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:38 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