//+------------------------------------------------------------------+ //| (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