#ModifyStopLoss

Author: Copyright � 2006, Yuri2005
#ModifyStopLoss

This script is a specialized tool designed for traders using the MetaTrader 4 platform to precisely manage and modify Stop Loss levels for active trades or pending orders. Instead of requiring the user to calculate complex price points manually, it provides a visual and automated way to set safety nets on the trading chart.

Core Functionality

The primary purpose of this tool is to allow you to move your Stop Loss to a specific level based on a visual "anchor" line. Once you place the script on the chart, it identifies your target order and lets you define the new safety boundary by simply moving a line on the screen.

How the Logic Works

1. Order Identification The script looks for an order to modify in two ways:

  • Proximity: If no specific order number is provided, the script automatically detects the trade located closest to where you dropped the script on the chart.
  • Direct Selection: You can manually input a specific Order Number if you want to target a particular trade regardless of its position.

2. Configuration and Data Loading The tool is highly flexible in how it gathers its settings:

  • External Files: It can pull specific trading parameters (like distances and spreads) from an external CSV file. This is useful for traders who want consistent risk management across different currency pairs.
  • Manual Overrides: If the external file isn't used, or if certain values are set to zero, the script uses the manual settings you input directly into the tool's properties.

3. The Visual "Calculation Level" The heart of the logic is a visual line (usually Lime Green) that appears on your chart:

  • As an Anchor: You can move this line to any price level.
  • As a Starting Point: If you don't provide a manual price, the script intelligently defaults this line to either your current Stop Loss or your trade's Opening Price.

4. Dynamic Distance Calculation The script calculates the final Stop Loss position by applying an "indent" (a specific number of points) to the Calculation Level line:

  • For Buy Trades: It subtracts the chosen distance from the line (moving the stop lower).
  • For Sell Trades: It adds the chosen distance to the line (moving the stop higher), while also accounting for the "Spread" to ensure the level is valid.

5. Safety and Validation Before executing the change, the script performs a "reality check":

  • It verifies that your new Stop Loss isn't too close to the current market price.
  • If the requested level violates the broker's minimum distance rules (StopLevel), it will alert you with a warning message and ask you to reposition the line before trying again.

6. Execution and Feedback Once you confirm the change:

  • The script sends the modification command to the server.
  • It provides an on-screen confirmation if the trade was updated successfully.
  • It updates visual labels on your chart, marking the new Stop Loss price clearly in red text for easy monitoring.
Orders Execution
Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategy
Miscellaneous
Uses files from the file systemIt reads information from a fileIt opens Message Boxes to the user
13 Views
0 Downloads
0 Favorites
#ModifyStopLoss
//+------------------------------------------------------------------+
//|                                        (ModifyStopLoss).mq4 |
//|                                       Copyright © 2006, Yuri2005 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Yuri2005"

/*
-----------------------------Â-Í-È-Ì-À-Í-È-Å---------------------------------
Ïåðåä çàïóñêîì ñêðèïòà íàñòîÿòåëüíî ðåêîìåíäóåòñÿ èçó÷èòü ñëåäóþùåå ðóêîâîäñòâî:

Ñêðèïò ïðåäíàçíà÷åí äëÿ ìîäèôèêàöèè èëè óäàëåíèÿ ñòîï-ëîññà ó óñòàíîâëåííîãî îòëîæåííîãî 
îðäåðà èëè îòêðûòîé ïîçèöèè.

Äëÿ ýòîãî íåîáõîäèìî:

 1) Îçíàêîìèòüñÿ ñ äàííûì ðóêîâîäñòâîì. 
 
 2) Óñòàíîâèòü çíà÷åíèÿ ïåðåìåííûõ ïî óìîë÷àíèþ (íàõîäÿòñÿ ïîä îïèñàíèåì,íà÷èíàþòñÿ è 
   çàêàí÷èâàþòñÿ ñòðîêîé  //+----------------------------------------------+ )
 
 3) Ðàçðåøèòü èìïîðò âíåøíèõ ýêñïåðòîâ ÷åðåç ìåíþ
 	"Ñåðâèñ" -> "Íàñòðîéêè" -> "Ñîâåòíèêè" -> "Ðàçðåøèòü èìïîðòèðîâàíèå âíåøíèõ ýêñïåðòîâ"
 	(íåîáõîäèìî äëÿ îïèñàíèÿ îøèáêè, êîòîðàÿ ìîæåò âîçíèêíóòü ïðè óñòàíîâêå îðäåðà.

 4) Ó ñêðèïòà îäíà óïðàâëÿþùàÿ ëèíèÿ:
 
	- Calculation Level Line (ïî óìîë÷àíèþ - öâåòà LimeGreen - áëèçêîãî ê çåë¸íîìó ) - 
	äàííàÿ ëèíèÿ â çàâèñèìîñòè îò äðóãèõ íàñòðîåê ëèáî îïðåäåëÿåò íîâûé óðîâåíü Stop Loss,
	ëèáî ñëóæèò óðîâíåì äëÿ îòñ÷¸òà Stop Loss'à.

   Äëÿ ìîäèôèêàöèè ñòîï-ëîññà ïåðåíåñèòå ëèíèþ Calculation Level Line íà íóæíûé óðîâåíü.
   Äëÿ óäàëåíèÿ ñòîï-ëîññà âûäåëèòå ëèíèþ Calculation Level Line è óäàëèòå å¸ ñ ãðàôèêà. 
    
 5) Êîãäà âñ¸ áóäåò ãîòîâî, â ïîÿâèâøåìñÿ îêíå íàæìèòå êíîïêó "ÎÊ".
    
 6) Äëÿ ïðåêðàùåíèÿ ðàáîòû ñêðèïòà â ëþáîé ìîìåíò ìîæíî âîñïîëüçîâàòüñÿ êíîïêîé "Îòìåíà".

*/


//+------------------------------------------------------------------+

// Åñëè îêíî ñâîéñòâ íå íóæíî, íàäî çàêîììåíòèðîâàòü ñëåäóþùóþ ñòðîêó (ïîñòàâèòü â íà÷àëî //)

#property show_inputs

// Óðîâåíü, îò êîòîðîãî áóäåò ðàñ÷èòûâàòüñÿ íîâîå çíà÷åíèå ñòîï-ëîññà. 
// Åñëè çíà÷åíèå ðàâíî 0, òî â êà÷åñòâå íà÷àëüíîãî çíà÷åíèÿ äàííîãî óðîâíÿ óñòàíàâëèâàåòñÿ óæå èìåþùèéñÿ ó îðäåðà ñòîï-ëîññ,
// à ïðè åãî îòñóòñòâèè - öåíà îòêðûòèÿ îðäåðà.

extern double Calculation_Level = 0;

// Ïåðâûé âîçìîæíûé ðàçìåð îòñòóïà îò óðîâíÿ Calculation_Level. Äàííîå çíà÷åíèå, â ñëó÷àå åãî èñïîëüçîâàíèÿ, îòíèìàåòñÿ èëè ïðèáàâëÿåòñÿ
// (â çàâèñèìîñòè îò íàïðàâëåíèÿ - Buy èëè Sell èçìåíÿåìîãî îðäåðà) îò óðîâíÿ Calculation_Level è îïðåäåëÿåò íîâîå çíà÷åíèå
// óðîâíÿ Stop Loss. Åñëè ðàâåí 0, òî â êà÷åñòâå óðîâíÿ Stop Loss áóäåò èñïîëüçîâàòüñÿ çíà÷åíèå óðîâíÿ Calculation_Level.

extern int Indent_From_Level1 = 0;

// Âòîðîé âîçìîæíûé ðàçìåð îòñòóïà îò óðîâíÿ Calculation_Level. Íàçíà÷åíèå òî æå, ÷òî è ó óðîâíÿ Indent_From_Level1. Äëÿ èçìåíåíèÿ ñòîï-ëîññà 
// ìîæåò èñïîëüçîâàòüñÿ òîëüêî îäèí èç íèõ, êàêîé èìåííî - îïðåäåëÿåòñÿ ïåðåìåííîé Indent_From_Level1_Flag (ñìîòðè íèæå).

extern int Indent_From_Level2 = 0;

// Ïåðåêëþ÷àòåëü èñïîëüçóåìûõ äëÿ ìîäèôèêàöèè ñòîï-ëîññà îòñòóïîâ. Åñëè óñòàíîâëåí â True, òî èñïîëüçóåòñÿ îòñòóï Indent_From_Level1,
// åñëè óñòàíîâëåí â False, òî Indent_From_Level2

extern bool Indent_From_Level1_Flag = True;

// Íîìåð îðäåðà äëÿ èçìåíåíèÿ. Äàííûé ñêðèïò ïîçâîëÿåò âûäåëÿòü îðäåðà äëÿ èçìåíåíèÿ êàê óêàçàíèåì íà èõ ëèíèþ íà ãðàôèêå, 
// òàê è ïðÿìûì ââåäåíèåì èõ íîìåðîâ. Åñëè íîìåð îðäåðà ââåä¸í, òî óêàçàíèå ëèíèè îðäåðà íà ãðàôèêå èãíîðèðóåòñÿ,
// åñëè íîìåð ðàâåí 0, òî èñïîëüçóåòñÿ óêàçàíèå ëèíèè îðäåðà.

extern int Order_Number = 0;

// Ñïðåä ïî òåêóùåìó èíñòðóìåíòó. Äàííàÿ ïåðåìåííàÿ èñïîëüçóåòñÿ äëÿ óòî÷íåíèÿ óðîâíÿ ñòîï-ëîññà, åñëè åãî íóæíî âûñòàâèòü ïî öåíå Ask,
// òî åñòü íà ïîêóïêó (Buy), à ãðàôèêè ñòðîÿòñÿ òîëüêî ïî öåíå Bid (êàê ñòàíäàðòíî â Ìåòàòðåéäåðå).

extern int Spread = 0;

// Êîììåíòàðèé ê îðäåðó

extern string _Comment = " ";

// Ìàêñèìàëüíîå ðàññòîÿíèå â ïóíêòàõ îò ìåñòà, íà êîòîðîå áûë "îòïóùåí" ñêðèïò, äî
// öåíû îòêðûòèÿ îðäåðà. Äëÿ ìàêèìàëüíîé òî÷íîñòè ðàáîòû èñïîëüçóéòå "0",
// òîãäà îðäåð âûäåëèòñÿ òîëüêî â ñëó÷àå òî÷íîãî ïîïàäàíèÿ.

extern int Order_Find_Radius = 10;

// Óñòàíàâëèâàåòñÿ, áóäåò ëè èñïîëüçîâàòüñÿ óïðàâëÿþùèé ôàéë äëÿ óñòàíîâêè ïàðàìåòðîâ îðäåðîâ.
// True - èñïîëüçóåòñÿ, False - íåò.
//  äàííîì ñêðèïòå èç óïðàâëÿþùåãî ôàéëà èñïîëüçóþòñÿ òîëüêî çíà÷åíèÿ Short_Indent_From_Level,
// Long_Indent_From_Level è Spread ïî êàæäîìó êîíêðåòíîìó òîðãîâîìó èíñòðóìåíòó, îñòàëüíûå ïàðàìåòðû 
// èç óïðàâëÿþùåãî ôàéëà, èñïîëüçóåìûå â äðóãèõ ñêðèïòàõ, èãíîðèðóþòñÿ.

extern bool Read_From_File = True;

// Óñòàíàâëèâàåòñÿ, áóäåò ëè èñïîëüçîâàòüñÿ çíà÷åíèå ñïðåäà, çàïèñàííîå â óïðàâëÿþùåì ôàéëå äëÿ êîíêðåòíîãî
// ñèìâîëà. Åñëè True - èñïîëüçóåòñÿ, åñëè False - èãíîðèðóåòñÿ.

extern bool Use_Spread_From_File = True;

// Íàçâàíèå óïðàâëÿþùåãî ôàéëà. Ôàéë äîëæåí íàõîäèòñÿ â ïàïêå experts\files, íàõîäÿùåéñÿ 
// â ïàïêå ñ óñòàíîâëåííîé ïðîãðàììîé Metatrader. Â äàííîì ôàéëå ìîãóò õðàíèòñÿ è èçìåíÿòüñÿ
// âðó÷íóþ èëè èç äðóãèõ ýêñïåðòîâ/ ñêðèïòîâ/ èíäèêàòîðîâ/ ïðîãðàìì ðàçìåð òîðãîâîé îïåðàöèè, 
// ñòîï ëîññà, òåéê-ïðîôèòà è ðÿä äðóãèõ ïàðàìåòðîâ, ïîçâîëÿþùèõ àâòîìàòè÷åñêè èñïîëüçîâàòü 
// îïðåäåë¸ííûå òðåéäåðîì ïðàâèëà óïðàâëåíèÿ êàïèòàëîì.

/* Ôîðìàò óïðàâëÿþùåãî ôàéëà

EURUSD;51;102;14;38;2;13
USDJPY;52;104;17;39;3;13
GBPUSD;72;142;10;54;3;18
USDCAD;51;102;15;38;4;13
AUDUSD;35;70;22;26;2;9

Äëÿ âñåõ ñêðèïòîâ èñïîëüçóåòñÿ îäèí è òîò æå óïðàâëÿþùèé ôàéë, îäíàêî ÷àñòü ïàðàìåòðîâ èç ôàéëà â îòäåëüíûõ 
ñêðèïòàõ ìîæåò íå èñïîëüçîâàòüñÿ.

Ôàéë äîëæåí ïðåäñòàâëÿòü ñîáîé ñïèñîê ñòðîê, ïàðàìåòðû â êàæäîé ñòðîêå ðàçäåëåíû ";"
Ïîñëå ïîñëåäíåé ñòðîêè ôàéëà îáÿçàòåëüíî íåîáõîäèìî ñäåëàòü ïåðåâîä ñòðîêè (ïðè ðó÷íîì íàáîðå íàæàòü "Enter"

Çíà÷åíèÿ ïàðàìåòðîâ â ñòîëáöàõ:

1 - Íàçâàíèå òîðãîâîãî èíñòðóìåíòà. Äîëæíî òî÷íî ñîâïàäàòü ñ íàçâàíèåì äàííîãî òîðãîâîãî èíñòðóìåíòà â Ìåòàòðåéäåðå. 
  Âñå ñëåäóþùèå ïàðàìåòðû èç äàííîé ñòðîêè áóäóò èñïîëüçîâàòüñÿ òîëüêî äëÿ ñîâåðøåíèÿ òîðãîâûõ îïåðàöèé ïî ýòîìó òîðãîâîìó
  èíñòðóìåíòó.  ñëó÷àå îòñóòñòâèÿ â ôàéëå íàçâàíèÿ èíñòðóìåíòà, ïî êîòîðîìó âû ïðåäïîëàãàåòå ñîâåðøèòü îïåðàöèþ, áóäóò
  èñïîëüçîâàòüñÿ çíà÷åíèÿ èç íàñòðîåê èëè âõîäíûõ ïàðàìåòðîâ ñêðèïòà.
  
2 - Indent From Level1 (îòñòóï îò óðîâíÿ - 1). Ýòî òîò æå ñàìûé ïàðàìåòð, êîòîðûé â äðóãèõ ñêðèïòàõ íàçûâàåòñÿ Attached Stop Loss 
  (ïðèêðåïë¸ííûé ñòîï ëîññ), íî â òåêóùåì ñêðèïòå îí èìååò äðóãîå íàçíà÷åíèå. Äàííûé ïàðàìåòð ïðè ÷òåíèè èç ôàéëà çàïèñûâàåòñÿ â 
  ïåðåìåííóþ Indent_From_File1. 
  Íàçíà÷åíèå è èñïîëüçîâàíèå äàííîãî ïàðàìåòðà ïîëíîñòüþ àíàëîãè÷íî èñïîëüçîâàíèÿþ ïðåäîïðåäåë¸ííîé ïåðåìåííîé Indent_From_Level1 
  (ñìîòðè âûøå). Ïðè íàëè÷èè â ôàéëå äàííîãî ïàðàìåòðà îí çàìåíÿåò ïåðåìåííóþ Indent_From_Level1. Åñëè çíà÷åíèå Indent_From_Level1 
  áûëî ââåäåíî â íàñòðîéêàõ ñêðèïòà èëè åãî âõîäíûõ ïàðàìåòðàõ, òî îíî èãíîðèðóåòñÿ, îäíàêî åñëè çíà÷åíèå â ñòîëáöå ðàâíî 0, 
  òî èñïîëüçóåòñÿ çíà÷åíèå, ââåä¸ííîå â ñêðèïòå.
  
3 - Attached Take Profit (ïðèêðåïë¸ííûé òåéê ïðîôèò). Äàííûé ïàðàìåòð â òåêóùåì ñêðèïòå íå èñïîëüçóåòñÿ, çíà÷åíèÿ èç äàííîãî ñòîëáöà 
  èãíîðèðóþòñÿ, îäíàêî ñàì ñòîëáåö â ôàéëå äîëæåí ïðèñóòñòâîâàòü è áûòü çàïîëíåííûì (÷òî òàì óêàçàíî, äëÿ äàííîãî ñêðèïòà íå èìååò 
  çíà÷åíèÿ) - ýòî ñäåëàíî äëÿ ñîâìåñòèìîñòè ñ äðóãèìè ñêðèïòàìè. Îïèñàíèå åãî íàçíà÷åíèÿ ñìîòðèòå â èíñòðóêöèÿõ ê äðóãèì ñêðèïòàì.
 
4 - Îáú¸ì òîðãîâîé îïåðàöèè. Äàííûé ïàðàìåòð â òåêóùåì ñêðèïòå íå èñïîëüçóåòñÿ, çíà÷åíèÿ èç äàííîãî ñòîëáöà 
  èãíîðèðóþòñÿ, îäíàêî ñàì ñòîëáåö â ôàéëå äîëæåí ïðèñóòñòâîâàòü è áûòü çàïîëíåííûì (÷òî òàì óêàçàíî, äëÿ äàííîãî ñêðèïòà íå èìååò 
  çíà÷åíèÿ) - ýòî ñäåëàíî äëÿ ñîâìåñòèìîñòè ñ äðóãèìè ñêðèïòàìè. Îïèñàíèå åãî íàçíà÷åíèÿ ñìîòðèòå â èíñòðóêöèÿõ ê äðóãèì ñêðèïòàì.
   
5 - Indent From Level (îòñòóï îò óðîâíÿ). Äàííûé ïàðàìåòð â òåêóùåì ñêðèïòå íå èñïîëüçóåòñÿ, çíà÷åíèÿ èç äàííîãî ñòîëáöà 
  èãíîðèðóþòñÿ, îäíàêî ñàì ñòîëáåö â ôàéëå äîëæåí ïðèñóòñòâîâàòü è áûòü çàïîëíåííûì (÷òî òàì óêàçàíî, äëÿ äàííîãî ñêðèïòà íå èìååò 
  çíà÷åíèÿ) - ýòî ñäåëàíî äëÿ ñîâìåñòèìîñòè ñ äðóãèìè ñêðèïòàìè. Îïèñàíèå åãî íàçíà÷åíèÿ ñìîòðèòå â èíñòðóêöèÿõ ê äðóãèì ñêðèïòàì.
  
6 - Âåëè÷èíà ñïðåäà ïî èíñòðóìåíòó. Äàííûé ïàðàìåòð ïðè ÷òåíèè èç ôàéëà çàïèñûâàåòñÿ â ïåðåìåííóþ Spread_From_File.Íàçíà÷åíèå è 
  èñïîëüçîâàíèå äàííîãî ïàðàìåòðà ïîëíîñòüþ àíàëîãè÷íî èñïîëüçîâàíèþ ïðåäîïðåäåë¸ííîé ïåðåìåííîé Spread (ñìîòðè âûøå). Ïðè íàëè÷èè â 
  ôàéëå äàííîãî ïàðàìåòðà îí çàìåíÿåò ïåðåìåííóþ Spread. Åñëè çíà÷åíèå Spread áûëî ââåäåíî â íàñòðîéêàõ ñêðèïòà èëè åãî âõîäíûõ 
  ïàðàìåòðàõ, òî îíî èãíîðèðóåòñÿ, îäíàêî åñëè çíà÷åíèå â ñòîëáöå ðàâíî 0, òî èñïîëüçóåòñÿ çíà÷åíèå, ââåä¸ííîå â ñêðèïòå.
  
7 - Indent From Level2 (îòñòóï îò óðîâíÿ 2). Äàííûé ïàðàìåòð ÈÑÏÎËÜÇÓÅÒÑß ÒÎËÜÊÎ Â ÒÅÊÓÙÅÌ ÑÊÐÈÏÒÅ. Äàííûé ïàðàìåòð ïðè ÷òåíèè èç ôàéëà
  çàïèñûâàåòñÿ â ïåðåìåííóþ Indent_From_File2. 
  Íàçíà÷åíèå è èñïîëüçîâàíèå äàííîãî ïàðàìåòðà ïîëíîñòüþ àíàëîãè÷íî èñïîëüçîâàíèÿþ ïðåäîïðåäåë¸ííîé ïåðåìåííîé Indent_From_Level2 
  (ñìîòðè âûøå). Ïðè íàëè÷èè â ôàéëå äàííîãî ïàðàìåòðà îí çàìåíÿåò ïåðåìåííóþ Indent_From_Level2. Åñëè çíà÷åíèå Indent_From_Level2 
  áûëî ââåäåíî â íàñòðîéêàõ ñêðèïòà èëè åãî âõîäíûõ ïàðàìåòðàõ, òî îíî èãíîðèðóåòñÿ, îäíàêî åñëè çíà÷åíèå â ñòîëáöå ðàâíî 0, 
  òî èñïîëüçóåòñÿ çíà÷åíèå, ââåä¸ííîå â ñêðèïòå.

Åñëè âû íå ïëàíèðóòå èñïîëüçîâàíèå äàííîãî ïàðàìåòðà âîîáùå, òî ìîæåòå íå ñîçäàâàòü äàííûé ñòîëáåö ïðè ñîçäàíèè óïðàâëÿþùåãî ôàéëà.
 
Åñëè âû íå ïëàíèðóåòå èñïîëüçîâàíèå ëþáîãî èç âûøåóêàçàííûõ ïàðàìåòðîâ, òî â ñîîòâåòñòâóþùåì ñòîëáöå óêàæèòå 0 - ïðè ÷òåíèè èç ôàéëà
îí áóäåò èãíîðèðîâàòüñÿ, à â ðàáîòå áóäåò èñïîëüçîâàòüñÿ ñîîòâåòñòâóþùåå çíà÷åíèå èç íàñòðîåê èëè âõîäíûõ ïàðàìåòðîâ ñêðèïòà. Îäíàêî 
ñòîëáåö íåëüçÿ ïðîïóñêàòü. Êðîìå òîãî, ìîæíî ïîëíîñòüþ óäàëÿòü ñòîëáåö, åñëè îí â äàííîì ôàéëå ÿâëÿåòñÿ ïîñëåäíèì, åñëè âû íå ïëàíèðóåòå
èñïîëüçîâàòü ýòîò ïàðàìåòð.

  
  Ïðèîðèòåò ïàðàìåòðîâ îðäåðà. 
  
Íàèâûñøèì ïðèîðèòåòîì îáëàäàþò çíà÷åíèÿ èç âõîäíûõ ïàðàìåòðîâ ñêðèïòà Indent From Level1, Indent From Level2, Spread, òî åñòü åñëè îíè íå 
ðàâíû 0, ëþáûå äðóãèå àíàëîãè÷íûå ïàðàìåòðû, ïåðåäàâàåìûå èç óïðàâëÿþùåãî ôàéëà,áóäóò èãíîðèðîâàòüñÿ. Åñëè âûøåóêàçàííûå ïàðàìåòðû ðàâíû 0, 
òî èñïîëüçóþòñÿ àíàëîãè÷íûå ïàðàìåòðû, ïåðåäàâàåìûå èç óïðàâëÿþùåãî ôàéëà. 
  
*/

extern string FileName = "Raschet.csv";

extern string Line_Color = "----------------------------------------------------------------------------------------";

// Öâåòà óïðàâëÿþùèé ëèíèé è òåêñòà ïî óìîë÷àíèþ

extern color Calculation_Level_Line_Color = LimeGreen;
extern color Open_Price_Line_Color = Blue;
extern color Stop_Loss_Color = Red;

//+------------------------------------------------------------------+

// Âêëþ÷åíèå áèáëèîòåêè îáðàáîòêè îøèáîê

#include <stdlib.mqh>

// Îáúÿâëåíèå ïåðåìåííûõ

int first = 1, stroka = 1, stolbec = 1 ;
double Indent_From_File1 = 0, Indent_From_File2 = 0, Spread_From_File = 0;

// Íà÷àëî ñêðèïòà

int start()
{

//+------------------------------------------------------------------+

// Îáúÿâëåíèå è óñòàíîâêà íà÷àëüíûõ çíà÷åíèé ïåðåìåííûõ

int _break, error, Indent_From_Level;
double Calculation_Level_Line, Stop_Loss_Level, DropPrice = PriceOnDropped();

//×òåíèå ïàðàìåòðîâ äëÿ èçìåíåíèÿ ñòîï-ëîññà èç ôàéëà

if (Read_From_File)
   {
   string Info[120][20];
   int FileHandle = FileOpen(FileName, FILE_CSV|FILE_READ, ";");
   
   if (FileHandle == -1)   
      {
      Print("Îøèáêà=",GetLastError());
      Read_From_File = False;
      }
   
   if (FileHandle > 0)
      {
      while(!FileIsEnding(FileHandle))
         {
         Info[stroka,stolbec] = FileReadString(FileHandle); 
         stolbec++;
         if (FileIsLineEnding(FileHandle)) 
            {
            stroka++; 
            stolbec = 1;
            }
         }
      }
   }         

// Çàïèñü ñ÷èòàííûõ èç ôàéëà ïàðàìåòðîâ óñòàíîâêè îðäåðà â ïåðåìåííûå äëÿ èõ äàëüíåéøåãî èñïîëüçîâàíèÿ
         
if (Read_From_File)
   {
   for (int i = 1; i < stroka; i++)
      {
      if (Symbol() == Info[i,1])
          {
          Read_From_File = True;
          Indent_From_File1 = StrToInteger(Info[i,2]);
          Indent_From_File2 = StrToInteger(Info[i,7]);
          Spread_From_File = StrToInteger(Info[i,6]);
          break;
          }
      Read_From_File = False;
      }
   }
      
if (Use_Spread_From_File && Spread_From_File != 0)
   Spread = Spread_From_File;
   
if (Indent_From_File1 != 0 && Indent_From_Level1 == 0)
   Indent_From_Level1 = Indent_From_File1;

if (Indent_From_File2 != 0 && Indent_From_Level2 == 0)
   Indent_From_Level2 = Indent_From_File2;
   
if (Indent_From_Level1_Flag)
   Indent_From_Level = Indent_From_Level1;
else
   Indent_From_Level = Indent_From_Level2;
   
// Ïîèñê îðäåðà äëÿ èçìåíåíèÿ

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

// Óñòàíîâêà íà÷àëüíûõ çíà÷åíèé:

// ---Calculation_Level_Line

if (Calculation_Level == 0 && _OrderStopLoss != 0 )
	Calculation_Level_Line = _OrderStopLoss;
else 
   if (Calculation_Level == 0 && _OrderStopLoss == 0 )
      Calculation_Level_Line = _OrderOpenPrice;
   else 
      Calculation_Level_Line = NormalizeDouble(Calculation_Level, Digits);

// Ñîçäàíèå ëèíèè:

if ( first == 1 )
   {						
	ObjectCreate( "Calculation Level Line", OBJ_HLINE, 0, 0, Calculation_Level_Line, 0, 0, 0, 0 );
	ObjectSet(  "Calculation Level Line", OBJPROP_COLOR, Calculation_Level_Line_Color );
   ObjectsRedraw();
   }

// Âûâîä îêíà ïîäòâåðæäåíèÿ îïåðàöèè

string Description2 = "Ïðè èçìåíåíèè îðäåðà îòñòóï íå èñïîëüçóåòñÿ. Íîâûé ñòîï-ëîññ \n"
                    + "áóäåò óñòàíîâëåí òî÷íî íà óðîâíå óïðàâëÿþùåé ëèíèè.";

if ( _OrderType == OP_SELL || _OrderType == OP_SELLSTOP || _OrderType == OP_SELLLIMIT )
   {
   string Description = "Ïðè èçìåíåíèè îðäåðà èñïîëüçóåòñÿ äîïîëíèòåëüíûé îòñòóï ââåðõ. \n"
                      + "Íîâûé ñòîï-ëîññ áóäåò óñòàíîâëåí íà " + (Indent_From_Level + Spread) + " ïóíêòîâ âûøå óðîâíÿ \n"
                      + "óïðàâëÿþùåé ëèíèè.";
   if (Indent_From_Level + Spread == 0)
         Description = Description2;
   }
else
   {
   Description = "Ïðè èçìåíåíèè îðäåðà èñïîëüçóåòñÿ äîïîëíèòåëüíûé îòñòóï âíèç. \n"
               + "Íîâûé ñòîï-ëîññ áóäåò óñòàíîâëåí íà " + Indent_From_Level + " ïóíêòîâ íèæå óðîâíÿ \n"
               + "óïðàâëÿþùåé ëèíèè.";
   if (Indent_From_Level == 0)
         Description = Description2;
   }
	
string Question = "Äëÿ âíåñåíèÿ èçìåíåíèé ïåðåìåñòèòå ëèíèþ íà íåîáõîäèìûé \n" 
	             + "óðîâåíü è íàæìèòå \"ÎÊ\".\n\n" 
	             + "×òîáû îòêàçàòüñÿ îò ìîäèôèêàöèè è çàâåðøèòü ðàáîòó,\n"
				    + "íàæìèòå \"Îòìåíà\".\n\n"
				    + Description;
				    
int Answer = MessageBox( Question, "Èçìåíåíèå óðîâíÿ Stop Loss", 0x00000001 | 0x00000040 | 0x00040000 );
first = 0;

// åñëè íàæàòà ëþáàÿ êðîìå "ÎÊ" êíîïêà - âûõîäèì
if ( Answer != 1 ) 
	{ 
	deinit(); 
	return(0); 
	}
	
// Ñ÷èòûâàåì çíà÷åíèÿ ñ îáúåêòîâ è íîðìàëèçóåì:

// Calculation_Level

Calculation_Level_Line = NormalizeDouble( ObjectGet( "Calculation Level Line", OBJPROP_PRICE1 ), Digits );

// Âû÷èñëåíèå íîâîãî çíà÷åíèÿ Stop Loss

// Stop_Loss

if ( _OrderType == OP_BUY || _OrderType == OP_BUYSTOP || _OrderType == OP_BUYLIMIT )
   Stop_Loss_Level = NormalizeDouble(Calculation_Level_Line - Indent_From_Level * Point, Digits);
else
   Stop_Loss_Level = NormalizeDouble(Calculation_Level_Line + (Indent_From_Level + Spread) * Point, Digits);
          
if (Calculation_Level_Line == 0)
   Stop_Loss_Level = 0;

// Ïðîâåðÿåì âñå çíà÷åíèÿ
	
if ( _OrderType == OP_BUY )
   {
	if (Bid - Stop_Loss_Level < MarketInfo( Symbol(), MODE_STOPLEVEL )* Point )
      {
		Answer = MessageBox( "Íåïðàâèëüíî óñòàíîâëåí óðîâåíü Stop Loss!\n" + 
				 		 		 	"\n" +
				 		 		 	"Äëÿ Buy - ïîçèöèè îí äîëæåí áûòü ÍÈÆÅ Bid.	\n" + 
				 		 		 	"Ìèíèìàëüíûé îòñòóï (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " ïóíêòîâ.\n" + 
				 		 		 	"\n" +
				 		 		 	"Óñòàíîâèòå ïðàâèëüíîå çíà÷åíèå è íàæìèòå \"Ïîâòîð\".\n" +
				 		 		 	"×òîáû îòêàçàòüñÿ îò ìîäèôèêàöèè, íàæìèòå \"Îòìåíà\".", "Ìîäèôèêàöèÿ îðäåðà", 0x00000005 | 0x00000030 | 0x00040000 );
		if ( Answer == 4 ) 
		   { 
		   ObjectsRedraw(); 
		   start(); 
		   }
		deinit();
		return(-1);
		}
	}

if ( _OrderType == OP_BUYSTOP || _OrderType == OP_BUYLIMIT )
   {
	if ( _OrderOpenPrice - Stop_Loss_Level < MarketInfo( Symbol(), MODE_STOPLEVEL )* Point )
	   {
		Answer = MessageBox(  "Íåïðàâèëüíî óñòàíîâëåí óðîâåíü Stop Loss!\n" + 
					 	 			 "\n" +
					 		 		 "Äëÿ Buy, BuyLimit è BuyStop - îðäåðîâ îí äîëæåí áûòü ÍÈÆÅ óðîâíÿ Open Price.\n" + 
					 		 		 "Ìèíèìàëüíûé îòñòóï (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " ïóíêòîâ.\n" + 
					 				 "\n" +
					 		 		 "Óñòàíîâèòå ïðàâèëüíîå çíà÷åíèå è íàæìèòå \"Ïîâòîð\".\n" +
					 		 		 "×òîáû îòêàçàòüñÿ îò ìîäèôèêàöèè, íàæìèòå \"Îòìåíà\".", "Ìîäèôèêàöèÿ îðäåðà", 0x00000005 | 0x00000030 | 0x00040000 );
		if ( Answer == 4 ) 
		   { 
		   ObjectsRedraw(); 
		   start(); 
		   }
		deinit();
		return(-1);
		}
	}

if ( _OrderType == OP_SELL )
	{
	if ( Stop_Loss_Level - Ask < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point )
      {
		Answer = MessageBox(  "Íåïðàâèëüíî óñòàíîâëåí óðîâåíü Stop Loss!\n" + 
				 		 			 "\n" +
					 		 		 "Äëÿ Sell - ïîçèöèè îí äîëæåí áûòü ÂÛØÅ Ask.	\n" + 
					 		 		 "Ìèíèìàëüíûé îòñòóï (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " ïóíêòîâ.\n" + 
					 		 		 "\n" +
					 		 		 "Óñòàíîâèòå ïðàâèëüíîå çíà÷åíèå è íàæìèòå \"Ïîâòîð\".\n" +
					 		 		 "×òîáû îòêàçàòüñÿ îò ìîäèôèêàöèè, íàæìèòå \"Îòìåíà\".", "Ìîäèôèêàöèÿ îðäåðà", 0x00000005 | 0x00000030 | 0x00040000 );
		if ( Answer == 4 ) 
		   { 
		   ObjectsRedraw(); 
		   start(); 
		   }
		deinit();
		return(-1);
		}
	}
	
if ( _OrderType == OP_SELLLIMIT || _OrderType == OP_SELLSTOP )
	{
	if ( Stop_Loss_Level - _OrderOpenPrice < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point )
	   {
		Answer = MessageBox(  "Íåïðàâèëüíî óñòàíîâëåí óðîâåíü Stop Loss!\n" + 
					 	 			 "\n" +
					 				 "Äëÿ Sell, SellLimit è SellStop - îðäåðîâ îí äîëæåí áûòü ÂÛØÅ óðîâíÿ Open Price.\n" + 
					 				 "Ìèíèìàëüíûé îòñòóï (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " ïóíêòîâ.\n" + 
					 				 "\n" +
					 				 "Óñòàíîâèòå ïðàâèëüíîå çíà÷åíèå è íàæìèòå \"Ïîâòîð\".\n" +
					 				 "×òîáû îòêàçàòüñÿ îò ìîäèôèêàöèè, íàæìèòå \"Îòìåíà\".", "Ìîäèôèêàöèÿ îðäåðà", 0x00000005 | 0x00000030 | 0x00040000 );
		if ( Answer == 4 ) 
		   { 
		   ObjectsRedraw(); 
		   start(); 
		   }
		deinit();
		return(-1);
		}
   }

// Óñòàíîâêà íîâîãî çíà÷åíèÿ Stop Loss
   
if (NormalizeDouble(Stop_Loss_Level, Digits) - NormalizeDouble(_OrderStopLoss, Digits) != 0 ) 
   {
   
   // Âûâîäèì èíôó î çàïðîñå è ïûòàåìñÿ ìîäèôèöèðîâàòü îðäåð

   Print( "OrderTicket=",_OrderTicket, ",_OrderType=",_OrderType, ",Open_Price_Level=",_OrderOpenPrice, ",Stop_Loss_Level=", Stop_Loss_Level, ",Take_Profit_Level=", _OrderTakeProfit, ",Expiration_Time=", _OrderExpiration);
   int ordermodify = OrderModify( _OrderTicket, _OrderOpenPrice, Stop_Loss_Level, _OrderTakeProfit, _OrderExpiration);
     
   if (ordermodify > 0)
      {
      // Åñëè âñ¸ îê, âûâîäèì ëîã è âûõîäèì
	   OrderPrint();
	   Print( "Îðäåð #", _OrderTicket, " ìîäèôèöèðîâàí óñïåøíî!");
	   }
	else
	   {
	   Print( "Îðäåð #", _OrderTicket, " îñòàëñÿ áåç èçìåíåíèé");
	   error = GetLastError();
	   if (error != 1)
	      { 
	      Print("GetLastError = ", error, ", ErrorDescription =  \"", ErrorDescription( error ), "\"" );
         MessageBox( "Îðäåð îñòàëñÿ áåç èçìåíåíèé \n" + ErrorDescription( error ), "Îðäåð íå èçìåí¸í", 0x00000000 | 0x00000040 | 0x00040000 );
	      }
	   else
	      MessageBox( "Îðäåð îñòàëñÿ áåç èçìåíåíèé \n", "Îðäåð íå èçìåí¸í", 0x00000000 | 0x00000040 | 0x00040000 );
	   }
	} 
	else 
   MessageBox( "Îðäåð îñòàëñÿ áåç èçìåíåíèé \n", "Îðäåð íå èçìåí¸í", 0x00000000 | 0x00000040 | 0x00040000 );
	    
OrderSelect(_OrderTicket, SELECT_BY_TICKET);
   
if (!ObjectMove("Îðäåð # " + DoubleToStr(_OrderTicket,0), 0, iTime(NULL,0,0), OrderOpenPrice()))
	   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_Line_Color );
   

if (!ObjectMove("Îðäåð # " + DoubleToStr(_OrderTicket,0) + " Stop Loss", 0, iTime(NULL,0,0), OrderStopLoss()) && (Stop_Loss_Level != 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 );
		  
return(-1);
}

// Çàâåðøåíèå ðàáîòû ñêðèïòà
 
int deinit()
{

// Óäàëåíèå âñåõ îáúåêòîâ, ñîçäàííûõ ñêðèïòîì
	
ObjectDelete( "Calculation Level Line" );
ObjectsRedraw();		
	
return(0);
}

Comments