Funkcje transakcji:   OrderClose()

Funkcja bool OrderClose() zamyka otwartą pozycje po cenie rynkowej. Zwraca true jeśli operacja się powiodła lub false jeśli nie. Więcej informacji można znaleźć w specyfikacji MQL4.

OrderClose(ticket, lots, price, slippage, arrow_color);
int ticket - unikalny numer (ticket) otwartej pozycji.
double lots - liczba lotów (wolumen) do zamknięcia.
double price - cena zamknięcia.
int slippage - poślizg cenowy, tj. dopuszczalna różnica w punktach między zleconą ceną zamknięcia a rzeczywistą ceną rynkową.
color arrow_color - kolor strzałki na wykresie. Jeśli argument jest pusty lub równy CLR_NONE , to strzałka na wykresie nie jest wyświetlana.

int ticket - unikalny numer (ticket) otwartej pozycji.

double lots - liczba lotów (wolumen) do zamknięcia.

double price - cena zamknięcia.

int slippage - poślizg cenowy, tj. dopuszczalna różnica w punktach między zleconą ceną zamknięcia a rzeczywistą ceną rynkową.

color arrow_color - kolor strzałki na wykresie. Jeśli argument jest pusty lub równy CLR_NONE , to strzałka na wykresie nie jest wyświetlana.


Przykład 1

#property strict
void OnStart()
  {
//--- dane do zamknięcia wybranej pozycji
   int    TicketToClose   = 123456; // unikalny numer (ticket) pozycji
   double LotToClose      = 0.01;   // ilość lotów
   int    SlippageToClose = 50;     // poślizg cenowy w punktach

//--- przeszukać listę otwartych pozycji/oczekujących zleceń
//--- oraz historię zamkniętych pozycji/usuniętych zleceń
//--- i wybrać do dalszego przetwarzania
   if(OrderSelect(TicketToClose, SELECT_BY_TICKET) == true)
     {
      //--- odświeżyć notowania
      RefreshRates();
      //--- zamknąć otwartą pozycję kupna
      if(OrderClose(TicketToClose, LotToClose, Bid, SlippageToClose, CLR_NONE) == false)
         Print("Nie udało się zamknąć pozycję. Błąd nr = ",GetLastError());
     }
  }

Przykład 2

Przykład skryptu na zamknięcie wszystkich otwartych pozycji na sprzedaż.

#property strict
void OnStart()
  {
   for(int i = OrdersTotal()-1; i >= 0; i--)
      //--- wybrać pozycję/zlecenie z indeksem "i"
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
         //--- wybrać tylko otwartą pozycję na sprzedaż
         if(OrderType() == OP_SELL)
           {
            //--- odświeżyć notowania
            RefreshRates();
            //--- zamknąć wybraną pozycję
            if(OrderClose(OrderTicket(), // funkcja OrderTicket() znajdzie unikalny numer (ticket) pozycji
                          OrderLots(),   // funkcja OrderLots() znajdzie ilość lotów tej pozycji
                          Ask,           // aktualna cena kupna
                          50)            // poślizg cenowy, w punktach
                          == false)
               //--- wyświetlić informację jeśli nie uda się zamknąć pozycję
               Print("Nie udało się zamknąć pozycję ",OrderTicket(),
                     ". Błąd nr = ",GetLastError());
           }
  }

Przykład 3

Przykład skryptu na zmniejszenie o 0.03 lota otwartych pozycji: na sprzedaż, dla EURUSD, z unikalnym identyfikatorem (magic number) = 555. Jeśli któraś z tych pozycji będzie miała 0.03 lota, zostanie ona zamknięta. Jeśli będzie miała mniej niż 0.03 lota, zostanie wygenerowany błąd nr 131 (ERR_INVALID_TRADE_VOLUME), tj. nieprawidłowy wolumen transakcji.

#property strict
void OnStart()
  {
//--- dane do zmniejszenia wolumenu wybranych pozycji
   string SymbolToClose = "EURUSD"; // symbol pozycji
   int    MagicToClose  = 555;      // unikalny identyfikator (magic number) pozycji
   double LotToClose    = 0.03;     // ilość lotów (wolumen) do zmniejszenia

   for(int i = OrdersTotal()-1; i >= 0; i--)
      //--- wybrać pozycję/zlecenie z indeksem "i"
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         //--- wybrać otwartą pozycję na sprzedaż dla EURUSD z unikalnym identyfikatorem (magic number)
         if(OrderType() == OP_SELL && 
            OrderSymbol() == SymbolToClose && 
            OrderMagicNumber() == MagicToClose)
           {
            //--- odświeżyć notowania
            RefreshRates();
            //--- zamknąć wybraną pozycję
            if(!OrderClose(OrderTicket(), LotToClose, Ask, 50))
               //--- wyświetlić informację jeśli nie uda się zamknąć pozycję
               Print("Nie udało się zamknąć pozycję ",OrderTicket(),
                     ". Błąd nr = ",GetLastError());
           }
  }

W celu usunięcia oczekującego zlecenia (nie otwartej pozycji), należy zastosować funkcję OrderDelete() .