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