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)
-   -   Max-/Min-Werte im dynamischen Array (http://www.expert-advisor.com/forum/showthread.php?t=5758)

icepick1661 19.07.17 22:44

Max-/Min-Werte im dynamischen Array
 
Hallo,

ich erweitere momentan meine Erfahrungen in der MQL4-Programmierung.

Mit nachfolgendem Code will ich den Max-Preis (OderOpenPrice() aller offenen Long-Positionen (und später auch den Min-Wert aller Short-Positionen...) ermitteln und später weiterverwenden.

Das Array soll dynamisch sein, weil Orders dazukommen oder geschlossen werden.

Gleichwohl: es funktioniert einfach nicht. Die Sortierfunktionen gelten alle nur für statische Arrays, im Web gefundene Vergleiche der einzelnen Elemente bringen auch nichts.

Hier der Code (ich krieg ihn nicht anders rein...):

double ArrayName[];
int iPos = OrdersTotal();

ArrayResize(ArrayName,iPos+1);

ArrayInitialize(ArrayName,0);
for(iPos=0; iPos<=OrdersTotal(); iPos++)
{
if (OrderSelect(iPos, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == MagicNumber)
{
if (OrderMagicNumber() == MagicNumber && OrderType() == OP_BUY)

{
ArrayName [iPos]=OrderOpenPrice();
}

Danke für eure Hilfe!!

traderdoc 19.07.17 23:43

Über den Button # bekommst Du diesen Code (nach Korrekturen! und Bereinigung):

Code:

double ArrayName[];
int iPos = OrdersTotal();

ArrayResize(ArrayName, iPos);
ArrayInitialize(ArrayName, 0);

for (iPos = 0; iPos < OrdersTotal(); iPos++) {
  if (OrderSelect(iPos, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
        if (OrderType() == OP_BUY) {
            ArrayName[iPos] = OrderOpenPrice();
        }
      }
  }
}

Aufgrund der Tatsache, dass das Array über alle möglichen offenen MarketOrders und evtl. gesetzten PendingOrders deklariert wird, aber auf der anderen Seite nach der Selektion mittels der MagicNumber nachselektiert wird, würde ich auch das Array dynamisch nur so groß deklarieren wie nötig. Beim Ermitteln des minimalen Preises der Sellorders würde, falls ein Feld den Wert 0 hat, weil das Array unnötig zu groß ist, dann als kleinsten Wert auch 0 ausgeben und nicht den minimalsten OpenPrice:

Code:

double ArrayName_Buy[];
double ArrayName_Sell[];
int cnt_buy = 0, cnt_sell = 0;
double max_price = 0, min_price = 0;

for (int iPos = 0; iPos < OrdersTotal(); iPos++) {
  if (OrderSelect(iPos, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
        if (OrderType() == OP_BUY) {
            ArrayResize(ArrayName_Buy, cnt_buy+1);
            ArrayName_Buy[cnt_buy] = OrderOpenPrice();
            cnt_buy++;
        }
        if (OrderType() == OP_SELL) {
            ArrayResize(ArrayName_Sell, cnt_sell+1);
            ArrayName_Sell[cnt_sell] = OrderOpenPrice();
            cnt_sell++;
        }
      }
  }
}

if (cnt_buy > 0) {
  int max_value_idx = ArrayMaximum(ArrayName_Buy, WHOLE_ARRAY, 0);
  max_price = ArrayName_Buy[max_value_idx];
}
if (cnt_sell > 0) {
  int min_value_idx = ArrayMinimum(ArrayName_Sell, WHOLE_ARRAY, 0);
  min_price = ArrayName_Sell[min_value_idx];
}

traderdoc

icepick1661 26.07.17 23:35

Danke Traderdoc, die Lösung funktioniert bestens. Leider stehe ich schon vorm nächsten Problem, ich öffne dazu ein neues Thema.


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