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;

RefreshRates();

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);
}





Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders

It Closes Orders by itself

Other Features:

It opens Message Boxes to the user