Orders Execution
Miscellaneous
1
Views
0
Downloads
0
Favorites
#CloseOrDeleteOrder
//+------------------------------------------------------------------+
//| (CloseOrDeleteOrder).mq4 |
//| Copyright © 2006, Yuri2005 |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Yuri2005"
/*
-----------------------------Â-Í-È-Ì-À-Í-È-Å---------------------------------
Ïåðåä çàïóñêîì ñêðèïòà íàñòîÿòåëüíî ðåêîìåíäóåòñÿ èçó÷èòü ñëåäóþùåå ðóêîâîäñòâî:
Ñêðèïò ïðåäíàçíà÷åí äëÿ çàêðûòèÿ/óäàëåíèÿ ïîçèöèè/îòëîæåííîãî îðäåðà.
Äëÿ ýòîãî íåîáõîäèìî:
1) Îçíàêîìèòüñÿ ñ äàííûì ðóêîâîäñòâîì.
2) Óñòàíîâèòü çíà÷åíèÿ ïåðåìåííûõ ïî óìîë÷àíèþ (íàõîäÿòñÿ ïîä îïèñàíèåì,íà÷èíàþòñÿ è
çàêàí÷èâàþòñÿ ñòðîêîé //+----------------------------------------------+ )
3) Ðàçðåøèòü èìïîðò âíåøíèõ ýêñïåðòîâ ÷åðåç ìåíþ
"Ñåðâèñ" -> "Íàñòðîéêè" -> "Ñîâåòíèêè" -> "Ðàçðåøèòü èìïîðòèðîâàíèå âíåøíèõ ýêñïåðòîâ"
(íåîáõîäèìî äëÿ îïèñàíèÿ îøèáêè, êîòîðàÿ ìîæåò âîçíèêíóòü ïðè óñòàíîâêå îðäåðà.
4) Ïåðåòàùèòü ñêðèïò íà ãðàôèê íåäàëåêî îò ëèíèè îðäåðà/ïîçèöèè, êîòîðûé(-óþ) íåîáõîäèìî ìîäèôèöèðîâàòü
èëè çàêðûòü, ëèáî ââåñòè å¸ íîìåð âî âõîäíûõ ïàðàìåòðàõ ñêðèïòà.
5) Óïðàâëÿþùàÿ ëèíèÿ.
- "****" - óêàçàòåëü ðàçìåðà ïîçèöèè (èñïîëüçóåòñÿ òîëüêî â òîì ñëó÷àå, åñëè íåîáõîäèìî çàêðûòü
îòêðûòóþ ïîçèöèþ ÷àñòè÷íî). Íåîáõîäèìî óñòàíîâèòü íàïðîòèâ íóæíîãî çíà÷åíèÿ.
6) Ïîñëå íàõîæäåíèÿ íóæíîãî îðäåðà ïîÿâèòñÿ îêíî ñ âîïðîñîì î ïîäòâåðæäåíèè çàêðûòèÿ èëè óäàëåíèÿ îðäåðà
(â çàâèñèìîñòè îò åãî òèïà). Äëÿ ïîäòâåðæäåíèÿ îïåðàöèè íàæìèòå â í¸ì "OK", äëÿ å¸ îòìåíû - "Îòìåíà".
7) Äëÿ ïðåêðàùåíèÿ ðàáîòû ñêðèïòà â ëþáîé ìîìåíò ìîæíî âîñïîëüçîâàòüñÿ êíîïêîé "Îòìåíà".
*/
//+------------------------------------------------------------------+
// Åñëè îêíî ñâîéñòâ íå íóæíî, íàäî çàêîììåíòèðîâàòü ñëåäóþùóþ ñòðîêó (ïîñòàâèòü â íà÷àëî //)
#property show_inputs
// Íîìåð îðäåðà äëÿ èçìåíåíèÿ. Äàííûé ñêðèïò ïîçâîëÿåò âûäåëÿòü îðäåðà äëÿ èçìåíåíèÿ êàê óêàçàíèåì íà èõ ëèíèþ íà ãðàôèêå,
// òàê è ïðÿìûì ââåäåíèåì èõ íîìåðîâ. Åñëè íîìåð îðäåðà ââåä¸í, òî óêàçàíèå ëèíèè îðäåðà íà ãðàôèêå èãíîðèðóåòñÿ,
// åñëè íîìåð ðàâåí 0, òî èñïîëüçóåòñÿ óêàçàíèå ëèíèè îðäåðà.
extern int Order_Number = 0;
// Èçìåí¸ííûé îáü¸ì îðäåðà ïî óìîë÷àíèþ (ìîæíî ìåíÿòü â ïðîöåññå ðàáîòû)- â äàííîì ñêðèïòå èñïîëüçóåòñÿ òîëüêî
// äëÿ ÷àñòè÷íîãî çàêðûòèÿ ïîçèöèè. Åñëè ðàâåí 0, òî èñïîëüçóåòñÿ ðàíåå óñòàíîâëåííûé äëÿ îðäåðà îáú¸ì.
// Äîëæåí áûòü êðàòåí ðàçìåðó ìèíèìàëüíîãî ëîòà (ñìîòðè íèæå).
extern double Lots = 0;
// Ìàêñèìàëüíîå îòêëîíåíèå îò çàïðîøåííîé öåíû
extern int Slippage = 1;
// Ìàêñèìàëüíîå ðàññòîÿíèå â ïóíêòàõ îò ìåñòà, íà êîòîðîå áûë "îòïóùåí" ñêðèïò, äî
// öåíû îòêðûòèÿ îðäåðà. Äëÿ ìàêèìàëüíîé òî÷íîñòè ðàáîòû èñïîëüçóéòå "0",
// òîãäà îðäåð âûäåëèòñÿ òîëüêî â ñëó÷àå òî÷íîãî ïîïàäàíèÿ.
extern int Order_Find_Radius = 10;
// Ìèíèìàëüíûé ðàçìåð ëîòà. Îïðåäåëÿåòñÿ òîðãîâûìè óñëîâèÿìè êîíêðåòíîé êîìïàíèè è ìîæåò
// ïðèíèìàòü òîëüêî îäíî èç 3 âîçìîæíûõ çíà÷åíèé: 0.01, 0.1 èëè 1.
// Îò äàííîé ïåðåìåííîé çàâèñèò îòðèñîâêà øêàëû óñòàíîâêè ðàçìåðà òîðãîâîãî ëîòà è åù¸ ðÿä íàñòðîåê.
extern double Min_Lot_Size = 0.1;
extern string Line_Color = "----------------------------------------------------------------------------------------";
// Öâåòà óïðàâëÿþùèé ëèíèé è òåêñòà ïî óìîë÷àíèþ
extern color Open_Price_Color = Blue;
extern color Stop_Loss_Color = Red;
extern color Take_Profit_Color = DarkViolet;
//+------------------------------------------------------------------+
// Âêëþ÷åíèå áèáëèîòåêè îáðàáîòêè îøèáîê
#include <stdlib.mqh>
// Îáúÿâëåíèå ïåðåìåííûõ
int first = 1, dig;
double Lots_Scale;
// Íà÷àëî ñêðèïòà
int start()
{
//+------------------------------------------------------------------+
// Îáúÿâëåíèå è óñòàíîâêà çíà÷åíèé ïåðåìåííûõ
int _break, error;
double DropPrice = PriceOnDropped();
if (Min_Lot_Size == 0.01)
dig = 2;
else
if (Min_Lot_Size == 0.1)
dig = 1;
else
if (Min_Lot_Size == 1.0)
dig = 0;
else
{
string Question = "Óñòàíîâèòå âî âõîäíûõ ïàðàìåòðàõ ñêðèïòà \n"
+ "çíà÷åíèå Min_Lot_Size = 0.01, 0.1 èëè 1.0";
int Answer = MessageBox( Question, "Íåêîððåêòíàÿ óñòàíîâêà ìèíèìàëüíîãî ëîòà", 0x00000000 | 0x00000030);
deinit();
return(0);
}
if (Lots != 0 && Lots < Min_Lot_Size)
{
Question = "Óñòàíîâèòå âî âõîäíûõ ïàðàìåòðàõ ñêðèïòà \n"
+ "ðàçìåð ëîòà íå ìåíüøå ìèíèìàëüíîãî";
Answer = MessageBox( Question, "Íåêîððåêòíàÿ óñòàíîâêà ðàçìåðà ëîòà", 0x00000000 | 0x00000030);
deinit();
return(0);
}
// Ïîèñê îðäåðà äëÿ èçìåíåíèÿ
int _OrdersTotal = OrdersTotal();
// Íàõîæäåíèå îðäåðà ïðè ïîìîùè óêàçàíèÿ åãî ëèíèè íà ãðàôèêå
if (Order_Number == 0)
{
for ( int x = 0; x <= Order_Find_Radius; x ++ )
{
for ( int z1 = _OrdersTotal - 1; z1 >= 0; z1 -- )
{
OrderSelect( z1, 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 (Order_Number != 0)
{
OrderSelect(Order_Number, SELECT_BY_TICKET);
if ( OrderSymbol() == Symbol() )
_break = 1;
}
if ( _break != 1 )
{
MessageBox( "Íå óäàëîñü íàéòè îðäåð!\n\n"
+ "Ïåðåìåñòèòå ñêðèïò íà ãðàôèê íåäàëåêî îò öåíû îòêðûòèÿ \n"
+ "îðäåðà, êîòîðûé õîòèòå ìîäèôèöèðîâàòü, ëèáî ââåäèòå \n"
+ "íîìåð îðäåðà âî âõîäíûõ ïàðàìåòðàõ ñêðèïòà.",
"Íà÷àëî ðàáîòû", 0x00000000 | 0x00000010 | 0x00040000 );
return(0);
}
// Çàïèñü ïàðàìåòðîâ íàéäåííîãî îðäåðà
int _OrderType = OrderType();
int _OrderTicket = OrderTicket();
double _OrderOpenPrice = OrderOpenPrice();
double _OrderStopLoss = OrderStopLoss();
double _OrderTakeProfit = OrderTakeProfit();
double _Order_Lots = OrderLots();
datetime _OrderExpiration = OrderExpiration();
// Óäàëåíèå îòëîæåííîãî îðäåðà
if (_OrderType != OP_BUY && _OrderType != OP_SELL)
{
// Âûâîä îêíà ïîäòâåðæäåíèÿ îïåðàöèè
Question = "Âû óâåðåíû, ÷òî õîòèòå óäàëèòü îòëîæåííûé îðäåð #" + _OrderTicket + "? \n\n"
+ "Äëÿ ïîäòâåðæäåíèÿ îïåðàöèè íàæìèòå \"ÎÊ\".\n\n"
+ "×òîáû îòêàçàòüñÿ îò îïåðàöèè, íàæìèòå \"Îòìåíà\".";
Answer = MessageBox( Question, "Óäàëåíèå îòëîæåííîãî îðäåðà", 0x00000001 | 0x00000020 | 0x00040000 );
// Åñëè íàæàòà ëþáàÿ êðîìå "ÎÊ" êíîïêà - âûõîäèì
if ( Answer == 1 )
{
if (OrderDelete( _OrderTicket ))
{
// åñëè âñ¸ îê, âûâîäèì ëîã è âûõîäèì
Print( "Îðäåð #", _OrderTicket, " óäàë¸í óñïåøíî!");
ObjectDelete("Îðäåð # " + DoubleToStr(_OrderTicket,0));
ObjectDelete("Îðäåð # " + DoubleToStr(_OrderTicket,0) + " Stop Loss");
ObjectDelete("Îðäåð # " + DoubleToStr(_OrderTicket,0) + " Take Profit");
ObjectsRedraw();
}
else
// åñëè îøèáêà - âûâîäèì ñîîáùåíèå è âûõîäèì
{
error = GetLastError();
if (error != 0 && error != 4202 )
{
Print("Îøèáêà ïðè óäàëåíèè! GetLastError = ", error, ", ErrorDescription = \"", ErrorDescription( error ), "\"" );
MessageBox( "Îøèáêà ïðè óäàëåíèè! GetLastError = " + error + ", ErrorDescription = \"" + ErrorDescription( error ) + "\"",
"Îøèáêà óäàëåíèÿ îðäåðà", 0x00000000 | 0x00000010 | 0x00040000 );
ObjectsRedraw();
return(-1);
}
}
}
ObjectsRedraw();
return(-1);
}
// Çàêðûòèå îòêðûòîé ïîçèöèè
// Óñòàíîâêà íà÷àëüíûõ çíà÷åíèé:
if (Lots == 0)
Lots = _Order_Lots;
int Lots_value_y = 30;
// Ñîçäàíèå ëèíèé:
if ( first == 1 )
{
int y = 25;
if (Lots - 7 * Min_Lot_Size >= Min_Lot_Size)
Lots_Scale = Lots - 7 * Min_Lot_Size;
else
Lots_Scale = Min_Lot_Size;
for ( double z = Lots_Scale; z < Lots_Scale + 20 * Min_Lot_Size; z += Min_Lot_Size )
{
if (NormalizeDouble(z,dig) - NormalizeDouble( Lots,dig) == 0)
int y_pos = y;
ObjectCreate( DoubleToStr( z, dig ), OBJ_LABEL, 0,0,0,0,0,0,0);
ObjectSet( DoubleToStr( z, dig ), OBJPROP_CORNER, 1);
ObjectSet( DoubleToStr( z, dig ), OBJPROP_XDISTANCE, 1);
ObjectSet( DoubleToStr( z, dig ), OBJPROP_YDISTANCE, y);
ObjectSetText( DoubleToStr( z, dig ), DoubleToStr( z, dig ), 10, "Arial", Open_Price_Color);
y += 15;
}
ObjectCreate( "Lots", OBJ_LABEL, 0,0,0,0,0,0,0);
ObjectSet( "Lots", OBJPROP_CORNER, 1);
ObjectSet( "Lots", OBJPROP_XDISTANCE, 1);
ObjectSet( "Lots", OBJPROP_YDISTANCE, 10);
ObjectSetText( "Lots", "Lots", 10, "Arial", Open_Price_Color);
ObjectCreate( "Lots value", OBJ_LABEL, 0,0,0,0,0,0,0);
ObjectSet( "Lots value", OBJPROP_CORNER, 1);
ObjectSet( "Lots value", OBJPROP_XDISTANCE, 25);
ObjectSet( "Lots value", OBJPROP_YDISTANCE, y_pos + 5);
ObjectSetText( "Lots value", "****", 14, "Arial", Open_Price_Color);
ObjectsRedraw();
// Âûâîä îêíà ïîäòâåðæäåíèÿ îïåðàöèè
if (_OrderType == OP_BUY)
{
string Price_Type = "Bid";
string Operation = "ïðîäàòü ";
}
else
{
Price_Type = "Ask";
Operation = "êóïèòü ";
}
Question = "Âû óâåðåíû, ÷òî õîòèòå çàêðûòü ïîçèöèþ #" + _OrderTicket + " -" + "\n" + Operation + DoubleToStr(Lots,dig)
+ " ëîòîâ ïî òåêóùåé ðûíî÷íîé öåíå " + Price_Type + "? \n\n"
+ "Äëÿ ïîäòâåðæäåíèÿ îïåðàöèè íàæìèòå \"ÎÊ\".\n\n"
+ "Äëÿ ÷àñòè÷íîãî çàêðûòèÿ óñòàíîâèòå íåîáõîäèìûé\n"
+ "ðàçìåð ëîòà ìåíüøå " + DoubleToStr(_Order_Lots, dig) + ".\n\n"
+ "×òîáû îòêàçàòüñÿ îò îïåðàöèè, íàæìèòå \"Îòìåíà\".";
Answer = MessageBox( Question, "Çàêðûòèå ÎÒÊÐÛÒÎÉ ÏÎÇÈÖÈÈ ïî ðûíêó", 0x00000001 | 0x00000020 | 0x00040000 );
first = 0;
// åñëè íàæàòà ëþáàÿ êðîìå "ÎÊ" êíîïêà - âûõîäèì
if ( Answer != 1 )
{
deinit();
return(0);
}
}
// Ñ÷èòûâàåì çíà÷åíèÿ ñ îáúåêòîâ è íîðìàëèçóåì:
// Ðàçìåð ëîòà
Lots_value_y = ObjectGet( "Lots value", OBJPROP_YDISTANCE );
if ( Lots_value_y < 35) Lots = Lots_Scale;
if ( Lots_value_y >= 35 && Lots_value_y < 50 ) Lots = Lots_Scale + Min_Lot_Size;
if ( Lots_value_y >= 50 && Lots_value_y < 65 ) Lots = Lots_Scale + 2 * Min_Lot_Size;
if ( Lots_value_y >= 65 && Lots_value_y < 80 ) Lots = Lots_Scale + 3 * Min_Lot_Size;
if ( Lots_value_y >= 80 && Lots_value_y < 95 ) Lots = Lots_Scale + 4 * Min_Lot_Size;
if ( Lots_value_y >= 95 && Lots_value_y < 110 ) Lots = Lots_Scale + 5 * Min_Lot_Size;
if ( Lots_value_y >= 110 && Lots_value_y < 125 ) Lots = Lots_Scale + 6 * Min_Lot_Size;
if ( Lots_value_y >= 125 && Lots_value_y < 140 ) Lots = Lots_Scale + 7 * Min_Lot_Size;
if ( Lots_value_y >= 140 && Lots_value_y < 155 ) Lots = Lots_Scale + 8 * Min_Lot_Size;
if ( Lots_value_y >= 155 && Lots_value_y < 170 ) Lots = Lots_Scale + 9 * Min_Lot_Size;
if ( Lots_value_y >= 170 && Lots_value_y < 185 ) Lots = Lots_Scale + 10 * Min_Lot_Size;
if ( Lots_value_y >= 185 && Lots_value_y < 200 ) Lots = Lots_Scale + 11 * Min_Lot_Size;
if ( Lots_value_y >= 200 && Lots_value_y < 215 ) Lots = Lots_Scale + 12 * Min_Lot_Size;
if ( Lots_value_y >= 215 && Lots_value_y < 230 ) Lots = Lots_Scale + 13 * Min_Lot_Size;
if ( Lots_value_y >= 230 && Lots_value_y < 245 ) Lots = Lots_Scale + 14 * Min_Lot_Size;
if ( Lots_value_y >= 245 && Lots_value_y < 260 ) Lots = Lots_Scale + 15 * Min_Lot_Size;
if ( Lots_value_y >= 260 && Lots_value_y < 275 ) Lots = Lots_Scale + 16 * Min_Lot_Size;
if ( Lots_value_y >= 275 && Lots_value_y < 290 ) Lots = Lots_Scale + 17 * Min_Lot_Size;
if ( Lots_value_y >= 290 && Lots_value_y < 305 ) Lots = Lots_Scale + 18 * Min_Lot_Size;
if ( Lots_value_y >= 305 ) Lots = Lots_Scale + 19 * Min_Lot_Size;
Lots = NormalizeDouble( Lots, dig );
// Íåïîñðåäñòâåííî îïåðàöèÿ çàêðûòèÿ
int order;
if ( _OrderType == OP_BUY )
order = OrderClose( _OrderTicket, Lots, Bid, Slippage);
else
order = OrderClose( _OrderTicket, Lots, Ask, Slippage);
if ( order > 0 )
{
// åñëè âñ¸ îê, âûâîäèì ëîã è âûõîäèì
if (Lots == _Order_Lots)
Print( "Îðäåð #", _OrderTicket, " çàêðûò óñïåøíî!");
else
Print( "Îðäåð #", _OrderTicket, " çàêðûò ÷àñòè÷íî!");
ObjectDelete("Îðäåð # " + DoubleToStr(_OrderTicket,0));
ObjectDelete("Îðäåð # " + DoubleToStr(_OrderTicket,0) + " Stop Loss");
ObjectDelete("Îðäåð # " + DoubleToStr(_OrderTicket,0) + " Take Profit");
ObjectsRedraw();
if (Lots != _Order_Lots)
{
// Ïîèñê íîâîãî îðäåðà, îòêðûòîãî âçàìåí ÷àñòè÷íî çàêðûòîãî
for(int pos = 0; pos < OrdersTotal(); pos++)
{
OrderSelect(pos, SELECT_BY_POS, MODE_TRADES);
if (OrderComment() == "split from #"+ DoubleToStr(_OrderTicket,0))
{
_OrderTicket = OrderTicket();
_OrderOpenPrice = OrderOpenPrice();
_OrderStopLoss = OrderStopLoss();
_OrderTakeProfit = OrderTakeProfit();
break;
}
}
ObjectCreate("Îðäåð # " + DoubleToStr(_OrderTicket,0), OBJ_TEXT, 0, iTime(NULL,0,0), _OrderOpenPrice);
ObjectSetText("Îðäåð # " + DoubleToStr(_OrderTicket,0), DoubleToStr(_OrderOpenPrice, Digits), 8,"Times New Roman", Open_Price_Color );
if (_OrderStopLoss != 0)
{
ObjectCreate("Îðäåð # " + DoubleToStr(_OrderTicket,0) + " Stop Loss", OBJ_TEXT, 0, iTime(NULL,0,0), _OrderStopLoss);
ObjectSetText("Îðäåð # " + DoubleToStr(_OrderTicket,0) + " Stop Loss", DoubleToStr(_OrderStopLoss, Digits), 8,"Times New Roman", Stop_Loss_Color );
}
if (_OrderTakeProfit != 0)
{
ObjectCreate("Îðäåð # " + DoubleToStr(_OrderTicket,0) + " Take Profit", OBJ_TEXT, 0, iTime(NULL,0,0), _OrderTakeProfit);
ObjectSetText("Îðäåð # " + DoubleToStr(_OrderTicket,0) + " Take Profit", DoubleToStr(_OrderTakeProfit, Digits), 8,"Times New Roman", Take_Profit_Color );
}
}
ObjectsRedraw();
return(0);
}
// Åñëè îøèáêà - âûâîäèì ñîîáùåíèå è âûõîäèì
error = GetLastError();
if (error != 0 && error != 4202 )
{
Print("Îøèáêà ïðè çàêðûòèè! GetLastError = ", error, ", ErrorDescription = \"", ErrorDescription( error ), "\"" );
MessageBox( "Îøèáêà ïðè çàêðûòèè! GetLastError = " + error + ", ErrorDescription = \"" + ErrorDescription( error ) + "\"",
"Îøèáêà çàêðûòèÿ îðäåðà", 0x00000000 | 0x00000010 | 0x00040000 );
ObjectsRedraw();
return(-1);
}
}
// Çàâåðøåíèå ðàáîòû ñêðèïòà
int deinit()
{
// Óäàëåíèå âñåõ îáúåêòîâ, ñîçäàííûõ ñêðèïòîì
for ( double z = Lots_Scale; z < Lots_Scale + 20 * Min_Lot_Size; z += Min_Lot_Size )
ObjectDelete( DoubleToStr( z, dig ));
ObjectDelete( "Lots" );
ObjectDelete( "Lots value" );
ObjectsRedraw();
return(0);
}
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---