ModifyOrder
Download scriptThis script is a specialized tool designed for traders using the MetaTrader 4 platform to visually manage and modify active trading orders or open positions. Instead of manually typing in complex price figures, it allows you to adjust your trade parameters by interacting with visual lines on your chart.
How the Logic Works
1. Visual Identification When you drop the script onto a trading chart, it automatically searches for an open order or position near the point where the script was placed. If it finds one, it generates four distinct visual lines:
- White Line: Represents the current Open Price.
- Red Line: Represents the Stop Loss (SL).
- Green Line: Represents the Take Profit (TP).
- Yellow Line: Represents the Expiration Time (for pending orders).
2. Manual Modification via Drag-and-Drop The core logic relies on user interaction. To change your trade settings, you simply click and drag these lines to your desired price levels. The script constantly "reads" the current position of these lines on the chart.
Once you have moved the lines to your preferred levels, you click "OK" in the pop-up window. The script then takes those visual coordinates and sends them as commands to the broker to update your actual trade.
3. Smart Validation Rules To prevent users from entering invalid data that would be rejected by the broker (which could result in an error), the script contains built-in logic checks:
- Distance Checks: It verifies that your Stop Loss and Take Profit are far enough away from the current price to meet the broker's "Stop Level" requirements.
- Order Type Awareness: The script recognizes different types of trades (Buy, Sell, Buy Limit, etc.). It ensures that for example, a "Buy" order's Stop Loss is correctly placed below the entry price, while a "Sell" order's is placed above it.
- Safety Warnings: If you try to move a line to an illegal position (e.g., placing a profit target too close to the current price), the script will stop the process and show a warning message explaining why it cannot be completed.
4. Order Closure and Cleanup The script also includes logic for closing or deleting trades:
- If you move the White Line (Open Price) back to zero, the script interprets this as a command to either close an active position or delete a pending order.
- Once the operation is finished—whether it was a modification, a closure, or a deletion—the script automatically cleans up the chart by removing all the visual lines it created.
Summary of User Workflow
The logic transforms a technical data entry task into a simple "point and click" experience. You select the trade visually, drag the safety boundaries (SL/TP) to where you want them, and the script handles the mathematical calculations and communication with the server to ensure the changes are applied correctly.
//+------------------------------------------------------------------+
//| (ModifyOrder).mq4 |
//| Copyright © 2005, komposter |
//| mailto:komposterius@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, komposter"
#property link "mailto:komposterius@mail.ru"
/*
-----------------------------Â-Í-È-Ì-À-Í-È-Å---------------------------------
Ïåðåä çàïóñêîì ñêðèïòà íàñòîÿòåëüíî ðåêîìåíäóþ èçó÷èòü ñëåäóþùåå ðóêîâîäñòâî:
Ñêðèïò ïðåäíàçíà÷åí äëÿ ìîäèôèêàöèè/óäàëåíèÿ/çàêðûòèÿ ïîçèöèè/îòëîæåííîãî îðäåðà.
Äëÿ ýòîãî íåîáõîäèìî:
1) Îçíàêîìèòüñÿ ñ äàííûì ðóêîâîäñòâîì =), !óñòàíîâèòü çíà÷åíèÿ ïî óìîë÷àíèþ! (íàõîäÿòñÿ ïîä îïèñàíèåì,
íà÷èíàþòñÿ è çàêàí÷èâàþòñÿ ñòðîêîé //+----------------------------------------------+ ),
ðàçðåøèòü èìïîðò âíåøíèõ ýêñïåðòîâ ÷åðåç ìåíþ
"Ñåðâèñ" -> "Íàñòðîéêè" -> "Ñîâåòíèêè" -> "Ðàçðåøèòü èìïîðòèðîâàíèå âíåøíèõ ýêñïåðòîâ"
(íåîáõîäèìî äëÿ îïèñàíèÿ îøèáêè, êîòîðàÿ ìîæåò âîçíèêíóòü ïðè ìîäèôèêàöèè îðäåðà)
2) Ïåðåòàùèòü ñêðèïò íà ãðàôèê íåäàëåêî îò îðäåðà/ïîçèöèè, êîòîðûé(-óþ) íåîáõîäèìî ìîäèôèöèðîâàòü.
3) Ïåðåìåñòèòü âñå ëèíèè íà íåîáõîäèìûå óðîâíè:
- Open_Price_Line (ïî óìîë÷àíèþ - áåëàÿ) - öåíà îòêðûòèÿ (ÒÎËÜÊÎ ÄËß ÎÒËÎÆÅÍÍÛÕ ÎÐÄÅÐÎÂ)
- Stop_Loss_Line (êðàñíàÿ) - óðîâåíü Ñòîï Ëîññ
- Take_Profit_Line (çåë¸íàÿ) - óðîâåíü Òåéê Ïðîôèò
- Expiration_Line (æ¸ëòàÿ) - âðåìÿ èñòå÷åíèÿ (ÒÎËÜÊÎ ÄËß ÎÒËÎÆÅÍÍÛÕ ÎÐÄÅÐÎÂ)
×òîá óäàëèòü Ñòîï Ëîññ/Òåéê Ïðîôèò/Âðåìÿ èñòå÷åíèÿ - ïðîñòî óäàëèòå ñîîòâåòñòâóþùóþ ëèíèþ.
×òîá óäàëèòü îòëîæåííûé îðäåð/çàêðûòü ïîçèöèþ - óäàëèòå ëèíèþ Open_Price_Line.
4) Êîãäà âñ¸ áóäåò ãîòîâî, â ïîÿâèâøåìñÿ îêíå íàæàòü êíîïêó "ÎÊ".
Äëÿ ïðåêðàùåíèÿ ðàáîòû ñêðèïòà â ëþáîé ìîìåíò ìîæíî âîñïîëüçîâàòüñÿ êíîïêîé "Îòìåíà".
Åñëè Âàìè áóäåò íàéäåíà îøèáêà â êîäå, èëè â ëîãèêå ðàáîòû ñêðèïòà, ïðîñüáà ñîîáùèòü íà komposterius@mail.ru
*/
#include <stdlib.mqh>
int first = 1;
int start()
{
//+------------------------------------------------------------------+
// Ìàêñèìàëüíîå ðàññòîÿíèå â ïóíêòàõ îò ìåñòà, íà êîòîðîå áûë "îòïóùåí" ñêðèïò, äî
// öåíû îòêðûòèÿ îðäåðà. Äëÿ ìàêèìàëüíîé òî÷íîñòè ðàáîòû èñïîëüçóéòå "0",
// òîãäà îðäåð âûäåëèòñÿ òîëüêî â ñëó÷àå òî÷íîãî ïîïàäàíèÿ.
int Order_Find_Radius = 10;
// Ðàññòîÿíèå ìåæäó ëèíèåé Take_Profit/Stop_Loss è ëèíèåé Open_Price â ïóíêòàõ ïî óìîë÷àíèþ.
// Åñëè Take_Profit/Stop_Loss èñïîëüçîâàòüñÿ íå áóäåò, óñòàíîâèòå 0
int Take_Profit = 50;
int Stop_Loss = 50;
// Ìàêñèìàëüíîå îòêëîíåíèå îò çàïðîøåííîé öåíû (äëÿ çàêðûòèÿ ïîçèöèè)
int Slippage = 5;
// Âðåìÿ èñòå÷åíèÿ îðäåðà, âûðàæåííîå â ñâå÷àõ
// Äëÿ ïåðèîäà ãðàôèêà H4 è Expiration_Shift = 3 âðåìÿ èñòå÷åíèÿ íàñòóïèò ÷åðåç 12 ÷àñîâ ïîñëå óñòàíîâêè
// Åñëè íåîáõîäèìî ñòàíäàðòíîå âðåìÿ èñòå÷åíèÿ äëÿ âñåõ ïåðèîäîâ ãðàôèêà, óêàæèòå "0" (áåç êàâû÷åê), è ïåðåõîäèòå ê ñëåäóþùåé íàñòðîéêå
// Åñëè âðåìÿ èñòå÷åíèÿ îðäåðà èñïîëüçîâàòüñÿ íå áóäåò, óñòàíîâèòå 0
int Expiration_Shift = 0;
// Âðåìÿ èñòå÷åíèÿ îðäåðà, âûðàæåííîå â ÷àñàõ
// Äëÿ òîãî, ÷òîá èñïîëüçîâàòü ýòó íàñòðîéêó, íåîáõîäèìî óñòàíîâèòü Expiration_Shift (ñì. âûøå íà 2 ñòðîêè) "0" (áåç êàâû÷åê)
// Åñëè âðåìÿ èñòå÷åíèÿ îðäåðà èñïîëüçîâàòüñÿ íå áóäåò, óñòàíîâèòå 0
int Expiration_Shift_H = 0;
// Öâåòà îòîáðàæåíèÿ îðäåðîâ íà ãðàôèêå
color Buy_Color = Lime; //( äëÿ îðäåðîâ BUYSTOP è BUYLIMIT )
color Sell_Color = Red; //( äëÿ îðäåðîâ SELLLIMIT è SELLSTOP )
// Öâåòà ëèíèé:
color Open_Price_Line_Color = White;
color Stop_Loss_Line_Color = Red;
color Take_Profit_Line_Color = Lime;
color Expiration_Line_Color = Yellow;
//+------------------------------------------------------------------+
double Open_Price_Level, Stop_Loss_Level, Take_Profit_Level;
datetime Expiration_Time;
int _break, error;
double DropPrice = PriceOnDropped();
// ïîèñê îðäåðà
for ( int x = 0; x <= Order_Find_Radius; x ++ )
{
int _OrdersTotal = OrdersTotal();
for ( int z = _OrdersTotal - 1; z >= 0; z -- )
{
OrderSelect( z, SELECT_BY_POS, MODE_TRADES );
if ( OrderSymbol() == Symbol() )
{
if ( ( DropPrice - OrderOpenPrice() )/Point <= x && ( DropPrice - OrderOpenPrice() )/Point >= 0 )
{ _break = 1; break; }
if ( ( OrderOpenPrice() - DropPrice )/Point <= x && ( OrderOpenPrice() - DropPrice )/Point >= 0 )
{ _break = 1; break; }
}
}
if ( _break == 1 ) { break; }
}
if ( _break != 1 )
{
MessageBox( "Íå óäàëîñü íàéòè îðäåð!\n\n" +
"Ïåðåìåñòèòå ñêðèïò íà ãðàôèê íåäàëåêî îò öåíû îòêðûòèÿ îðäåðà, êîòîðûé õîòèòå ìîäèôèöèðîâàòü ",
"Íà÷àëî ðàáîòû", 0x00000000 | 0x00000010 | 0x00040000 );
return(0);
}
int _OrderType = OrderType();
int _OrderTicket = OrderTicket();
double _OrderOpenPrice = OrderOpenPrice();
double _OrderStopLoss = OrderStopLoss();
double _OrderTakeProfit = OrderTakeProfit();
datetime _OrderExpiration = OrderExpiration();
// Óñòàíîâêà íà÷àëüíûõ çíà÷åíèé:
Open_Price_Level = _OrderOpenPrice;
if ( _OrderStopLoss > 0 )
{ Stop_Loss_Level = _OrderStopLoss; }
else
{
if ( Stop_Loss > 0 )
{
if ( _OrderType == OP_BUY || _OrderType == OP_BUYSTOP || _OrderType == OP_BUYLIMIT )
{ Stop_Loss_Level = Open_Price_Level - Stop_Loss*Point; }
else
{ Stop_Loss_Level = Open_Price_Level + Stop_Loss*Point; }
}
}
if ( _OrderTakeProfit > 0 )
{ Take_Profit_Level = _OrderTakeProfit; }
else
{
if ( Take_Profit > 0 )
{
if ( _OrderType == OP_BUY || _OrderType == OP_BUYSTOP || _OrderType == OP_BUYLIMIT )
{ Take_Profit_Level = Open_Price_Level + Take_Profit*Point; }
else
{ Take_Profit_Level = Open_Price_Level - Take_Profit*Point; }
}
}
if ( _OrderExpiration > 0 )
{ Expiration_Time = _OrderExpiration; }
else
{
if ( _OrderType != OP_BUY && _OrderType != OP_SELL )
{
if ( Expiration_Shift > 0 )
{ Expiration_Time = CurTime() + Period()*60*Expiration_Shift; }
else
{
if ( Expiration_Shift_H > 0 )
{ Expiration_Time = CurTime() + 3600*Expiration_Shift_H; }
}
}
}
// Ñîçäàíèå ëèíèé:
if ( first == 1 )
{
ObjectCreate( "Open_Price_Line", OBJ_HLINE, 0, 0, Open_Price_Level, 0, 0, 0, 0 );
ObjectSet( "Open_Price_Line", OBJPROP_COLOR, Open_Price_Line_Color );
ObjectSetText( "Open_Price_Line", "Open_Price_Line", 6, "Arial", Open_Price_Line_Color );
if ( Stop_Loss_Level > 0 )
{
ObjectCreate( "Stop_Loss_Line", OBJ_HLINE, 0, 0, Stop_Loss_Level, 0, 0, 0, 0 );
ObjectSet( "Stop_Loss_Line", OBJPROP_COLOR, Stop_Loss_Line_Color );
ObjectSetText( "Stop_Loss_Line", "Stop_Loss_Line", 6, "Arial", Stop_Loss_Line_Color );
}
if ( Take_Profit_Level > 0 )
{
ObjectCreate( "Take_Profit_Line", OBJ_HLINE, 0, 0, Take_Profit_Level, 0, 0, 0, 0 );
ObjectSet( "Take_Profit_Line", OBJPROP_COLOR, Take_Profit_Line_Color );
ObjectSetText( "Take_Profit_Line", "Take_Profit_Line", 6, "Arial", Take_Profit_Line_Color );
}
if ( Expiration_Time > 0 )
{
ObjectCreate( "Expiration_Line", OBJ_VLINE, 0, Expiration_Time, 0, 0, 0, 0, 0 );
ObjectSet( "Expiration_Line", OBJPROP_COLOR, Expiration_Line_Color );
ObjectSetText( "Expiration_Line", "Expiration_Line", 6, "Arial", Expiration_Line_Color );
}
// âûâîä ìåññåäæáîêñà
string Question = "Äëÿ âíåñåíèÿ èçìåíåíèé ïåðåìåñòèòå ëèíèè íà íåîáõîäèìûå óðîâíè è íàæìèòå \"ÎÊ\".\n" +
"×òîá îòêàçàòüñÿ îò ìîäèôèêàöèè è çàâåðøèòü ðàáîòó, íàæìèòå \"Îòìåíà\".";
int Answer = MessageBox( Question, "Ìîäèôèêàöèÿ îðäåðà", 0x00000001 | 0x00000040 | 0x00040000 );
first = 0;
// åñëè íàæàòà ëþáàÿ êðîìå "ÎÊ" êíîïêà - âûõîäèì
if ( Answer != 1 ) { deinit(); return(0); }
}
// ñ÷èòûâàåì çíà÷åíèÿ ñ îáúåêòîâ è íîðìàëèçóåì:
Open_Price_Level = NormalizeDouble( ObjectGet( "Open_Price_Line", OBJPROP_PRICE1 ), MarketInfo( Symbol(), MODE_DIGITS ) );
Stop_Loss_Level = NormalizeDouble( ObjectGet( "Stop_Loss_Line", OBJPROP_PRICE1 ), MarketInfo( Symbol(), MODE_DIGITS ) );
Take_Profit_Level = NormalizeDouble( ObjectGet( "Take_Profit_Line", OBJPROP_PRICE1 ), MarketInfo( Symbol(), MODE_DIGITS ) );
Expiration_Time = ObjectGet( "Expiration_Line", OBJPROP_TIME1 );
if ( Open_Price_Level == 0 )
{
int order;
if ( _OrderType == OP_BUY || _OrderType == OP_SELL )
{
if ( _OrderType == OP_BUY )
{ order = OrderClose( _OrderTicket, OrderLots(), Bid, Slippage, Buy_Color ); }
else
{ order = OrderClose( _OrderTicket, OrderLots(), Ask, Slippage, Sell_Color ); }
}
else
{ order = OrderDelete( _OrderTicket ); }
if ( order > 0 )
{
// åñëè âñ¸ îê, âûâîäèì ëîã è âûõîäèì
Print( "Îðäåð ¹", _OrderTicket, " çàêðûò/óäàë¸í óñïåøíî!");
return(0);
}
else
{
// åñëè îøèáêà - âûâîäèì ñîîáùåíèå è âûõîäèì
error = GetLastError();
Print("Îøèáêà ïðè çàêðûòèè/óäàëåíèè! GetLastError = ", error, ", ErrorDescription = \"", ErrorDescription( error ), "\"" );
MessageBox( "Îøèáêà ïðè çàêðûòèè/óäàëåíèè! GetLastError = " + error + ", ErrorDescription = \"" + ErrorDescription( error ) + "\"",
"Îøèáêà çàêðûòèÿ/óäàëåíèÿ îðäåðà", 0x00000000 | 0x00000010 | 0x00040000 );
return(-1);
}
return(0);
}
color _Color = Buy_Color;
// ïðîâåðÿåì âñå çíà÷åíèÿ
if ( _OrderType == OP_BUY )
{
if ( Bid - Stop_Loss_Level < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point && Stop_Loss_Level != 0 )
{
Answer = MessageBox( "Íåïðàâèëüíî óñòàíîâëåíà Stop_Loss_Line (êðàñíàÿ ëèíèÿ)!\n" +
"\n" +
"Äëÿ Buy - ïîçèöèè îíà äîëæíà áûòü ÍÈÆÅ Bid. \n" +
"Ìèíèìàëüíûé îòñòóï (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " ïóíêòîâ.\n" +
"\n\n" +
"×òîáû íà÷àòü ìîäèôèêàöèþ ñ íà÷àëà, íàæìèòå \"Ïîâòîð\".\n" +
"×òîá îòêàçàòüñÿ îò ìîäèôèêàöèè, íàæìèòå \"Îòìåíà\".", "Ìîäèôèêàöèÿ îðäåðà", 0x00000005 | 0x00000030 | 0x00040000 );
if ( Answer == 4 ) { start(); }
deinit();
return(-1);
}
if ( Take_Profit_Level - Bid < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point && Take_Profit_Level != 0 )
{
Answer = MessageBox( "Íåïðàâèëüíî óñòàíîâëåíà Take_Profit_Line (çåë¸íàÿ ëèíèÿ)!\n" +
"\n" +
"Äëÿ Buy - ïîçèöèè îíà äîëæíà áûòü ÂÛØÅ Bid. \n" +
"Ìèíèìàëüíûé îòñòóï (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " ïóíêòîâ.\n" +
"\n\n" +
"×òîáû íà÷àòü ìîäèôèêàöèþ ñ íà÷àëà, íàæìèòå \"Ïîâòîð\".\n" +
"×òîá îòêàçàòüñÿ îò ìîäèôèêàöèè, íàæìèòå \"Îòìåíà\".", "Ìîäèôèêàöèÿ îðäåðà", 0x00000005 | 0x00000030 | 0x00040000 );
if ( Answer == 4 ) { start(); }
deinit();
return(-1);
}
}
if ( _OrderType == OP_BUYSTOP || _OrderType == OP_BUYLIMIT )
{
if ( Open_Price_Level - Stop_Loss_Level < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point && Stop_Loss_Level != 0 )
{
Answer = MessageBox( "Íåïðàâèëüíî óñòàíîâëåíà Stop_Loss_Line (êðàñíàÿ ëèíèÿ)!\n" +
"\n" +
"Äëÿ Buy, BuyLimit è BuyStop - îðäåðîâ îíà äîëæíà áûòü ÍÈÆÅ ëèíèè Open_Price_Line. \n" +
"Ìèíèìàëüíûé îòñòóï (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " ïóíêòîâ.\n" +
"\n\n" +
"×òîáû íà÷àòü ìîäèôèêàöèþ ñ íà÷àëà, íàæìèòå \"Ïîâòîð\".\n" +
"×òîá îòêàçàòüñÿ îò ìîäèôèêàöèè, íàæìèòå \"Îòìåíà\".", "Ìîäèôèêàöèÿ îðäåðà", 0x00000005 | 0x00000030 | 0x00040000 );
if ( Answer == 4 ) { start(); }
deinit();
return(-1);
}
if ( Take_Profit_Level - Open_Price_Level < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point && Take_Profit_Level != 0 )
{
Answer = MessageBox( "Íåïðàâèëüíî óñòàíîâëåíà Take_Profit_Line (çåë¸íàÿ ëèíèÿ)!\n" +
"\n" +
"Äëÿ Buy, BuyLimit è BuyStop - îðäåðîâ îíà äîëæíà áûòü ÂÛØÅ ëèíèè Open_Price_Line. \n" +
"Ìèíèìàëüíûé îòñòóï (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " ïóíêòîâ.\n" +
"\n\n" +
"×òîáû íà÷àòü ìîäèôèêàöèþ ñ íà÷àëà, íàæìèòå \"Ïîâòîð\".\n" +
"×òîá îòêàçàòüñÿ îò ìîäèôèêàöèè, íàæìèòå \"Îòìåíà\".", "Ìîäèôèêàöèÿ îðäåðà", 0x00000005 | 0x00000030 | 0x00040000 );
if ( Answer == 4 ) { start(); }
deinit();
return(-1);
}
if ( _OrderType == OP_BUYSTOP )
{
if ( Open_Price_Level - Bid < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point )
{
Answer = MessageBox( "Íåïðàâèëüíî óñòàíîâëåíà Open_Price_Line (áåëàÿ ëèíèÿ)!\n" +
"\n" +
"Äëÿ BuyStop - îðäåðà îíà äîëæíà áûòü ÂÛØÅ òåêóùåé öåíû. \n" +
"Ìèíèìàëüíûé îòñòóï (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " ïóíêòîâ.\n" +
"\n\n" +
"×òîáû íà÷àòü ìîäèôèêàöèþ ñ íà÷àëà, íàæìèòå \"Ïîâòîð\".\n" +
"×òîá îòêàçàòüñÿ îò ìîäèôèêàöèè, íàæìèòå \"Îòìåíà\".", "Ìîäèôèêàöèÿ îðäåðà", 0x00000005 | 0x00000030 | 0x00040000 );
if ( Answer == 4 ) { start(); }
deinit();
return(-1);
}
}
if ( _OrderType == OP_BUYLIMIT )
{
if ( Bid - Open_Price_Level < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point )
{
Answer = MessageBox( "Íåïðàâèëüíî óñòàíîâëåíà Open_Price_Line (áåëàÿ ëèíèÿ)!\n" +
"\n" +
"Äëÿ BuyLimit - îðäåðà îíà äîëæíà áûòü ÍÈÆÅ òåêóùåé öåíû. \n" +
"Ìèíèìàëüíûé îòñòóï (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " ïóíêòîâ.\n" +
"\n\n" +
"×òîáû íà÷àòü ìîäèôèêàöèþ ñ íà÷àëà, íàæìèòå \"Ïîâòîð\".\n" +
"×òîá îòêàçàòüñÿ îò ìîäèôèêàöèè, íàæìèòå \"Îòìåíà\".", "Ìîäèôèêàöèÿ îðäåðà", 0x00000005 | 0x00000030 | 0x00040000 );
if ( Answer == 4 ) { start(); }
deinit();
return(-1);
}
}
}
if ( _OrderType == OP_SELL )
{
_Color = Sell_Color;
if ( Stop_Loss_Level - Ask < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point && Stop_Loss_Level != 0 )
{
Answer = MessageBox( "Íåïðàâèëüíî óñòàíîâëåíà Stop_Loss_Line (êðàñíàÿ ëèíèÿ)!\n" +
"\n" +
"Äëÿ Sell - ïîçèöèè îíà äîëæíà áûòü ÂÛØÅ Ask. \n" +
"Ìèíèìàëüíûé îòñòóï (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " ïóíêòîâ.\n" +
"\n\n" +
"×òîáû íà÷àòü ìîäèôèêàöèþ ñ íà÷àëà, íàæìèòå \"Ïîâòîð\".\n" +
"×òîá îòêàçàòüñÿ îò ìîäèôèêàöèè, íàæìèòå \"Îòìåíà\".", "Ìîäèôèêàöèÿ îðäåðà", 0x00000005 | 0x00000030 | 0x00040000 );
if ( Answer == 4 ) { start(); }
deinit();
return(-1);
}
if ( Ask - Take_Profit_Level < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point && Take_Profit_Level != 0 )
{
Answer = MessageBox( "Íåïðàâèëüíî óñòàíîâëåíà Take_Profit_Line (çåë¸íàÿ ëèíèÿ)!\n" +
"\n" +
"Äëÿ Sell - ïîçèöèè îíà äîëæíà áûòü ÍÈÆÅ Ask. \n" +
"Ìèíèìàëüíûé îòñòóï (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " ïóíêòîâ.\n" +
"\n\n" +
"×òîáû íà÷àòü ìîäèôèêàöèþ ñ íà÷àëà, íàæìèòå \"Ïîâòîð\".\n" +
"×òîá îòêàçàòüñÿ îò ìîäèôèêàöèè, íàæìèòå \"Îòìåíà\".", "Ìîäèôèêàöèÿ îðäåðà", 0x00000005 | 0x00000030 | 0x00040000 );
if ( Answer == 4 ) { start(); }
deinit();
return(-1);
}
}
if ( _OrderType == OP_SELLLIMIT || _OrderType == OP_SELLSTOP )
{
_Color = Sell_Color;
if ( Stop_Loss_Level - Open_Price_Level < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point && Stop_Loss_Level != 0 )
{
Answer = MessageBox( "Íåïðàâèëüíî óñòàíîâëåíà Stop_Loss_Line (êðàñíàÿ ëèíèÿ)!\n" +
"\n" +
"Äëÿ Sell, SellLimit è SellStop - îðäåðîâ îíà äîëæíà áûòü ÂÛØÅ ëèíèè Open_Price_Line. \n" +
"Ìèíèìàëüíûé îòñòóï (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " ïóíêòîâ.\n" +
"\n\n" +
"×òîáû íà÷àòü ìîäèôèêàöèþ ñ íà÷àëà, íàæìèòå \"Ïîâòîð\".\n" +
"×òîá îòêàçàòüñÿ îò ìîäèôèêàöèè, íàæìèòå \"Îòìåíà\".", "Ìîäèôèêàöèÿ îðäåðà", 0x00000005 | 0x00000030 | 0x00040000 );
if ( Answer == 4 ) { start(); }
deinit();
return(-1);
}
if ( Open_Price_Level - Take_Profit_Level < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point && Take_Profit_Level != 0 )
{
Answer = MessageBox( "Íåïðàâèëüíî óñòàíîâëåíà Take_Profit_Line (çåë¸íàÿ ëèíèÿ)!\n" +
"\n" +
"Äëÿ Sell, SellLimit è SellStop - îðäåðîâ îíà äîëæíà áûòü ÍÈÆÅ ëèíèè Open_Price_Line. \n" +
"Ìèíèìàëüíûé îòñòóï (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " ïóíêòîâ.\n" +
"\n\n" +
"×òîáû íà÷àòü ìîäèôèêàöèþ ñ íà÷àëà, íàæìèòå \"Ïîâòîð\".\n" +
"×òîá îòêàçàòüñÿ îò ìîäèôèêàöèè, íàæìèòå \"Îòìåíà\".", "Ìîäèôèêàöèÿ îðäåðà", 0x00000005 | 0x00000030 | 0x00040000 );
if ( Answer == 4 ) { start(); }
deinit();
return(-1);
}
if ( _OrderType == OP_SELLLIMIT )
{
if ( Open_Price_Level - Ask < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point )
{
Answer = MessageBox( "Íåïðàâèëüíî óñòàíîâëåíà Open_Price_Line (áåëàÿ ëèíèÿ)!\n" +
"\n" +
"Äëÿ SellLimit - îðäåðà îíà äîëæíà áûòü ÍÈÆÅ òåêóùåé öåíû. \n" +
"Ìèíèìàëüíûé îòñòóï (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " ïóíêòîâ.\n" +
"\n\n" +
"×òîáû íà÷àòü ìîäèôèêàöèþ ñ íà÷àëà, íàæìèòå \"Ïîâòîð\".\n" +
"×òîá îòêàçàòüñÿ îò ìîäèôèêàöèè, íàæìèòå \"Îòìåíà\".", "Ìîäèôèêàöèÿ îðäåðà", 0x00000005 | 0x00000030 | 0x00040000 );
if ( Answer == 4 ) { start(); }
deinit();
return(-1);
}
}
if ( _OrderType == OP_SELLSTOP )
{
if ( Ask - Open_Price_Level < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point )
{
Answer = MessageBox( "Íåïðàâèëüíî óñòàíîâëåíà Open_Price_Line (áåëàÿ ëèíèÿ)!\n" +
"\n" +
"Äëÿ SellStop - îðäåðà îíà äîëæíà áûòü ÂÛØÅ òåêóùåé öåíû. \n" +
"Ìèíèìàëüíûé îòñòóï (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " ïóíêòîâ.\n" +
"\n\n" +
"×òîáû íà÷àòü ìîäèôèêàöèþ ñ íà÷àëà, íàæìèòå \"Ïîâòîð\".\n" +
"×òîá îòêàçàòüñÿ îò ìîäèôèêàöèè, íàæìèòå \"Îòìåíà\".", "Ìîäèôèêàöèÿ îðäåðà", 0x00000005 | 0x00000030 | 0x00040000 );
if ( Answer == 4 ) { start(); }
deinit();
return(-1);
}
}
}
if ( _OrderType == OP_BUY || _OrderType == OP_SELL )
{
if ( Open_Price_Level != _OrderOpenPrice )
{
Answer = MessageBox( "Íåëüçÿ äâèãàòü Open_Price_Line (áåëàÿ ëèíèÿ) äëÿ óæå îòêðûòûõ ïîçèöèé!\n" +
"\n\n" +
"×òîáû óñòàíîâèòü ëèíèþ â íà÷àëüíîå ïîëîæåíèå è íà÷àòü ìîäèôèêàöèþ ñ íà÷àëà, íàæìèòå \"Ïîâòîð\".\n" +
"×òîá îòêàçàòüñÿ îò ìîäèôèêàöèè, íàæìèòå \"Îòìåíà\".", "Ìîäèôèêàöèÿ îðäåðà", 0x00000005 | 0x00000030 | 0x00040000 );
if ( Answer == 4 ) { ObjectSet( "Open_Price_Line", OBJPROP_PRICE1, _OrderOpenPrice ); start(); }
deinit();
return(-1);
}
if ( Expiration_Time != 0 )
{
Answer = MessageBox( "Íåëüçÿ óñòàíàâëèâàòü Expiration_Line (æ¸ëòàÿ ëèíèÿ) äëÿ óæå îòêðûòûõ ïîçèöèé!\n" +
"\n\n" +
"×òîáû óäàëèòü ëèíèþ è íà÷àòü ìîäèôèêàöèþ ñ íà÷àëà, íàæìèòå \"Ïîâòîð\".\n" +
"×òîá îòêàçàòüñÿ îò ìîäèôèêàöèè, íàæìèòå \"Îòìåíà\".", "Ìîäèôèêàöèÿ îðäåðà", 0x00000005 | 0x00000030 | 0x00040000 );
if ( Answer == 4 ) { ObjectDelete( "Expiration_Line" ); start(); }
deinit();
return(-1);
}
}
else
{
if ( Expiration_Time <= CurTime() && Expiration_Time != 0 )
{
Answer = MessageBox( "Íåïðàâèëüíî óñòàíîâëåíà Expiration_Line (æ¸ëòàÿ ëèíèÿ)!\n" +
"\n" +
"Ñðîê èñòå÷åíèÿ îðäåðà íå ìîæåò áûòü â ïðîøåäøåì âðåìåíè! \n" +
"\n\n" +
"×òîáû íà÷àòü ìîäèôèêàöèþ ñ íà÷àëà, íàæìèòå \"Ïîâòîð\".\n" +
"×òîá îòêàçàòüñÿ îò ìîäèôèêàöèè, íàæìèòå \"Îòìåíà\".", "Ìîäèôèêàöèÿ îðäåðà", 0x00000005 | 0x00000030 | 0x00040000 );
if ( Answer == 4 ) { start(); }
deinit();
return(-1);
}
}
// âûâîäèì èíôó î çàïðîñå è ïûòàåìñÿ ìîäèôèöèðîâàòü îðäåð
Print( "OrderTicket=",_OrderTicket, ",_OrderType=",_OrderType, ",Open_Price_Level=",Open_Price_Level, ",Stop_Loss_Level=", Stop_Loss_Level, ",Take_Profit_Level=", Take_Profit_Level, ",Expiration_Time=", Expiration_Time, ",_Color=", _Color );
int ordermodify = OrderModify( _OrderTicket, Open_Price_Level, Stop_Loss_Level, Take_Profit_Level, Expiration_Time, _Color );
if ( ordermodify > 0 )
{
// åñëè âñ¸ îê, âûâîäèì ëîã è âûõîäèì
OrderPrint();
Print( "Îðäåð ¹", _OrderTicket, " ìîäèôèöèðîâàí óñïåøíî!");
return(0);
}
// åñëè îøèáêà - âûâîäèì ñîîáùåíèå è âûõîäèì
error = GetLastError();
Print("Îøèáêà ïðè ìîäèôèêàöèè! GetLastError = ", error, ", ErrorDescription = \"", ErrorDescription( error ), "\"" );
MessageBox( "Îøèáêà ïðè ìîäèôèêàöèè! GetLastError = " + error + ", ErrorDescription = \"" + ErrorDescription( error ) + "\"",
"Îøèáêà ìîäèôèêàöèè îðäåðà", 0x00000000 | 0x00000010 | 0x00040000 );
return(-1);
}
int deinit()
{
// óäàëåíèå âñåõ îáúåêòîâ, ñîçäàííûõ ñêðèïòîì
ObjectDelete( "Open_Price_Line" );
ObjectDelete( "Stop_Loss_Line" );
ObjectDelete( "Take_Profit_Line" );
ObjectDelete( "Expiration_Line" );
return(0);
}
Comments