e-PSIeVirtualTrader1_25

Author: Copyright � 2011, TarasBY WM Z670270286972
Orders Execution
Checks for the total of open orders
0 Views
0 Downloads
0 Favorites
e-PSIeVirtualTrader1_25
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                           e-PSI@VirtualTrader.mq4 |
//|                                                         Copyright © 2011, TarasBY |
//|                                                                taras_bulba@tut.by |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
#property copyright "Copyright © 2011, TarasBY WM Z670270286972"
#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                       = 880;              // Ìàãèê: -1 - ëþáîé, >= 0 - îòêðûòûé ñîâåòíèêîì èëè âðó÷íóþ
extern bool   WhileTrade_ON            = FALSE;            // Ðàáîòà ñîâåòíèêà â öèêëå
extern bool   PrintCom                 = TRUE;             // Ïå÷àòàòü êîììåíòàðèé.
extern bool   ShowCommentInChart       = TRUE;             // Ïîêàçûâàòü êîììåíòàðèè íà ãðàôèêå.
extern string Order_Comment            = "VirtualTrader";  // Êîììåíòàðèé äëÿ îòêðûâàåìîãî îðäåðà
extern bool   VirtualOrders_ON         = TRUE;             // Âêëþ÷åíèå îòêðûòèÿ îðäåðîâ ïî ëèíèÿì íà ãðàôèêå
extern int    Variant_Send             = 1;
// 0 - ïðè ïåðåñå÷åíèè óðîâíÿ - îòêðûâàåì ïî òåêóùåé öåíå îðäåð ïî íàçâàíèþ ëèíèè
// 1 - ïðè ïåðåñå÷åíèè óðîâíÿ: STOP-îðäåðà îòêðûâàåì ïî òåêóùåé öåíå, LIMIT îòêðûâàåì ïîñëå òîãî, êàê öåíà ðàçâåðí¸òñÿ è âûéäåò çà ïðåäåëû "âèäèìîñòè" óðîâíÿ (OpenPrice+-Reliable_Area)
extern int    Variant_Line             = 0;                // 0 - OBJ_HLINE; 1 - OBJ_TREND
extern bool   TrailPrice_ON            = TRUE;             // Òðàëèòü PriceOpen çà öåíîé
extern bool   DeleteInActiveLine       = FALSE;            // Óäàëåíèå "îòðàáîòàííîé" ëèíèè
extern int    NewBarInPeriod           = 1;                // <= 0 - ðàáîòàåì íà íà÷àëå ïåðèîäà íîâîãî áàðà, -1 - ðàáîòàåì íà êàæäîì òèêå
extern int    Reliable_Area            = 20;               // Çîíà â ïï. (äëÿ 4-¸õ çíàêîâ) çà ïðåäåëàõ êîòîðîé (ïîñëå ïåðåñå÷åíèÿ) äîëæíà âûéòè öåíà, ÷òîáû ñîâåòíèê îòêðûë îðäåð - ðàçìåð "âèäèìîñòè" óðîâíÿ
extern int    Order_SL                 = 100;              // SL îðäåðîâ (äëÿ 4-¸õ çíàêîâ)
extern int    Order_TP                 = 100;              // TP îðäåðîâ
extern int    Slippage                 = 2;                // Äîïóñòèìîå îòêëîíåíèå îò çàïðîøåííîé öåíû
extern int    MAX_OredersInSymbol      = 3;                // Ìàêñèìàëüíîå êîëè÷åñòâî îðäåðîâ íà ðàáî÷åì ñèìâîëå
extern string Name_BUY_Line            = "BUY";            // Èìÿ ëèíèè äëÿ îðäåðà BUY
extern string Name_SELL_Line           = "SELL";           // Èìÿ ëèíèè äëÿ îðäåðà SELL
extern string Setup_Lots             = "======== Ïàðàìåòðû ìîäóëÿ ðàñ÷¸òà ëîòà ========";
extern bool   UseMM                    = True;             // Èñïîëüçîâàòü ðàñøèðÿþùèéñÿ ëîò
extern string Setup_LotsWayChoice      = "LotsWayChoice: 0 - ôèêñèð.; 1 - % îò Depo; 2 - ôðàêöèîííî-ïðîïîðö.; 3 - ôðàêöèîííî-ôèêñèð.";
extern int    LotsWayChoice            = 1;                // Ñïîñîá âûáîðà ðàáî÷åãî ëîòà:
                                                           // 0 - ôèêñèðîâàííûé,
                                                           // 1 - ïðîöåíò îò MeansType,
                                                           // 2 - ôðàêöèîííî-ïðîïîðöèîíàëüíûé,
                                                           // 3 - ôðàêöèîííî-ôèêñèðîâàííûé
extern string Setup_MeansType          = "MeansType: 1 - Balance; 2 - Equity; 3 - FreeMargin; 4 - RiskDepo";
extern int    MeansType                = 2;                // Òèï ñðåäñòâ èñïîëüçóåìûõ ïðè ðàñ÷åòå ðàçìåðà ëîòà:
                                                           // 1 - Balance, 
                                                           // 2 - Equity, 
                                                           // 3 - FreeMargin, 
                                                           // 4 - RiskDepo
extern double Order_Lots               = 0.1;              // Ôèêñèðîâàííûé ðàçìåð ëîòà
extern int    LotsPercent              = 7;                // Ïðîöåíò îò MeansType
extern int    LotsDeltaDepo            = 500;              // Êîýôôèöèåíò ïðèðàùåíèÿ äåïîçèòà
extern int    LotsDepoForOne           = 500;              // Ðàçìåð äåïîçèòà äëÿ îäíîãî ìèíèëîòà
extern int    LotsMax                  = 1000;             // Ìàêñèìàëüíîå êîëè÷åñòâî ìèíèëîòîâ
extern double MinLot                   = 0.1;              // Ìèíèìàëüíûé ëîò ðûíî÷íîãî îðäåðà
extern double MaxLot                   = 5.0;              // Ìàêñèìàëüíûé ëîò ðûíî÷íîãî îðäåðà 
extern double RiskDepo                 = 2000.0;           // Ðàçìåð Depo â âàëþòå äåïîçèòà, íà êîòîðûé èãðàåì
extern int    StopMarginPercent        = 50;               // Ïðîöåíò ñâîáîäíîé ìàðæè îò Áàëàíñà ïðè êîòîðîì íîâûå îðäåðà íå âûñòàâëÿþòñÿ
extern int    RiskDepoPercent          = 30;               // Ïðè êàêîì ëîññå îò Depo (â ïðîöåíòàõ) çàêðûâàþòñÿ âñå îðäåðà
extern bool   FULL_Control_ON          = False;            // Ïðè ïîëíîì óäàëåíèè óäàëÿòü ÂÑÅ îðäåðà íà ñ÷åòó (èëè òîëüêî ïî MAGIC)
extern string Setup_Tester          = "=================== Tester ====================";
extern int    Period_CreatHLine        = 240;              // Ñâå÷ó êàêîãî ïåðèîäà áåð¸ì çà "òî÷êó îòñ÷¸òà" (> Period())
extern bool   CreatHLINE_ON            = FALSE;            // Âêëþ÷åíèå îòêðûòèÿ îðäåðîâ ïî HLine íà ãðàôèêå
//IIIIIIIIIIIIIIIIIII======Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà======IIIIIIIIIIIIIIIIIIIIII+
double        gda_Price[2], gd_Point, gd_area, gda_SendLevel[4], gd_Value_draw,
              gda_TimeOfLine[2], LotsMM;
int           gi_Digits, gi_Decimal = 1, gi_MyOrders, cur_Line, pre_Type, ind_Draw,
              gia_Line[] = {0,1};
string        gs_Symbol, gs_pre_Name, gs_NameGV, gs_Info, gsa_Name_Line[2], gsa_Comment[5],
              gs_sign, ExpertName, gsa_Name_ORD[] = {"BUY","SELL"};
datetime      NewBar;
bool          gb_NewLine = true, gb_Virtual_Trade, gb_InfoPrint = false, RealTrade = True,
              gb_Pause = false, gb_Control = FALSE;
color         gca_color[] = {Blue,Red,Blue,Red,DeepSkyBlue,Magenta}, gc_color;
//IIIIIIIIIIIIIIIIIII==========Ïîäêëþ÷åííûå áèáëèîòåêè==========IIIIIIIIIIIIIIIIIIIIII+
double        bda_cur_Order[5];      // ìàññèâ èíôîðìàöèè î áëèæàéøåì ê öåíå îòëîæåííîì îðäåðå
              // bda_cur_Order[0] - Ticket
              // bda_cur_Order[1] - OpenPrice
              // bda_cur_Order[2] - Type
              // bda_cur_Order[3] - Expiration
              // bda_cur_Order[4] - òèï îòêðûâàåìîãî îðäåðà (OP_BUY èëè OP_SELL)
extern string Setup_Integration     = "================ Integration ==================";
extern bool   Integration_ON           = FALSE;            // Âêëþ÷åíèå ñîâìåñòíîé ðàáîòû VirtualTrader ñ ÷óæèìè îòëîæåííûìè îðäåðàìè
extern int    MG_Check                 = 880;              // Ìàãèê: -1 - ëþáîé, >= 0 - îòêðûòûé ñîâåòíèêîì èëè âðó÷íóþ
extern int    Expiration               = 240;              // Âðåìÿ æèçíè ëèíèè (ìèí.) (OrderExpiration - åñëè åñòü ïðèîðèòåòíî), (0 - áåññðî÷íî)
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  Custom expert initialization function                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int init()
{
    int lia_Periods[] = {1,5,15,30,60,240,1440,10080,43200},
        //---- ïîãðåøíîñòü ðèñîâàíèÿ îáúåêòîâ íà ãðàôèêå ñ ðàçíûìè TF
        lia_Value_draw[] = {8,12,16,20,26,50,80,100,140};
//----
    gs_Symbol = Symbol();
    gd_Point = MarketInfo (gs_Symbol, MODE_POINT);
    gi_Digits = MarketInfo (gs_Symbol, MODE_DIGITS);
    ExpertName = StringConcatenate (WindowExpertName(), "[", MG, "]:  ", fGet_NameTF (Period()), "_", gs_Symbol);
    //---- Ó÷èòûâàåì ðàáîòó 5-òè çíàêà
    if (gi_Digits == 3 || gi_Digits == 5)
    {gi_Decimal = 10;}
    gd_area = NDP (Reliable_Area * gi_Decimal);
    Order_SL *= gi_Decimal;
    Order_TP *= gi_Decimal;
    //---- Çàïîëíÿåì ìàññèâ èì¸í ëèíèé
    gsa_Name_Line[0] = Name_BUY_Line;
    gsa_Name_Line[1] = Name_SELL_Line;
    ArrayInitialize (gda_SendLevel, -1.0);
    gs_NameGV = "VirtualTrader";
    ind_Draw = fGetNumPeriods (lia_Periods, Period());
    gd_Value_draw = NDP (lia_Value_draw[ind_Draw] * gi_Decimal);
    gb_Virtual_Trade = VirtualOrders_ON;
    //---- Îïðåäåëÿåì çíà÷åíèå âàëþòû äåïîçèòà (äëÿ îòîáðàæåíèÿ ñòàòèñòèêè)
    gs_sign = "RUB";
    if (AccountCurrency() == "USD") {gs_sign = "$";}
    if (AccountCurrency() == "EUR") {gs_sign = "ˆ";}
    Comment ("");
    //---- Ðàñ÷èòûâàåì ðàçìåð ëîòà
    LotsMM = GetSizeLot (Order_Lots);
    //---- Ñîçäà¸ì èíôîðìàöèþ äëÿ îòîáðàæåíèÿ íàñòðîåê íà ãðàôèêå
    fCheckInfo();
    //---- Èäåíòèôèöèðóåì ñòàòóñ ðàáîòû ñîâåòíèêà
    if (IsTesting() || IsOptimization())
    {RealTrade = False;}
    //---- Îðãàíèçóåì ïîäãîòîâêó êîììåíòàðèåâ
    if (PrintCom || ShowCommentInChart)
    {gb_InfoPrint = true;}
    InitializeArray_STR (gsa_Comment);
    //---- ÏÐÅÄÓÏÐÅÆÄÅÍÈÅ
    if (Variant_Line == 1 && Integration_ON)
    {Alert ("Äëÿ ïðàâèëüíîé ðàáîòû ñîâåòíèêà óñòàíîâèòå ïàðàìåòð Variant_Line = 0 !!!");}
//----
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  Custor expert deinitialization function                          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int deinit()
{
//----
//----
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|               Custom expert iteration function                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int start()
{
    int err = GetLastError();
//----
    if (WhileTrade_ON)
    {
        //---- Çàïóñêàåì â öèêëå ðàáîòó ñîâåòíèêà
        while (IsExpertEnabled())    //---- Ïàóçà äëÿ èçìåíåíèÿ ïàðàìåòðîâ ñîâåòíèêà
        {
            if (fMain() == 2)
            {return (0);}
            Sleep (500);
        }
    } 
    else 
    {fMain();}
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
	 fGetLastError (gsa_Comment, "start():", 3);
//----
    return (0);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Îñíîâíîé êîä ñîâåòíèêà                                                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fMain()
{
    int    err = GetLastError();
    string ls_txt = "";
//----
    //---- Ïîëó÷àåì â ìàññèâ àêòóàëüíûå öåíû ïî èíñòðóìåíòó
    gda_Price[0] = MarketInfo (gs_Symbol, MODE_BID);
    gda_Price[1] = MarketInfo (gs_Symbol, MODE_ASK);
    gi_MyOrders = MyPositions();
    //---- Äëÿ ãðàôè÷åñêîãî óïðàâëåíèÿ ñîâåòíèêîì ðèñóåì îáúåêòû
    if (!FindObject ("label-BUY"))
    {SetLabel ("label-BUY", "BUY", 45, 55, 18, "Calibri", 2, 0, Blue);}
    else {ObjectSet ("label-BUY", OBJPROP_COLOR, IIFc (gb_Virtual_Trade, Blue, Gray));}
    if (!FindObject ("label-SELL"))
    {SetLabel ("label-SELL", "SELL", 45, 15, 18, "Calibri", 2, 0, Red);}
    else {ObjectSet ("label-SELL", OBJPROP_COLOR, IIFc (gb_Virtual_Trade, Red, Gray));}
    if (!FindObject ("label-TRADE"))
    {SetLabel ("label-TRADE", IIFs (gb_Virtual_Trade, "TRADE", "PAUSE"), 35, 15, 18, "Calibri", 2, 90, Gold);}
    //---- Îñóùåñòâëÿåì ãðàôè÷åñêîå óïðàâëåíèå îáúåêòàìè
    fOBJ_Check (gsa_Name_Line);
    //---- Íåïîñðåäñòâåííî ñàì Virtual Trading
    if (gb_Virtual_Trade)
    {
        //---- Â òåñòîâîì ðåæèìå ðèñóåì ëèíèè
        if (IsTesting() && CreatHLINE_ON)
        {
            if (fCreatHLine (Period_CreatHLine))
            {return (0);}
        }
        //---- Ïðè íåäîñòàòêå ñâîáîäíîé ìàðæè - áîëüøå îðäåðîâ íå âûñòàâëÿåì !!!
        gb_Pause = fCheckMargin (ls_txt, AccountBalance(), StopMarginPercent, RiskDepoPercent);
        fPrintAndShowComment (ls_txt, ShowCommentInChart, PrintCom && fCCV_I (gb_Pause, 2), gsa_Comment, 2);
        //---- Êîíòðîëèðóåì êîëè÷åñòâî îòêðûòûõ íà ïàðå îðäåðîâ
        if (gi_MyOrders < MAX_OredersInSymbol && !gb_Pause)
        {fSendOrdersFromLine (gs_Symbol, gda_SendLevel, gda_Price);}
    }
    else
    {gsa_Comment[0] = "Âèðòóàëüíûé òðåéäèíã ïðèîñòàíîâëåí !!!";}
    //---- Âûâîäèì èíôîðìàöèþ íà ãðàôèê
    if (ShowCommentInChart)
    {fCommentInChart();}
    //---- Åñëè ëîññ ïðåâûñèë äîïóñòèìîå çíà÷åíèå îò áàëàíñà, çàêðûâàåì âñå îðäåðà
    if (fRiskPercentControl (ls_txt, AccountBalance(), AccountProfit()))
    {
        fPrintAndShowComment (ls_txt, ShowCommentInChart, PrintCom, gsa_Comment, 2);
        CloseOrderAll (IIFi (FULL_Control_ON, -1, MG));
    }
    //---- Âìåñòî îòëîæåííîãî îðäåðà ðèñóåì ñîîòâåòñòâóþùóþ ëèíèþ (åñëè çàäàíî)
    fCreatIntegratedHLine (bda_cur_Order, gsa_Name_Line, Expiration, gs_Symbol, MG_Check);
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
	 fGetLastError (gsa_Comment, "fMain():", 3);
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ñîáèðàåì ñòàòèñòèêó ïî ïàðå (Sym) íà Magic (iMG)                           |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int MyPositions (string Sym = "", int iMG = -1)
{
    int li_int, li_order, err = GetLastError(), li_total = OrdersTotal();
//----
    if (li_total == 0)
    {return (0);}
    li_order = 0;
    Sym = IIFs ((Sym == ""), Symbol(), Sym);
    for (li_int = li_total - 1; li_int >= 0; li_int--)
    {
        if (!OrderSelect (li_int, SELECT_BY_POS, MODE_TRADES))
        {
            if (PrintCom) {Print ("Îøèáêà ïîëó÷åíèÿ òåêóùåãî îðäåðà OrderSelect() â ôóíêöèè MyPositions(): ", GetLastError(), " (", OrderTicket(), ").");}
            return (0);
        }
        if (OrderSymbol() == Sym && (OrderMagicNumber() == iMG || iMG < 0))
        {
            if (OrderType() == OP_BUY || OrderType() == OP_SELL)
            {li_order++;}
        }
    }
    fGetLastError (gsa_Comment, "MyPositions():", 3);
//----
    return (li_order);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Îòêðûâàåì îðäåðà ïî Line íà ãðàôèêàõ                                       |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fSendOrdersFromLine (string fs_Symbol,        // ðàáî÷èé ñèìâîë
                          double& ar_curLevel[],   // ìàññèâ ïàðàìåòðîâ óïðàâëÿþùåãî óðîâíÿ
                          double ar_Price[2])      // ìàññèâ öåí ïî ðàáî÷åìó èíñòðóìåíòó
{
    int    cmd, li_Ticket, cur_Type, err = GetLastError();
    double ld_PriceOpen, ld_Price, ld_SL, ld_TP, ld_deltaPrice;
    bool   lb_Send;
    static int cnt;
    string ls_txt, ls_txt1 = "", ls_Name, ls_fName = "fSendOrdersFromLine()";
//----
    //---- Ñ÷èòûâàåì óðîâåíü îòêðûòèÿ îðäåðà
    fGetLevelFromLine (ar_curLevel, ar_Price);
    //---- Âõîäèì â íà÷àëå óêàçàííîãî áàðà (åñëè NewBarInPeriod >= 0)
    if (NewBarInPeriod >= 0)
    {
        if (NewBar == iTime (gs_Symbol, NewBarInPeriod, 0))
        {return (0);}
        NewBar = iTime (gs_Symbol, NewBarInPeriod, 0);
    }
    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 if (fCCV_I (cur_Type, 0))
                            {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);
                                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 if (fCCV_I (cur_Type, 0))
                            {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);
                                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, ShowCommentInChart, 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);
        ld_SL = IIFd ((Order_SL == 0), 0, ld_Price - cmd * NDP (Order_SL));
        ld_TP = IIFd ((Order_TP == 0), 0, ld_Price + cmd * NDP (Order_TP));
        //---- Ðàñ÷èòûâàåì ðàçìåð ëîòà
        LotsMM = GetSizeLot (Order_Lots);
        //---- Ñîçäà¸ì èíôîðìàöèþ äëÿ îòîáðàæåíèÿ íàñòðîåê íà ãðàôèêå
        fCheckInfo();
        ld_Price = IIFd ((cur_Type == OP_BUY), Ask, Bid);
        li_Ticket = OrderSend (fs_Symbol, cur_Type, LotsMM, ld_Price, Slippage, NDD (ld_SL), NDD (ld_TP), Order_Comment, MG, 0, gc_color);
        if (li_Ticket > 0)
        {
            ls_txt = StringConcatenate (ls_fName, ": Îòêðûëè ", GetNameOP (cur_Type), "-îðäåð[", li_Ticket, "] ïî ", IIFs ((Variant_Line == 0), "HLine", "TRENDLine"), ". LevelPrice = ", DSD (ld_PriceOpen), "; Price = ", DSD (ld_Price));
            if (PrintCom) {Print (ls_txt);}
            pre_Type = ar_curLevel[1];
            //---- Àííóëèðóåì îòðàáîòàííóþ ëèíèþ
            ls_Name = gsa_Name_Line[cur_Line];
            //---- Óäàëÿåì "îòðàáîòàííóþ" ëèíèþ (åñëè çàäàíî)
            if (DeleteInActiveLine)
            {
                if (ObjectFind (ls_Name) == 0)
                {
                    ObjectDelete (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));
            }
            cur_Line = -1;
            ls_Name = "RAY_Price";
            if (ObjectFind (ls_Name) == 0)
            {ObjectDelete (ls_Name);}
            gb_NewLine = false;
            ls_txt1 = StringConcatenate (ls_fName, ": ", ls_txt1, " Óäàëèëè ëèíèþ ", ls_Name, ".");
            if (PrintCom) {Print (ls_txt1);}
            if (ShowCommentInChart)
            {
                gsa_Comment[1] = ls_txt1;
                gsa_Comment[2] = ls_txt;
            }
            ArrayInitialize (ar_curLevel, -1.0);
            fCCV_I (cur_Type, 0);
            if (OrderSelect (li_Ticket, SELECT_BY_TICKET))
            {OrderPrint();}
        }
    }
    fGetLastError (gsa_Comment, "fSendOrdersFromLine():", 3);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Äâèãàåì ëèíèþ çà öåíîé                                                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void 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();
//----
    li_cmd = IIFi ((fd_Price < fd_OpenPrice), 1, -1);
    switch (Variant_Line)
    {
        case 0: 
            fd_OpenPrice = fd_Price + gd_area * li_cmd;
            ObjectSet (fs_Name, OBJPROP_PRICE1, fd_OpenPrice);
            ObjectSet (fs_Name, OBJPROP_PRICE2, fd_OpenPrice); 
            fGetLastError (gsa_Comment, "fMooveLineByPrice(): 0", 3);
            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);
            ObjectSet (fs_Name, OBJPROP_PRICE2, lda_Price[1] - fd_Distance * li_cmd);
            fd_OpenPrice = fObjectGetValue_ByCurrent (fs_Name);
            break;
    }
    //fd_OpenPrice = IIFd ((Variant_Line == 0), ObjectGet (fs_Name, OBJPROP_PRICE1), fObjectGetValue_ByCurrent (fs_Name));
    ar_cur_Level[0] = fd_OpenPrice;
    fGetLastError (gsa_Comment, "fMooveLineByPrice():", 3);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Ïðîâåðÿåì íàëè÷èå óïðàâëÿþùåé ëèíèè è ôèêñèðóåì çàäàííûé óðîâåíü            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fGetLevelFromLine (double& ar_Level[],    // âîçâðàùàåìûé ìàññèâ ïàðàìåòðîâ óïðàâëÿþùåãî óðîâíÿ
                        double ar_Price[])     // àêòóàëüíûé ìàññèâ öåí ïî èíñòðóìåíòó
{
    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), ShowCommentInChart, 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 (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, ShowCommentInChart, 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), ShowCommentInChart, 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 (ShowCommentInChart && !lb_break)
    {gsa_Comment[0] = ls_txt;}
    fGetLastError (gsa_Comment, "fGetLevelFromLine():", 3);
    return (lb_break);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|             Ïðîâåðÿåì ïîëîæåíèå îáúåêòîâ                                          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fOBJ_Check (string fsa_Name_Line[])
{
    int    li_int, cmd, li_OBJ = 0, li_curOBJ = 0,
           lia_Property[] = {OBJPROP_TIME1,OBJPROP_PRICE1,OBJPROP_TIME2,OBJPROP_PRICE2,OBJPROP_RAY};
    string ls_txt, ls_Name, tmp_Name, lsa_Name[] = {"label-BUY","label-SELL"},
           ls_fName = "fOBJ_Check()";
    double lda_InfoLine[6];
    color  lc_color;
//----
    ArrayInitialize (lda_InfoLine, 0.0);
    //---- Ïðîâåðÿåì íà åäèíè÷íîñòü (â îäíîì ýêçåìïëÿðå) óïðàâëÿåìîé ëèíèè
    for (li_int = ObjectsTotal() - 1; li_int >= 0; li_int--)
    {
        ls_Name = ObjectName (li_int);
        if ((ObjectType (ls_Name) == OBJ_HLINE && Variant_Line == 0) || (ObjectType (ls_Name) == OBJ_TREND && Variant_Line == 1))
        {
            if (StringFind (ls_Name, "Horizontal Line ") == 0 || StringFind (ls_Name, "Trendline ") == 0)
            {
                tmp_Name = ls_Name;
                li_OBJ++;
            }
            li_curOBJ++;
        }
    }
    //---- Åñëè èñêîìûõ îáúåêòîâ íåò - âûõîäèì
    if (li_curOBJ == 0)
    {return (0);}
    //---- Êîíòðîëèðóåì èçìåíåíèå íàçâàíèé óïðàâëÿåìîé ëèíèè
    for (li_int = 0; li_int < 2; li_int++)
    {
        //---- Ïðåäóñìàòðèâàåì ÷òîáû ñäâèíóòûé Label è òèï (íàçâàíèå) ëèíèè íå ñîâïàäàëè
        cmd = IIFi ((li_int == 0), 1, 0);
        if (!SearchObject (lsa_Name[cmd], OBJPROP_XDISTANCE, 45))
        {
            if (PrintCom) {Print (ls_fName, ": FindObject[", lsa_Name[cmd], "] = ", CheckBOOL (FindObject (lsa_Name[cmd])), "; Êîîðäèíàòà X = ", ObjectGet (lsa_Name[cmd], OBJPROP_XDISTANCE), "; ÊÎÎÐÄÈÍÀÒÀ Y = ", ObjectGet (lsa_Name[cmd], OBJPROP_YDISTANCE));}
            Sleep (2000);
            DelObject (lsa_Name[cmd]);
            WindowRedraw();
            Sleep (1000);
            //---- Ïðîâåðÿåì íàëè÷èå óïðàâëÿåìîé ëèíèè äëÿ å¸ ïåðåèìåíîâàíèÿ
            if (li_OBJ == 1 || FindObject (gsa_Name_Line[li_int]))
            {
                ls_Name = IIFs ((li_OBJ == 1), tmp_Name, gsa_Name_Line[li_int]);
                //---- Ñîõðàíÿåì ðîäèòåëüñêèå äàííûå î ëèíèè
                lda_InfoLine[0] = ObjectType (ls_Name);
                for (int li_PRT = 0; li_PRT < 5; li_PRT++)
                {lda_InfoLine[li_PRT+1] = ObjectGet (ls_Name, lia_Property[li_PRT]);}
                //---- Óäàëÿåì ñòàðóþ ëèíèþ è ðèñóåì äóáëèêàò ñ íîâûì èìåíåì
                if (ObjectDelete (ls_Name))
                {
                    ls_Name = gsa_Name_Line[cmd];
                    ls_txt = fPrepareComment (StringConcatenate (ls_fName, ": ", IIFs ((li_OBJ == 1), StringConcatenate ("Íàèìåíîâàëè ëèíèþ ", ls_Name), StringConcatenate ("Ïðîèçâåëè ïåðåèìåíîâàíèå óïðàâëÿåìîé ëèíèè ñ ", gsa_Name_Line[li_int], " íà ", gsa_Name_Line[cmd]))), gb_InfoPrint);
                    fPrintAndShowComment (ls_txt, ShowCommentInChart, PrintCom, gsa_Comment, 1);
                    fCreat_OBJ (ls_Name, lda_InfoLine[0], 0, "", 0, lda_InfoLine[1], lda_InfoLine[2], lda_InfoLine[5], White, lda_InfoLine[3], lda_InfoLine[4]);
                    gb_NewLine = true;
                }
                return (1);
            }
            else
            {
                if (li_OBJ > 1)
                {Alert ("Êîëè÷åñòâî ëèíèé > 1 - óäàëèòå ëèøíèå ëèíèè èëè èìåíóéòå ëèíèþ âðó÷íóþ !!!");}
                else
                {Alert ("Ìîæíî ïîïûòàòüñÿ ñìåíèòü çíà÷åíèå Variant_Send (íå ñ òåì òèïîì ëèíèè ðàáîòàåì) !!!");}
            }
        }
	 }
    //---- Êîíòðîëèðóåì âêë.\âûêë. ïàóçû
	 ls_Name = "label-TRADE";
    if (!SearchObject (ls_Name, OBJPROP_XDISTANCE, 35))
    {
        if (PrintCom) {Print (ls_fName, ": FindObject[", ls_Name, "] = ", CheckBOOL (FindObject (ls_Name)), "; Êîîðäèíàòà X = ", ObjectGet (ls_Name, OBJPROP_XDISTANCE), "; ÊÎÎÐÄÈÍÀÒÀ Y = ", ObjectGet (ls_Name, OBJPROP_YDISTANCE));}
        Sleep (2000);
        DelObject (ls_Name);
        WindowRedraw();
        Sleep (1000);
        gb_Virtual_Trade = IIFb (gb_Virtual_Trade == true, false, true);
        ls_txt = StringConcatenate (ls_fName, ": ", IIFs (!gb_Virtual_Trade, "Ïðèîñòàíàâëèâàåì òîðãîâëþ !!!", "ÐÀÁÎÒÀÅÌ !!!"));
        fPrintAndShowComment (ls_txt, ShowCommentInChart, PrintCom, gsa_Comment, 1);
        //---- Îáåñöâå÷èâàåì óïðàâëÿåìóþ ëèíèþ
        ls_Name = gsa_Name_Line[cur_Line];
        if (FindObject (ls_Name))
        {
            lc_color = IIFc (gb_Virtual_Trade, gca_color[cur_Line], White);
            ObjectSet (ls_Name, OBJPROP_COLOR, lc_color);
        }
        return (1);
    }
	 return (0);
}
//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 = StringConcatenate (ls_fName, ": Ëèíèÿ ", fs_Name, " â ðàáîòå.");
        fPrintAndShowComment (ls_txt, ShowCommentInChart, PrintCom, gsa_Comment, 1);
        ar_TimeLine[0] = lda_TimeLine[0];
        ar_TimeLine[1] = lda_TimeLine[1];
        return (true);
    }
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Â òåñòîâîì ðåæèìå âûñòàâëÿåì ëèíèè (OBJ_HLINE)                              |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCreatHLine (int fi_Period)
{
    static datetime li_NewDay;
    if (li_NewDay == iTime (gs_Symbol, fi_Period, 0))
    {return (false);}
    li_NewDay = iTime (gs_Symbol, fi_Period, 0);
    int li_Type = -1;
    string ls_line, ls_Name, ls_fName = "fCreatHLine()";
    double ld_middle, ld_candle, ld_Price,
           ld_MAX = iHigh (gs_Symbol, fi_Period, 1),
           ld_MIN = iLow (gs_Symbol, fi_Period, 1);
    static int cnt;
    static double pre_Price;
//----
    ld_candle = (ld_MAX - ld_MIN);
    ld_middle = ld_MIN + ld_candle / 2;
    if (fi_Period > Period())
    {
        if (pre_Price > 0)
        {
            pre_Type = IIFi ((pre_Type < 0), gda_SendLevel[1], pre_Type);
            ls_Name = "ray" + cnt;
            fCreat_OBJ (ls_Name, OBJ_TREND, 0, (GetNameOP (pre_Type) + "/" + NameDayOfWeek (DayOfWeek())), 0, iTime (gs_Symbol, fi_Period, 1), pre_Price, li_NewDay, pre_Price, false, gc_color);
        }
        //---- Ðèñóåì âåðòèêàëüíóþ ëèíèþ, ÷òîáû ñèãìåíòèðîâàòü âðåìåííóþ ëèíèþ ïî äëèòåëüíîñòè äåéñòâèÿ íàðèñîâàííîé ãîðèçîíòàëüíîé ëèíèè
        ObjectCreate ("vline" + cnt, OBJ_VLINE, 0, li_NewDay, 0);
    }
    if (fDeleteHLine())
    {
        if (PrintCom) {Print (ls_fName, ": Óäàëèëè ëèíèþ.");}
        ArrayInitialize (gda_SendLevel, -1.0);
    }
    cnt++;
    if (gda_Price[0] < ld_middle - ld_candle * 0.236)
    {
        li_Type = IIFi ((DayOfWeek() == 5), 0, 1);
        ld_Price = ld_MIN;
    }
    if (gda_Price[0] > ld_middle + ld_candle * 0.236)
    {
        li_Type = IIFi ((DayOfWeek() == 5), 1, 0);
        ld_Price = ld_MAX;
    }
    if (li_Type >= 0)
    {
        ls_line = gsa_Name_Line[li_Type];
        pre_Price = ld_Price;
        pre_Type = gda_SendLevel[1];
        if (ObjectCreate (ls_line, OBJ_HLINE, 0, 0, ld_Price))
        {
            if (PrintCom) {Print (ls_fName, ": ", TS_DM (li_NewDay), "/", NameDayOfWeek (DayOfWeek()), ": Íàðèñîâàëè ëèíèþ ", ls_line, " íà óðîâíå #", ld_Price, " !!!");}
            return (true);
        }
    }
    else
    {
        if (PrintCom) {Print (ls_fName, ": ", TS_DM (li_NewDay), "/", NameDayOfWeek (DayOfWeek()), ": Ëèíèè íå áóäåò !!!");}
        pre_Price = 0.0;
        pre_Type = -1;
    }
    return (false);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ñîâìåñòíàÿ ðàáîòà ñ "÷óæèìè" îðäåðàìè                                     |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Èùåì áëèæàéøèé ê öåíå îòëîæåííûé îðäåð ïî ïàðå (fs_Symbol) íà Magic (iMG)  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCheckIntegratedPosition (double& ar_Array[],    // âîçâðàùàåìûé ìàññèâ c äàííûìè ïî áëèæàéøåìó ê öåíå îðäåðó
                               string fs_Symbol = "", // ðàáî÷èé ñèìâîë
                               int iMG = -1)          // Magic
{
    int    li_int, li_Ticket = 0, li_Type, li_cmd = -1, err = GetLastError(), li_total = OrdersTotal();
    double ld_OpenPrice, ld_Price, ld_Distance = 100;
//----
    if (li_total == 0)
    {return (0);}
    ArrayInitialize (ar_Array, -1.0);
    fs_Symbol = IIFs ((fs_Symbol == ""), Symbol(), fs_Symbol);
    for (li_int = li_total - 1; li_int >= 0; li_int--)
    {
        if (!OrderSelect (li_int, SELECT_BY_POS, MODE_TRADES))
        {
            if (PrintCom) {Print ("Îøèáêà ïîëó÷åíèÿ òåêóùåãî îðäåðà OrderSelect() â ôóíêöèè fCheckIntegratedPosition(): ", GetLastError(), " (", OrderTicket(), ").");}
            return (false);
        }
        if (OrderSymbol() == fs_Symbol && (OrderMagicNumber() == iMG || iMG < 0))
        {
            li_Type = OrderType();
            if (li_Type > 1)
            {
                ld_OpenPrice = OrderOpenPrice();
                li_cmd = IIFi ((li_Type == OP_BUYLIMIT || li_Type == OP_BUYSTOP), 0, 1);
                ld_Price = IIFd ((li_cmd == 0), Ask, Bid);
                if (MathAbs (ld_OpenPrice - ld_Price) < ld_Distance)
                {
                    ld_Distance = MathAbs (ld_OpenPrice - ld_Price);
                    li_Ticket = OrderTicket();
                    ar_Array[4] = li_cmd;
                }
            }
        }
    }
    if (li_Ticket > 0)
    {
        if (OrderSelect (li_Ticket, SELECT_BY_TICKET, MODE_TRADES))
        {
            ar_Array[0] = li_Ticket;
            ar_Array[1] = OrderOpenPrice();
            ar_Array[2] = OrderType();
            ar_Array[3] = OrderExpiration();
            return (true);
        }
    }
    fGetLastError (gsa_Comment, "fCheckIntegratedPosition():", 3);
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Âìåñòî îòëîæåííîãî îðäåðà ðèñóåì OBJ_HLINE                                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCreatIntegratedHLine (double ar_Array[],     // âîçâðàùàåìûé ìàññèâ c äàííûìè ïî áëèæàéøåìó ê öåíå îðäåðó
                            string ar_NameLines[], // ìàññèâ èì¸í óïðàâëÿþùèõ ëèíèé
                            int fi_Expiration = 0, // âðåìÿ æèçíè ñîçäàâàåìîé ëèíèè
                            string fs_Symbol = "", // ðàáî÷èé ñèìâîë
                            int iMG = -1)          // Magic
{
    string ls_Name, ls_Expiration, ls_txt;
    int li_cmd, li_Expiration, li_Ticket, err = GetLastError();
    datetime ldt_curTime;
    if (Integration_ON)
    {
        if (fCheckIntegratedPosition (ar_Array, fs_Symbol, iMG))
        {
            //---- Ðèñóåì óïðàâëÿþùóþ ëèíèþ
            li_cmd = ar_Array[4];
            ls_Name = ar_NameLines[li_cmd];
            //---- Ðàáîòàåì òîëüêî â òîì ñëó÷àå, êîãäà íåò óïðàâëÿþùåé ëèíèè
            if (FindObject (ls_Name))
            {return (false);}
            ldt_curTime = IIFi (RealTrade, TimeCurrent(), iTime (fs_Symbol, 1, 0));
            li_Expiration = IIFi ((ar_Array[3] > 0), ND0 (ar_Array[3]), IIFi ((fi_Expiration > 0), ldt_curTime + fi_Expiration * 60, 0));
            ls_Expiration = IIFs ((li_Expiration > 0), TS_DM (li_Expiration), "");
            fCreat_OBJ (ls_Name, OBJ_HLINE, 0, ls_Expiration, 10, Time[0], ar_Array[1], false, Red);
            if (FindObject (ls_Name))
            {
                gb_NewLine = true;
                //---- Óäàëÿåì îòëîæåííûé îðäåð
                li_Ticket = ar_Array[0];
                if (OrderDelete (li_Ticket))
                {
                    ls_txt = fPrepareComment (StringConcatenate ("Âìåñòî îòëîæåííîãî îðäåðà íà ", DSD (ar_Array[1]), ", ñîçäàëè ", gsa_Name_ORD[li_cmd], " ëèíèþ. Îðäåð[", li_Ticket, "] ", GetNameOP (ar_Array[2]), " óäàëèëè !!!"), gb_InfoPrint);
                    fPrintAndShowComment (ls_txt, ShowCommentInChart, PrintCom, gsa_Comment, 1);
                    return (true);
                }
            }
        }
    }
    fGetLastError (gsa_Comment, "fCreatIntegratedHLine():", 3);
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòà ñ îðäåðàìè                                                         |
//|***********************************************************************************|
//+===================================================================================+
//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 (gsa_Comment, "CloseOrderAll():", 3);
//----
    return (lb_Close);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Îáùèå ôóíêöèè                                                             |
//|***********************************************************************************|
//+===================================================================================+
//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                                                               |
//+-----------------------------------------------------------------------------------+
//|  Âåðñèÿ   : 14.07.2010                                                            |
//|  Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå äíÿ íåäåëè                                    |
//+-----------------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                       |
//|    ndw - íîìåð äíÿ íåäåëè                                                         |
//|    Var - 0: ñîêðàù¸ííûé; 1: ïîëíûé                                                |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string NameDayOfWeek (int ndw, int Var = 0)
{
    switch (ndw)
    {
        case 0: return (IIFs (Var == 1, "Âîñêðåñåíüå", "Âñ"));
        case 1: return (IIFs (Var == 1, "Ïîíåäåëüíèê", "Ïí"));
        case 2: return (IIFs (Var == 1, "Âòîðíèê", "Âò"));
        case 3: return (IIFs (Var == 1, "Ñðåäà", "Ñð"));
        case 4: return (IIFs (Var == 1, "×åòâåðã", "×ò"));
        case 5: return (IIFs (Var == 1, "Ïÿòíèöà", "Ïò"));
        case 6: return (IIFs (Var == 1, "Ñóááîòà", "Ñá"));
    }
//----
    return ("NO-unknow");
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð    : TarasBY                                                               |
//+-----------------------------------------------------------------------------------+
//|  Âåðñèÿ   : 09.08.2009                                                            |
//|  Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òàéìôðåéìà                                    |
//+-----------------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                       |
//|    fi_Period - òàéìôðåéì                                                          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string fGet_NameTF (int fi_Period)
{
//----
    switch (fi_Period) 
    {
        case 1: return ("PERIOD_M1");
        case 5: return ("PERIOD_M5");
        case 15: return ("PERIOD_M15");
        case 30: return ("PERIOD_M30");
        case 60: return ("PERIOD_H1");
        case 240: return("PERIOD_H4");
        case 1440: return ("PERIOD_D1");
        case 10080: return ("PERIOD_W1");
        case 43200: return ("PERIOD_MN1");
        default: return ("undefined " + fi_Period);
    }
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ, îïðåäåëåíèÿ ìèíèìàëüíîé ðàçðÿäíîñòè ëîòà                          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int LotDecimal()
{return (MathCeil (MathAbs (MathLog (MarketInfo (Symbol(), MODE_LOTSTEP)) / MathLog (10))));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                          |
//+-----------------------------------------------------------------------------------+
//|  Âåðñèÿ   : 01.02.2008                                                            |
//|  Îïèñàíèå : Âîçâðàùàåò îäíî èç äâóõ çíà÷åíèé âçàâèñèìîñòè îò óñëîâèÿ.             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double IIFd (bool condition, double ifTrue, double ifFalse)
{if (condition) {return (ifTrue);} else {return (ifFalse);}}
//+-----------------------------------------------------------------------------------+
int IIFi (bool condition, int ifTrue, int ifFalse)
{if (condition) {return (ifTrue);} else {return (ifFalse);}}
//+-----------------------------------------------------------------------------------+
bool IIFb (bool condition, bool ifTrue, bool ifFalse)
{if (condition) {return (ifTrue);} else {return (ifFalse);}}
//+-----------------------------------------------------------------------------------+
string IIFs (bool condition, string ifTrue, string ifFalse)
{if (condition) {return (ifTrue);} else {return (ifFalse);}}
//+-----------------------------------------------------------------------------------+
color IIFc (bool condition, color ifTrue, color ifFalse)
{if (condition) {return (ifTrue);} else {return (ifFalse);}}
//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+
//|        Ôóíêöèÿ, íîðìàëèçàöèè çíà÷åíèÿ double äî 0                                 |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double ND0 (double v) {return (NormalizeDouble (v, 0));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ, ïåðåâîäà int â double ïî Point                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double NDP (int v) {return (v * gd_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+
//|        Ôóíêöèÿ, ïåðåâîäà çíà÷åíèÿ èç double â string c íîðìàëèçàöèåé ïî           |
//| ìèíèìàëüíîé ðàçðÿäíîñòè ëîòà                                                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string DSDig (double v) {return (DoubleToStr (v, LotDecimal()));} 
//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_TREND, OBJ_ARROW, OBJ_HLINE                                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void 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();
    if (ObjectFind (fs_Name) == -1)
    {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 (gsa_Comment, "fCreat_OBJ():", 3);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð    : TarasBY, taras_bulba@tut.by                                           |
//+-----------------------------------------------------------------------------------+
//|  Âåðñèÿ   : 23.07.2010                                                            |
//|  Îïèñàíèå : Óñòàíîâêà îáúåêòà 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+
//|       Óäàëÿåì 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 (ObjectFind (ls_Name) == 0)
        {
            if (ObjectDelete (ls_Name))
            {li_result = true;}
        }
    }
//----
    return (li_result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|              ÏÎËÓ×ÅÍÈÅ ÑÂÎÉÑÒ ÃÐÀÔÈ×ÅÑÊÎÃÎ ÎÁÚÅÊÒÀ                               |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool SearchObject (string txt, int Property, int Value)
{
    int cnt, position;
    bool result;
//----
    if (!FindObject (txt))
    return (true);
    else
    {
        position = ObjectGet (txt, Property);
        while (position <= 0)
        {
            position = ObjectGet (txt, Property);
            if (cnt == 10)
            {break;}
            cnt++;
        }
    }
    if (position == Value || position == 0)
    {result = true;}
    //---- Èçáåãàåì âîçìîæíûõ îøèáîê
    if (position != Value)
    {result = false;}
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
	 fGetLastError (gsa_Comment, StringConcatenate ("SearchObject(): Search (", txt, ")"), 3);
//----
    return (result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                ÏÎÈÑÊ ÃÐÀÔÈ×ÅÑÊÎÃÎ ÎÁÚÅÊÒÀ                                         |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool FindObject (string txt)
{
    string lbl;
//----
    if (ObjectFind (txt) != -1)
    {return (true);}
    for (int i = ObjectsTotal() - 1; i >= 0; i--)
    {
        lbl = ObjectName (i);
        if (lbl == txt)
        {return (true);}
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
	 fGetLastError (gsa_Comment, StringConcatenate ("FindObject(): Find (", txt, ")"), 3);
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//          ÓÄÀËÅÍÈÅ ÃÐÀÔÈ×ÅÑÊÎÃÎ ÎÁÚÅÊÒÀ                                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool DelObject (string txtPart)
{
    string lbl;
//----
    if (ObjectFind (txtPart) != -1)
    {
        if (ObjectDelete (txtPart))
        {return (true);}
    }
    for (int i = ObjectsTotal() - 1; i >= 0; i--)
    {
        lbl = ObjectName (i);
        if (StringFind (lbl, txtPart, 0) > -1)
        {
            if (ObjectDelete (lbl))
            {return (true);}
        }
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
	 fGetLastError (gsa_Comment, StringConcatenate ("DelObject(): Delete (", txtPart, ")"), 3);
//----
    return (false);
}
//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+
void fCommentInChart()
{
    int li_Period = IIFi ((NewBarInPeriod == 0), Period(), NewBarInPeriod) * 60;
    static string lsa_Time, ls_Error;
    datetime ldt_curTime;
    static datetime lsdt_TimeError;
//---- 
    ldt_curTime = IIFi ((RealTrade), TimeLocal(), iTime (gs_Symbol, 1, 0));
    //---- Îðãàíèçóåì óäàëåíèå ÷åðåç 1 ÷àñ ñîîáùåíèÿ îá îøèáêå
    if (StringLen (gsa_Comment[3]) > 0)
    {
        if (ls_Error != gsa_Comment[3])
        {
            ls_Error = gsa_Comment[3];
            lsdt_TimeError = ldt_curTime;
        }
    }
    //---- Ñïóñòÿ 1 ÷àñ óïîìèíàíèå îá îøèáêå óäàëÿåì
    if (ldt_curTime > lsdt_TimeError + 3600)
    {gsa_Comment[3] = "";}
    Comment (ExpertName, "\n", gs_Info, IIFs ((NewBarInPeriod < 0), "", TS_DM (NewBar + li_Period)), "\n", 
             "*******************************************************\n",
             IIFs ((StringLen (gsa_Comment[0]) > 0), StringConcatenate (gsa_Comment[0], "\n"), ""),
             IIFs ((StringLen (gsa_Comment[1]) > 0), StringConcatenate (gsa_Comment[1], "\n"), ""),
             IIFs ((StringLen (gsa_Comment[2]) > 0), StringConcatenate (gsa_Comment[2], "\n"), ""),
             IIFs ((StringLen (gsa_Comment[0]) > 0 || StringLen (gsa_Comment[1]) > 0 || StringLen (gsa_Comment[2]) > 0),
             "*******************************************************\n", ""),
             IIFs ((StringLen (gsa_Comment[3]) > 0), StringConcatenate ("ERROR:\n", gsa_Comment[3], "\n"), ""),
             //---- Ñòðîêà ñ îòëàäî÷íîé èíôîðìàöèåé
             IIFs (gb_Control, "CONTROL:  ", ""), gsa_Comment[4]);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ñîçäà¸ì èíôîðìàöèþ äëÿ îòîáðàæåíèÿ íàñòðîåê íà ãðàôèêå                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fCheckInfo()
{
//---- 
    if (ShowCommentInChart)
    {
        if (UseMM)
        {
            string ls_Trail, ls_MM, ls_Virtual, ls_addConditions, ls_DelLine, ls_Integration;
            ls_Trail = IIFs (TrailPrice_ON, "TrailPrice", "");
            ls_DelLine = IIFs (DeleteInActiveLine, "DelLine", "");
            ls_MM = IIFs (UseMM, StringConcatenate ("MM (", DSDig (LotsMM), ")", fGet_MeansType (MeansType, LotsPercent)), "L: " + DSDig (LotsMM));
            ls_Integration = IIFs (Integration_ON, "Integration", "");
            ls_Virtual = IIFs (VirtualOrders_ON, "Virtual", "");
            ls_addConditions = StringConcatenate (IIFs ((StringLen (ls_Trail) > 0), ls_Trail, ""),
            IIFs ((StringLen (ls_DelLine) > 0), " - ", ""),
            IIFs ((StringLen (ls_DelLine) > 0), ls_DelLine, ""),
            IIFs ((StringLen (ls_MM) > 0), " - ", ""),
            IIFs ((StringLen (ls_MM) > 0), ls_MM, ""),
            IIFs ((StringLen (ls_Integration) > 0), " - ", ""),
            IIFs ((StringLen (ls_Integration) > 0), ls_Integration, ""),
            IIFs ((StringLen (ls_Virtual) > 0), " - ", ""),
            IIFs ((StringLen (ls_Virtual) > 0), ls_Virtual, ""));
            //---- Óáèðàåì " - " èç íà÷àëà ñòðîêè (åñëè åñòü)
            ls_addConditions = IIFs ((StringFind (ls_addConditions, " - ") == 0), StringSubstr (ls_addConditions, 3), ls_addConditions);
            gs_Info = StringConcatenate (gs_NameGV, ":     Area = ", Reliable_Area * gi_Decimal, "; ", IIFs ((Variant_Line == 0), "HLINE", "TREND"), "; Send = ", Variant_Send,
            "; STOPS (", Order_SL, "/", Order_TP, ")\n",
            IIFs ((StringLen (ls_addConditions) > 0), StringConcatenate (ls_addConditions, "\n"), ""),
            IIFs (WhileTrade_ON, "C: ", "N: "), IIFs ((NewBarInPeriod < 0), "Ðàáîòàåì íà êàæäîì òèêå", "ÏÀÓÇÀ äî: "));
        }
    }
//---- 
}
//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)
{
    //---- Åñëè MM íå èñïîëüçóåòñÿ - âûõîäèì
    if (!UseMM)
    {return (fd_Lot);}
//----
    double dLot, Money = 0;
    int dig;
//----
    dig = LotDecimal();
    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: // ôèêñèðîâàííûé ïðîöåíò îò äåïîçèòà
            if (MeansType == 3)
            {dLot = (AccountFreeMargin() * LotsPercent) / (MarketInfo (Symbol(), MODE_MARGINREQUIRED) * 100.0);}
            else
            {dLot = Money * MathMin (AccountLeverage(), 100) * LotsPercent / (100000 * 100);}
            break;
        case 2: // ôðàêöèîííî-ïðîïîðöèîíàëüíûé
            int k = LotsDepoForOne;
            for (double 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, dig);
    dLot = MathMax (MinLot, dLot);
    dLot = MathMin (MaxLot, dLot);
//----
    return (fLotsNormalize (dLot));
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Ïðîèçâîäèì íîðìàëèçàöèþ ëîòà                                                |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fLotsNormalize (double fd_Lots)
{
    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));
//----
    return (fd_Lots);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|           Äëÿ ñòàòèñòèêè ïîëó÷àåì ðàçìåð ñðåäñòâ äëÿ ôîðìèðîâàíèÿ ëîòà            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string fGet_MeansType (int fi_Variant, int fi_Percent)
{
    string ls_Percent = "";
//----
    if (LotsWayChoice == 1)
    {ls_Percent = StringConcatenate (fi_Percent, "% ");}
    switch (fi_Variant)
    {
        case 1: return (StringConcatenate (": ", ls_Percent, "from Balance = ", gs_sign, DoubleToStr (AccountBalance(), 1)));
        case 2: return (StringConcatenate (": ", ls_Percent, "from Equity = ", gs_sign, DoubleToStr (AccountEquity(), 1)));
        case 3: return (StringConcatenate (": ", ls_Percent, "from FreeMargin = ", gs_sign, DoubleToStr (AccountFreeMargin(), 1)));
        case 4: return (StringConcatenate (": ", ls_Percent, "from RiskDepo = ", gs_sign, DoubleToStr (RiskDepo, 1)));
        default: return ("");
    }
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|           Îïðåäåëÿåì âîçìîæíîñòü äàëüíåéøåãî âûñòàâëåíèÿ îðäåðîâ                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCheckMargin (string& sInfo,            // âîçâðàùàåìûé êîììåíòàðèé
                   double d_BeginBalance,    // íà÷àëüíûé ðàçìåð äåïî
                   int i_StopMarginPercent,  // äîïóñòèìûé ðàçìåð çàëîãà â %
                   int i_RiskDepoPercent)    // ìàêñèìàëüíûé ðàçìåð ëîññà â %
{
    bool Zapret, StopMargin, StopBalance, lb_Pause = False;
    string ls_prichina, ls_fName = "CheckMargin()";
    
    StopMargin = AccountFreeMargin() / AccountEquity() * 100 <= i_StopMarginPercent;
    StopBalance = AccountBalance() / d_BeginBalance * 100 <= i_RiskDepoPercent;
    Zapret = (StopMargin || StopBalance);
    
    if (Zapret == true)
    {
        if (!lb_Pause)
        {
            ls_prichina = fPrepareComment ("Äîñòèãëè îãðàíè÷åíèÿ ðàçìåðà ñâîáîäíîé ìàðæè - ïðèîñòàíàâëèâàåì âûñòàâëåíèå îðäåðîâ", StopMargin);
            ls_prichina = fPrepareComment ("Äîñòèãëè äîïóñòèìîãî çíà÷åíèÿ óìåíüøåíèÿ áàëàíñà - ïðèîñòàíàâëèâàåì òîðãîâëþ", StopBalance);
            sInfo = StringConcatenate (ls_fName, ": ", ls_prichina, " (FreeMargin = $", DS0 (AccountFreeMargin()), "; Equity = $", DS0 (AccountEquity()), ")", "; Balance = $", DS0 (AccountBalance()), "; BeginBalance = $", DS0 (d_BeginBalance), " (", WindowExpertName(), ").");
        }
        lb_Pause = True;
    }
    else
    {
        if (lb_Pause)
        {sInfo = 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_Array[], string Com = "", int index = -1)
{
    int err = GetLastError();
    string ls_err;
//---- 
    if (err > 0 && err != 4202)
    {
        ls_err = StringConcatenate (Com, " Îøèáêà ¹ ", err, ": ", ErrorDescription (err));
        Print (ls_err);
        if (index >= 0)
        {Comm_Array[index] = ls_err;}
    }
//---- 
    return (err);
}
//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 ---