Funkcje transakcji:   OrderModify()

Funkcja bool OrderModify() modyfikuje parametry otwartych pozycji oraz oczekujących zleceń. Więcej informacji można znaleźć w specyfikacji MQL4.

OrderModify(ticket, price, stoploss, takeprofit, expiration, arrow_color);
int ticket - unikalny numer (ticket) pozycji lub zlecenia.
double price - cena otwarcia.
double stoploss - poziom ceny, po osiągnięciu którego następuję zamknięcie pozycji ze stratą.
double takeprofit - poziom ceny, po osiągnięciu którego następuję zamknięcie pozycji z zyskiem.
datetime expiration - czas wygaśnięcia oczekującego zlecenia.
color arrow_color - kolor zamykającej 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) pozycji lub zlecenia.

double price - cena otwarcia.

double stoploss - poziom ceny, po osiągnięciu którego następuję zamknięcie pozycji ze stratą.

double takeprofit - poziom ceny, po osiągnięciu którego następuję zamknięcie pozycji z zyskiem.

datetime expiration - czas wygaśnięcia oczekującego zlecenia.

color arrow_color - kolor zamykającej 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

Przykład skryptu na modyfikację stoploss otwartych pozycji na sprzedaż.

#property strict
void OnStart()
  {
//--- dane do modyfikacji stoploss
   int Change = 100;    // ilość punktów

   for(int i = OrdersTotal()-1; i >= 0; i--)
      //--- wybrać pozycję/zlecenie z indeksem "i"
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
         //--- wybrać otwartą pozycję na sprzedaż
         if(OrderType() == OP_SELL)
           {
            //--- ustawić poziom stoploss wyżej o wartość Change
            //--- i przypisać wynik zmiennej LevelStopLoss
            double LevelStopLoss = OrderStopLoss() + (Change * _Point);
            //--- znormalizować cenę
            LevelStopLoss = NormalizeDouble(LevelStopLoss, _Digits);
            //--- zmienić poziom stoploss
            if(OrderModify(OrderTicket(), OrderOpenPrice(), LevelStopLoss, OrderTakeProfit(), OrderExpiration()) == true)
               Print("Modyfikacja stoploss pozycji ",OrderTicket()," powiodła się.");
            else
               Print("Nie udało się zmodyfikować stoploss pozycji ",OrderTicket());
           }
  }

Rys. 1. Przykład stosowania funkcji OrderModify().


Przykład 2

Przykład skryptu na modyfikację cen otwarcia, stoploss i takeprofit oczekujących zleceń na kupno, cena otwarcia którego znajduje się niżej bieżącej ceny rynkowej.

#property strict
void OnStart()
  {
//--- dane do modyfikacji poziomów cen
   int ChangePoints = 100;    // ilość punktów

   for(int i = OrdersTotal()-1; i >= 0; i--)
      //--- wybrać pozycję/zlecenie z indeksem "i"
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
         //--- wybrać oczekujące zlecenie na kupno
         //--- cena otwarcia którego znajduje się niżej bieżącej ceny rynkowej
         if(OrderType() == OP_BUYLIMIT)
           {
            //--- ustawić nowe poziomy cen otwarcia LevelOpenPrice,
            //--- stoploss LevelStopLoss i takeprofit LevelTakeProfit
            double LevelOpenPrice  = OrderOpenPrice() + (ChangePoints * _Point);
            double LevelStopLoss   = OrderStopLoss() + (ChangePoints * _Point);
            double LevelTakeProfit = OrderTakeProfit() + (ChangePoints * _Point);

            //--- znormalizować ceny
            LevelOpenPrice  = NormalizeDouble(LevelOpenPrice, _Digits);
            LevelStopLoss   = NormalizeDouble(LevelStopLoss, _Digits);
            LevelTakeProfit = NormalizeDouble(LevelTakeProfit, _Digits);

            //--- zmienić ceny otwarcia, stoploss i takeprofit
            if(OrderModify(OrderTicket(), LevelOpenPrice, LevelStopLoss, LevelTakeProfit, OrderExpiration()) == true)
               Print("Modyfikacja cen otwarcia, stoploss i takeprofit oczekującego zlecenia ",OrderTicket()," powiodła się.");
            else
               Print("Nie udało się zmodyfikować ceny otwarcia, stoploss i takeprofit oczekującego zlecenia ",OrderTicket());
           }
  }

Za pomocą OrderModify() u otwartej pozycji można zmienić tylko stoploss, takeprofit oraz arrow_color. Modyfikowane ceny stoploss i takeprofit nie mogą się znajdować zbyt blisko bieżącej ceny rynkowej. Minimalna odległość stop-ów w punktach można uzyskać za pomocą MarketInfo(MODE_STOPLEVEL) . W przypadku błędnych oraz nieznormalizowanych stop-ów zostanie wygenerowany błąd 130 (ERR_INVALID_STOPS). Jeśli MarketInfo(MODE_STOPLEVEL) zwróci 0 to znaczy, że albo brak jest ograniczeń na minimalną odlęgłośc dla stoploss i takeprofit, albo serwer handlowy używa zewnętrzne mechanizmy dynamicznej kontroli poziomów, które nie mogą być przekazane terminalowi MetaTrader 4. W drugim przypadku GetLastError() może zwrócić błąd 130, ponieważ poziom MODE_STOPLEVEL jest ruchomy.

Za pomocą OrderModify() u oczekującego zlecenia można zmienić wszystkie parametry opróc ticket. Modyfikując cenę otwarcia price nowa cena nie może znajdować się zbyt blisko bieżącej ceny rynkowej. Minimalną odległość w punktach między price a bieżącą ceną rynkową można uzyskać za pomocą MarketInfo(MODE_STOPLEVEL). W przypadku nieprawidłowego price oczekującego zlecenia zostanie wygenerowany błąd 130 (ERR_INVALID_STOPS).

Modyfikowane ceny stoploss i takeprofit u oczekującego zlecenia nie mogą się znajdować zbyt blisko ceny otwarcia price. Minimalną odległość w punktach między price a stoploss i takeprofit można uzyskać za pomocą MarketInfo(MODE_STOPLEVEL).

W przypadku jeśli bieżąca cena rynkowa znajduje się zbyt blisko ceny otwarcia oczekującego zlecenia, to takie zlecenie nie może zostać zmodyfikowane, anulowane lub zamknięte. Minimalną odległość w punktach między price a ceną rynkową, kiedy następuje "zamrożenie" oczekującego zlecenia, można uzyskać za pomocą MarketInfo(MODE_FREEZELEVEL).

Na niektórych serwerach handlowych może być wyłączona możliwość ustawienia czasu wygaśnięcia oczekującego zlecenia. W takich przypadkach, próbując ustawić niezerową wartość w expiration, zostanie wygenerowany błąd 147 (ERR_TRADE_EXPIRATION_DENIED).