Funkcje własne:   PositionTicketByLot()

Funkcja int PositionTicketByLot() zwraca ticket otwartej pozycji z określonym wolumenem transakcji. Ma następujące argumenty:

f_symbol - nazwa instrumentu finansowego. Wartość domyślna = "", tj. wszystkie instrumenty. W przypadku _Symbol funkcja zwróci ticket pozycji dla instrumentu finansowego tego wykresu notowań, gdzie program MQL4 zostanie uruchomiony.
f_cmd - typ pozycji. Wartość domyślna = -1, tj. wszystkie otwarte pozycje typu OP_BUY i OP_SELL .
f_magic - identyfikator (magic number). Wartość domyślna = -1, tj. wszystkie pozycje.
f_lotMin i f_lotMax - dolna i górna granice filtru wolumenu transakcji. Wartości domyślne = 0, tj. wszystkie pozycje. Uwzględnia się tylko te pozycje, które znajdują się między tymi wartościami lub są im równe.

f_symbol - nazwa instrumentu finansowego. Wartość domyślna = "", tj. wszystkie instrumenty. W przypadku _Symbol funkcja zwróci ticket pozycji dla instrumentu finansowego tego wykresu notowań, gdzie program MQL4 zostanie uruchomiony.

f_cmd - typ pozycji. Wartość domyślna = -1, tj. wszystkie otwarte pozycje typu OP_BUY i OP_SELL .

f_magic - identyfikator (magic number). Wartość domyślna = -1, tj. wszystkie pozycje.

f_lotMin  i  f_lotMax - dolna i górna granice filtru wolumenu transakcji. Wartości domyślne = 0, tj. wszystkie pozycje. Uwzględnia się tylko te pozycje, które znajdują się między tymi wartościami lub są im równe.

Jeśli żądana pozycja nie istnieje, funkcja zwróci -1.

int PositionTicketByLot(string f_symbol="",  // instrument finansowy
                        int    f_cmd=-1,     // typ pozycji
                        int    f_magic=-1,   // identyfikator
                        double f_lotMin=0,   // dolna granica wolumenu
                        double f_lotMax=0)   // górna granica wolumenu
  {
   int f_ticket=-1;
//---
   double f_min=MathMin(NormalizeDouble(f_lotMin,2),
                        NormalizeDouble(f_lotMax,2));
   double f_max=MathMax(NormalizeDouble(f_lotMin,2),
                        NormalizeDouble(f_lotMax,2));
//---
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         int f_type=OrderType();
         if(f_type==OP_BUYLIMIT || f_type==OP_SELLLIMIT ||
            f_type==OP_BUYSTOP  || f_type==OP_SELLSTOP)
            continue;
         //---
         if((f_symbol==OrderSymbol() || f_symbol=="") && 
            (f_cmd==OrderType()      || f_cmd==-1)    && 
            (f_magic==OrderMagicNumber()                || f_magic==-1) &&
            ((f_min<=OrderLots() && OrderLots()<=f_max) || (f_lotMin==0 && f_lotMax==0)))
            return OrderTicket();
        }
   return f_ticket;
  }

Przykłady stosowania funkcji

1) Znaleźć ticket otwartej pozycji dla EURUSD, na sprzedaż, z identyfikatorem 12345 i z wolumenem w zakresie od 0.01 do 0.05:

PositionTicketByLot("EURUSD", OP_SELL, 12345, 0.01, 0.05);

2) Znaleźć ticket otwartej pozycji dla EURUSD dowolnego typu, z dowolnym identyfikatorem i z wolumenem w zakresie od 0.01 do 0.05:

PositionTicketByLot("EURUSD", -1, -1, 0.01, 0.05);

3) Znaleźć ticket otwartej pozycji wśród wszystkich instrumentów finansowych, dowolnego typu, z dowolnym identyfikatorem i wolumenem 0.01:

PositionTicketByLot("", -1, -1, 0.01, 0.01);