Author: Copyright � 2011, TarasBY WM R418875277808
Price Data Components
Series array that contains open time of each bar
Orders Execution
Checks for the total of open ordersChecks for the total of closed orders
0 Views
0 Downloads
0 Favorites
e-PSIzVTEC
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                                    e-PSI@VTEC.mq4 |
//|                                                         Copyright © 2011, TarasBY |
//|                                                                taras_bulba@tut.by |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
#property copyright "Copyright © 2011, TarasBY WM R418875277808"
#property link      "taras_bulba@tut.by"
//IIIIIIIIIIIIIIIIIII==================CONSTANS=================IIIIIIIIIIIIIIIIIIIIII+
#define Line_BUY  0
#define Line_SELL 1
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  *****         Ïàðàìåòðû ñîâåòíèêà         *****                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
extern string SETUP_Expert       = "=========== Îáùèå íàñòðîéêè ñîâåòíèêà ===========";
extern int    MG                    = 123;         // Ìàãèê
extern int    NewBarInPeriod        = 1;           // <= 0 - ðàáîòàåì íà íà÷àëå ïåðèîäà íîâîãî áàðà, -1 - ðàáîòàåì íà êàæäîì òèêå
extern int    Variant_TradePrice    = 1;           // Âàðèàíò öåí, ñ êîòîðûìè áóäåò ðàáîòàòü ñîâåòíèê
// 0 - Bid\Ask ("êàê Áîã ïîøë¸ò") - íà ðåçóëüòàòû òåñòåðà ìîæåòå íå îáðàùàòü âíèìàíèÿ
// 1 - Open[0] - ïðåäïî÷òèòåëüíûé âàðèàíò (íà ëþáèòåëÿ)
// 2 - Close[1] - (íà ëþáèòåëÿ)
// 3 - Close[0] - "íà âñÿêèé ñëó÷àé"
extern int    Profit_MIN            = 30;          // Ìèí. ïðîôèò äëÿ çàêðûòèÿ îðäåðà (â ïï.)
extern int    MIN_StopLoss          = 50;          // Ìèí. ñòîï-ëîññ äëÿ âñåõ îðäåðîâ
extern string Setup_baseStrategy = "================= Base STRATEGY =================";
extern bool   Send_base_ON          = TRUE;        // Îòêðûâàåì base (îñíîâíûå) îðäåðà
extern int    MIN_Range             = 100;         // ìèí. äèàïàçîí ìåæäó ìèí. è ìàêñ.
extern int    Trailling_Volume      = 40;          // Ðàçìåð òðàëà 
extern string Setup_flatStrategy = "================= Flat STRATEGY =================";
extern bool   Send_flat_ON          = TRUE;        // Îòêðûâàåì flat (íà ïðîáîé flat-êàíàëà) îðäåðà
extern int    MAX_flat_Range        = 30;          // ìàêñ. äèàïàçîí "ôëýòîâîãî êîðèäîðà"
extern int    Weight_Channel        = 30;          // Äëèíà "ôëýòîâîãî êîðèäîðà" â ñâå÷àõ
extern int    Trailling_Vol_Channel = 30;          // òðàë êîðèäîðà
extern string Setup_PartClose    = "======== ×àñòè÷íîå çàêðûòèå flat îðäåðîâ ========";
extern bool   PartClose_ON          = TRUE;        // ×àñòè÷íîå çàêðûòèå flat îðäåðîâ
extern string Levels                = "20/50/100"; // Óðîâíè çàêðûòèÿ. Íàïðèìåð, ïðè ïàðàìåòðàõ 10/20/5 ïåðâîå çàêðûòèå âûïîëíÿåòñÿ ïðè äîñòèæåíèè îðäåðîì ïðèáûëè â 10 ïóíêòîâ, çàòåì åùå ÷åðåç 20 ïóíêòîâ è åùå ÷åðåç 5 ïóíêòîâ.
extern int    DinamicLevels         = 1;           // Óðîâíè çàêðûòèÿ óñòàíàâëèâàþòñÿ äèíàìè÷åñêè îò Trailling_Vol_Channel, åñëè DinamicLevels > 0
// 1:         1-ûé Trailling_Vol_Channel / 2;     2-îé Trailling_Vol_Channel;         3-èé Trailling_Vol_Channel * 2
// 2:         1-ûé Trailling_Vol_Channel;         2-îé Trailling_Vol_Channel * 2;     3-èé Trailling_Vol_Channel * 3
// 3:         1-ûé Trailling_Vol_Channel * 0.618; 2-îé Trailling_Vol_Channel * 1.236; 3-èé Trailling_Vol_Channel * 2
extern string Percents              = "40/20/20";  // Ïðîöåíò çàêðûòèÿ (÷åðåç ðàçäåëèòåëü "/") äëÿ ñîîòâåòñòâóþùåãî óðîâíÿ. Çäåñü îòñ÷åò èäåò îò ëîòà ïåðâîãî îðäåðà. Åñëè èñõîäíûé îðäåð îòêðûò ñ ëîòîì 1.0 ëîò, çàêðûâàåòñÿ 50% - 0.5, çàòåì 25% îò 1.0 - 0.3 è íàêîíåö 0.2
extern string Setup_compStrategy = "============= Compensation STRATEGY =============";
extern bool   Send_comp_ON          = TRUE;        // Îòêðûâàåì êîìïåíñàòîðíûå (âìåñòå ñ base èëè flat) îðäåðà
extern double K_comp_lot            = 2.0;         // Êîýôôèöèåíò óâåëè÷èâàþùåãîñÿ ëîòà äëÿ êîìïåíñàòîðíîãî îðäåðà
extern int    Comp_Range            = 200;         // Ìèí. ðàññòîÿíèå â ïï. îò 1-ãî îðäåðà äî íîâîãî ýêñòðåìóìà
extern string Setup_Services     = "==================== SERVICES ===================";
extern bool   PrintCom              = TRUE;        // Ïå÷àòàòü êîììåíòàðèé.
extern bool   Dinamic_Trail_ON      = TRUE;        // Ðàçìåð òðàëà îïðåäåëÿåì ïî MAX ðàçìåðó ñâå÷è ïîñëåäíèõ Counted_Bars áàðîâ
extern int    Counted_Bars          = 5;           // Êîëè÷åñòâî ïîñëåäíèõ ñâå÷åé äëÿ îïðåäåëåíèÿ âåëè÷èíû Trailling
extern int    Slippage              = 2;           // Äîïóñòèìîå îòêëîíåíèå îò çàïðîøåííîé öåíû
extern int    CloseTime             = 5;           // Êîëè÷åñòâî äíåé æèçíè ëîññîâîãî îðäåðà
extern bool   SoundAlert            = FALSE;       // Çâóê
extern string Setup_Lots         = "========= Ïàðàìåòðû ìîäóëÿ ðàñ÷¸òà ëîòà =========";
extern bool   UseMM                 = FALSE;       // Èñïîëüçîâàòü ðàñøèðÿþùèéñÿ ëîò
extern string Setup_LotsWayChoice   = "LotsWayChoice: 0 - ôèêñèð.; 1 - % îò MeansType; 2 - ôðàêöèîííî-ïðîïîðö.; 3 - ôðàêöèîííî-ôèêñèð.";
extern int    LotsWayChoice         = 1;           // Ñïîñîá âûáîðà ðàáî÷åãî ëîòà:
extern string Setup_MeansType       = "MeansType: 1 - Balance; 2 - Equity; 3 - FreeMargin; 4 - RiskDepo";
extern int    MeansType             = 3;           // Òèï ñðåäñòâ èñïîëüçóåìûõ ïðè ðàñ÷åòå ðàçìåðà ëîòà:
extern double Order_Lots            = 0.3;         // Ôèêñèðîâàííûé ðàçìåð ëîòà
extern int    LotsPercent           = 3;           // Ïðîöåíò îò äåïîçèòà
extern int    LotsDeltaDepo         = 500;         // Êîýôôèöèåíò ïðèðàùåíèÿ äåïîçèòà
extern int    LotsDepoForOne        = 500;         // Ðàçìåð äåïîçèòà äëÿ îäíîãî ìèíèëîòà
extern int    LotsMax               = 1000;        // Ìàêñèìàëüíîå êîëè÷åñòâî ìèíèëîòîâ
extern double MinLot                = 0.1;         // Ìèíèìàëüíûé ëîò ðûíî÷íîãî îðäåðà
extern double MaxLot                = 2.0;         // Ìàêñèìàëüíûé ëîò ðûíî÷íîãî îðäåðà 
extern double RiskDepo              = 2000.0;      // Ðàçìåð Depo â âàëþòå äåïîçèòà, íà êîòîðûé èãðàåì
extern int    StopMarginPercent     = 50;          // Ïðîöåíò ñâîáîäíîé ìàðæè îò Áàëàíñà ïðè êîòîðîì íîâûå îðäåðà íå âûñòàâëÿþòñÿ
extern int    RiskDepoPercent       = 30;          // Ïðè êàêîì ëîññå îò Depo (â ïðîöåíòàõ) çàêðûâàþòñÿ âñå îðäåðà
extern string Setup_Table        = "=============== Ïàðàìåòðû òàáëèöû ===============";
extern bool   DrawObject_ON         = FALSE;       // Ðèñîâàòü ëè íà ãðàôèêå îáúåêòû (äëÿ òåñòèðîâàíèÿ è îïòèìèçàöèè íè ê ÷åìó)
extern color  Base_color            = Lime;        // Îñíîâíîé öâåò òàáëèöû
extern color  ADD_color             = Gold;        // Äîïîëíèòåëüíûé öâåò òàáëèöû
extern color  Profit_color          = Blue;        // Öâåò ïîëîæèòåëüíîé ñòàòèñòèêè
extern color  LOSS_color            = Red;         // Öâåò îòðèöàòåëüíîé ñòàòèñòèêè
extern color  Time_color            = Aqua;        // Öâåò îòîáðàæåíèÿ âðåìåíè ñîáûòèÿ
extern string Font_Table            = "Calibri";   // Øðèôò òàáëèöû
extern string Font_Time             = "Calibri";   // Øðèôò îòîáðàæåíèÿ âðåìåíè ñîáûòèé
extern string WorkSheduller      = "============== Ðàáîòà ïî ðàñïèñàíèþ =============";
extern bool   TimeControl           = TRUE;
extern int    Open_HourTrade        = 2;           // Íà÷àëî ðàáîòû
extern int    Close_HourTrade       = 16;          // Êîíåö ðàáîòû
extern int    AllCloseHour          = 0;           // Âî ñêîëüêî êàæäûé äåíü çàêðûâàåì âñå îðäåðà (åñëè AllCloseHour > 0)
//IIIIIIIIIIIIIIIIIII======Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà======IIIIIIIIIIIIIIIIIIIIII+
double   gd_HIGH, gd_LOW, gd_flat_MAX, gd_flat_MIN, gda_Pribul[3], gd_MIN_Range, 
         gd_MAX_flat_Range = 0, gd_Trail, gd_Trail_ch, gda_otkat[2], gd_MinSTOP,
         gd_flat_Channel = 0, gd_MaxLOSS, gd_Profit, gd_Point, gd_Channel_base,
         gd_Comp_Range, gd_Profit_MIN, gd_min_SL, gda_Price[2];
int      gi_MyOrders, gi_Ticket, gi_Decimal = 1, gi_Digits, gi_dig, gi_counted_bars,
         gi_HistoryTotal = 0, gi_min = 45, cur_MG = 0, gi_chart_Period,
         gia_Periods[] = {1,5,15,30,60,240,1440,10080,43200}, gi_Bar_High, gi_Bar_Low,
         gia_HistoryOrders[3], gia_MG[3], gia_Levels[], gia_Percents[];
string   gs_trade, gs_sign, gsa_NameCom[] = {"base","flat","add"}, gs_Symbol,
         gs_NameGV, gs_fName, gs_ComError = "";
bool     gb_flat = false, gba_Send[3], RealTrade = true, gba_IsLine[2],
         gb_moove_UP = False, gb_moove_DW = False;
color    gc_base_BUY = Blue,         // öâåò BUY base-îðäåðîâ
         gc_base_SELL = Red,         // öâåò SELL base-îðäåðîâ
         gc_add_BUY = LightSeaGreen, // öâåò BUY add-îðäåðîâ
         gc_add_SELL = DarkOrchid,   // öâåò SELL add-îðäåðîâ
         gc_flat_BUY = Aqua,         // öâåò BUY flat-îðäåðîâ
         gc_flat_SELL = Magenta,     // öâåò SELL flat-îðäåðîâ
         gc_modify = Yellow,         // öâåò ìîäèôèöèðóåìîãî îðäåðà
         gc_high, gc_low;
datetime NewBar, gdt_curTime, dta_CommentTime[13];
//IIIIIIIIIIIIIIIIIII==========Ïîäêëþ÷åííûå áèáëèîòåêè==========IIIIIIIIIIIIIIIIIIIIII+
#import "kernel32.dll"
void GetLocalTime (int& TimeArray[]);
int  GetTimeZoneInformation (int& TZInfoArray[]);
#import
extern string SETUP_VirtualTrade = "============= Setup Virtual Trade =============";
extern bool   VirtualOrders_ON      = TRUE;             // Âêëþ÷åíèå îòêðûòèÿ îðäåðîâ ïî ëèíèÿì íà ãðàôèêå
extern int    Variant_Send          = 0;
// 0 - ïðè ïåðåñå÷åíèè óðîâíÿ - îòêðûâàåì ïî òåêóùåé öåíå îðäåð ïî íàçâàíèþ ëèíèè
// 1 - ïðè ïåðåñå÷åíèè óðîâíÿ: STOP-îðäåðà îòêðûâàåì ïî òåêóùåé öåíå, LIMIT îòêðûâàåì ïîñëå òîãî, êàê öåíà ðàçâåðí¸òñÿ è âûéäåò çà ïðåäåëû "âèäèìîñòè" óðîâíÿ (OpenPrice+-Reliable_Area)
extern bool   TrailPrice_ON         = TRUE;             // Òðàëèòü PriceOpen çà öåíîé
extern bool   DeleteInActiveLine    = TRUE;             // Óäàëåíèå "îòðàáîòàííîé" ëèíèè
extern int    Reliable_Area         = 20;               // Çîíà â ïï. (äëÿ 4-¸õ çíàêîâ) çà ïðåäåëàõ êîòîðîé (ïîñëå ïåðåñå÷åíèÿ) äîëæíà âûéòè öåíà, ÷òîáû ñîâåòíèê îòêðûë îðäåð - ðàçìåð "âèäèìîñòè" óðîâíÿ
extern string Name_BUY_Line         = "OpenPrice_BUY";  // Èìÿ ëèíèè äëÿ îðäåðà BUY
extern string Name_SELL_Line        = "OpenPrice_SELL"; // Èìÿ ëèíèè äëÿ îðäåðà SELL
//IIIIIIIIIIIIIIIIIII========Ãëîáàëüíûå ïåðåìåííûå ìîäóëÿ=======IIIIIIIIIIIIIIIIIIIIII+
double   gd_area, gda_SendLevel[4], gd_Value_draw, gda_TimeOfLine[2];
int      cur_Line, pre_Type, gia_Line[] = {0,1}, Variant_Line = 0;
string   gs_pre_Name = "", gs_Info, gsa_Name_Line[2], gsa_Comment[5],
         gsa_Name_ORD[] = {"BUY","SELL"};
bool     gb_NewLine = true, gb_Virtual_Trade, gb_InfoPrint = false,
         gb_Pause = false, gb_Control = TRUE;
color    gca_color[] = {Blue,Red,Blue,Red,DeepSkyBlue,Magenta}, gc_color;
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  Custom expert initialization function                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int init()
{
    int    li_size, err = GetLastError();
    string lsa_txt[2], tmpArr[];
//----
    gs_Symbol = Symbol();
    gi_Digits = MarketInfo (gs_Symbol, MODE_DIGITS);
    gd_Point = MarketInfo (gs_Symbol, MODE_POINT);
    gi_dig = LotDecimal();
    gia_MG[0] = MG;
    gia_MG[1] = MG + 1;
    gia_MG[2] = MG + 2;
    gba_Send[0] = Send_base_ON;
    gba_Send[1] = Send_comp_ON;
    gba_Send[2] = Send_flat_ON;
    gs_trade = "Ïðîâåä¸ííûå îïåðàöèè îòñòóòñòâóþò !!!";
    gs_fName = "init()";
    //---- Îïðåäåëÿåì çíà÷åíèå âàëþòû äåïîçèòà (äëÿ îòîáðàæåíèÿ ñòàòèñòèêè)
    gs_sign = "RUB";
    if (AccountCurrency() == "USD") {gs_sign = "$";}
    if (AccountCurrency() == "EUR") {gs_sign = "ˆ";}
    //---- Ó÷èòûâàåì ðàáîòó 5-òè çíàêà
    if (gi_Digits == 3 || gi_Digits == 5)
    {gi_Decimal = 10;}
    gd_MIN_Range = MIN_Range * gi_Decimal * gd_Point;
    gd_MAX_flat_Range = MAX_flat_Range * gi_Decimal * gd_Point;
    gd_Trail = Trailling_Volume * gi_Decimal * gd_Point;
    gd_Trail_ch = Trailling_Vol_Channel * gi_Decimal * gd_Point;
    gd_Profit_MIN = Profit_MIN * gi_Decimal * gd_Point;
    gd_Comp_Range = Comp_Range * gi_Decimal * gd_Point;
    gd_min_SL = MIN_StopLoss * gi_Decimal * gd_Point;
    //Profit_MIN *= gi_Decimal;
    MIN_Range *= gi_Decimal;
    Comp_Range *= gi_Decimal;
    MAX_flat_Range *= gi_Decimal;
    //---- Îïðåäåëÿåì íà÷àëüíûå Extremums
    gi_MyOrders = MyPositions (gia_MG);
    if (gi_MyOrders == 0)
    {
        gd_HIGH = 0;
        gd_LOW = 0;
        fGet_HIGH (gd_MIN_Range);
        fGet_LOW (gd_MIN_Range);
        //---- Îïðåäåëÿåì øèðèíó ïîëó÷åííîãî êàíàëà
        gd_Channel_base = gd_HIGH - gd_LOW;
    }
    gs_NameGV = "Extremums&Channel";
    if (IsTesting())
    {gs_NameGV = gs_NameGV + "_t";}
    if (IsDemo())
    {gs_NameGV = gs_NameGV + "_d";}
    //---- Ïîäãîòîâêà êîìïîíåíòîâ ñèñòåìû PartClose
    fSplitStrToStr (Levels, tmpArr, "/");
    li_size = ArraySize (tmpArr);
    ArrayResize (gia_Levels, li_size);
    for (int li_int = 0; li_int < li_size; li_int++)
    {gia_Levels[li_int] = StrToInteger (tmpArr[li_int]) * gi_Decimal;}
    lsa_txt[0] = "Çàêðûâàåì îðäåðà ïî ÷àñòÿì â ";
    lsa_txt[1] = "ïðè äîñòèæåíèè îðäåðîì ïðîôèòà â ";
    fSplitStrToStr (Percents, tmpArr, "/");
    ArrayResize (gia_Percents, li_size);
    for (li_int = 0; li_int < li_size; li_int++)
    {
        gia_Percents[li_int] = StrToInteger (tmpArr[li_int]);
        lsa_txt[0] = StringConcatenate (lsa_txt[0], gia_Percents[li_int], IIFs ((li_int == li_size - 1), " ", ", "));
        lsa_txt[1] = StringConcatenate (lsa_txt[1], gia_Levels[li_int], IIFs ((li_int == li_size - 1), " ïï.", ", "));
    }
    lsa_txt[0] = StringConcatenate (lsa_txt[0], " ïðîöåíòàõ îò ëîòà ", lsa_txt[1]);
    Print (lsa_txt[0]);
    //---- Èäåíòèôèöèðóåì ñòàòóñ ðàáîòû ñîâåòíèêà
    if (IsTesting() || IsOptimization())
    {
        RealTrade = False;
        //---- Îòêëþ÷àåì íå èñïîëüçóåìûå ôóíêöèè ïðè òåñòèðîâàíèè è îïòèìèçàöèè
        if (IsOptimization())
        {
            DrawObject_ON = false;
            PrintCom = false;
        }
        SoundAlert = false;
        //---- Ïîä÷èùàåì GV-ïåðåìåííûå
        GlobalVariablesDeleteAll (gs_NameGV);
    }
    if (!IsOptimization())
    {
        //---- Îðãàíèçóåì ïîäãîòîâêó êîììåíòàðèåâ
        if (PrintCom || DrawObject_ON)
        {gb_InfoPrint = true;}
    }
    //---- Îïðåäåëÿåì èíäåêñ ïåðèîäà ÷àðòà
    gi_chart_Period = fGetNumPeriods (gia_Periods, Period());
    if (VirtualOrders_ON)
    {
        fInitVirtualTrade();
        ArrayInitialize (gba_IsLine, 0);
    }
    //---- Åñëè çàäàíî ÷àñòè÷íîå çàêðûòèå îðäåðîâ - îïðåäåëÿåì ìèíèìàëüíûé ðàçìåð ëîòà
    if (Send_flat_ON && PartClose_ON)
    {Order_Lots = MathMax (Order_Lots, 0.3);}
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, "init()");
//----
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  Custor expert deinitialization function                          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int deinit()
{
//----
    //---- Ðèñóåì íà ãðàôèêå êîììåíòû
    if (DrawObject_ON)
    {
        //---- Ïîäñ÷èòûâàåì èòîãè ðàáîòû
        fCalculatePribul (gs_Symbol, gda_Pribul, gia_HistoryOrders, gia_MG);
        fInfoDraw (5, 15);
    }
    if (!RealTrade)
    {GlobalVariablesDeleteAll (gs_NameGV);}
//----
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|               Custom expert iteration function                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int start()
{
    //---- Ïî âûõîäíûì "íå ëîõìàòèì áàáóøêó"
    if (!ServerWork())
    {return (0);}
    //---- Äëÿ èçëèøíåé îïòèìèçàöèè óáèðàåì íå ñóùåñòâåííûå âàðèàíòû
    if (IsOptimization())
    {
        if (MIN_Range <= MAX_flat_Range * 2 || Profit_MIN * 2 < MIN_StopLoss)
        {return (0);}
    }
    //---- Îïðåäåëÿåì ïåðèîäè÷íîñòü ðàáîòû ñîâåòíèêà
    if (NewBarInPeriod >= 0)
    {
        if (NewBar == iTime (gs_Symbol, NewBarInPeriod, 0))
        {return (0);}
        NewBar = iTime (gs_Symbol, NewBarInPeriod, 0);
    }
//----
    int li_add_Ticket = 0, err = GetLastError();
    string ls_txt = "";
    static bool lb_new_first = false;
//----
    //---- Åñëè ëîññ ïðåâûñèë äîïóñòèìîå çíà÷åíèå îò áàëàíñà, çàêðûâàåì âñå îðäåðà
    if (fRiskPercentControl (ls_txt, AccountBalance(), AccountProfit()))
    {
        if (PrintCom) Print (ls_txt);
        CloseOrderAll();
    }
    //---- Ïîëó÷àåì öåíû, ñ êîòîðûìè áóäåò ðàáîòàòü ñîâåòíèê
    fGetTradePrice (Variant_TradePrice, gda_Price);
    //---- Ïîëó÷àåì äàííûå î íàøèõ îðäåðàõ
    gi_MyOrders = -1;
    while (gi_MyOrders < 0)
    {
        gi_MyOrders = MyPositions (gia_MG);
        if (!IsExpertEnabled() || IsStopped())
        {break;}
    }
    //---- Åñëè åñòü îòêðûòûå ñäåëêè, ðàáîòàåò òðàë
    if (gi_MyOrders > 0)
    {
        //---- Ðàññ÷èòûâàåì äèíàìè÷åñêèé òðàë (åñëè ðàçðåøåíî)
        fGetDinamicTrail (Counted_Bars, gd_Trail, gd_Trail_ch, gia_Periods[gi_chart_Period+2]);
        fTrailling (gia_MG);
        lb_new_first = true;
    }
    else
    {
        //---- Ïðèâîäèì çíà÷èìûå ïåðåìåííûå â ïåðâîíà÷àëüíîå ñîñòîÿíèå
        if (lb_new_first)
        {
            fGet_HIGH (gd_MIN_Range);
            fGet_LOW (gd_MIN_Range);
            lb_new_first = false;
            gb_flat = false;
        }
    }
    //---- Îðãàíèçîâûâàåì ðàáîòó ïî âðåìåíè
    if (IsTradeTime (Open_HourTrade, Close_HourTrade))
    {
        //---- Åñëè îðäåðîâ íåò
        if (gi_MyOrders == 0)
        {
            gi_Ticket = 0;
            if (Send_base_ON                     // ðàçðåøåíî îòêðûâàòüñÿ
            && (gd_HIGH != 0 && gd_LOW != 0)     // íàéäåíû HIGH è LOW
            && !gb_flat)                         // íå ñôîðìèðîâàí "ôëýòîâûé êîðèäîð"
            {
                gs_fName = "start()";
                //---- Îïðåäåëÿåì øèðèíó ïîëó÷åííîãî êàíàëà
                gd_Channel_base = gd_HIGH - gd_LOW;
                //---- Ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ îñíîâíîãî îðäåðà
                gi_Ticket = fBase_Strategy (gia_MG[0]);
                if (gi_Ticket > 0 && !IsOptimization())
                {
                    if (OrderSelect (gi_Ticket, SELECT_BY_TICKET)) {OrderPrint();}
                    gs_trade = fPrepareComment (StringConcatenate ("Îòêðûëè base-îðäåð[", gi_Ticket, "] ", GetNameOP (OrderType()), " (", OrderMagicNumber(), ") !!!"), gb_InfoPrint);
                    if (PrintCom) Print (gs_trade, "[", OrdersTotal(), "/", gi_MyOrders, "]");
                }
            }
            //---- Åñëè îñíîâíàÿ ñäåëêà íå îòêðûòà
            if (Send_flat_ON && gi_Ticket <= 0)
            {
                //---- Ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ flat-îðäåðà
                gi_Ticket = fChannel_Strategy (gia_MG[1]);
                if (gi_Ticket > 0)
                {
                    gb_flat = false;
                    if (!IsOptimization())
                    {
                        if (OrderSelect (gi_Ticket, SELECT_BY_TICKET)) {OrderPrint();}
                        gs_trade = fPrepareComment (StringConcatenate ("Îòêðûëè flat-îðäåð[", gi_Ticket, "] ", GetNameOP (OrderType()), " (", OrderMagicNumber(), ") !!!"), gb_InfoPrint);
                        if (PrintCom) Print (gs_trade, "[", OrdersTotal(), "/", gi_MyOrders, "]");
                    }
                }
            }
        }
        //---- Îòêðûâàåì êîìïåíñàòîðíûé îðäåð (åñëè çàäàíî)
        if (gi_MyOrders == 1 && Send_comp_ON && (Send_base_ON || Send_flat_ON))
        {
            if (!OrderSelect (gi_Ticket, SELECT_BY_TICKET))
            {return (0);}
            //---- Åñëè îñíîâíàÿ ñäåëêà âûõîäèò â ìèíóñ, îòêðûâàåì êîìïåíñàòîðíóþ ñäåëêó
            if (OrderProfit() + OrderCommission() + OrderSwap() < 0)
            {
                gs_fName = "start()";
                //---- Íàõîäèì íîâûå ýêñòðåìóìû
                if (OrderType() == OP_BUY)
                {
                    if (fGet_LOW (MathMin (gd_MIN_Range, gd_Comp_Range), gi_Ticket) == 0)
                    {return (0);}
                }
                if (OrderType() == OP_SELL)
                {
                    if (fGet_HIGH (MathMin (gd_MIN_Range, gd_Comp_Range), gi_Ticket) == 0)
                    {return (0);}
                }
                //---- Îïðåäåëÿåì øèðèíó ïîëó÷åííîãî êàíàëà
                gd_Channel_base = gd_HIGH - gd_LOW;
                if (!IsOptimization() && gd_Channel_base > gd_MIN_Range + gd_Comp_Range)
                {if (PrintCom) Print ("Íîâûé êàíàë äëÿ îòêðûòèÿ êîìïåíñàòîðíîãî îðäåðà ñôîðìèðîâàí = ", gd_Channel_base / gd_Point, " !!!");}
                //---- Ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ êîìïåíñàòîðíîãî îðäåðà
                li_add_Ticket = fCompensation_Strategy (gi_Ticket, gia_MG[2]);
                if (li_add_Ticket > 0)
                {
                    gb_flat = false;
                    if (!IsOptimization())
                    {
                        if (OrderSelect (li_add_Ticket, SELECT_BY_TICKET)) {OrderPrint();}
                        gs_trade = fPrepareComment (StringConcatenate ("Îòêðûëè add-îðäåð[", li_add_Ticket, "] ", GetNameOP (OrderType()), " (", OrderMagicNumber(), ") !!!"), gb_InfoPrint);
                        if (PrintCom) Print (gs_trade, "[", OrdersTotal(), "]");
                    }
                }
            }
        }
    }
    fVirtualTrade (gda_Price, cur_MG, RealTrade);
    //---- Ðàáîòàåì ñî ñòàòèñòèêîé
    if (DrawObject_ON)
    {
        //---- Ïîäñ÷èòûâàåì èòîãè ðàáîòû
        if (OrdersHistoryTotal() != gi_HistoryTotal)
        {
            fCalculatePribul (gs_Symbol, gda_Pribul, gia_HistoryOrders, gia_MG);
            gi_HistoryTotal = OrdersHistoryTotal();
        }
        //---- Ðèñóåì íà ãðàôèêå êîììåíòû
        fInfoDraw (5, 15);
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, "start()");
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Óíèêàëüíûå ôóíêöèè                                                        |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Íàõîäèì HIGH ýêñòðåìóì                                                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_HIGH (double fd_Distance, int fi_NewTicket = 0)
{
    int    i, li_Bar, li_Day, cnt, li_pos, err = GetLastError();
    double lda_PriceBar[10], ld_Extrem;
    string ls_High, ls_Name;
    static int li_preTicket, li_cnt = 0;
    bool   lb_break = false;
//----
    //---- Îïðåäåëÿåì HIGH äëÿ êàæäîãî îðäåðà â îòäåëüíîñòè
    if (li_preTicket == fi_NewTicket && fi_NewTicket != 0)
    {return (0);}
    //---- Îïðåäåëÿåì êîëè÷åñòâî ïðîñ÷èòûâàåìûõ áàð çà ïîñëåäíèõ 3-îå ñóòîê, íî íå ìåíüøå 100 (áàð)
    li_Day = 3;
    if (TimeDayOfWeek(Time[0]) == 1) {li_Day = 5;}
    if (TimeDayOfWeek(Time[0]) == 2) {li_Day = 4;}
    gi_counted_bars = iBarShift (gs_Symbol, Period(), (Time[0] - 1440 * 60 * li_Day));
    gb_moove_UP = false;
    //---- Èòåðàöèÿ gi_counted_bars ñâå÷åê, ñðåäè íèõ íóæíî íàéòè "¸ëî÷êó" (ïèêîâàÿ ñâå÷êà + ïî 5 ñâå÷åê ïî áîêàì)
    for (i = 5; i <= gi_counted_bars; i++)
    {
        if (Close[i] > Open[i]) {ld_Extrem = Close[i];} else {ld_Extrem = Open[i];}
        if (ld_Extrem > gda_Price[1] && ld_Extrem - fd_Distance < gda_Price[1]       // "çîíà ñòàðòà" âíèç
        //---- Ýòî äîëæíà áûòü âåðøèíà ñðåäè +- Weight_Channel áàðîâ
        && ld_Extrem > iClose (gs_Symbol, Period(), iHighest (gs_Symbol, Period(), MODE_CLOSE, MathMin (i, Weight_Channel), MathMax (0, i - Weight_Channel)))
        && ld_Extrem > iOpen (gs_Symbol, Period(), iHighest (gs_Symbol, Period(), MODE_OPEN, MathMin (i, Weight_Channel), MathMax (0, i - Weight_Channel))))
        {
            cnt = 0;
            for (li_Bar = 0; li_Bar < 11; li_Bar++)
            {
                if (li_Bar == 5)
                {continue;}
                if (Close[li_Bar+i-5] > Open[li_Bar+i-5]) {lda_PriceBar[cnt] = Close[li_Bar+i-5];} else {lda_PriceBar[cnt] = Open[li_Bar+i-5];}
                cnt++;
            }
            lb_break = false;
            //---- Èùåì "¸ëî÷êó"
            for (li_Bar = 0; li_Bar < 10; li_Bar++)
            {
                if (lda_PriceBar[li_Bar] > ld_Extrem)
                {
                    lb_break = true;
                    break;
                }
            }
            if (lb_break)
            {continue;}
            gd_HIGH = ld_Extrem - 4 * gi_Decimal * gd_Point;
            //---- HIGH íå ìîæåò áûòü íèæå LOW
            if (gd_HIGH >= gd_LOW + fd_Distance)
            {
                //---- Åñëè HIGH ñòàðøå LOW > 1 ÷àñ èùåì íîâûé HIGH
                if (dta_CommentTime[1] + 3600 < dta_CommentTime[0])
                {fGet_LOW (fd_Distance);}
                else
                {continue;}
            }
            if (fd_Distance < 150 * gi_Decimal * gd_Point) {gda_otkat[0] = 0.236;} else {gda_otkat[0] = 0.118;}
            ls_High = DoubleToStr (gd_HIGH, gi_Digits);
            //---- Åñëè ìàêñèìóì îáíîâèëñÿ
            if (fCCV_S (ls_High, 0))
            {
                if (!RealTrade) {dta_CommentTime[0] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[0] = TimeCurrent();}
                if (DrawObject_ON)
                {
                    gi_Bar_High = i;
                    gc_high = Base_color;
                    if (PrintCom) Print (gs_fName, ": Íàøëè íîâûé ìàêñèìóì[", li_cnt,"] = ", ls_High);
                    DelObject ("high_add");
                    ls_Name = fNamedOBJ_cnt ("arrow_high", li_cnt);
                    SetArrow (218, Base_color, ls_Name,  Time[i], High[i] + 3 * gi_Decimal * gd_Point, 1);
                    ObjectSetText (ls_Name, TimeToStr (Time[i], TIME_DATE|TIME_MINUTES), 10);
                    SetLabel ("high", StringConcatenate ("HIGH[", li_cnt,"] :   ", ls_High), 5, 15, 10, Font_Table, 0, 0, Base_color);
                    SetLabel ("time_high",  ":  " + TimeToStr (dta_CommentTime[0], TIME_DATE|TIME_MINUTES), 270, 15, 10, Font_Time, 0, 0, Time_color);
                }
            }
            li_preTicket = fi_NewTicket;
            return (1);
        }
    }
    //---- Åñëè "¸ëî÷êà" íå íàéäåíà, íàçíà÷àåì íîâûé ìàêñèìóì
    if (i >= gi_counted_bars)
    {
        //---- Åñëè â÷åðàøíèé ìàêñèìóì íèæå öåí òåêóùåãî äíÿ, áåð¸ì ìàêñèìóì òåêóùåãî äíÿ
        if (iHigh (gs_Symbol, PERIOD_D1, 1) >= gda_Price[1]) {li_pos = 1;} else {li_pos = 0;}
        //---- Áåð¸ì HIGH ïîñëåäíèõ ñóòîê
        gd_HIGH = iHigh (gs_Symbol, PERIOD_D1, li_pos);
        //---- Íàõîäèì íîìåð áàðà ýòîãî High íà òåêóùåì ãðàôèêå
        i = iBarShift (gs_Symbol, Period(), iTime (gs_Symbol, PERIOD_D1, 1));
        gi_Bar_High = iHighest (gs_Symbol, Period(), MODE_HIGH, i, 0);
        gda_otkat[0] = 0.236;
        ls_High = DoubleToStr (gd_HIGH, gi_Digits);
        //---- Åñëè ìàêñèìóì îáíîâèëñÿ
        if (fCCV_S (ls_High, 0))
        {
            if (!RealTrade) {dta_CommentTime[0] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[0] = TimeCurrent();}
            if (DrawObject_ON)
            {
                gc_high = Blue;
                if (PrintCom) Print (gs_fName, ": Íîâûé ìàêñèìóì íå íàøëè, ÍÎ íàçíà÷èëè[", li_cnt,"] = ", ls_High);
                ls_Name = fNamedOBJ_cnt ("arrow_high", li_cnt);
                SetArrow (218, ADD_color, ls_Name,  Time[gi_Bar_High], High[gi_Bar_High] + 3 * gi_Decimal * gd_Point, 1);
                ObjectSetText (ls_Name, TimeToStr (Time[gi_Bar_High], TIME_DATE|TIME_MINUTES), 10);
                SetLabel ("high", StringConcatenate ("New HIGH[", li_cnt,"]: "), 5, 15, 10, Font_Table, 0, 0, Base_color);
                //---- Òàêîé ìàêñèìóì âûäåëÿåòñÿ äðóãèì öâåòîì
                SetLabel ("high_add", ls_High, 102, 15, 10, Font_Table, 0, 0, ADD_color);
                SetLabel ("time_high", ":  " + TimeToStr (dta_CommentTime[0], TIME_DATE|TIME_MINUTES), 270, 15, 10, Font_Time, 0, 0, Time_color);
            }
        }
        li_preTicket = fi_NewTicket;
        return (1);
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, gs_fName);
//----
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Íàõîäèì LOW ýêñòðåìóì                                                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_LOW (double fd_Distance, int fi_NewTicket = 0)
{
    int    i, cnt, li_pos, err = GetLastError();
    double lda_PriceBar[10], ld_Extrem;
    string ls_Low, ls_Name;
    static int li_preTicket, li_cnt = 0;
    bool   lb_break = false;
//----
    //---- Îïðåäåëÿåì LOW äëÿ êàæäîãî îðäåðà â îòäåëüíîñòè
    if (li_preTicket == fi_NewTicket && fi_NewTicket != 0)
    {return (0);}
    gb_moove_DW = false;
    //---- Äëÿ ìèíèìóìà - "¸ëî÷êà" ïåðåâ¸ðíóòà
    for (i = 5; i <= gi_counted_bars; i++)
    {
        if (Close[i] < Open[i]) {ld_Extrem = Close[i];} else {ld_Extrem = Open[i];}
        if (ld_Extrem < gda_Price[0] && ld_Extrem + fd_Distance > gda_Price[0]         // "çîíà ñòàðòà" ââåðõ
        //---- Ýòî äîëæíà áûòü âïàäèíà ñðåäè +- Weight_Channel áàðîâ
        && ld_Extrem < iClose (gs_Symbol, Period(), iLowest (gs_Symbol, Period(), MODE_CLOSE, MathMin (i, Weight_Channel), MathMax (0, i - Weight_Channel)))
        && ld_Extrem < iOpen (gs_Symbol, Period(), iLowest (gs_Symbol, Period(), MODE_OPEN, MathMin (i, Weight_Channel), MathMax (0, i - Weight_Channel))))
        {
            cnt = 0;
            for (int li_Bar = 0; li_Bar < 11; li_Bar++)
            {
                if (li_Bar == 5)
                {continue;}
                if (Close[li_Bar+i-5] < Open[li_Bar+i-5]) {lda_PriceBar[cnt] = Close[li_Bar+i-5];} else {lda_PriceBar[cnt] = Open[li_Bar+i-5];}
                cnt++;
            }
            lb_break = false;
            //---- Èùåì ïåðåâ¸ðíóòóþ "¸ëî÷êó"
            for (li_Bar = 0; li_Bar < 10; li_Bar++)
            {
                if (lda_PriceBar[li_Bar] < ld_Extrem)
                {
                    lb_break = true;
                    break;
                }
            }
            if (lb_break)
            {continue;}
            gd_LOW = ld_Extrem + 4 * gi_Decimal * gd_Point;
            //---- LOW íå ìîæåò áûòü âûøå HIGH
            if (gd_LOW >= gd_HIGH - fd_Distance)
            {
                //---- Åñëè HIGH ñòàðøå LOW > 1 ÷àñ èùåì íîâûé HIGH
                if (dta_CommentTime[0] + 3600 < dta_CommentTime[1])
                {fGet_HIGH (fd_Distance);}
                else
                {continue;}
            }
            if (fd_Distance < 150 * gi_Decimal * gd_Point) {gda_otkat[1] = 0.236;} else {gda_otkat[1] = 0.118;}
            ls_Low = DoubleToStr (gd_LOW, gi_Digits);
            //---- Åñëè ìèíèìóì îáíîâèëñÿ
            if (fCCV_S (ls_Low, 1))
            {
                if (!RealTrade) {dta_CommentTime[1] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[1] = TimeCurrent();}
                if (DrawObject_ON)
                {
                    gi_Bar_Low = i;
                    gc_low = Base_color;
                    if (PrintCom) Print (gs_fName, ": Íàøëè íîâûé ìèíèìóì[", li_cnt,"] = ", ls_Low);
                    DelObject ("low_add");
                    ls_Name = fNamedOBJ_cnt ("arrow_low", li_cnt);
                    SetArrow (217, Base_color, ls_Name, Time[i], Low[i] - 3 * gi_Decimal * gd_Point, 1);
                    ObjectSetText (ls_Name, TimeToStr (Time[i], TIME_DATE|TIME_MINUTES), 10);
                    SetLabel ("low", StringConcatenate ("LOW[", li_cnt,"] :   ", ls_Low), 5, 30, 10, Font_Table, 0, 0, Base_color);
                    SetLabel ("time_low",  ":  " + TimeToStr (dta_CommentTime[1], TIME_DATE|TIME_MINUTES), 270, 30, 10, Font_Time, 0, 0, Time_color);
                }
            }
            li_preTicket = fi_NewTicket;
            return (1);
        }
    }
    //----Åñëè ïåðåâåðíóòàÿ "¸ëî÷êà" íå íàéäåíà,
    if (i >= gi_counted_bars)
    {
        //---- Åñëè â÷åðàøíèé ìèíèìóì âûøå öåí òåêóùåãî äíÿ, áåð¸ì ìèíèìóì òåêóùåãî äíÿ
        if (iLow (gs_Symbol, PERIOD_D1, 1) <= gda_Price[0]) {li_pos = 1;} else {li_pos = 0;}
        //---- Áåð¸ì LOW ïîñëåäíèõ ñóòîê
        gd_LOW = iLow (gs_Symbol, PERIOD_D1, li_pos);
        //---- Íàõîäèì íîìåð áàðà ýòîãî Low íà òåêóùåì ãðàôèêå
        i = iBarShift (gs_Symbol, Period(), iTime (gs_Symbol, PERIOD_D1, 1));
        gi_Bar_Low = iLowest (gs_Symbol, Period(), MODE_LOW, i, 1);
        gda_otkat[1] = 0.236;
        ls_Low = DoubleToStr (gd_LOW, gi_Digits);
        //---- Åñëè ìèíèìóì îáíîâèëñÿ
        if (fCCV_S (ls_Low, 1))
        {
            if (!RealTrade) {dta_CommentTime[1] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[1] = TimeCurrent();}
            if (DrawObject_ON)
            {
                gc_low = Red;
                if (PrintCom) Print (gs_fName, ": Íîâûé ìèíèìóì íå íàøëè, ÍÎ íàçíà÷èëè[", li_cnt,"] = ", ls_Low);
                ls_Name = fNamedOBJ_cnt ("arrow_low", li_cnt);
                SetArrow (217, ADD_color, ls_Name, Time[gi_Bar_Low], Low[gi_Bar_Low] - 3 * gi_Decimal * gd_Point, 1);
                ObjectSetText (ls_Name, TimeToStr (Time[gi_Bar_Low], TIME_DATE|TIME_MINUTES), 10);
                SetLabel ("low", StringConcatenate ("New LOW[", li_cnt,"]: "), 5, 30, 10, Font_Table, 0, 0, Base_color);
                //---- Òàêîé ìèíèìóì âûäåëÿåòñÿ äðóãèì öâåòîì
                SetLabel ("low_add", ls_Low, 100, 30, 10, Font_Table, 0, 0, ADD_color);
                SetLabel ("time_low",  ":  " + TimeToStr (dta_CommentTime[1], TIME_DATE|TIME_MINUTES), 270, 30, 10, Font_Time, 0, 0, Time_color);
            }
        }
        li_preTicket = fi_NewTicket;
        return (1);
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, gs_fName);
//----
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Îòêðûòèå îðäåðîâ ïî îòêàòó îò ìàêñèìóìîâ                                   |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fBase_Strategy (int fi_MG)
{
    int    li_Ticket = 0, err = GetLastError();
    double ld_SL, ld_TP, ld_MIN_Range = 150 * gi_Decimal * gd_Point;
    bool   lb_Channel = (gd_Channel_base > gd_MIN_Range);
    string ls_err;
    gs_fName = "fBase_Strategy()";
    gd_MinSTOP = MarketInfo (Symbol(), MODE_STOPLEVEL) * gd_Point;
    //---- Îñíîâíàÿ ñäåëêà îòêðûâàåòñÿ åñëè íå ñôîðìèðîâàëñÿ "ôëýòîâûé êîðèäîð" è 
    if (lb_Channel)
    {
        //---- Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå âåðøèíû è æä¸ì äàëüíåéøåãî äâèæåíèÿ âíèç
        if (gd_HIGH - gd_Channel_base * gda_otkat[0] < gda_Price[0]  // íèæíÿÿ ãðàíèöà êîðèäîðà
        && gd_HIGH > gda_Price[0]                                    // âåðõíÿÿ ãðàíèöà êîðèäîðà
        && !gb_moove_UP)                                             // åù¸ çäåñü íå áûëè
        {
            gb_moove_UP = true;
            if (PrintCom) Print (gs_fName, ": Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå ìàêñèìóìà: ", DoubleToStr (gd_HIGH, gi_Digits));
        }
        if (gb_moove_UP                                              // áûëè âîçëå âåðøèíû
        && gd_HIGH - gd_Channel_base * gda_otkat[0] >= gda_Price[0]  // íåìíîæêî îòêàòèëè îò ìàêñèìóìà
        && gd_HIGH - gd_Channel_base * 0.5 < gda_Price[0])           // íî ìåíüøå, ÷åì 50 %
        {
            if (!VirtualOrders_ON)
            {
                //---- ×òîáû èçáåæàòü î÷åíü ìàëåíüêèõ òåéêîâ
                if (gd_Channel_base < ld_MIN_Range) {ld_TP = gd_LOW;} else {ld_TP = gd_LOW + gd_Channel_base * 0.382;}
                ld_TP = NormalizeDouble (MathMin (ld_TP, gda_Price[1] - MathMax (gd_Profit_MIN, gd_MinSTOP)), gi_Digits);
                ld_SL = NormalizeDouble (MathMax ((gd_HIGH + gd_Channel_base * gda_otkat[0]), gda_Price[1] + MathMax (gd_MinSTOP, gd_min_SL)), gi_Digits);
                RefreshRates();
                li_Ticket = OrderSend (gs_Symbol, OP_SELL, GetSizeLot (Order_Lots), Bid, Slippage, ld_SL, ld_TP, "sell_base", fi_MG, 0, gc_base_SELL);
                if (IsOptimization())
                {return (li_Ticket);}
                if (li_Ticket < 0)
                {
                    ls_err = "mistake.wav";
                    gs_ComError = fPrepareComment (StringConcatenate (gs_fName, ": Îøèáêà ïðè îòêðûòèè SELL base-îðäåðà: ", ErrorDescription (GetLastError())), gb_InfoPrint);
                    if (PrintCom) Print (gs_ComError);
                }
                else
                {
                    ls_err = "yes.wav";
                    if (PrintCom) Print (gs_fName, ": TP = ", (Ask - ld_TP) / gd_Point, "; SL = ", (ld_SL - Ask) / gd_Point);
                }
            }
            //---- Îðãàíèçóåì âèðòóàëüíóþ ðàáîòó
            else
            {
                //---- Óäàëÿåì "íå ñâîè" ëèíèè
                //if (cur_MG != fi_MG)
                //{fDeleteHLine();}
                if (!gba_IsLine[1])
                {
                    gba_IsLine[1] = true;
                    cur_MG = fi_MG;
                    //DelObject (gsa_Name_Line[0]);
                    fDeleteHLine();
                    if (fCreat_OBJ (gsa_Name_Line[1], OBJ_HLINE, 0, "", 0, Time[0], gda_Price[0] + gd_area, false, Red))
                    {
                        gs_trade = fPrepareComment (StringConcatenate ("Base: Ñîçäàëè ëèíèþ ", gsa_Name_Line[1], " !!!"), gb_InfoPrint);
                        if (PrintCom) Print (gs_trade);
                    }
                }
            }
        }
    }
    else
    {gb_moove_UP = false;}
    //----  ïðîòèâíîì ñëó÷àå - ñäåëêà íå îòêðûâàåòñÿ, è âûïîëíÿåòñÿ ïîèñê íîâîãî ìàêñèìóìà
    if (((gd_HIGH >= gda_Price[0] && gd_Channel_base <= gd_MIN_Range) || gd_HIGH < gda_Price[0]) && !gb_flat)
    {fGet_HIGH (gd_MIN_Range);}
    if (lb_Channel)
    {
        //---- Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå âïàäèíû è æä¸ì äàëüíåéøåãî äâèæåíèÿ ââåðõ
        if (gd_LOW + gd_Channel_base * gda_otkat[1] > gda_Price[1]  // âåðõíÿÿ ãðàíèöà êîðèäîðà
        && gd_LOW < gda_Price[1]                                    // íèæíÿÿ ãðàíèöà êîðèäîðà
        && !gb_moove_DW)                                            // åù¸ çäåñü íå áûëè
        {
            gb_moove_DW = true;
            if (PrintCom) Print (gs_fName, ": Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå ìèíèìóìà: ", DoubleToStr (gd_LOW, gi_Digits));
        }
        if (gb_moove_DW                                             // áûëè âîçëå âïàäèíû
        && gd_LOW + gd_Channel_base * gda_otkat[1] <= gda_Price[1]  // Íåìíîæêî îòêàòèëè îò ìèíèìóìà
        && gd_LOW + gd_Channel_base * 0.5 > gda_Price[1])           // íî ìåíüøå, ÷åì 50 %
        {
            if (!VirtualOrders_ON)
            {
                //---- ×òîáû èçáåæàòü î÷åíü ìàëåíüêèõ òåéêîâ
                if (gd_Channel_base < ld_MIN_Range) {ld_TP = gd_HIGH;} else {ld_TP = gd_HIGH - gd_Channel_base * 0.382;}
                ld_TP = NormalizeDouble (MathMax (ld_TP, gda_Price[0] + MathMax (gd_Profit_MIN, gd_MinSTOP)), gi_Digits);
                ld_SL = NormalizeDouble (MathMin ((gd_LOW - gd_Channel_base * gda_otkat[1]), gda_Price[0] - MathMax (gd_MinSTOP, gd_min_SL)), gi_Digits);
                RefreshRates();
                li_Ticket = OrderSend (gs_Symbol, OP_BUY, GetSizeLot (Order_Lots), Ask, Slippage, ld_SL, ld_TP, "buy_base", fi_MG, 0, gc_base_BUY);
                if (IsOptimization())
                {return (li_Ticket);}
                if (li_Ticket < 0)
                {
                    ls_err = "mistake.wav";
                    gs_ComError = fPrepareComment (StringConcatenate (gs_fName, ": Îøèáêà ïðè îòêðûòèè SELL base-îðäåðà: ", ErrorDescription (GetLastError())), gb_InfoPrint);
                    if (PrintCom) Print (gs_ComError);
                }
                else
                {
                    ls_err = "yes.wav";
                    if (PrintCom) Print (gs_fName, ": TP = ", (ld_TP - Bid) / gd_Point, "; SL = ", (Bid - ld_SL) / gd_Point);
                }
            }
            //---- Îðãàíèçóåì âèðòóàëüíóþ ðàáîòó
            else
            {
                //---- Óäàëÿåì "íå ñâîè" ëèíèè
                //if (cur_MG != fi_MG)
                //{fDeleteHLine();}
                if (!gba_IsLine[0])
                {
                    gba_IsLine[0] = true;
                    cur_MG = fi_MG;
                    //DelObject (gsa_Name_Line[1]);
                    fDeleteHLine();
                    if (fCreat_OBJ (gsa_Name_Line[0], OBJ_HLINE, 0, "", 0, Time[0], gda_Price[1] - gd_area, false, Blue))
                    {
                        gs_trade = fPrepareComment (StringConcatenate ("Base: Ñîçäàëè ëèíèþ ", gsa_Name_Line[0], " !!!"), gb_InfoPrint);
                        if (PrintCom) Print (gs_trade);
                    }
                }
            }
        }
    }
    else
    {gb_moove_DW = false;}
    //---- Èëè íîâîãî ìèíèìóìà, ñîîòâåòñòâåííî
    if (((gd_LOW <= gda_Price[1] && gd_Channel_base <= gd_MIN_Range) || gd_LOW > gda_Price[1]) && !gb_flat)
    {fGet_LOW (gd_MIN_Range);}
    //---- Ïîäà¸ì çâóê
    if (SoundAlert) {PlaySound (ls_err);}
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, gs_fName);
    return (li_Ticket);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Îòêðûòèå êîìïåíñàòîðíûõ îðäåðîâ ïî ëîññó (Ìàðòèí)                          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fCompensation_Strategy (int fi_Ticket, int fi_MG)
{
    int    li_Type, li_cmd, li_Ticket = 0, err = GetLastError();
    double ld_SL, ld_TP, ld_compensation, ld_Price;
    bool   lb_modify = false;
//----
    gs_fName = "fCompensation_Strategy()";
    gd_MinSTOP = MarketInfo (Symbol(), MODE_STOPLEVEL) * gd_Point;
    if (!OrderSelect (fi_Ticket, SELECT_BY_TICKET))
    {return (0);}
    li_Type = OrderType();
    if (li_Type == OP_SELL)
    {
        //---- Âòîðàÿ (êîìïåíñàòîðíàÿ) ñäåëêà îòêðûâàåòñÿ, åñëè íàéäåí íîâûé ìàêñèìóì 
        //---- Êîòîðûé äîëæåí áûòü âûøå OpenPrice íà Comp_Range
        if ((gd_HIGH > OrderOpenPrice()) + MathMax (gd_MIN_Range, gd_Comp_Range))
        {
            //---- Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå âåðøèíû è æä¸ì äàëüíåéøåãî äâèæåíèÿ âíèç
            if (gd_HIGH - gd_Channel_base * gda_otkat[0] < gda_Price[0] // íèæíÿÿ ãðàíèöà êîðèäîðà
            && gd_HIGH > gda_Price[0]                                   // âåðõíÿÿ ãðàíèöà êîðèäîðà
            && !gb_moove_UP)                                            // åù¸ çäåñü íå áûëè
            {
                gb_moove_UP = true;
                if (PrintCom) Print (gs_fName, ": Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå ìàêñèìóìà: ", DoubleToStr (gd_HIGH, gi_Digits));
            }
            if (gb_moove_UP                                                              // áûëè ó âåðøèíû
            && gd_HIGH - MathMin (gd_MIN_Range, gd_Comp_Range) >= gda_Price[0]           // îòêàòèëè
            && OrderOpenPrice() + MathMin (gd_MIN_Range, gd_Comp_Range) < gda_Price[0])  // ðàññòîÿíèå ì\ó îðäåðàìè íå ìåíåå gd_MIN_Range
            {
                //---- Ïðè ýòîì òåéê-ïðîôèò âòîðîé ñäåëêè äîëæåí êîìïåíñèðîâàòü ñòîï-ëîññ ïåðâîé.
                //---- Êîìïåíñàòîðíàÿ ñäåëêà îòêðûâàåòñÿ ïî óâåëè÷åííîìó îáúåìó â òîì æå íàïðàâëåíèè.
                //---- Òàêèì îáðàçîì, îáå ñäåëêè áóäóò çàêðûòû â òîò ìîìåíò, êîãäà ðûíîê ðåàëèçóåò êîððåêöèþ îò âòîðîãî (êîìïåíñàòîðíîãî) ìàêñèìóìà
                ld_compensation = (gda_Price[1] - OrderOpenPrice()) * 0.382;
                ld_TP = NormalizeDouble (gda_Price[1] - MathMax (ld_compensation, MathMax (gd_Profit_MIN, gd_MinSTOP)), gi_Digits);
                ld_SL = NormalizeDouble (MathMax ((gd_HIGH + gd_Channel_base * gda_otkat[0]), gda_Price[1] + MathMax (gd_MinSTOP, gd_min_SL)), gi_Digits);
                RefreshRates();
                li_Ticket = OrderSend (gs_Symbol, OP_SELL, fLotsNormalize (GetSizeLot (Order_Lots) * K_comp_lot), Bid, Slippage, ld_SL, ld_TP, "sell_add", fi_MG, 0, gc_add_SELL);
            }
        }
    }
    //---- Åñëè öåíà ïîäûìàåòñÿ âûøå HIGH - èùåì íîâûé ìàêñèìóì
    if (gd_HIGH < gda_Price[0])
    {
        gb_moove_UP = false;
        fGet_HIGH (gd_MIN_Range, fi_Ticket);
    }
    if (li_Type == OP_BUY) 
    {
        if (gd_LOW < OrderOpenPrice() - MathMax (gd_MIN_Range, gd_Comp_Range))
        {
            //---- Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå âïàäèíû è æä¸ì äàëüíåéøåãî äâèæåíèÿ ââåðõ
            if (gd_LOW + gd_Channel_base * gda_otkat[0] > gda_Price[1] // âåðõíÿÿ ãðàíèöà êîðèäîðà
            && gd_LOW < gda_Price[1]                                   // íèæíÿÿ ãðàíèöà êîðèäîðà
            && !gb_moove_DW)                                           // åù¸ çäåñü íå áûëè
            {
                gb_moove_DW = true;
                if (PrintCom) Print (gs_fName, ": Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå ìèíèìóìà: ", DoubleToStr (gd_LOW, gi_Digits));
            }
            //---- Èëè ìèíèìóìà, ñîîòâåòñòâåííî
            if (gb_moove_DW                                                             // áûëè ó âïàäèíû
            && gd_LOW + MathMin (gd_MIN_Range, gd_Comp_Range) <= gda_Price[1]           // îòêàòèëè
            && OrderOpenPrice() - MathMin (gd_MIN_Range, gd_Comp_Range) > gda_Price[1]) // ðàññòîÿíèå ì\ó îðäåðàìè íå ìåíåå gd_MIN_Range
            {
                ld_compensation = (OrderOpenPrice() - gda_Price[0]) * 0.382;
                ld_TP = NormalizeDouble (gda_Price[0] + MathMax (ld_compensation, MathMax (gd_Profit_MIN, gd_MinSTOP)), gi_Digits);
                ld_SL = NormalizeDouble (MathMin ((gd_LOW - gd_Channel_base * gda_otkat[1]), gda_Price[0] - MathMax (gd_MinSTOP, gd_min_SL)), gi_Digits);
                RefreshRates();
                li_Ticket = OrderSend (gs_Symbol, OP_BUY, fLotsNormalize (GetSizeLot (Order_Lots) * K_comp_lot), Ask, Slippage, ld_SL, ld_TP, "buy_add", fi_MG, 0, gc_add_BUY);
            }
        }
    }
    //---- Åñëè öåíà îïóñêàåòñÿ íèæå LOW - èùåì íîâûé ìèíèìóì
    if (gd_LOW > gda_Price[1])
    {
        gb_moove_DW = false;
        fGet_LOW (gd_MIN_Range, fi_Ticket);
    }
    //---- Ïî ðåçóëüòàòàì ïðåäûäóùåé îïåðàöèè
    if (li_Ticket < 0)
    {
        if (!IsOptimization())
        {
            if (SoundAlert) {PlaySound ("mistake.wav");}
            gs_ComError = fPrepareComment (StringConcatenate (gs_fName, ": Îøèáêà ïðè îòêðûòèè ", GetNameOP (li_Type), " add-îðäåðà: ", ErrorDescription (GetLastError())), gb_InfoPrint);
            if (PrintCom) Print (gs_ComError);
        }
    }
    if (li_Ticket > 0)
    {
        gb_moove_UP = false;
        gb_moove_DW = false;
        if (li_Type == OP_BUY) {ld_Price = Bid;} else {ld_Price = Ask;}
        if (li_Type == OP_BUY) {li_cmd = 1;} else {li_cmd = -1;}
        if (PrintCom) Print (gs_fName, ": TP = ", li_cmd * (ld_TP - ld_Price) / gd_Point, "; SL = ", li_cmd * (ld_Price - ld_SL) / gd_Point);
        //---- Ìîäèôèöèðóåì ëîññîâûé-îðäåð
        lb_modify = OrderModify (fi_Ticket, OrderOpenPrice(), OrderStopLoss(), ld_TP, 0, gc_modify);
        if (IsOptimization())
        {return (li_Ticket);}
        if (SoundAlert) {PlaySound ("yes.wav");}
        if (lb_modify)
        {if (SoundAlert) {PlaySound ("modify.wav");}}
        else
        {
            if (SoundAlert) {PlaySound ("mistake.wav");}
            gs_ComError = fPrepareComment (StringConcatenate (gs_fName, ": Îøèáêà ïðè ìîäèôèêàöèè ", GetNameOP (li_Type), " îðäåðà[", fi_Ticket, "]: ", ErrorDescription (GetLastError())), gb_InfoPrint);
            if (PrintCom) Print (gs_ComError);
        }
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, gs_fName);
//----
    return (li_Ticket);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Îòêðûòèå îðäåðîâ ïî ïðîáèòèþ êàíàëà                                        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fChannel_Strategy (int fi_MG)
{
    double ld_SL, ld_MAX, ld_MIN, err = GetLastError();
    int    li_Ticket = 0, li_Type = -1;
    string ls_txt;
//----
    gs_fName = "fChannel_Strategy()";
    //---- Ãðàíèöû êàíàëà îáíîâëÿþòñÿ äî ìîìåíòà ôîðìèðîâàíèÿ êàíàëà
    if (!gb_flat)
    {
        //---- Îïðåäåëÿåì êàíàë
        fGetChannel (ld_MAX, ld_MIN);
        gd_flat_MAX = ld_MAX;
        gd_flat_MIN = ld_MIN;
        gd_flat_Channel = gd_flat_MAX - gd_flat_MIN;
        if (gd_flat_Channel <= gd_MAX_flat_Range)
        {
            gb_flat = true;
            if (PrintCom) Print (gs_fName, ": Ñôîðìèðîâàí ôëýòîâûé êàíàë !!!");
        }
    }
    //---- Åñëè êàíàë ñôîðìèðîâàí ïðîâåðÿåì âîçìîæíîñòü íà îòêðûòèå îðäåðà
    if (gb_flat)
    {
        if (!VirtualOrders_ON)
        {
            gd_MinSTOP = MarketInfo (Symbol(), MODE_STOPLEVEL) * gd_Point;
            //---- Ïðè ïðîáèòèè êîðèäîðà îòêðûâàåòñÿ ñäåëêà â íàïðàâëåíèè ïðîáèòèÿ
            RefreshRates();
            if ((gd_flat_MAX + gd_flat_Channel * 0.618) <= gda_Price[1])
            {
                ld_SL = MathMin ((gd_flat_MIN - gd_flat_Channel * 0.118), gda_Price[0] - MathMax (gd_MinSTOP, gd_min_SL));
                li_Type = OP_BUY;
                li_Ticket = OrderSend (gs_Symbol, OP_BUY, GetSizeLot (Order_Lots), Ask, Slippage, ld_SL, 0, "", fi_MG, 0, gc_flat_BUY);
            }
            if ((gd_flat_MIN - gd_flat_Channel * 0.618) >= gda_Price[0])
            {
                ld_SL = MathMax ((gd_flat_MAX + gd_flat_Channel * 0.118), gda_Price[1] + MathMax (gd_MinSTOP, gd_min_SL));
                li_Type = OP_SELL;
                li_Ticket = OrderSend (gs_Symbol, OP_SELL, GetSizeLot (Order_Lots), Bid, Slippage, ld_SL, 0, "", fi_MG, 0, gc_flat_SELL);
            }
            if (IsOptimization())
            {return (li_Ticket);}
            if (li_Ticket < 0)
            {
                if (SoundAlert) {PlaySound ("mistake.wav");}
                gs_ComError = fPrepareComment (StringConcatenate (gs_fName, ": Îøèáêà ïðè îòêðûòèè ", GetNameOP (li_Type), " flat-îðäåðà: ", ErrorDescription (GetLastError())), gb_InfoPrint);
                if (PrintCom) Print (gs_ComError);
            }
            if (li_Ticket > 0) {if (SoundAlert) {PlaySound ("yes.wav");}}
        }
        //---- Îðãàíèçóåì âèðòóàëüíóþ ðàáîòó
        else
        {
            //---- Óäàëÿåì "íå ñâîè" ëèíèè
            //if (cur_MG != fi_MG)
            //{fDeleteHLine();}
            if ((gd_flat_MAX + gd_flat_Channel * 0.5) <= gda_Price[1])
            {
                if (!gba_IsLine[0])
                {
                    gba_IsLine[0] = true;
                    cur_MG = fi_MG;
                    //DelObject (gsa_Name_Line[1]);
                    fDeleteHLine();
                    fCreat_OBJ (gsa_Name_Line[0], OBJ_HLINE, 0, "", 0, Time[0], gda_Price[1] + gd_area, false, Blue);
                    gs_trade = fPrepareComment (StringConcatenate ("Flat: Ñîçäàëè ëèíèþ ", gsa_Name_Line[0], " !!!"), gb_InfoPrint);
                    if (PrintCom) Print (gs_trade);
                    return (0);
                }
            }
            else
            {
                if (gd_flat_MIN >= gda_Price[1] && gba_IsLine[0])
                {
                    DelObject (gsa_Name_Line[0]);
                    gba_IsLine[0] = false;
                }
            }
            if ((gd_flat_MIN - gd_flat_Channel * 0.5) >= gda_Price[0])
            {
                if (!gba_IsLine[1])
                {
                    gba_IsLine[1] = true;
                    cur_MG = fi_MG;
                    //DelObject (gsa_Name_Line[0]);
                    fDeleteHLine();
                    fCreat_OBJ (gsa_Name_Line[1], OBJ_HLINE, 0, "", 0, Time[0], gda_Price[0] - gd_area, false, Red);
                    gs_trade = fPrepareComment (StringConcatenate ("Flat: Ñîçäàëè ëèíèþ ", gsa_Name_Line[1], " !!!"), gb_InfoPrint);
                    if (PrintCom) Print (gs_trade);
                    return (0);
                }
            }
            else
            {
                if (gd_flat_MAX <= gda_Price[0] && gba_IsLine[1])
                {
                    DelObject (gsa_Name_Line[1]);
                    gba_IsLine[1] = false;
                }
            }
        }
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, gs_fName);
//----
    return (li_Ticket);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ðàñ÷èòûâàåì ÑÒÎÏû                                                          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGetSTOPs (double& ar_STOPs[], int fi_Type, int fi_Var_STOPs)
{
    int li_cmd, cmd, err = GetLastError();
    double ld_Extr[2], ld_SL, ld_TP, ld_Price, ld_MIN_Range = 150 * gi_Decimal * gd_Point;
//----
    if (fi_Type == OP_BUY) {li_cmd = 1;} else {li_cmd = -1;}
    if (fi_Type == OP_BUY) {cmd = 1;} else {cmd = 0;}
    ld_Extr[0] = gd_LOW;
    ld_Extr[1] = gd_HIGH;
    if (fi_Type == OP_BUY) {ld_Price = Bid;} else {ld_Price = Ask;}
    gd_MinSTOP = MarketInfo (Symbol(), MODE_STOPLEVEL) * gd_Point;
    switch (fi_Var_STOPs)
    {
        case 0:
            if (gd_Channel_base < ld_MIN_Range) {ld_TP = ld_Extr[cmd];} else {ld_TP = ld_Extr[cmd] - li_cmd * gd_Channel_base * 0.382;}
            switch (fi_Type)
            {
                case 0:
                    ar_STOPs[0] = NormalizeDouble (MathMin ((gd_LOW - gd_Channel_base * gda_otkat[1]), ld_Price - MathMax (gd_MinSTOP, gd_min_SL)), gi_Digits);
                    ar_STOPs[1] = NormalizeDouble (MathMax (ld_TP, ld_Price + MathMax (gd_Profit_MIN, gd_MinSTOP)), gi_Digits);
                    break;
                case 1:
                    ar_STOPs[0] = NormalizeDouble (MathMax ((gd_HIGH + gd_Channel_base * gda_otkat[0]), ld_Price + MathMax (gd_MinSTOP, gd_min_SL)), gi_Digits);
                    ar_STOPs[1] = NormalizeDouble (MathMin (ld_TP, ld_Price - MathMax (gd_Profit_MIN, gd_MinSTOP)), gi_Digits);
                    break;
            }
            break;
        case 1:
            if (fi_Type == OP_BUY)
            {ar_STOPs[0] = NormalizeDouble (MathMin ((gd_flat_MIN - gd_flat_Channel * 0.118), ld_Price - MathMax (gd_MinSTOP, gd_min_SL)), gi_Digits);}
            else
            {ar_STOPs[0] = NormalizeDouble (MathMax ((gd_flat_MAX + gd_flat_Channel * 0.118), gda_Price[1] + MathMax (gd_MinSTOP, gd_min_SL)), gi_Digits);}
            ar_STOPs[1] = 0.0;
            break;
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, "fGetSTOPs()");
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|    "Ôëýòîâûé êîðèäîð" âêëþ÷àåò Weight_Channel ñâå÷åê, ñîïðîòèâëåíèå è ïîääåðæêà   |
//|     îïðåäåëÿþòñÿ ïî öåíàì îòêðûòèÿ è çàêðûòèÿ                                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGetChannel (double& fd_MAX, double& fd_MIN)
{
    int err = GetLastError();
//----
    fd_MAX = 0;
    fd_MIN = 1000;
    for (int li_Bar = 1; li_Bar <= Weight_Channel; li_Bar++)
    {
        fd_MAX = MathMax (fd_MAX, MathMax (Close[li_Bar], Open[li_Bar]));
        fd_MIN = MathMin (fd_MIN, MathMin (Open[li_Bar], Close[li_Bar]));
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, "fGetChannel()");
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Òðàë îñíîâíîé è êîìïåíñàòîðíîé ñäåëîê                                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fTrailling (int ar_MG[])
{
    int li_Type, li_Ticket, li_ind_MG, li_result = -1, err = GetLastError();
    bool lb_result = false;
    double ld_Profit, ld_new_SL = 0.0, ld_Trail_Value, ld_Price, ld_TickValue,
           ld_swap, ld_step_Trail = 2 * gi_Decimal * gd_Point;
    string ls_order = "", ls_fName = "fTrailling()";
//----
    gd_MinSTOP = MarketInfo (Symbol(), MODE_STOPLEVEL) * gd_Point;
    for (int li_int = OrdersTotal() - 1; li_int >= 0; li_int--)
    {
        if (!OrderSelect (li_int, SELECT_BY_POS))
        {return;}
        li_ind_MG = fCheckMyMagic (OrderMagicNumber(), ar_MG);
        if (li_ind_MG < 0 || OrderSymbol() != gs_Symbol)
        {continue;}
        //---- Íå òðîãàåì êîìïåíñàòîðíûå îðäåðà
        if (li_ind_MG == 2)
        {continue;}
        if (OrderType() > 1)
        {continue;}
        li_Type = OrderType();
        //---- Îïðåäåëÿåì ñòîèìîñòü ïóíêòà
        ld_TickValue = fGetTickValue();
        //---- Ïîäñ÷èòàåì ïîòåðè îò Swap
        ld_swap = MathAbs (OrderSwap() / ld_TickValue);
        ld_Profit = OrderProfit() + OrderCommission() + OrderSwap();
        //if (li_Type == OP_BUY) {ld_Price = Bid;} else {ld_Price = Ask;}
        ld_Price = gda_Price[li_Type];
        li_Ticket = OrderTicket();
        if (li_ind_MG == 0) {ls_order = gsa_NameCom[0];} else {ls_order = gsa_NameCom[2];}
        if (li_ind_MG == 0) {ld_Trail_Value = gd_Trail;} else {ld_Trail_Value = gd_Trail_ch;}
        //---- Êîíòðîëèðóåì ìèíèìàëüíóþ ïðèáûëü
        if (ld_Profit < ((Profit_MIN + ld_Trail_Value / gd_Point) / 0.1) * OrderLots() * ld_TickValue + ld_swap)
        {continue;}
        //Print ("Swap = ", ld_swap, "; Min Profit = ", DoubleToStr ((Profit_MIN / 0.1) * OrderLots() * ld_TickValue + ld_swap, gi_Digits));
        //---- Íîðìàëèçóåì ìèíèìàëüíîå ðàññòîÿíèå ì\ó öåíîé è ñòîïîì ïî STOPLEVEL
        ld_Trail_Value = MathMax (ld_Trail_Value, gd_MinSTOP);
        if (li_Type == OP_SELL)
        {
            if (OrderOpenPrice() - ld_Trail_Value > ld_Price)
            {
                //---- Îñíîâàíèå äëÿ äâèæåíèÿ
                if (ld_Price + ld_Trail_Value + ld_step_Trail < OrderStopLoss())
                {ld_new_SL = NormalizeDouble (Ask + ld_Trail_Value, gi_Digits);}
            }
        }
        if (li_Type == OP_BUY)
        {
            if (OrderOpenPrice() + ld_Trail_Value < ld_Price)
            {
                //---- Îñíîâàíèå äëÿ äâèæåíèÿ
                if (ld_Price - ld_Trail_Value - ld_step_Trail > OrderStopLoss())
                {ld_new_SL = NormalizeDouble (Bid - ld_Trail_Value, gi_Digits);}
            }
        }
        if (ld_new_SL != 0 && ld_new_SL != OrderStopLoss())
        {li_result = OrderModify (li_Ticket, OrderOpenPrice(), ld_new_SL, OrderTakeProfit(), 0, gc_modify);}
        if (IsOptimization())
        {continue;}
        if (li_result == 0)
        {
            if (SoundAlert) {PlaySound ("mistake.wav");}
            gs_ComError = fPrepareComment (StringConcatenate (ls_fName, ": Îøèáêà ïðè ìîäèôèêàöèè ", GetNameOP (li_Type), " ", ls_order, "-îðäåðà[", li_Ticket, "]: ", ErrorDescription (GetLastError()),
            "\nSL[", (OrderStopLoss() - ld_new_SL) / gd_Point, "/", (OrderStopLoss() - ld_Price) / gd_Point, "] = ",
            DoubleToStr (OrderStopLoss(), gi_Digits), "; new SL[", (ld_new_SL - ld_Price)  / gd_Point, "] = ",
            DoubleToStr (ld_new_SL, gi_Digits), "; Price = ", DoubleToStr (ld_Price, gi_Digits)), gb_InfoPrint);
            if (PrintCom) Print (gs_ComError);
        }
        if (li_result == 1) {if (SoundAlert) {PlaySound ("modify.wav");}}
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, ls_fName);
//----
}
//+------------------------------------------------------------------+
//|  Îïðåäåëåíèå ñòîèìîñòè ïóíêòà                                    |
//+------------------------------------------------------------------+
double fGetTickValue()
{
    double ld_Price, ld_TickValue, ld_pips;
//----
    //if (OrderType() == OP_BUY) {ld_Price = Bid;} else {ld_Price = Ask;}
    ld_Price = gda_Price[OrderType()];
    ld_pips = ((OrderOpenPrice() - ld_Price) / gd_Point);
    if (ld_pips == 0) {return (1);}
    ld_TickValue = MathAbs (OrderProfit() / ld_pips);
    ld_TickValue = ld_TickValue / OrderLots() * MarketInfo (gs_Symbol, MODE_MINLOT);
    if (ld_TickValue == 0) {return (1);}
//----
    return (ld_TickValue);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ðàñ÷èòûâàåì äèíàìè÷åñêèé òðàë ïî ïîñëåäíèì fi_Counted_Bars áàðàì           |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGetDinamicTrail (int fi_Counted_Bars, double& fd_Tral1, double& fd_Tral2, int fi_Period = 0)
{
    if (Dinamic_Trail_ON)
    {
        fd_Tral1 = 0;
        fd_Tral2 = 0;
        for (int li_Bar = 0; li_Bar < fi_Counted_Bars; li_Bar++)
        {
            fd_Tral1 = MathMax (fd_Tral1, iHigh (gs_Symbol, fi_Period, li_Bar) - iLow (gs_Symbol, fi_Period, li_Bar));
            fd_Tral2 = MathMax (fd_Tral2, MathAbs (iOpen (gs_Symbol, fi_Period, li_Bar) - iClose (gs_Symbol, fi_Period, li_Bar)));
        }
    }
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Ïîëó÷àåì äèíàìè÷åñêèå óðîâíè ÷àñòè÷íîãî çàêðûòèÿ îðäåðà                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGetDinamicLevels (int fi_Part, double fd_BeginLevel, int& ar_Levels[])
{
    int li_BeginLevel = fd_BeginLevel / gd_Point;
//----
    for (int li_LVL = fi_Part; li_LVL < ArraySize (ar_Levels); li_LVL++)
    {
        switch (DinamicLevels)
        {
            case 1:
                ar_Levels[0] = MathCeil (li_BeginLevel / 2);
                ar_Levels[1] = MathMax (ar_Levels[0], li_BeginLevel);
                ar_Levels[2] = MathMax (ar_Levels[1], li_BeginLevel * 2);
                break;
            case 2:
                ar_Levels[0] = li_BeginLevel;
                ar_Levels[1] = MathMax (ar_Levels[0], li_BeginLevel * 2);
                ar_Levels[2] = MathMax (ar_Levels[1], li_BeginLevel * 3);
                break;
            case 3:
                ar_Levels[0] = MathCeil (li_BeginLevel * 0.618);
                ar_Levels[1] = MathMax (ar_Levels[0], MathCeil (li_BeginLevel * 1.236));
                ar_Levels[2] = MathMax (ar_Levels[1], li_BeginLevel * 2);
                break;
        }
    }
//----
} 
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|         Ðèñóåì êîðèäîð è âûâîäèì äðóãóþ àêòóàëüíóþ èíôîðìàöèþ íà ãðàôèê           |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fInfoDraw (int fi_X, int fi_Y)
{
    double ld_Pribul = 0;
    int    cnt = 0, li_row = 3, li_row_result = 0, li_HistoryOrders = 0,
           li_X_time = 270, err = GetLastError();
    string ls_Name = "", ls_txt = "", ls_Range, ls_row;
    color  lc_color;
    static double lsd_LOSS_Percent = 0;
    datetime ldt_cur_Time;
//----
    //---- Ôèêñèðóåì âðåìÿ â "íàñòîÿùèé ìîìåíò"
    if (!RealTrade) {ldt_cur_Time = iTime (gs_Symbol, 1, 0);} else {ldt_cur_Time = TimeCurrent();}
    //---- 3-ÿ ñòðîêà
    ls_Range = StringConcatenate ("RANGE: ", (gd_Channel_base / gd_Point), " (", MIN_Range, " default)");
    SetLabel ("current_range", ls_Range, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, Base_color);
    if (fCCV_S (ls_Range, 2))
    {
        dta_CommentTime[2] = ldt_cur_Time;
        SetLabel ("time_range",  ":  " + TimeToStr (dta_CommentTime[2], TIME_DATE|TIME_MINUTES), li_X_time, li_row * fi_Y, 10, Font_Time, 0, 0, Time_color);
    }
    //---- 4-ÿ ñòðîêà
    li_row++;
    ls_txt = StringConcatenate ("Channel ", Weight_Channel, " candles: ", (gd_flat_Channel / gd_Point), " (", MAX_flat_Range, " default)");
    if (gb_flat) {lc_color = ADD_color;} else {lc_color = Base_color;}
    SetLabel ("fl_channel", ls_txt, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, lc_color);
    if (fCCV_S (ls_txt, 3))
    {
        dta_CommentTime[3] = ldt_cur_Time;
        SetLabel ("time_channel",  ":  " + TimeToStr (dta_CommentTime[3], TIME_DATE|TIME_MINUTES), li_X_time, li_row * fi_Y, 10, Font_Time, 0, 0, Time_color);
    }
    //---- 5-ÿ ñòðîêà
    li_row++;
    ls_txt = StringConcatenate ("Trailling[", Counted_Bars, "]: ", (gd_Trail / gd_Point));
    SetLabel ("trail", ls_txt, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, Base_color);
    if (fCCV_S (ls_txt, 4))
    {
        dta_CommentTime[4] = ldt_cur_Time;
        SetLabel ("time_trail",  ":  " + TimeToStr (dta_CommentTime[4], TIME_DATE|TIME_MINUTES), li_X_time, li_row * fi_Y, 10, Font_Time, 0, 0, Time_color);
    }
    //---- 6-ÿ ñòðîêà
    li_row++;
    ls_txt = StringConcatenate ("Trailling flat[", Counted_Bars, "]: ", (gd_Trail_ch / gd_Point));
    SetLabel ("trail_ch", ls_txt, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, Base_color);
    if (fCCV_S (ls_txt, 5))
    {
        dta_CommentTime[5] = ldt_cur_Time;
        SetLabel ("time_trail_ch",  ":  " + TimeToStr (dta_CommentTime[5], TIME_DATE|TIME_MINUTES), li_X_time, li_row * fi_Y, 10, Font_Time, 0, 0, Time_color);
    }
    //---- 7-ÿ ñòðîêà
    li_row++;
    ls_txt = StringConcatenate ("Part Close Levels[", DinamicLevels, "]: ", gia_Levels[0], " / ", gia_Levels[1], " / ", gia_Levels[2]);
    SetLabel ("part_close", ls_txt, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, Base_color);
    if (fCCV_S (ls_txt, 6))
    {
        dta_CommentTime[6] = ldt_cur_Time;
        SetLabel ("time_part_close",  ":  " + TimeToStr (dta_CommentTime[6], TIME_DATE|TIME_MINUTES), li_X_time, li_row * fi_Y, 10, Font_Time, 0, 0, Time_color);
    }
    //---- 8-ÿ ñòðîêà
    li_row++;
    ls_row = "*********************************************";
    SetLabel ("row", ls_row, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, Base_color);
    //---- 9-ÿ ñòðîêà
    li_row++;
    SetLabel ("send", gs_trade, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, ADD_color);
    if (fCCV_S (ls_txt, 7))
    {
        dta_CommentTime[7] = ldt_cur_Time;
        SetLabel ("time_send",  ":  " + TimeToStr (dta_CommentTime[7], TIME_DATE|TIME_MINUTES), li_X_time, li_row * fi_Y, 10, Font_Time, 0, 0, Time_color);
    }
    //---- 10-ÿ ñòðîêà
    li_row++;
    lsd_LOSS_Percent = MathMax (lsd_LOSS_Percent, MathAbs (gd_MaxLOSS / AccountBalance() * 100));
    ls_txt = StringConcatenate ("Max LOSS = ", gs_sign, " ", DoubleToStr (gd_MaxLOSS, 0), " (% ", DoubleToStr (lsd_LOSS_Percent, 1), ")");
    SetLabel ("max_Loss", ls_txt, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, Base_color);
    if (fCCV_S (ls_txt, 8))
    {
        dta_CommentTime[8] = ldt_cur_Time;
        SetLabel ("time_loss",  ":  " + TimeToStr (dta_CommentTime[8], TIME_DATE|TIME_MINUTES), li_X_time, li_row * fi_Y, 10, Font_Time, 0, 0, Time_color);
    }
    //---- 11-ÿ ñòðîêà
    li_row++;
    ls_txt = "Îáùèé PROFIT:";
    SetLabel ("result", ls_txt, fi_X, li_row * fi_Y, 12, Font_Table, 0, 0, Base_color);
    //---- Âû÷èñëÿåì íà÷àëüíóþ ñòðîêó ïî âûâîäó ðåçóëüòàòîâ
    li_row_result = li_row * fi_Y + 20;
    for (int li_int = 0; li_int < 3; li_int++)
    {
        //---- Åñëè ñòðàòåãèÿ íå çàäåéñòâîâàíà
        if (!gba_Send[li_int])
        {continue;}
        SetLabel ("orders_" + cnt, gsa_NameCom[li_int], 45, li_row_result + fi_Y * cnt, 10, Font_Table, 0, 0, Base_color);
        SetLabel ("ordersS_" + cnt, ":", 75, li_row_result + fi_Y * cnt, 10, Font_Table, 0, 0, Base_color);
        ls_txt = StringConcatenate (gs_sign, " ", DoubleToStr (gda_Pribul[li_int], 0), " [", gia_HistoryOrders[li_int], "]");
        if (gda_Pribul[li_int] >= 0) {lc_color = Profit_color;} else {lc_color = LOSS_color;}
        SetLabel ("ordersC_" + cnt, ls_txt, 85, li_row_result + fi_Y * cnt, 10, Font_Table, 0, 0, lc_color);
        li_HistoryOrders += gia_HistoryOrders[li_int];
        ld_Pribul += gda_Pribul[li_int];
        cnt++;
    }
    ls_txt = StringConcatenate (gs_sign, " ", DoubleToStr (ld_Pribul, 0), " [", li_HistoryOrders, "]");
    if (ld_Pribul >= 0) {lc_color = Profit_color;} else {lc_color = LOSS_color;}
    SetLabel ("profit", ls_txt, 145, li_row * fi_Y, 13, Font_Table, 0, 0, lc_color);
    //---- 15-ÿ ñòðîêà
    li_row += cnt + 1;
    //ls_txt = "****************************************";
    SetLabel ("row1", ls_row, fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, Base_color);
    //---- 16-ÿ ñòðîêà
    li_row++;
    ls_txt = "ERROR:";
    SetLabel ("error", ls_txt, fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, Base_color);
    if (fCCV_S (gs_ComError, 9))
    {
        dta_CommentTime[9] = ldt_cur_Time;
        SetLabel ("time_err",  ":  " + TimeToStr (dta_CommentTime[9], TIME_DATE|TIME_MINUTES), li_X_time, li_row * fi_Y, 10, Font_Time, 0, 0, Time_color);
    }
    //---- 17-ÿ ñòðîêà
    li_row++;
    if (StringLen (gs_ComError) > 0)
    {SetLabel ("error_txt", gs_ComError, fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, Gray);}
    if (VirtualOrders_ON)
    {
        //---- 18-ÿ ñòðîêà
        li_row++;
        //ls_txt = "****************************************";
        SetLabel ("row2", ls_row, fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, Base_color);
        //---- 19-21-ÿ ñòðîêè
        for (int li_com = 0; li_com <= 2; li_com++)
        {
            //---- Âûâîäèì íà ãðàôèê äåéñòâèÿ VirtualTrader
            if (StringLen (gsa_Comment[li_com]) > 0)
            {
                li_row++;
                ls_txt = StringSubstr (gsa_Comment[li_com], StringFind (gsa_Comment[li_com], ":") + 1);
                if (StringLen (ls_txt) > 40)
                {ls_txt = StringSubstr (ls_txt, 0, StringFind (ls_txt, "!") + 3);}
                SetLabel ("com" + li_com, ls_txt, fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, Base_color);
                if (fCCV_S (ls_txt, 12 + li_com))
                {
                    dta_CommentTime[10+li_com] = ldt_cur_Time;
                    SetLabel ("time_ñom" + li_com,  ":  " + TimeToStr (dta_CommentTime[10+li_com], TIME_DATE|TIME_MINUTES), li_X_time, li_row * fi_Y + 5, 10, Font_Time, 0, 0, Time_color);
                }
            }
        }
        //---- Ðèñóåì êîíòðîëüíûå çíà÷åíèÿ ïåðåìåííûõ
        if (gb_Control)
        {
            //---- 22-ÿ ñòðîêà
            li_row++;
            //ls_txt = "****************************************";
            SetLabel ("row3", ls_row, fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, Base_color);
            //---- 23-ÿ ñòðîêà
            li_row++;
            ls_txt = "CONTROL:";
            SetLabel ("control", ls_txt, fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, Base_color);
            //---- 24-ÿ ñòðîêà
            if (StringLen (gsa_Comment[4]) > 0)
            {
                li_row++;
                SetLabel ("ctrl_txt", gsa_Comment[4], fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, ADD_color);
            }
        }
    }
    //---- Ðèñóåì íà ãðàôèêå êîðèäîð "ôëåòà"
    if (gb_flat)
    {
        ls_txt = fPrepareComment (StringConcatenate ("Íàðèñîâàë ôëýòîâûé êàíàë: MAX = ", DoubleToStr (gd_flat_MAX, gi_Digits), "; MIN = ", DoubleToStr (gd_flat_MIN, gi_Digits)), PrintCom);
        //---- ×òîáû íå ïîâòîðÿòüñÿ, ââîäèì ñðàâíåíèå ñ ïðåäûäóùèì êîììåíòîì
        if (fCCV_S (ls_txt, 10))
        {if (PrintCom) Print (ls_txt);}
        DelObject ("ray_high");
        DelObject ("ray_low");
        ls_Name = "flat_MAX";
        if (ObjectFind (ls_Name) == -1)
        {ObjectCreate (ls_Name, OBJ_TREND, 0, Time[Weight_Channel], gd_flat_MAX, Time[1], gd_flat_MAX);}
        ObjectSet (ls_Name, OBJPROP_COLOR, Base_color);
        ObjectSet (ls_Name, OBJPROP_STYLE, STYLE_DASH);
        ls_Name = "flat_MIN";
        if (ObjectFind (ls_Name) == -1)
        {ObjectCreate (ls_Name, OBJ_TREND, 0, Time[Weight_Channel], gd_flat_MIN, Time[1], gd_flat_MIN);}
        ObjectSet (ls_Name, OBJPROP_COLOR, Base_color);
        ObjectSet (ls_Name, OBJPROP_STYLE, STYLE_DASH);
    }
    //---- Èëè ðèñóåì îñíîâíîé êàíàë
    else
    {
        if (fCCV_S (ls_Range, 11))
        {
            DelObject ("flat_MAX");
            DelObject ("flat_MIN");
            //ls_txt = fPrepareComment (StringConcatenate ("Íàðèñîâàëè îñíîâíîé êàíàë: HIGH = ", DoubleToStr (gd_HIGH, gi_Digits), "; LOW = ", DoubleToStr (gd_LOW, gi_Digits)), PrintCom);
            //if (PrintCom) Print (ls_txt);
        }
        if (fCCV_D (gd_HIGH, 0))
        {
            DelObject ("ray_high");
            //ls_txt = fPrepareComment (StringConcatenate ("Íàðèñîâàëè HIGH = ", DoubleToStr (gd_HIGH, gi_Digits)), PrintCom);
            //if (PrintCom) Print (ls_txt);
            ls_Name = "ray_high";
            if (gd_Channel_base > gd_MIN_Range) {lc_color = gc_high;} else {lc_color = Time_color;}
            if (ObjectFind (ls_Name) == -1)
            {ObjectCreate (ls_Name, OBJ_TREND, 0, Time[gi_Bar_High], gd_HIGH, Time[1], gd_HIGH);}
            ObjectSet (ls_Name, OBJPROP_COLOR, lc_color);
            ObjectSet (ls_Name, OBJPROP_STYLE, STYLE_DASHDOT);
        }
        if (fCCV_D (gd_LOW, 1))
        {
            DelObject ("ray_low");
            //ls_txt = fPrepareComment (StringConcatenate ("Íàðèñîâàëè LOW = ", DoubleToStr (gd_LOW, gi_Digits)), PrintCom);
            //if (PrintCom) Print (ls_txt);
            ls_Name = "ray_low";
            if (gd_Channel_base > gd_MIN_Range) {lc_color = gc_low;} else {lc_color = Time_color;}
            if (ObjectFind (ls_Name) == -1)
            {ObjectCreate (ls_Name, OBJ_TREND, 0, Time[gi_Bar_Low], gd_LOW, Time[1], gd_LOW);}
            ObjectSet (ls_Name, OBJPROP_COLOR, lc_color);
            ObjectSet (ls_Name, OBJPROP_STYLE, STYLE_DASHDOT);
        }
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, "fInfoDraw()");
//----
    return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòà ñ îðäåðàìè                                                         |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Ðàáîòàåì (ñëåäèì) çà "ñâîèìè" îðäåðàìè                                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int MyPositions (int ar_MG[])
{
    int order = 0, li_Ticket = 0, li_Part, li_ind_MG, total = OrdersTotal();
    if (total == 0)
    {return (0);}
    double ld_Profit, ld_Price, ld_TickValue, ld_swap;
//----
    gd_Profit = 0;
    for (int i = total - 1; i >= 0; i--)
    {
        if (!OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
        {return (0);}
        li_ind_MG = fCheckMyMagic (OrderMagicNumber(), ar_MG);
        if (OrderSymbol() == gs_Symbol && li_ind_MG >= 0)
        {
            if (OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
                //---- Åñëè óñòàíîâëåíî, çàêðûâàåì âñå îðäåðà â êîíöå äíÿ
                if (fCloseHour (AllCloseHour, OrderTicket()))
                {continue;}
                ld_Profit = OrderProfit() + OrderCommission() + OrderSwap();
                gd_Profit += ld_Profit;
                //---- Çàêðûâàåì ëîññîâûé îðäåð ïî èñòå÷åíèþ "ñðîêà æèçíè"
                if (ld_Profit < 0 && CloseTime > 0)
                {
                    if (fLossControl (CloseTime))
                    {continue;}
                }
                li_Ticket = OrderTicket();
                //if (OrderType() == OP_BUY) {ld_Price = Ask;} else {ld_Price = Bid;}
                ld_Price = gda_Price[OrderType()];
                //---- Êîíòðîëèðóåì ìèíèìàëüíóþ ïðèáûëü ïðè ÷àñòè÷íîì çàêðûòèè
                if (li_ind_MG == 1)
                {
                    if (PartClose_ON && ld_Profit > 0)
                    {
                        //---- Îïðåäåëÿåì ñòîèìîñòü ïóíêòà
                        ld_TickValue = fGetTickValue();
                        //---- Ïîäñ÷èòàåì ïîòåðè îò Swap
                        ld_swap = MathAbs (OrderSwap() / ld_TickValue);
                        ld_Profit = OrderProfit() + OrderCommission() + OrderSwap();
                        //---- Êîíòðîëèðóåì ìèíèìàëüíóþ ïðèáûëü
                        if (ld_Profit > (Profit_MIN / 0.1) * OrderLots() * ld_TickValue + ld_swap)
                        {
                            //Print ("Swap = ", ld_swap, "; Min Profit = ", DoubleToStr ((Profit_MIN / 0.1) * OrderLots() * ld_TickValue + ld_swap, gi_Digits));
                            //---- Êîíòðîëèðóåì ÷àñòè÷íîå çàêðûòèå flat-îðäåðîâ
                            li_Part = fPartClose (li_Ticket);
                            if (li_Part > 0)
                            {
                                gs_trade = fPrepareComment (StringConcatenate ("×àñòè÷íî çàêðûëè flat-îðäåð[", li_Ticket, "] !!!"), gb_InfoPrint);
                                if (PrintCom) Print (gs_trade);
                                //---- Âîçâðàùàåì íà "ïåðåó÷¸ò"
                                if (li_Part == 2)
                                return (-1);
                            }
                        }
                    }
                }
                order++;
            }
        }
    }
    gd_MaxLOSS = MathMin (gd_MaxLOSS, gd_Profit);
    if (order == 1)
    {gi_Ticket = li_Ticket;}
//----
    return (order);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ çàêðûòèÿ îðäåðîâ ïî òèïó (OP) è Magic (iMG)                        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool CloseOrderAll (int iMG = -1, int OP = -1)
{
    color  lc_close;
    int    li_Type, err = GetLastError();
    double ld_ClosePrice;
    bool   lb_Close = false;
//----
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if (!OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
        {continue;}
        if (OrderMagicNumber() != iMG && iMG >= 0)
        {continue;}
        //if (OrderSymbol() != Symbol())
        //{continue;}
        li_Type = OrderType();
        if (OP == li_Type || OP == -1)
        {
            ld_ClosePrice = MarketInfo (Symbol(), IIFi ((li_Type == OP_BUY), MODE_BID, MODE_ASK));
            lc_close = IIFc (li_Type == OP_BUY, Blue, Red);
            lb_Close = OrderClose (OrderTicket(), OrderLots(), ld_ClosePrice, Slippage, lc_close);
        }
    }
    fGetLastError (gs_ComError, "CloseOrderAll()");
//----
    return (lb_Close);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð    : TarasBY                                                               |
//+-----------------------------------------------------------------------------------+
//|  Îïèñàíèå : Ïîëó÷àåì öåíû, ñ êîòîðûìè áóäåò ðàáîòàòü ñîâåòíèê                     |
//+-----------------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                       |
//|    iPrice          : 0 - Bid; 1 - Ask                                             |
//|    fi_VariantPrice : 0 - Bid\Ask; 1 - Open[0]; 2 - Close [1]; 3 - Close[0]        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGetTradePrice (int fi_VariantPrice, double& ar_Price[])
{
    switch (fi_VariantPrice)
    {
        case 0: 
            RefreshRates();
            ar_Price[0] = Bid;
            ar_Price[1] = Ask;
            break;
        case 1: double ld_Price = Open[0]; break;
        case 2: ld_Price = Close[1]; break;
        case 3: ld_Price = Close[0]; break;
    }
    double ld_spread = MarketInfo (gs_Symbol, MODE_SPREAD) * gd_Point;
    ar_Price[0] = ld_Price;
    ar_Price[1] = ld_Price + ld_spread;
//----
    return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Óäàëÿåì ëîññîâûé îðäåð ïî èñòå÷åíèþ "ñðîêà æèçíè" â fi_Period äíåé          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fLossControl (int fi_Period)
{
    datetime ldt_OpenTime = OrderOpenTime(), ldt_curTime;
    double   ld_Price;
    int      err = GetLastError();
    bool     lb_result = false;
//----
    if (IsOptimization() || IsTesting()) {ldt_curTime = iTime (gs_Symbol, 1, 0);} else {ldt_curTime = TimeCurrent();}
    if (PERIOD_D1 * 60 * fi_Period + ldt_OpenTime < ldt_curTime)
    {
        //if (OrderType() == OP_BUY) {ld_Price = Bid;} else {ld_Price = Ask;}
        ld_Price = gda_Price[OrderType()];
        lb_result = OrderClose (OrderTicket(), OrderLots(), ld_Price, Slippage, White);
        if (IsOptimization())
        {return (lb_result);}
        if (lb_result)
        {
            if (SoundAlert) {PlaySound ("delete_loss.wav");}
            gs_trade = fPrepareComment (StringConcatenate ("fLossControl(): Óäàëèëè ëîññîâûé îðäåð[", OrderTicket(), "] ïî ïðîøåñòâèè ", fi_Period, " äíåé !!!"), gb_InfoPrint);
            if (PrintCom) Print (gs_trade);
        }
        else {if (SoundAlert) {PlaySound ("mistake.wav");}}
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, "fLossControl()");
//----
    return (lb_result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Ñ÷èòàåì çàðàáîòàííóþ ïðèáûëü (åñëè âîîáùå çàðàáîòàëè)                       |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fCalculatePribul (string fs_Symbol,          // ðàáî÷èé ñèìâîë
                       double& ar_Pribul[],       // âîâðàùàåìûé ìàññèâ ðåçóëüòàòîâ ðàáîòû ïî òð¸ì òèïàì îðäåðîâ
                       int& ar_HistoryOrders[],   // âîçâàðùàåìûé ìàññèâ çàêðûòûõ îðäåðîâ ïî òð¸ì òèïàì îðäåðîâ
                       int ar_Magic[],            // ìàññèâ Magic
                       int op = -1,               // òèï (BUY\SELL) ó÷èòûâàåìûõ îðäåðîâ
                       datetime dt = 0)           // ìîìåíò âðåìåíè, ñ êîòîðîãî ïðîèçâîäèì ðàñ÷¸ò
{
    int li_int, li_ind_MG, err = GetLastError(), li_NUM, history_total = OrdersHistoryTotal();
    double ld_Pribul = 0;
    string ls_Comment;
//----
    ArrayInitialize (ar_Pribul, 0.0);
    ArrayInitialize (ar_HistoryOrders, 0);
    for (li_int = history_total - 1; li_int >= 0; li_int--)
    {
        if (OrderSelect (li_int, SELECT_BY_POS, MODE_HISTORY))
        {
            li_ind_MG = fCheckMyMagic (OrderMagicNumber(), ar_Magic);
            if (li_ind_MG >= 0 && OrderSymbol() == fs_Symbol)
            {
                if (OrderType() < 2 && (op < 0 || OrderType() == op))
                {
                    if (dt < OrderCloseTime())
                    {
                        ld_Pribul = OrderProfit() + OrderSwap() + OrderCommission();
                        ar_Pribul[li_ind_MG] += ld_Pribul;
                        ar_HistoryOrders[li_ind_MG]++;
                    }
                }
            }
        }
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, "fCalculatePribul()");
//----
    return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Ïðîèçâîäèì ÷àñòè÷íîå çàêðûòèå îðäåðà ïî Ticket                              |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fPartClose (int fi_Ticket)
{
    int    li_ParentTicket, li_Part, err = GetLastError();
    double ld_Lots, ld_LotsClose, ld_Price;
    bool   lb_result = false;
    string ls_close, ls_Profit;
//----
    li_ParentTicket = 0;
    li_Part = 0;
    ld_Lots = OrderLots();
    li_ParentTicket = fGetParentTicket (OrderComment());
    if (li_ParentTicket != 0)
    {
        if (GlobalVariableCheck (StringConcatenate (gs_NameGV, "_", li_ParentTicket, "_Num")))
        {li_Part = GlobalVariableGet (StringConcatenate (gs_NameGV, "_", li_ParentTicket, "_Num")) + 1;}
        if (GlobalVariableCheck (StringConcatenate (gs_NameGV, "_", li_ParentTicket, "_Lots")))
        {ld_Lots = GlobalVariableGet (StringConcatenate (gs_NameGV, "_", li_ParentTicket, "_Lots"));}
    }
    GlobalVariableSet (StringConcatenate (gs_NameGV, "_", fi_Ticket, "_Num"), li_Part);
    GlobalVariableSet (StringConcatenate (gs_NameGV, "_", fi_Ticket, "_Lots"), ld_Lots);
    if (li_Part >= ArraySize (gia_Levels))
    {li_Part = ArraySize (gia_Levels) - 1;}
    RefreshRates();
    //---- Óñòàíàâëèâàåì äèíàìè÷åñêèå óðîâíè çàêðûòèÿ
    if (DinamicLevels > 0)
    {fGetDinamicLevels (li_Part, gd_Trail_ch, gia_Levels);}
    ld_Price = gda_Price[OrderType()];
    if (OrderType() == OP_BUY)
    {
        //ld_Price = Bid;
        if (ld_Price - OrderOpenPrice() >= gd_Point * gia_Levels[li_Part])
        {
            ld_LotsClose = fLotsNormalize ((gia_Percents[li_Part] * ld_Lots / 100.0), fi_Ticket);
            if (ld_LotsClose > 0)
            {
                ld_LotsClose = MathMin (ld_LotsClose, OrderLots());
                //if (li_Part == 2)
                //{ld_LotsClose = OrderLots();}
                RefreshRates();
                lb_result = OrderClose (fi_Ticket, ld_LotsClose, Bid, Slippage, White);
            }
        }
    }
    if (OrderType() == OP_SELL)
    {
        //ld_Price = Ask;
        if (OrderOpenPrice() - ld_Price >= gd_Point * gia_Levels[li_Part])
        {
            ld_LotsClose = fLotsNormalize ((gia_Percents[li_Part] * ld_Lots / 100.0), fi_Ticket);
            if (ld_LotsClose > 0)
            {
                ld_LotsClose = MathMin (ld_LotsClose, OrderLots());
                //if (li_Part == 2)
                //{ld_LotsClose = OrderLots();}
                RefreshRates();
                lb_result = OrderClose (fi_Ticket, ld_LotsClose, Ask, Slippage, White);
            }
        }
    }
    if (IsOptimization())
    {return (lb_result);}
    if (lb_result)
    {
        if (SoundAlert) {PlaySound ("part_close.wav");}
        OrderSelect (fi_Ticket, SELECT_BY_TICKET, MODE_HISTORY);
        ls_Profit = DoubleToStr ((OrderProfit() + OrderCommission() + OrderSwap()), 1);
        if (li_Part == 2) {ls_close = StringConcatenate ("îêîí÷àòåëüíîå (", li_Part, " / ", gia_Levels[li_Part], ")");} else {ls_close = StringConcatenate ("÷àñòè÷íîå (", li_Part, " / ", gia_Levels[li_Part], ")");}
        if (PrintCom) Print ("fPartClose(): Ïðîèçâåëè ", ls_close, " çàêðûòèå ", GetNameOP (OrderType()), " îðäåðà[", fi_Ticket, "/P-", li_ParentTicket, "] Profit = ", ls_Profit, " !!!");
        return (li_Part);
    }
    else
    {
        if (ld_LotsClose > 0)
        {
            if (SoundAlert) {PlaySound ("mistake.wav");}
            if (li_Part == 2) {ls_close = "îêîí÷àòåëüíîì";} else {ls_close = StringConcatenate ("÷àñòè÷íîì (", li_Part, ")");}
            gs_ComError = fPrepareComment (StringConcatenate ("fPartClose(): Îøèáêà ïðè ", ls_close, " çàêðûòèè ", GetNameOP (OrderType()), " îðäåðà[", fi_Ticket,
            "/P-", li_ParentTicket, "]: ", ErrorDescription (GetLastError()),
            "\nLot = ", DoubleToStr (OrderLots(), gi_dig), "; LotClose = ", DoubleToStr (ld_LotsClose, gi_dig)," !!!"), gb_InfoPrint);
            if (PrintCom) Print (gs_ComError);
        }
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, "fPartClose()");
//----
    return (-1);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Ïîëó÷àåì Ticket ðîäèòåëüñêîãî îðäåðà                                        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGetParentTicket (string aComment)
{
    int tPos1 = StringFind (aComment, "from");
//----
    if (tPos1 >= 0)
    {
        int tPos2 = StringFind (aComment, "#");
        if (tPos2 > tPos1)
        {return (StrToInteger (StringSubstr (aComment, tPos2 + 1, StringLen (aComment) - tPos2 - 1)));}
    }
//----
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Ïðîâåðÿåì Magic                                                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fCheckMyMagic (int fi_Magic, int ar_Magic[])
{
//----
    for (int li_int = 0; li_int < ArraySize (ar_Magic); li_int++)
    {
        if (fi_Magic == ar_Magic[li_int])
        {return (li_int);}
    }
//----
    return (-1);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Çàêðûâàåì îðäåð ïî âðåìåíè                                                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCloseHour (int fi_HourClose, int fi_Ticket)
{
    double ld_Price;
    int li_result = -1;
    string ls_txt;
//----
    if (!TimeControl)
    {return (false);}
    if (fi_HourClose < 24 && fi_HourClose > 0)
    {
        if (TimeHour (GetTime()) >= fi_HourClose)
        {
            RefreshRates();
            if (OrderType() == OP_BUY) {ld_Price = Bid;} else {ld_Price = Ask;}
            li_result = OrderClose (fi_Ticket, OrderLots(), ld_Price, Slippage, Yellow);
            if (IsOptimization())
            {return (true);}
            if (li_result == 1)
            {
                gs_trade = fPrepareComment (StringConcatenate ("fCloseHour(): Çàêðûëè îðäåð[", fi_Ticket, "] â êîíöå äíÿ! (", OrderMagicNumber(), ")."), gb_InfoPrint);
                if (PrintCom) Print (gs_trade);
                return (true);
            }
            if (li_result == 0)
            {
                if (SoundAlert) {PlaySound ("mistake.wav");}
                gs_ComError = fPrepareComment (StringConcatenate ("fCloseHour(): Îøèáêà ïðè çàêðûòèè ", GetNameOP (OrderType()), " îðäåðà[", fi_Ticket, "] â êîíöå äíÿ: ", ErrorDescription (GetLastError())), gb_InfoPrint);
                if (PrintCom) Print (gs_ComError);
            }
        }
    }
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Îáùèå ôóíêöèè                                                             |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Âîçâðàùàåò ìàññèâ STRING èç ñòðîêè, ðàçäåë¸ííîé sDelimiter                 |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fSplitStrToStr (string aString, string& aArray[], string aDelimiter = ",")
{
    string tmp_str = "", tmp_char = "";
//----
    ArrayResize (aArray, 0);
    for (int i = 0; i < StringLen (aString); i++)
    {
        tmp_char = StringSubstr (aString, i, 1);
        if (tmp_char == aDelimiter)
        {
            if (StringTrimLeft (StringTrimRight (tmp_str)) != "")
            {
                ArrayResize (aArray, ArraySize (aArray) + 1);
                aArray[ArraySize (aArray) - 1] = tmp_str;
            }
            tmp_str = "";
        }
        else
        {
            if (tmp_char != " ")
            {tmp_str = tmp_str + tmp_char;}
        }
    }
    if (StringTrimLeft (StringTrimRight (tmp_str)) != "")
    {
        ArrayResize (aArray, ArraySize (aArray) + 1);
        aArray[ArraySize (aArray) - 1] = tmp_str;
    }
//----
    return (ArraySize (aArray));
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð    : TarasBY                                                               |
//+-----------------------------------------------------------------------------------+
//|  Âåðñèÿ  : 27.10.2009                                                             |
//|  Îïèñàíèå: fControlChangeValue_I Ôèêñèðóåò ôàêò èçìåíåíèÿ ïðîâåðÿåìîãî            |
//|  int ïàðàìåòðà                                                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCCV_I (int param, int ix)
{
    static int cur_param[20];
    
    if (cur_param[ix] != param)
    {
        cur_param[ix] = param;
        return (true);
    }
//---- 
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð    : TarasBY                                                               |
//+-----------------------------------------------------------------------------------+
//|  Âåðñèÿ  : 27.10.2009                                                             |
//|  Îïèñàíèå: fControlChangeValue_S Ôèêñèðóåò ôàêò èçìåíåíèÿ ïðîâåðÿåìîãî            |
//|  string ïàðàìåòðà                                                                 |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCCV_S (string param, int ix)
{
    static string cur_param[20];
    static bool   lb_first = true;
//---- 
    //---- Ïðè ïåðâîì çàïóñêå èíèöèàëèçèðóåì ìàññèâ
    if (lb_first)
    {
        for (int l_int = 0; l_int < 20; l_int++)
        {cur_param[l_int] = "";}
        lb_first = false;
    }
    if (cur_param[ix] != param)
    {
        cur_param[ix] = param;
        return (true);
    }
//---- 
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð    : TarasBY                                                               |
//+-----------------------------------------------------------------------------------+
//|  Âåðñèÿ  : 27.10.2009                                                             |
//|  Îïèñàíèå: fControlChangeValue_D Ôèêñèðóåò ôàêò èçìåíåíèÿ ïðîâåðÿåìîãî            |
//|  double ïàðàìåòðà                                                                 |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCCV_D (double param, int ix)
{
    static double cur_param[20];
    static bool   lb_first = true;
//---- 
    //---- Ïðè ïåðâîì çàïóñêå èíèöèàëèçèðóåì ìàññèâ
    if (lb_first)
    {
        for (int l_int = 0; l_int < 20; l_int++)
        {cur_param[l_int] = 0;}
        lb_first = false;
    }
    if (cur_param[ix] != param)
    {
        cur_param[ix] = param;
        return (true);
    }
//---- 
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                          |
//+-----------------------------------------------------------------------------------+
//|  Âåðñèÿ   : 01.09.2005                                                            |
//|  Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òîðãîâîé îïåðàöèè                             |
//+-----------------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                       |
//|    op - èäåíòèôèêàòîð òîðãîâîé îïåðàöèè                                           |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string GetNameOP (int op) 
{
    switch (op) 
    {
        case OP_BUY      : return ("BUY");
        case OP_SELL     : return ("SELL");
        case OP_BUYLIMIT : return ("BUYLIMIT");
        case OP_SELLLIMIT: return ("SELLLIMIT");
        case OP_BUYSTOP  : return ("BUYSTOP");
        case OP_SELLSTOP : return ("SELLSTOP");
    }
    return (StringConcatenate ("None (", op, ")"));
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôîðìèðóåì íàçâàíèå îáúåêòà ñ ïðèìåíåíèåì ñóôôèêñà N (ñ÷¸ò÷èê)              |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string fNamedOBJ_cnt (string fs_Name, int& fi_cnt)
{
    string ls_Name = fs_Name + fi_cnt;
//----
    fi_cnt++;
//----
    return (ls_Name);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                          |
//+-----------------------------------------------------------------------------------+
//|  Âåðñèÿ   : 01.02.2008                                                            |
//|  Îïèñàíèå : Âîçâðàùàåò îäíî èç äâóõ çíà÷åíèé âçàâèñèìîñòè îò óñëîâèÿ.             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string IIFs (bool condition, string ifTrue, string ifFalse)
{if (condition) {return (ifTrue);} else {return (ifFalse);}}
//+-----------------------------------------------------------------------------------+
double IIFd (bool condition, double ifTrue, double ifFalse)
{if (condition) {return (ifTrue);} else {return (ifFalse);}}
//+-----------------------------------------------------------------------------------+
bool IIFb (bool condition, bool ifTrue, bool ifFalse)
{if (condition) {return (ifTrue);} else {return (ifFalse);}}
//+-----------------------------------------------------------------------------------+
int IIFi (bool condition, int ifTrue, int ifFalse)
{if (condition) {return (ifTrue);} else {return (ifFalse);}}
//+-----------------------------------------------------------------------------------+
color IIFc (bool condition, color ifTrue, color ifFalse)
{if (condition) {return (ifTrue);} else {return (ifFalse);}}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ, ïåðåâîäà int â double ïî Point                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double NDP (int v) {return (v * Point);}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ, íîðìàëèçàöèè çíà÷åíèÿ double äî Digit                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double NDD (double v) {return (NormalizeDouble (v, gi_Digits));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ, íîðìàëèçàöèè çíà÷åíèÿ double äî Digit-1 (äëÿ 5-ãî çíàêà)          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double NDDl (double v)
{
    int li_digit = IIFi ((gi_Digits == 5 || gi_Digits == 3), gi_Digits - 1, gi_Digits);
    return (NormalizeDouble (v, li_digit));
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ, íîðìàëèçàöèè çíà÷åíèÿ double äî ìèíèìàëüíîé ðàçðÿäíîñòè ëîòà      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double NDDig (double v) {return (NormalizeDouble (v, LotDecimal()));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ, ïåðåâîäà çíà÷åíèÿ èç double â string c íîðìàëèçàöèåé ïî Digit     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string DSD (double v) {return (DoubleToStr (v, gi_Digits));} 
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ, ïåðåâîäà âðåìåíè â ñåê. â ñòðîêó ôîðìàòà "yyyy.mm.dd hh:mi"       |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string TS_DM (datetime v) {return (TimeToStr (v, TIME_DATE|TIME_MINUTES));} 
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ, ïåðåâîäà çíà÷åíèÿ èç double â string c íîðìàëèçàöèåé ïî 0         |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string DS0 (double v) {return (DoubleToStr (v, 0));} 
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  UNI:      Ïîëó÷àåì íîìåð ïåðèîäà ãðàôèêà                                         |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGetNumPeriods (int aPeriod[], int iPeriod)
{
    for (int l_int = 0; l_int < ArraySize (aPeriod); l_int++)
    {
        if (aPeriod[l_int] == iPeriod)
        {return (l_int);}
    }
//---- 
    return (-1);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  UNI:               ÈÍÈÖÈÀËÈÇÈÐÓÅÌ ÌÀÑÑÈÂ STRING                                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int InitializeArray_STR (string& PrepareArray[], string Value = "")
{
    int l_int, size = ArraySize (PrepareArray);
//----
    for (l_int = 0; l_int < size; l_int++)
    {PrepareArray[l_int] = Value;}
//----
    return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|             ÎÐÃÀÍÈÇÓÅÌ ÌÈÃÀÅÍÈÅ ÂÛÂÎÄÈÌÛÕ ÍÀ ÃÐÀÔÈÊ ÎÁÚÅÊÒÎÂ                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fMigalka (double sec = 0.5)
{
    static bool li_migalka = true;
//----
    Sleep (sec * 1000);
    li_migalka = IIFb (li_migalka == true, false, true);
//----
    return (li_migalka);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Âîçâðàùàåò íàèìåíîâàíèå ñîñòîÿíèÿ (ÄÀ\ÍÅÒ)                                 |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string CheckBOOL (int M)
{
//----
    switch (M)
    {
        case 0: {return ("Íåò");}
        case 1: {return ("Äà");}
    }
//----
    return ("Íå çíàþ...");
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòà ñ ãðàôè÷åñêèìè îáúåêòàìè                                           |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Îïèñàíèå : Óñòàíîâêà çíà÷êà íà ãðàôèêå, îáúåêò OBJ_ARROW.                        |
//+-----------------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                       |
//|    fi_Code  - êîä çíà÷êà                                                          |
//|    fc_color - öâåò çíà÷êà                                                         |
//|    fs_Name  - èìÿ                                                                 |
//|    fdt_Time - âðåìÿ îòêðûòèÿ áàðà                             (0  - òåêóùèé áàð)  |
//|    fd_Price - öåíîâîé óðîâåíü                                 (0  - Bid)          |
//|    fi_size  - ðàçìåð çíà÷êà                                   (0  - ïî óìîë÷àíèþ) |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool SetArrow (int fi_Code, color fc_color, string fs_Name = "", datetime fdt_Time = 0, double fd_Price = 0, int fi_size = 0)
{
    bool lb_res_Draw_Arrow = false;
//----
    if (fdt_Time == 0) {fdt_Time = Time[0];}
    if (fd_Price == 0) {fd_Price = Bid;}
    if (ObjectFind (fs_Name) == -1)
    {
        lb_res_Draw_Arrow = ObjectCreate (fs_Name, OBJ_ARROW, 0, 0, 0);
        if (!lb_res_Draw_Arrow)
        {Print ("Error[", GetLastError(), "] - ObjectCreate()");}
    }
    if (!ObjectSet (fs_Name, OBJPROP_TIME1, fdt_Time))
    {Print ("Error[", GetLastError(), "] - ObjectSet (OBJPROP_TIME1)");}
    if (!ObjectSet (fs_Name, OBJPROP_PRICE1, fd_Price))
    {Print ("Error[", GetLastError(), "] - ObjectSet (OBJPROP_PRICE1)");}
    ObjectSet (fs_Name, OBJPROP_ARROWCODE, fi_Code);
    ObjectSet (fs_Name, OBJPROP_COLOR, fc_color);
    if (!ObjectSet (fs_Name, OBJPROP_WIDTH, fi_size))
    {Print ("Error[", GetLastError(), "] - ObjectSet (OBJPROP_WIDTH)");}
//----
    return (lb_res_Draw_Arrow);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Ðèñóåì OBJ_TREND, OBJ_ARROW, OBJ_HLINE                                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCreat_OBJ (string fs_Name, int fi_OBJ, int fi_ArrowCode, string fs_Text, int fi_FontSize,
                 datetime fdt_Time1, double fd_Price1, bool fb_Ray = true, color fc_Color = Gold,
                 datetime fdt_Time2 = 0, double fd_Price2 = 0)
{
    int err = GetLastError();
    bool lb_result = false;
//----
    if (ObjectFind (fs_Name) == -1)
    {lb_result = ObjectCreate (fs_Name, fi_OBJ, 0, 0, 0);}
    ObjectSet (fs_Name, OBJPROP_TIME1, fdt_Time1);
    ObjectSet (fs_Name, OBJPROP_PRICE1, fd_Price1);
    if (fdt_Time2 != 0 || fd_Price2 != 0)
    {
        ObjectSet (fs_Name, OBJPROP_TIME2, fdt_Time2);
        ObjectSet (fs_Name, OBJPROP_PRICE2, fd_Price2);
    }
    ObjectSet (fs_Name, OBJPROP_COLOR, fc_Color);
    if (fi_OBJ == OBJ_TREND)
    {ObjectSet (fs_Name, OBJPROP_RAY, fb_Ray);}
    if (fi_OBJ == OBJ_ARROW)
    {ObjectSet (fs_Name, OBJPROP_ARROWCODE, fi_ArrowCode);}
    if (StringLen (fs_Text) > 0)
    {ObjectSetText (fs_Name, fs_Text, fi_FontSize, "Calibri", fc_Color);}
    fGetLastError (gs_ComError, "fCreat_OBJ()");
//----
    return (lb_result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Îïèñàíèå : Óñòàíîâêà îáúåêòà OBJ_LABEL                                           |
//+-----------------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                       |
//|    name - íàèìåíîâàíèå îáúåêòà                                                    |
//|    text - ñàì îáúåêò                                                              |
//|    X - êîîðäèíàòà X                                                               |
//|    Y - êîîðäèíàòà Y                                                               |
//|    size - ðàçìåð îáúåêòà                                                          |
//|    Font - øðèôò îáúåêòà                                                           |
//|    Corner - óãîë                                      (0  - ïî óìîë÷àíèþ)         |
//|    Angle - óãîë                                       (0  - ïî óìîë÷àíèþ)         |
//|    CL - öâåò                                          (CLR_NONE - ïî óìîë÷àíèþ)   |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void SetLabel (string name, string text, int X, int Y, int size = 10, string Font = "Calibri",
               int Corner = 0, int Angle = 0, color CL = CLR_NONE)
{
    if (ObjectFind (name) == -1)
    {ObjectCreate (name, OBJ_LABEL, 0, 0, 0);}
    ObjectSet (name, OBJPROP_COLOR, CL);
    ObjectSet (name, OBJPROP_XDISTANCE, X);
    ObjectSet (name, OBJPROP_YDISTANCE, Y);
    ObjectSet (name, OBJPROP_CORNER, Corner);
    if (Angle > 0)
    {ObjectSet (name, OBJPROP_ANGLE, Angle);}
    if (text != "")
    {ObjectSetText (name, text, size, Font, CL);}
//----
    return;   
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//          ÓÄÀËÅÍÈÅ ÃÐÀÔÈ×ÅÑÊÎÃÎ ÎÁÚÅÊÒÀ                                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool DelObject (string fs_partTXT)
{
    string ls_Name;
    bool   lb_result = false;
//----
    if (ObjectFind (fs_partTXT) != -1)
    {
        if (ObjectDelete (fs_partTXT))
        {return (true);}
    }
    //---- Óäàëÿåì âñå îáúåêòû ñ çàäàííûì ïðåôèêñîì fs_partTXT
    for (int i = ObjectsTotal() - 1; i >= 0; i--)
    {
        ls_Name = ObjectName (i);
        if (StringFind (ls_Name, fs_partTXT, 0) > -1)
        {
            if (ObjectDelete (ls_Name))
            {lb_result = true;}
        }
    }
    fGetLastError (gs_ComError, StringConcatenate ("DelObject()[", fs_partTXT, "]"));
//----
    return (lb_result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Óäàëÿåì OBJ_HLINE                                                           |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fDeleteHLine()
{
    string ls_Name;
    bool   li_result = false;
//----
    for (int li_int = 0; li_int < 2; li_int++)
    {
        ls_Name = gsa_Name_Line[li_int];
        if (DelObject (ls_Name))
        {li_result = true;}
    }
//----
    return (li_result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ïîëó÷àåì çíà÷åíèå öåíû äëÿ óêàçàííîãî áàðà ñ ïîïðàâêîé                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fObjectGetValue_ByCurrent (string fs_Name, int fi_Shift = 0)
{
    double ld_Price = ObjectGetValueByShift (fs_Name, fi_Shift);
//----
    if (ld_Price != 0)
    {return (NDDl (ld_Price + fObjectGetDelta_ByCurrent (fs_Name)));}
    else {return (0);}
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Âû÷èñëÿåì ïîïðàâêó â "áàðàõ"                                               |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fObjectGetDelta_PerBar (string fs_Name)
{ 
   double ld_Price1 =  ObjectGet (fs_Name, OBJPROP_PRICE1),
          ld_Price2 = ObjectGet (fs_Name, OBJPROP_PRICE2);
   int    li_shift1 = ObjectGetShiftByValue (fs_Name, ld_Price1),
          li_shift2 = ObjectGetShiftByValue (fs_Name, ld_Price2),
          li_minus = li_shift1 - li_shift2;
   //---- Åñëè íå ãîðèçîíòàëüíàÿ ëèíèÿ
   if (li_minus != 0)
   {double delta = (ld_Price2 - ld_Price1) / li_minus;}
   return (NDDl (delta));
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Âû÷èñëÿåì ïîïðàâêó â çíà÷åíèÿõ öåíû                                        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fObjectGetDelta_ByCurrent (string fs_Name)
{ 
    double ld_deltaTime = TimeCurrent() - iTime (Symbol(), 0, 0),
           ld_TF = 60 * Period(),
           delta = fObjectGetDelta_PerBar (fs_Name),
           delta_ByCurrent = delta * (ld_deltaTime / ld_TF);
    return (NDDl (delta_ByCurrent));
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ñåðâèñíûõ ôóíêöèé                                                         |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ãîòîâèì ê âûâîäó íà ïå÷àòü è íà ãðàôèê êîììåíòàðèè                                |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string fPrepareComment (string sText = "", bool bConditions = false)
{if (bConditions && StringLen (sText) > 0) {return (sText);}}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Âûâîäèì íà ïå÷àòü è íà ãðàôèê êîììåíòàðèè                                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fPrintAndShowComment (string Text, bool Show_Conditions, bool Print_Conditions, string& s_Show[], int ind = -1)
{
    if ((Show_Conditions || Print_Conditions) && StringLen (Text) > 0)
    {
        if (ind >= 0 && Show_Conditions)
        {s_Show[ind] = Text;}
        if (Print_Conditions)
        {Print (Text);}
    }
//---- 
    return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Money Management                                                          |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|           Ãëàâíàÿ ôóíêöèÿ ïîëó÷åíèÿ ðàçìåðà ëîòà (âûçûâàåòñÿ èç ñîâåòíèêà)        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double GetSizeLot (double fd_Lot)
{
    if (!UseMM)
    {return (fd_Lot);}
    double dLot, koef = 1, Money = 0;
//----
    switch (MeansType)
    {
        case 1: Money = AccountBalance(); break;
        case 2: Money = AccountEquity(); break;
        case 3: Money = AccountFreeMargin(); break;
        case 4: Money = RiskDepo; break; 
    }                
    switch (LotsWayChoice)
    {
        case 0: dLot = fd_Lot; break;
        case 1: // ôèêñèðîâàííûé ïðîöåíò îò äåïîçèòà
            koef = Money * AccountLeverage() * LotsPercent / (100000 * 10);
            dLot = fd_Lot * koef;
            break;
        case 2: // ôðàêöèîííî-ïðîïîðöèîíàëüíûé
            int k = LotsDepoForOne;
            for (int i = 2; i <= LotsMax; i++)
            {
                k += i * LotsDeltaDepo;
                if (k > Money)
                {
                    dLot = (i - 1) / 10; 
                    break;
                }
            }
            break;
        case 3: // ôðàêöèîííî-ôèêñèðîâàííûé
            dLot = MathCeil ((Money - LotsDepoForOne) / LotsDeltaDepo) / 10;
            break;
    }

    dLot = NormalizeDouble (dLot, LotDecimal());
    dLot = MathMax (MinLot, dLot);
    dLot = MathMin (MaxLot, dLot);
//----
    return (dLot);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Ïðîèçâîäèì íîðìàëèçàöèþ ëîòà                                                |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fLotsNormalize (double fd_Lots, int fi_Ticket = 0)
{
    fd_Lots -= MarketInfo (Symbol(), MODE_MINLOT);
    fd_Lots /= MarketInfo (Symbol(), MODE_LOTSTEP);
    fd_Lots = MathRound (fd_Lots);
    fd_Lots *= MarketInfo (Symbol(), MODE_LOTSTEP);
    fd_Lots += MarketInfo (Symbol(), MODE_MINLOT);
    fd_Lots = NormalizeDouble (fd_Lots, LotDecimal());
    fd_Lots = MathMax (fd_Lots, MarketInfo (Symbol(), MODE_MINLOT));
    fd_Lots = MathMin (fd_Lots, MarketInfo (Symbol(), MODE_MAXLOT));
    //---- Ïðè ÷àñòè÷íîì çàêðûòèè ëîòà íóæíà òàêàÿ ïðîâåðêà íà ïîñëåäíåé ÷àñòè çàêðûòèÿ
    if (fi_Ticket > 0 && OrderLots() > 0)
    {fd_Lots = MathMin (fd_Lots, OrderLots());}
//----
    return (fd_Lots);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ, îïðåäåëåíèÿ ìèíèìàëüíîé ðàçðÿäíîñòè ëîòà                          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int LotDecimal()
{return (MathCeil (MathAbs (MathLog (MarketInfo (gs_Symbol, MODE_LOTSTEP)) / MathLog (10))));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|           Îïðåäåëÿåì âîçìîæíîñòü äàëüíåéøåãî âûñòàâëåíèÿ îðäåðîâ                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCheckMargin (string& fs_Info,          // âîçâðàùàåìûé êîììåíòàðèé
                   double fd_BeginBalance,   // íà÷àëüíûé ðàçìåð äåïî
                   int fi_StopMarginPercent, // äîïóñòèìûé ðàçìåð çàëîãà â %
                   int fi_RiskDepoPercent)   // ìàêñèìàëüíûé ðàçìåð ëîññà â %
{
    bool Zapret, StopMargin, StopBalance, lb_Pause = False;
    string ls_prichina, ls_fName = "CheckMargin()";
//----
    StopMargin = AccountFreeMargin() / AccountEquity() * 100 <= fi_StopMarginPercent;
    StopBalance = AccountBalance() / fd_BeginBalance * 100 <= fi_RiskDepoPercent;
    Zapret = (StopMargin || StopBalance);    
    if (IsOptimization())
    {return (Zapret);}
    if (Zapret == true)
    {
        if (!lb_Pause)
        {
            ls_prichina = fPrepareComment ("Äîñòèãëè îãðàíè÷åíèÿ ðàçìåðà ñâîáîäíîé ìàðæè - ïðèîñòàíàâëèâàåì âûñòàâëåíèå îðäåðîâ", StopMargin);
            ls_prichina = fPrepareComment ("Äîñòèãëè äîïóñòèìîãî çíà÷åíèÿ óìåíüøåíèÿ áàëàíñà - ïðèîñòàíàâëèâàåì òîðãîâëþ", StopBalance);
            fs_Info = StringConcatenate (ls_fName, ": ", ls_prichina, " (FreeMargin = $", DS0 (AccountFreeMargin()), "; Equity = $", DS0 (AccountEquity()), ")", "; Balance = $", DS0 (AccountBalance()), "; BeginBalance = $", DS0 (fd_BeginBalance), " (", WindowExpertName(), ").");
        }
        lb_Pause = True;
    }
    else
    {
        if (lb_Pause)
        {fs_Info = StringConcatenate (ls_fName, ": Îãðàíè÷åíèÿ ðàçìåðà ñâîáîäíîé ìàðæè íåò, áàëàíñ â íîðìå - òîðãóåì (FreeMargin = $", DS0 (AccountFreeMargin()), "; Equity = $", DS0 (AccountEquity()), ")", "; Balance = $", DS0 (AccountBalance()), " (", WindowExpertName(), ").");}
        lb_Pause = False;
    }
//----
    return (lb_Pause);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|           Ñëåäèì çà êðèòè÷åñêèì óìåíüøåíèåì ðàçìåðà äåïî                          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fRiskPercentControl (string& sInfo,            // âîçâðàùàåìûé êîììåíòàðèé
                          double dBalance,          // îò êàêîé âåëè÷èíû âåä¸ì ðàñ÷¸ò
                          double dProfit)           // ñîñòîÿíèå ñ÷¸òà
{
    if (dBalance * RiskDepoPercent / 100 < MathAbs (dProfit))
    {
        sInfo = StringConcatenate ("fRiskPercentControl(): Çàêðûâàåì âñå îðäåðà ïî ïðåâûøåíèþ ëîññà çàäàííîìó çàí÷åíèþ RiskDepoPercent! (", WindowExpertName(), ").");
        return (true);
    }
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòà ñ îøèáêàìè                                                         |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|     Ôóíêöèÿ ErrorDescription() âîçâðàùàåò íå êîä îøèáêè à å¸ ñëîâåñòíîå îïèñàíèå  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string ErrorDescription (int error_code)
{
    string error_string;
//---- 
    switch (error_code)
    {
         //---- codes returned from trade server
         case 0:      return ("ÍÅÒ !!!");
         case 1:      error_string = "Ïîïûòêà èçìåíèòü óæå óñòàíîâëåííûå çíà÷åíèÿ òàêèìè æå çíà÷åíèÿìè."; break;
         case 2:      error_string = "Îáùàÿ îøèáêà. Ïðåêðàòèòü âñå ïîïûòêè òîðãîâûõ îïåðàöèé äî âûÿñíåíèÿ îáñòîÿòåëüñòâ."; break;
         case 3:      error_string = "Â òîðãîâóþ ôóíêöèþ ïåðåäàíû íåïðàâèëüíûå ïàðàìåòðû."; break;
         case 4:      error_string = "Òîðãîâûé ñåðâåð çàíÿò."; break;
         case 5:      error_string = "Ñòàðàÿ âåðñèÿ êëèåíòñêîãî òåðìèíàëà."; break;
         case 6:      error_string = "Íåò ñâÿçè ñ òîðãîâûì ñåðâåðîì."; break;
         case 7:      error_string = "Íåäîñòàòî÷íî ïðàâ."; break;
         case 8:      error_string = "Ñëèøêîì ÷àñòûå çàïðîñû."; break;
         case 9:      error_string = "Íåäîïóñòèìàÿ îïåðàöèÿ íàðóøàþùàÿ ôóíêöèîíèðîâàíèå ñåðâåðà."; break;
         case 64:     error_string = "Ñ÷åò çàáëîêèðîâàí. Íåîáõîäèìî ïðåêðàòèòü âñå ïîïûòêè òîðãîâûõ îïåðàöèé."; break;
         case 65:     error_string = "Íåïðàâèëüíûé íîìåð ñ÷åòà."; break;
         case 128:    error_string = "Èñòåê ñðîê îæèäàíèÿ ñîâåðøåíèÿ ñäåëêè."; break;
         case 129:    error_string = "Íåïðàâèëüíàÿ öåíà bid èëè ask, âîçìîæíî, íåíîðìàëèçîâàííàÿ öåíà."; break;
         case 130:    error_string = "Ñëèøêîì áëèçêèå ñòîïû èëè íåïðàâèëüíî ðàññ÷èòàííûå èëè íåíîðìàëèçîâàííûå öåíû â ñòîïàõ (èëè â öåíå îòêðûòèÿ îòëîæåííîãî îðäåðà)."; break;
         case 131:    error_string = "Íåïðàâèëüíûé îáúåì, îøèáêà â ãðàíóëÿöèè îáúåìà."; break;
         case 132:    error_string = "Ðûíîê çàêðûò."; break;
         case 133:    error_string = "Òîðãîâëÿ çàïðåùåíà."; break;
         case 134:    error_string = "Íåäîñòàòî÷íî äåíåã äëÿ ñîâåðøåíèÿ îïåðàöèè."; break;
         case 135:    error_string = "Öåíà èçìåíèëàñü."; break;
         case 136:    error_string = "Íåò öåí."; break;
         case 137:    error_string = "Áðîêåð çàíÿò."; break;
         case 138:    error_string = "Çàïðîøåííàÿ öåíà óñòàðåëà, ëèáî ïåðåïóòàíû bid è ask."; break;
         case 139:    error_string = "Îðäåð çàáëîêèðîâàí è óæå îáðàáàòûâàåòñÿ."; break;
         case 140:    error_string = "Ðàçðåøåíà òîëüêî ïîêóïêà. Ïîâòîðÿòü îïåðàöèþ SELL íåëüçÿ."; break;
         case 141:    error_string = "Ñëèøêîì ìíîãî çàïðîñîâ."; break;
         case 142:    error_string = "Îðäåð ïîñòàâëåí â î÷åðåäü."; break;
         case 143:    error_string = "Îðäåð ïðèíÿò äèëåðîì ê èñïîëíåíèþ."; break;
         case 144:    error_string = "Îðäåð àííóëèðîâàí ñàìèì êëèåíòîì ïðè ðó÷íîì ïîäòâåðæäåíèè ñäåëêè."; break;
         case 145:    error_string = "Ìîäèôèêàöèÿ çàïðåùåíà, òàê êàê îðäåð ñëèøêîì áëèçîê ê ðûíêó è çàáëîêèðîâàí èç-çà âîçìîæíîãî ñêîðîãî èñïîëíåíèÿ."; break;
         case 146:    error_string = "Ïîäñèñòåìà òîðãîâëè çàíÿòà."; break;
         case 147:    error_string = "Èñïîëüçîâàíèå äàòû èñòå÷åíèÿ îðäåðà çàïðåùåíî áðîêåðîì."; break;
         case 148:    error_string = "Êîëè÷åñòâî îòêðûòûõ è îòëîæåííûõ îðäåðîâ äîñòèãëî ïðåäåëà, óñòàíîâëåííîãî áðîêåðîì."; break;
         case 149:    error_string = "Ïîïûòêà îòêðûòü ïðîòèâîïîëîæíóþ ïîçèöèþ ê óæå ñóùåñòâóþùåé â ñëó÷àå, åñëè õåäæèðîâàíèå çàïðåùåíî."; break;
         case 4000:   return ("");
         case 4001:   error_string = "Íåïðàâèëüíûé óêàçàòåëü ôóíêöèè."; break;
         case 4002:   error_string = "Èíäåêñ ìàññèâà - âíå äèàïàçîíà."; break;
         case 4003:   error_string = "Íåò ïàìÿòè äëÿ ñòåêà ôóíêöèé."; break;
         case 4004:   error_string = "Ïåðåïîëíåíèå ñòåêà ïîñëå ðåêóðñèâíîãî âûçîâà."; break;
         case 4005:   error_string = "Íà ñòåêå íåò ïàìÿòè äëÿ ïåðåäà÷è ïàðàìåòðîâ."; break;
         case 4006:   error_string = "Íåò ïàìÿòè äëÿ ñòðîêîâîãî ïàðàìåòðà."; break;
         case 4007:   error_string = "Íåò ïàìÿòè äëÿ âðåìåííîé ñòðîêè."; break;
         case 4008:   error_string = "Íåèíèöèàëèçèðîâàííàÿ ñòðîêà."; break;
         case 4009:   error_string = "Íåèíèöèàëèçèðîâàííàÿ ñòðîêà â ìàññèâå."; break;
         case 4010:   error_string = "Íåò ïàìÿòè äëÿ ñòðîêîâîãî ìàññèâà."; break;
         case 4011:   error_string = "Ñëèøêîì äëèííàÿ ñòðîêà."; break;
         case 4012:   error_string = "Îñòàòîê îò äåëåíèÿ íà íîëü."; break;
         case 4013:   error_string = "Äåëåíèå íà íîëü."; break;
         case 4014:   error_string = "Íåèçâåñòíàÿ êîìàíäà."; break;
         case 4015:   error_string = "Íåïðàâèëüíûé ïåðåõîä."; break;
         case 4016:   error_string = "Íåèíèöèàëèçèðîâàííûé ìàññèâ."; break;
         case 4017:   error_string = "Âûçîâû DLL íå ðàçðåøåíû."; break;
         case 4018:   error_string = "Íåâîçìîæíî çàãðóçèòü áèáëèîòåêó."; break;
         case 4019:   error_string = "Íåâîçìîæíî âûçâàòü ôóíêöèþ."; break;
         case 4020:   error_string = "Âûçîâû âíåøíèõ áèáëèîòå÷íûõ ôóíêöèé íå ðàçðåøåíû."; break;
         case 4021:   error_string = "Íåäîñòàòî÷íî ïàìÿòè äëÿ ñòðîêè, âîçâðàùàåìîé èç ôóíêöèè."; break;
         case 4022:   error_string = "Ñèñòåìà çàíÿòà."; break;
         case 4050:   error_string = "Íåïðàâèëüíîå êîëè÷åñòâî ïàðàìåòðîâ ôóíêöèè."; break;
         case 4051:   error_string = "Íåäîïóñòèìîå çíà÷åíèå ïàðàìåòðà ôóíêöèè."; break;
         case 4052:   error_string = "Âíóòðåííÿÿ îøèáêà ñòðîêîâîé ôóíêöèè."; break;
         case 4053:   error_string = "Îøèáêà ìàññèâà."; break;
         case 4054:   error_string = "Íåïðàâèëüíîå èñïîëüçîâàíèå ìàññèâà-òàéìñåðèè."; break;
         case 4055:   error_string = "Îøèáêà ïîëüçîâàòåëüñêîãî èíäèêàòîðà."; break;
         case 4056:   error_string = "Ìàññèâû íåñîâìåñòèìû."; break;
         case 4057:   error_string = "Îøèáêà îáðàáîòêè ãëîáàëüíûåõ ïåðåìåííûõ."; break;
         case 4058:   error_string = "Ãëîáàëüíàÿ ïåðåìåííàÿ íå îáíàðóæåíà."; break;
         case 4059:   error_string = "Ôóíêöèÿ íå ðàçðåøåíà â òåñòîâîì ðåæèìå."; break;
         case 4060:   error_string = "Ôóíêöèÿ íå ïîäòâåðæäåíà."; break;
         case 4061:   error_string = "Îøèáêà îòïðàâêè ïî÷òû."; break;
         case 4062:   error_string = "Îæèäàåòñÿ ïàðàìåòð òèïà string."; break;
         case 4063:   error_string = "Îæèäàåòñÿ ïàðàìåòð òèïà integer."; break;
         case 4064:   error_string = "Îæèäàåòñÿ ïàðàìåòð òèïà double."; break;
         case 4065:   error_string = " êà÷åñòâå ïàðàìåòðà îæèäàåòñÿ ìàññèâ."; break;
         case 4066:   error_string = "Çàïðîøåííûå èñòîðè÷åñêèå äàííûå â ñîñòîÿíèè îáíîâëåíèÿ."; break;
         case 4067:   error_string = "Îøèáêà ïðè âûïîëíåíèè òîðãîâîé îïåðàöèè."; break;
         case 4099:   error_string = "Êîíåö ôàéëà."; break;
         case 4100:   error_string = "Îøèáêà ïðè ðàáîòå ñ ôàéëîì."; break;
         case 4101:   error_string = "Íåïðàâèëüíîå èìÿ ôàéëà."; break;
         case 4102:   error_string = "Ñëèøêîì ìíîãî îòêðûòûõ ôàéëîâ."; break;
         case 4103:   error_string = "Íåâîçìîæíî îòêðûòü ôàéë."; break;
         case 4104:   error_string = "Íåñîâìåñòèìûé ðåæèì äîñòóïà ê ôàéëó."; break;
         case 4105:   error_string = "Íè îäèí îðäåð íå âûáðàí."; break;
         case 4106:   error_string = "Íåèçâåñòíûé ñèìâîë."; break;
         case 4107:   error_string = "Íåïðàâèëüíûé ïàðàìåòð öåíû äëÿ òîðãîâîé ôóíêöèè."; break;
         case 4108:   error_string = "Íåâåðíûé íîìåð òèêåòà."; break;
         case 4109:   error_string = "Òîðãîâëÿ íå ðàçðåøåíà. Íåîáõîäèìî âêëþ÷èòü îïöèþ Ðàçðåøèòü ñîâåòíèêó òîðãîâàòü â ñâîéñòâàõ ýêñïåðòà."; break;
         case 4110:   error_string = "Äëèííûå ïîçèöèè íå ðàçðåøåíû. Íåîáõîäèìî ïðîâåðèòü ñâîéñòâà ýêñïåðòà."; break;
         case 4111:   error_string = "Êîðîòêèå ïîçèöèè íå ðàçðåøåíû. Íåîáõîäèìî ïðîâåðèòü ñâîéñòâà ýêñïåðòà."; break;
         case 4200:   error_string = "Îáúåêò óæå ñóùåñòâóåò."; break;
         case 4201:   error_string = "Çàïðîøåíî íåèçâåñòíîå ñâîéñòâî îáúåêòà."; break;
         case 4202:   error_string = "Îáúåêò íå ñóùåñòâóåò."; break;
         case 4203:   error_string = "Íåèçâåñòíûé òèï îáúåêòà."; break;
         case 4204:   error_string = "Íåò èìåíè îáúåêòà."; break;
         case 4205:   error_string = "Îøèáêà êîîðäèíàò îáúåêòà."; break;
         case 4206:   error_string = "Íå íàéäåíî óêàçàííîå ïîäîêíî."; break;
         case 4207:   error_string = "Îøèáêà ïðè ðàáîòå ñ îáúåêòîì."; break;
    }  
//---- 
    return (error_string);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|     Ïîëó÷àåì íîìåð è îïèñàíèå ïîñëåäíåé îøèáêè è âûâîäèì â ìàññèâ êîììåíòîâ       |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGetLastError (string& Comm_Error, string Com = "")
{
    int err = GetLastError();
    string ls_err;
//---- 
    if (err > 0 && err != 4202)
    {
        ls_err = StringConcatenate (Com, ": Îøèáêà ¹ ", err, ": ", ErrorDescription (err));
        Print (ls_err);
        Comm_Error = ls_err;
    }
//---- 
    return (err);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòà ïî âðåìåíè                                                         |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|         Ôóíêöèÿ, êîíòðîëèðóþùàÿ âðåìÿ ðàáîòû ñîâåòíèêà                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool IsTradeTime (int OpenHour, int CloseHour)
{
    if (!TimeControl)
    {return (true);}
    if (OpenHour < CloseHour && (TimeHour (GetTime()) < OpenHour || TimeHour (GetTime()) >= CloseHour))
    {return (FALSE);}
    if (OpenHour > CloseHour && (TimeHour (GetTime()) < OpenHour && TimeHour (GetTime()) >= CloseHour))
    {return (FALSE);}
    if (OpenHour == 0)
    {CloseHour = 24;}
    if (TimeHour (GetTime()) == CloseHour - 1 && Minute() >= gi_min)
    {return (FALSE);}
//----
    return (TRUE);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|         Â âûõîäíûå íå çàïðàøèâàåì êîòèðîâêè ó ñåðâåðà                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool ServerWork()
{     
    if (DayOfWeek() == 0 || DayOfWeek() == 6)
    {return (false);}
    else
    {return (true);}
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
datetime GetTime()
{
    datetime ldt_Time;
    if (IsOptimization() || IsTesting())
    {ldt_Time = iTime (Symbol(), PERIOD_M1, 0);}
    else
    {ldt_Time = GetTimeGMT();}
//----
    return (ldt_Time);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string FormatDateTime (int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec)
{
    string sMonth, sDay, sHour, sMin, sSec;
//----
    sMonth = 100 + nMonth;
    sMonth = StringSubstr (sMonth, 1);
    sDay = 100 + nDay;
    sDay = StringSubstr (sDay, 1);
    sHour = 100 + nHour;
    sHour = StringSubstr (sHour, 1);
    sMin = 100 + nMin;
    sMin = StringSubstr (sMin, 1);
    sSec = 100 + nSec;
    sSec = StringSubstr (sSec, 1);
//----
    return (StringConcatenate (nYear, ".", sMonth, ".", sDay, " ", sHour, ":", sMin, ":", sSec));
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
datetime GetTimeGMT()
{
    int TimeArray[4];
    int nYear, nMonth, nDay, nHour, nMin, nSec;
    int TZInfoArray[43];
//----
    GetLocalTime (TimeArray);

    nYear = TimeArray[0]&0x0000FFFF;
    nMonth = TimeArray[0]>>16;
    nDay = TimeArray[1]>>16;
    nHour = TimeArray[2]&0x0000FFFF;
    nMin = TimeArray[2]>>16;
    nSec = TimeArray[3]&0x0000FFFF;
   
    string st = FormatDateTime (nYear, nMonth, nDay, nHour, nMin, nSec);
    datetime d = StrToTime (st);
    int gmt_shift = 0;
    int ret = GetTimeZoneInformation (TZInfoArray);
    if (ret != 0)
    {gmt_shift = TZInfoArray[0];}
    if (ret == 2)
    {gmt_shift += TZInfoArray[42];}
//----
    return (d + gmt_shift * 60);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòà ñ OBJECT_HLINE (Virtual Trader)                                    |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Îñíîâíîé êîä áèáëèîòåêè                                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fVirtualTrade (double ar_Price[], int fi_MG, bool fb_RealTrade)
{
    if (!VirtualOrders_ON)
    {return (0);}
    int    err = GetLastError();
    string ls_txt = "";
//----
    //---- Ïðîâåðÿåì íàëè÷èå óïðàâëÿþùèõ ëèíèé
    gb_NewLine = fCheckMyLine (gsa_Name_Line);
    if (!gb_NewLine)
    {
        ArrayInitialize (gba_IsLine, 0);
        return (0);
    }
    //---- Ïðè íåäîñòàòêå ñâîáîäíîé ìàðæè - áîëüøå îðäåðîâ íå âûñòàâëÿåì !!!
    gb_Pause = fCheckMargin (ls_txt, AccountBalance(), StopMarginPercent, RiskDepoPercent);
    fPrintAndShowComment (ls_txt, DrawObject_ON, PrintCom && fCCV_I (gb_Pause, 2), gsa_Comment, 2);
    //---- Íåïîñðåäñòâåííî ñàì Virtual Trading
    if (!gb_Pause && gi_MyOrders == 0)
    {fSendOrdersFromLine (gs_Symbol, gda_SendLevel, ar_Price, fi_MG, fb_RealTrade);}
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
	 fGetLastError (gs_ComError, "fVirtualTrade()");
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ïðîâåðÿåì íàëè÷èå íà ãðàôèêå óïðàâëÿþùèõ ëèíèé                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCheckMyLine (string ar_MyLine[])
{
    int li_Total = ObjectsTotal();
    string ls_Name;
    for (int li_OBJ = li_Total - 1; li_OBJ >= 0; li_OBJ--)
    {
        ls_Name = ObjectName (li_OBJ);
        for (int li_LN = 0; li_LN < ArraySize (ar_MyLine); li_LN++)
        {
            //---- Èùåì íóæíóþ ëèíèþ
            if (ls_Name == ar_MyLine[li_LN])
            {return (true);}
        }
    }
    return (false);
}

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ïðîâåðÿåì íà òðàíñôîðìàöèþ îòðàáîòàííîé ëèíèè                              |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCheckChangeLine (string fs_Name, int fi_type_OBJ, double& ar_TimeLine[])
{
    string ls_txt, ls_fName = "fCheckChangeLine()";
    double lda_TimeLine[2];
//----
    lda_TimeLine[0] = ObjectGet (fs_Name, IIFd ((fi_type_OBJ == 0), OBJPROP_PRICE1, OBJPROP_TIME1));
    lda_TimeLine[1] = ObjectGet (fs_Name, IIFd ((fi_type_OBJ == 0), OBJPROP_PRICE1, OBJPROP_TIME2));
    if (lda_TimeLine[0] != ar_TimeLine[0] || lda_TimeLine[1] != ar_TimeLine[1])
    {
        ls_txt = fPrepareComment (StringConcatenate (ls_fName, ": Ëèíèÿ ", fs_Name, " â ðàáîòå."), gb_InfoPrint);
        fPrintAndShowComment (ls_txt, DrawObject_ON, PrintCom, gsa_Comment, 1);
        ar_TimeLine[0] = lda_TimeLine[0];
        ar_TimeLine[1] = lda_TimeLine[1];
        return (true);
    }
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  Èíèöèàëèçàöèÿ áèáëèîòåêè                                         |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fInitVirtualTrade()
{
    //---- ïîãðåøíîñòü ðèñîâàíèÿ îáúåêòîâ íà ãðàôèêå ñ ðàçíûìè TF
    int lia_Value_draw[] = {8,12,16,20,26,50,80,100,140};
//----
    gd_area = NDP (Reliable_Area * gi_Decimal);
    //---- Çàïîëíÿåì ìàññèâ èì¸í ëèíèé
    gsa_Name_Line[0] = Name_BUY_Line;
    gsa_Name_Line[1] = Name_SELL_Line;
    ArrayInitialize (gda_SendLevel, -1.0);
    gd_Value_draw = NDP (lia_Value_draw[gi_chart_Period] * gi_Decimal);
    gb_Virtual_Trade = VirtualOrders_ON;
    InitializeArray_STR (gsa_Comment);
//----
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Îòêðûâàåì îðäåðà ïî Line íà ãðàôèêàõ                                       |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fSendOrdersFromLine (string fs_Symbol,        // ðàáî÷èé ñèìâîë
                          double& ar_curLevel[],   // ìàññèâ ïàðàìåòðîâ óïðàâëÿþùåãî óðîâíÿ
                          double ar_Price[2],      // ìàññèâ öåí ïî ðàáî÷åìó èíñòðóìåíòó
                          int fi_MG,               // ìàãèê
                          bool fb_RealTrade)       // ôëàã ðåàëüíîé òîðãîâëè
{
    int    cmd, li_Ticket, cur_Type, li_NUM, err = GetLastError();
    double ld_PriceOpen, ld_Price, ld_SL, ld_TP, ld_deltaPrice, lda_STOPs[2];
    bool   lb_Send;
    static int cnt;
    string ls_txt, ls_txt1 = "", ls_Name, ls_fName = "fSendOrdersFromLine()";
//----
    //---- Ñ÷èòûâàåì óðîâåíü îòêðûòèÿ îðäåðà
    fGetLevelFromLine (ar_curLevel, ar_Price, fb_RealTrade);
    cur_Type = -1;
    lb_Send = false;
    //---- Ïðîâåðÿåì óñëîâèÿ íà îòêðûòèå îðäåðà
    if (ar_curLevel[0] > 0)
    {
        ld_PriceOpen = ar_curLevel[0];
        cur_Type = ar_curLevel[1];
        cmd = IIFi ((cur_Line == Line_BUY), 1, 0);
        ld_Price = ar_Price[cmd];
        gc_color = gca_color[cur_Type];
        switch (Variant_Send)
        {
            case 0:
                switch (cur_Type)
                {
                    case OP_BUYSTOP:
                    case OP_SELLLIMIT:
                        if (ld_Price > ld_PriceOpen)
                        {lb_Send = true;}
                        break;
                    case OP_BUYLIMIT:
                    case OP_SELLSTOP:
                        if (ld_Price < ld_PriceOpen)
                        {lb_Send = true;}
                        break;
                }
                break;
            case 1:
                switch (cur_Type)
                {
                    case OP_BUYSTOP:
                        if (ld_Price > ld_PriceOpen)
                        {
                            if (ld_Price > ld_PriceOpen + gd_area)
                            {lb_Send = true;}
                            else
                            {ar_curLevel[2] = cur_Type;}
                        }
                        break;
                    case OP_BUYLIMIT:
                        if (ld_Price < ld_PriceOpen)
                        {
                            if (fCCV_I (cur_Type, 0))
                            {
                                ar_curLevel[2] = cur_Type;
                                ls_txt1 = fPrepareComment (StringConcatenate (ls_fName, ": Åñòü óñëîâèÿ äëÿ îòêðûòèÿ ", GetNameOP (cur_Type), " îðäåðà. Æä¸ì ðàçâîðîòà ðûíêà. PriceOpen = ", DSD (ld_PriceOpen)), gb_InfoPrint);
                                //---- Ðèñóåì íà ÷àðòå ñòðåëî÷êó
                                ls_Name = "ar" + cnt;
                                fCreat_OBJ (ls_Name, OBJ_ARROW, 233, (GetNameOP (cur_Type) + "/" + cur_Line), 0, Time[0], ld_Price, false, gc_color);
                                cnt++;
                            }
                            //---- Äâèãàåì ëèíèþ çà öåíîé (åñëè çàäàíî)
                            if (TrailPrice_ON && ld_Price < ld_PriceOpen - gd_area)
                            {
                                ld_deltaPrice = NDD (ld_PriceOpen - gd_area - ld_Price);
                                if (fMooveLineByPrice (gsa_Name_Line[cur_Line], ld_deltaPrice, ar_curLevel, ld_PriceOpen, ld_Price))
                                {ls_txt1 = fPrepareComment (StringConcatenate (ls_fName, ": Òðàëèì óðîâåíü ", GetNameOP (cur_Type), " îðäåðà çà öåíîé. Æä¸ì ðàçâîðîòà ðûíêà. PriceOpen = ", DSD (ld_PriceOpen), "; Price = ", DSD (ld_Price)), gb_InfoPrint);}
                            }
                        }
                        if (ar_curLevel[2] == cur_Type && ld_Price > ld_PriceOpen + gd_area)
                        {lb_Send = true;}
                        break;
                    case OP_SELLSTOP:
                        if (ld_Price < ld_PriceOpen)
                        {
                           if (ld_Price < ld_PriceOpen - gd_area)
                           {lb_Send = true;}
                           else
                           {ar_curLevel[2] = cur_Type;}
                        }
                        break;
                    case OP_SELLLIMIT:
                        if (ld_Price > ld_PriceOpen)
                        {
                            if (fCCV_I (cur_Type, 0))
                            {
                                ar_curLevel[2] = cur_Type;
                                ls_txt1 = fPrepareComment (StringConcatenate (ls_fName, ": Åñòü óñëîâèÿ äëÿ îòêðûòèÿ ", GetNameOP (cur_Type), " îðäåðà. Æä¸ì ðàçâîðîòà ðûíêà. PriceOpen = ", DSD (ld_PriceOpen)), gb_InfoPrint);
                                //---- Ðèñóåì íà ÷àðòå ñòðåëî÷êó
                                ls_Name = "ar" + cnt;
                                fCreat_OBJ (ls_Name, OBJ_ARROW, 234, (GetNameOP (cur_Type) + "/" + cur_Line), 0, Time[0], ld_Price, false, gc_color);
                                cnt++;
                            }
                            //---- Äâèãàåì ëèíèþ çà öåíîé (åñëè çàäàíî)
                            if (TrailPrice_ON && ld_Price > ld_PriceOpen + gd_area)
                            {
                                ld_deltaPrice = NDD (ld_Price - ld_PriceOpen - gd_area);
                                if (fMooveLineByPrice (gsa_Name_Line[cur_Line], ld_deltaPrice, ar_curLevel, ld_PriceOpen, ld_Price))             // öåíà
                                {ls_txt1 = fPrepareComment (StringConcatenate (ls_fName, ": Òðàëèì óðîâåíü ", GetNameOP (cur_Type), " îðäåðà çà öåíîé. Æä¸ì ðàçâîðîòà ðûíêà. PriceOpen = ", DSD (ld_PriceOpen), "; Price = ", DSD (ld_Price)), gb_InfoPrint);}
                            }
                        }
                        if (ar_curLevel[2] == cur_Type && ld_Price < ld_PriceOpen - gd_area)
                        {lb_Send = true;}
                        break;
                }
                break;
        }
    }
    //---- Âûâîäèì êîììåíòàðèè
    fPrintAndShowComment (ls_txt1, DrawObject_ON, PrintCom, gsa_Comment, 1);
    //---- Âûâîäèì îòëàäî÷íóþ èíôîðìàöèþ
    gsa_Comment[4] = fPrepareComment (StringConcatenate ("PriceOpen = ", DSD (ld_PriceOpen), "; Type = ", GetNameOP (ar_curLevel[1]), "; flag = ", IIFs ((ar_curLevel[2] == 0), "NO", GetNameOP (ar_curLevel[2]))), gb_Control);
    if (lb_Send)
    {
        if (cur_Type > 0)
        {cur_Type = IIFi ((cur_Type == OP_BUYSTOP || cur_Type == OP_BUYLIMIT), OP_BUY, OP_SELL);}
        //---- Ôîðìèðóåì ÑÒÎÏÛ
        cmd = IIFi ((cur_Type == 0), 1, -1);
        li_NUM = fCheckMyMagic (fi_MG, gia_MG);
        fGetSTOPs (lda_STOPs, cur_Type, li_NUM);
        ld_SL = lda_STOPs[0];
        ld_TP = lda_STOPs[1];
        RefreshRates();
        if (cur_Type == OP_BUY) {ld_Price = Ask;} else {ld_Price = Bid;}
        li_Ticket = OrderSend (fs_Symbol, cur_Type, NDDig (GetSizeLot (Order_Lots)), ld_Price, Slippage, ld_SL, ld_TP, "", fi_MG, 0, gc_color);
        if (li_Ticket > 0)
        {
            //---- Ñáðàñûâàåì ñîñòîÿíèå "flat"
            if (li_NUM == 1)
            {gb_flat = false;}
            pre_Type = ar_curLevel[1];
            gb_NewLine = false;
            ArrayInitialize (ar_curLevel, -1.0);
            fCCV_I (cur_Type, 0);
            if (!IsOptimization())
            {
                gsa_Comment[2] = fPrepareComment (StringConcatenate ("Îòêðûëè ", GetNameOP (cur_Type), "-îðäåð[", li_Ticket, "] (", fi_MG, ")."), DrawObject_ON);
                ls_txt = fPrepareComment (StringConcatenate (ls_fName, ": Îòêðûëè ", GetNameOP (cur_Type), "-îðäåð[", li_Ticket, "] SL[", MathAbs (ld_Price - ld_SL) / gd_Point, "] = ", DSD (ld_SL), "; TP[", IIFs ((ld_TP == 0), 0, DS0 (MathAbs (ld_Price - ld_TP) / gd_Point)), "] = ", DSD (ld_TP), "; LevelPrice = ", DSD (ld_PriceOpen), "; Price = ", DSD (ld_Price), " (", fi_MG, ")"), PrintCom);
                if (PrintCom) {Print (ls_txt);}
                //---- Àííóëèðóåì îòðàáîòàííóþ ëèíèþ
                ls_Name = gsa_Name_Line[cur_Line];
                //---- Óäàëÿåì "îòðàáîòàííóþ" ëèíèþ (åñëè çàäàíî)
                if (DeleteInActiveLine)
                {
                    if (DelObject (ls_Name))
                    {ls_txt1 = "Óäàëèëè îòðàáîòàííóþ ëèíèþ !!!";}
                }
                else
                {
                    ObjectSet (ls_Name, OBJPROP_COLOR, White);
                    gda_TimeOfLine[0] = ObjectGet (ls_Name, IIFd ((Variant_Line == 0), OBJPROP_PRICE1, OBJPROP_TIME1));
                    gda_TimeOfLine[1] = ObjectGet (ls_Name, IIFd ((Variant_Line == 0), OBJPROP_PRICE1, OBJPROP_TIME2));
                }
                ls_Name = "RAY_Price";
                DelObject (ls_Name);
                fGetLastError (gs_ComError, ls_fName + 1);
                ls_txt1 = fPrepareComment (StringConcatenate (ls_fName, ": ", ls_txt1, " Óäàëèëè ëèíèþ ", ls_Name, "."), gb_InfoPrint);
                fPrintAndShowComment (ls_txt1, DrawObject_ON, PrintCom, gsa_Comment, 1);
                if (OrderSelect (li_Ticket, SELECT_BY_TICKET))
                {OrderPrint();}
            }
            cur_Line = -1;
        }
        else
        {
            gs_ComError = fPrepareComment (StringConcatenate (ls_fName, ": Îøèáêà ïðè îòêðûòèè ", GetNameOP (cur_Type), "-îðäåðà. SL[", MathAbs (ld_Price - ld_SL) / gd_Point, "] = ", DSD (ld_SL), "; TP[", IIFs ((ld_TP == 0), 0, DS0 (MathAbs (ld_Price - ld_TP) / gd_Point)), "] = ", DSD (ld_TP), "; LevelPrice = ", DSD (ld_PriceOpen), "; Price = ", DSD (ld_Price), "; flat = ", CheckBOOL (gb_flat), " (", fi_MG, ")"), gb_InfoPrint);
            if (PrintCom) {Print (gs_ComError);}
        }
    }
    fGetLastError (gs_ComError, ls_fName);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Äâèãàåì ëèíèþ çà öåíîé                                                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fMooveLineByPrice (string fs_Name,               // èìÿ ïåðåäâèãàåìîé ëèíèè
                        double fd_Distance,           // ðàññòîÿíèå ïåðåäâèæåíèÿ
                        double& ar_cur_Level[],       // ìàññèâ çíà÷åíèé ïåðåäâèãàåìîãî óðîâíÿ
                        double& fd_OpenPrice,         // OpenPrice
                        double fd_Price)              // öåíà
{
    double lda_Price[2];
    string ls_fName = "fMooveLineByPrice()";
    int    li_cmd, err = GetLastError();
    bool   lb_result = false;
//----
    li_cmd = IIFi ((fd_Price < fd_OpenPrice), 1, -1);
    switch (Variant_Line)
    {
        case 0: lb_result = ObjectSet (fs_Name, OBJPROP_PRICE1, fd_Price + gd_area * li_cmd); break;
        case 1:
            lda_Price[0] = ObjectGet (fs_Name, OBJPROP_PRICE1);
            lda_Price[1] = ObjectGet (fs_Name, OBJPROP_PRICE2);
            ObjectSet (fs_Name, OBJPROP_PRICE1, lda_Price[0] - fd_Distance * li_cmd);
            lb_result = ObjectSet (fs_Name, OBJPROP_PRICE2, lda_Price[1] - fd_Distance * li_cmd);
            break;
    }
    if (Variant_Line == 0) {fd_OpenPrice = ObjectGet (fs_Name, OBJPROP_PRICE1);} else {fd_OpenPrice = fObjectGetValue_ByCurrent (fs_Name);}
    ar_cur_Level[0] = fd_OpenPrice;
    if (!lb_result)
    {if (PrintCom) Print ("Ïåðåìåñòèòü ëèíèþ ", fs_Name, " íå óäàëîñü. Price = ", DSD (fd_Price), " -> ", DSD (fd_Price + gd_area * li_cmd));}
    fGetLastError (gs_ComError, ls_fName);
    return (lb_result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Ïðîâåðÿåì íàëè÷èå óïðàâëÿþùåé ëèíèè è ôèêñèðóåì çàäàííûé óðîâåíü            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fGetLevelFromLine (double& ar_Level[],    // âîçâðàùàåìûé ìàññèâ ïàðàìåòðîâ óïðàâëÿþùåãî óðîâíÿ
                        double ar_Price[],     // àêòóàëüíûé ìàññèâ öåí ïî èíñòðóìåíòó
                        bool fb_RealTrade)     // ôëàã ðåàëüíîé òîðãîâëè
{
    int    cmd, li_cmd, li_Type = -1, li_Total = ObjectsTotal(), err = GetLastError();
    double ld_PriceOpen, ld_PriceOP_area;
    string ls_Name, ls_Type, ls_delta_Price, ls_txt = "", ls_txt1, ls_fName;
    color  lca_color[] = {Blue,Red}, lc_color;
    bool   lb_break = false;
    datetime ldt_curTime;
    ls_fName = "fGetLevelFromLine()";
//----
    if (cur_Line < 0)
    {ls_txt = "Íåò àêòèâíîé ëèíèè !!!";}
    ls_txt1 = ls_fName + ": Íàøëè óðîâåíü äëÿ îòêðûòèÿ îðäåðà-";
    for (int li_OBJ = li_Total - 1; li_OBJ >= 0; li_OBJ--)
    {
        ls_Name = ObjectName (li_OBJ);
        for (int li_LN = 0; li_LN < 2; li_LN++)
        {
            cmd = IIFi ((li_LN == 0), 1, 0);
            //---- Èùåì íóæíóþ ëèíèþ
            if (ls_Name == gsa_Name_Line[li_LN])
            {
                //---- Èñêëþ÷àåì ïîâòîðíîå ñðàáàòûâàíèå ëèíèè
                if (!gb_NewLine && !DeleteInActiveLine)
                {
                    if (fCheckChangeLine (ls_Name, Variant_Line, gda_TimeOfLine))
                    {gb_NewLine = true;}
                }
                if (!gb_NewLine)
                {continue;}
                ld_PriceOpen = IIFd ((Variant_Line == 0), ObjectGet (ls_Name, OBJPROP_PRICE1), fObjectGetValue_ByCurrent (ls_Name));
                cur_Line = gia_Line[li_LN];
                ar_Level[0] = ld_PriceOpen;
                //---- Ðèñóåì ëó÷ äëÿ îòîáðàæåíèÿ óðîâíÿ OpenPrice
                fCreat_OBJ ("RAY_Price", OBJ_TREND, 0, "", 0, Time[0], ld_PriceOpen, true, Yellow, Time[0] + Period() * 60, ld_PriceOpen);
                //---- Ðèñóåì íàçâàíèå îòêðûâàåìîãî îðäåðà
                ls_txt = gsa_Name_ORD[cur_Line];
                fCreat_OBJ ("Name_ORD", OBJ_TEXT, 0, ls_txt, 10, Time[0] + Period() * 300, ld_PriceOpen + gd_Value_draw, false, gca_color[cur_Line]);
                //---- Ðèñóåì òåêóùóþ öåíó îòêðûòèÿ îðäåðà
                li_cmd = IIFi ((ar_Level[1] >= 0), IIFi ((ar_Level[1] == OP_BUYLIMIT || ar_Level[1] == OP_SELLSTOP), 1, -1), 0);
                ls_delta_Price = DS0 ((ar_Price[cmd] - ld_PriceOpen) / gd_Point * li_cmd);
                ls_txt = StringConcatenate  (DSD (ld_PriceOpen), " (", ls_delta_Price, ")");
                //---- Îðãàíèçóåì ìèãàíèå öâåòà ïðè íàõîæäåíèè öåíû â "çîíå âèäèìîñòè" óðîâíÿ
                lc_color = IIFc ((ar_Price[cmd] > ld_PriceOpen + gd_area || ar_Price[cmd] < ld_PriceOpen - gd_area), Gold, IIFc (fMigalka(), Gold, Gray));
                fCreat_OBJ ("Value_Price", OBJ_TEXT, 0, ls_txt, 12, Time[0] + Period() * 900, ld_PriceOpen - gd_Value_draw, false, lc_color);
                //---- Ðèñóåì ãðàíèöû "âèäèìîñòè" óðîâíÿ
                for (int li_int = 0; li_int < 2; li_int++)
                {
                    li_cmd = IIFi ((li_int == 1), 1, -1);
                    ld_PriceOP_area = ld_PriceOpen + gd_area * li_cmd;
                    fCreat_OBJ ("RAY_Price_area_" + li_int, OBJ_TREND, 0, "", 0, Time[0], ld_PriceOP_area, false, lc_color, Time[4], ld_PriceOP_area);
                }
                ls_txt = StringConcatenate  (GetNameOP (ar_Level[1]), " ", IIFs ((ar_Price[cmd] <= ld_PriceOpen), "UP", "DW"), "#", DSD (ld_PriceOpen), " !!! ");
                fPrintAndShowComment (StringConcatenate ("Æä¸ì îòêðûòü îðäåð-", ls_txt), DrawObject_ON, False, gsa_Comment, 0);
                //---- Ïîäêðàøèâàåì ëèíèþ â íóæíûé öâåò
                ObjectSet (ls_Name, OBJPROP_COLOR, lca_color[li_LN]);
                //---- Ôèêñèðóåì âðåìÿ æèçíè ëèíèè (åñëè çàäàíî)
                ls_txt = ObjectDescription (ls_Name);
                if (StringLen (ls_txt) > 0)
                {
                    ar_Level[3] = StrToTime (ls_txt);
                    //---- Ïðîâåðÿåì ëèíèþ íà "ïðàâî æèçíè"
                    if (ar_Level[3] > 0)
                    {
                        ldt_curTime = IIFi (fb_RealTrade, TimeCurrent(), iTime (gs_Symbol, 1, 0));
                        if (ldt_curTime > ar_Level[3])
                        {
                            //---- Óäàëÿåì ëèíèþ ïî èñòå÷åíèþ "âðåìåíè æèçíè"
                            if (ObjectDelete (ls_Name))
                            {
                                ls_txt = fPrepareComment (StringConcatenate  (ls_fName, ": Óäàëèëè ëèíèþ ", ls_Name, " ïî èñòå÷åíèþ ñðîêà æèçíè !!! Expiration = ", TS_DM (ar_Level[3]), "; Time = ", TS_DM (ldt_curTime), "."), gb_InfoPrint);
                                fPrintAndShowComment (ls_txt, DrawObject_ON, PrintCom, gsa_Comment, 1);
                                return (false);
                            }
                        }
                    }
                }
                if (gs_pre_Name != ls_Name || ar_Level[1] <= 0)
                {
                    if (ar_Price[cmd] > ld_PriceOpen)
                    {ar_Level[1] = IIFi ((li_LN == 0), OP_BUYLIMIT, OP_SELLSTOP);}
                    if (ar_Price[cmd] < ld_PriceOpen)
                    {ar_Level[1] = IIFi ((li_LN == 0), OP_BUYSTOP, OP_SELLLIMIT);}
                    ls_txt = StringConcatenate  (GetNameOP (ar_Level[1]), " ", IIFs ((ar_Price[cmd] <= ld_PriceOpen), "UP", "DW"), "#", DSD (ld_PriceOpen), " !!! ");
                    fPrintAndShowComment (StringConcatenate ("Æä¸ì îòêðûòü îðäåð-", ls_txt), DrawObject_ON, False, gsa_Comment, 0);
                    gs_pre_Name = ls_Name;
                }
                lb_break = true;
                break;
            }
        }
        if (lb_break)
        {break;}
    }
    if (ls_txt != "" && PrintCom)
    {
        ls_txt1 = StringConcatenate (ls_txt1, ls_txt);
        if (fCCV_I (ar_Level[1], 1))
        {Print (IIFs ((cur_Line < 0), ls_txt, ls_txt1));}
    }
    if (DrawObject_ON && !lb_break)
    {gsa_Comment[0] = ls_txt;}
    fGetLastError (gs_ComError, ls_fName);
    return (lb_break);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---