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.
#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 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 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() .