e-PSI8ExtremumsAndChannel

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-PSI8ExtremumsAndChannel
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                       e-PSI@Extremums&Channel.mq4 |
//|                                                         Copyright © 2011, TarasBY |
//|                                                                taras_bulba@tut.by |
//|                                                    òîë÷¸ê îò Evgeny I. SHCHERBINA |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
#property copyright "Copyright © 2011, TarasBY WM R418875277808"
#property link      "taras_bulba@tut.by"
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
/*Ñîâåòíèê âûïîëíÿåò ñëåäóþùåå:
1. Íàõîäèò ýêñòðåìóìû è îïðåäåëÿåò "ôëýòîâûé êîðèäîð";
2. Îòêðûâàåò ñäåëêè â îáðàòíîì íàïðàâëåíèè îò ýêñòðåìóìîâ è ïðè ïðîáèòèè êîðèäîðà (ôëýòà);
3. Êîìïåíñèðóåò âîçìîæíûå óáûòî÷íûå ñäåëêè îòêðûòèåì êîìïåíñàòîðíîãî îðäåðà â òîì æå
   íàïðàâëåíèè c óâåëè÷èâàþùèìñÿ ëîòîì (åñëè ðàçðåøåíî).*/
//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            = 10;          // Ìèí. ïðîôèò äëÿ çàêðûòèÿ îðäåðà (â ïï.)
extern int    MIN_StopLoss          = 50;          // Ìèí. ñòîï-ëîññ äëÿ âñåõ îðäåðîâ
extern bool   Send_base_ON          = TRUE;        // Îòêðûâàåì base (îñíîâíûå) îðäåðà
extern int    MIN_Range             = 80;          // ìèí. äèàïàçîí ìåæäó ìèí. è ìàêñ.
extern int    Trailling_Volume      = 20;          // Ðàçìåð òðàëà 
extern bool   Send_comp_ON          = TRUE;        // Îòêðûâàåì êîìïåíñàòîðíûå (âìåñòå ñ base èëè flat) îðäåðà
extern double K_comp_lot            = 2.0;         // Êîýôôèöèåíò óâåëè÷èâàþùåãîñÿ ëîòà äëÿ êîìïåíñàòîðíîãî îðäåðà
extern int    Comp_Range            = 150;         // Ìèí. ðàññòîÿíèå â ïï. îò 1-ãî îðäåðà äî íîâîãî ýêñòðåìóìà
extern bool   Send_flat_ON          = TRUE;        // Îòêðûâàåì flat (íà ïðîáîé flat-êàíàëà) îðäåðà
extern int    MAX_flat_Range        = 30;          // ìàêñ. äèàïàçîí "ôëýòîâîãî êîðèäîðà"
extern int    Weight_Channel        = 20;          // Äëèíà "ôëýòîâîãî êîðèäîðà" â ñâå÷àõ
extern int    Trailling_Vol_Channel = 7;           // òðàë êîðèäîðà
extern bool   Dinamic_Trail_ON      = TRUE;        // Ðàçìåð òðàëà îïðåäåëÿåì ïî MAX ðàçìåðó ñâå÷è ïîñëåäíèõ Counted_Bars áàðîâ
extern int    Counted_Bars          = 5;           // Êîëè÷åñòâî ïîñëåäíèõ ñâå÷åé äëÿ îïðåäåëåíèÿ âåëè÷èíû Trailling
extern int    Slippage              = 2;           // Äîïóñòèìîå îòêëîíåíèå îò çàïðîøåííîé öåíû
extern int    CloseTime             = 7;           // Êîëè÷åñòâî äíåé æèçíè ëîññîâîãî îðäåðà
extern bool   SoundAlert            = FALSE;       // Çâóê
extern string Setup_PartClose    = "======== ×àñòè÷íîå çàêðûòèå flat îðäåðîâ ========";
extern bool   PartClose_ON          = TRUE;        // ×àñòè÷íîå çàêðûòèå flat îðäåðîâ
extern string Levels                = "20/50/200"; // Óðîâíè çàêðûòèÿ. Íàïðèìåð, ïðè ïàðàìåòðàõ 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              = "50/25/25";  // Ïðîöåíò çàêðûòèÿ (÷åðåç ðàçäåëèòåëü "/") äëÿ ñîîòâåòñòâóþùåãî óðîâíÿ. Çäåñü îòñ÷åò èäåò îò ëîòà ïåðâîãî îðäåðà. Åñëè èñõîäíûé îðäåð îòêðûò ñ ëîòîì 1.0 ëîò, çàêðûâàåòñÿ 50% - 0.5, çàòåì 25% îò 1.0 - 0.3 è íàêîíåö 0.2
extern string Setup_Lots         = "========= Ïàðàìåòðû ìîäóëÿ ðàñ÷¸òà ëîòà =========";
extern bool   UseMM                 = TRUE;        // Èñïîëüçîâàòü ðàñøèðÿþùèéñÿ ëîò
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.1;         // Ôèêñèðîâàííûé ðàçìåð ëîòà
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 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;
//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,
         gia_HistoryOrders[3], gia_MG[2], gia_Levels[], gia_Percents[];
string   gs_trade, gs_sign, gsa_NameCom[] = {"base","add","flat"}, gs_Symbol,
         gs_NameGV, gs_fName, gs_ComError = "";
bool     gb_flat = false, gba_Send[3], RealTrade = true,
         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, dta_CommentTime[10];
//IIIIIIIIIIIIIIIIIII==========Ïîäêëþ÷åííûå áèáëèîòåêè==========IIIIIIIIIIIIIIIIIIIIII+
#import "kernel32.dll"
void GetLocalTime (int& TimeArray[]);
int  GetTimeZoneInformation (int& TZInfoArray[]);
#import
//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;
    gba_Send[0] = Send_base_ON;
    gba_Send[1] = Send_comp_ON;
    gba_Send[2] = Send_flat_ON;
    gs_trade = "Ïðîâåä¸ííûå îïåðàöèè îòñòóòñòâóþò !!!";
    //---- Îïðåäåëÿåì çíà÷åíèå âàëþòû äåïîçèòà (äëÿ îòîáðàæåíèÿ ñòàòèñòèêè)
    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_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 (!RealTrade)
    {SoundAlert = false;}
    if (IsOptimization())
    {DrawObject_ON = false;}
    //---- Ïîä÷èùàåì GV-ïåðåìåííûå
    if (!RealTrade)
    {GlobalVariablesDeleteAll (gs_NameGV);}
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    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);}
//----
    int li_add_Ticket = 0, err = GetLastError();
    //---- Äëÿ èçëèøíåé îïòèìèçàöèè óáèðàåì íå ñóùåñòâåííûå âàðèàíòû
    if (IsOptimization())
    {
        if (MIN_Range <= MAX_flat_Range || Comp_Range <= MIN_Range)
        {return (0);}
    }
    //---- Îïðåäåëÿåì ïåðèîäè÷íîñòü ðàáîòû ñîâåòíèêà
    if (NewBarInPeriod >= 0)
    {
        if (NewBar == iTime (gs_Symbol, NewBarInPeriod, 0))
        {return (0);}
        NewBar = iTime (gs_Symbol, NewBarInPeriod, 0);
    }
    //---- Ïîëó÷àåì öåíû, ñ êîòîðûìè áóäåò ðàáîòàòü ñîâåòíèê
    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);
        fTrailling (gia_MG);
    }
    //---- Îðãàíèçîâûâàåì ðàáîòó ïî âðåìåíè
    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)                         // íå ñôîðìèðîâàí "ôëýòîâûé êîðèäîð"
            {
                //---- Ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ îñíîâíîãî îðäåðà
                gi_Ticket = fBase_Strategy (gia_MG[0]);
                if (gi_Ticket > 0)
                {
                    if (OrderSelect (gi_Ticket, SELECT_BY_TICKET)) {OrderPrint();}
                    gs_trade = StringConcatenate ("Îòêðûëè base-îðäåð[", gi_Ticket, "] ", GetNameOP (OrderType()), " (", OrderMagicNumber(), ") !!!");
                    Print (gs_trade, "[", OrdersTotal(), "/", gi_MyOrders, "]");
                }
            }
            //---- Åñëè îñíîâíàÿ ñäåëêà íå îòêðûòà
            if (Send_flat_ON && gi_Ticket <= 0)
            {
                //---- Îïðåäåëÿåì øèðèíó ïîëó÷åííîãî êàíàëà
                gd_Channel_base = gd_HIGH - gd_LOW;
                //---- Ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ flat-îðäåðà
                gi_Ticket = fChannel_Strategy (gia_MG[1]);
                if (gi_Ticket > 0)
                {
                    gb_flat = false;
                    if (OrderSelect (gi_Ticket, SELECT_BY_TICKET)) {OrderPrint();}
                    gs_trade = StringConcatenate ("Îòêðûëè flat-îðäåð[", gi_Ticket, "] ", GetNameOP (OrderType()), " (", OrderMagicNumber(), ") !!!");
                    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 (gd_MIN_Range, gi_Ticket) == 0)
                    {return (0);}
                }
                if (OrderType() == OP_SELL)
                {
                    if (fGet_HIGH (gd_MIN_Range, gi_Ticket) == 0)
                    {return (0);}
                }
                //---- Îïðåäåëÿåì øèðèíó ïîëó÷åííîãî êàíàëà
                gd_Channel_base = gd_HIGH - gd_LOW;
                if (gd_Channel_base > gd_MIN_Range)
                {Print ("Íîâûé êàíàë äëÿ îòêðûòèÿ êîìïåíñàòîðíîãî îðäåðà ñôîðìèðîâàí = ", gd_Channel_base / gd_Point, " !!!");}
                //---- Ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ êîìïåíñàòîðíîãî îðäåðà
                li_add_Ticket = fCompensation_Strategy (gi_Ticket, gia_MG[0]);
                if (li_add_Ticket > 0)
                {
                    gb_flat = false;
                    if (OrderSelect (li_add_Ticket, SELECT_BY_TICKET)) {OrderPrint();}
                    gs_trade = StringConcatenate ("Îòêðûëè add-îðäåð[", li_add_Ticket, "] ", GetNameOP (OrderType()), " (", OrderMagicNumber(), ") !!!");
                    Print (gs_trade, "[", OrdersTotal(), "]");
                }
            }
        }
    }
    //---- Ðèñóåì íà ãðàôèêå êîììåíòû
    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, 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));
    //---- Èòåðàöèÿ 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)
                {
                    gc_high = Base_color;
                    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, CLR_NONE, Base_color);
                    SetLabel ("time_high",  ": " + TimeToStr (dta_CommentTime[0], TIME_DATE|TIME_MINUTES), 250, 15, 10, Font_Time, 0, 0, CLR_NONE, Time_color);
                }
            }
            li_preTicket = fi_NewTicket;
            return (1);
        }
    }
    //---- Åñëè "¸ëî÷êà" íå íàéäåíà, íàçíà÷àåì íîâûé ìàêñèìóì
    if (i >= gi_counted_bars)
    {
        //---- Áåð¸ì HIGH ïîñëåäíèõ ñóòîê
        gd_HIGH = iHigh (gs_Symbol, PERIOD_D1, 1);
        //---- Íàõîäèì íîìåð áàðà ýòîãî High íà òåêóùåì ãðàôèêå
        i = iBarShift (gs_Symbol, Period(), iTime (gs_Symbol, PERIOD_D1, 1));
        i = 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;
                Print (gs_fName, ": Íîâûé ìàêñèìóì íå íàøëè, ÍÎ íàçíà÷èëè[", li_cnt,"] = ", ls_High);
                ls_Name = fNamedOBJ_cnt ("arrow_high", li_cnt);
                SetArrow (218, ADD_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 ("New HIGH[", li_cnt,"]: "), 5, 15, 10, Font_Table, 0, 0, CLR_NONE, Base_color);
                //---- Òàêîé ìàêñèìóì âûäåëÿåòñÿ äðóãèì öâåòîì
                SetLabel ("high_add", ls_High, 102, 15, 10, Font_Table, 0, 0, CLR_NONE, ADD_color);
                SetLabel ("time_high", ": " + TimeToStr (dta_CommentTime[0], TIME_DATE|TIME_MINUTES), 250, 15, 10, Font_Time, 0, 0, CLR_NONE, 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, 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);}
    //---- Äëÿ ìèíèìóìà - "¸ëî÷êà" ïåðåâ¸ðíóòà
    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)
                {
                    gc_low = Base_color;
                    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, CLR_NONE, Base_color);
                    SetLabel ("time_low",  ":  " + TimeToStr (dta_CommentTime[1], TIME_DATE|TIME_MINUTES), 250, 30, 10, Font_Time, 0, 0, CLR_NONE, Time_color);
                }
            }
            li_preTicket = fi_NewTicket;
            return (1);
        }
    }
    //----Åñëè ïåðåâåðíóòàÿ "¸ëî÷êà" íå íàéäåíà,
    if (i >= gi_counted_bars)
    {
        //---- Áåð¸ì LOW ïîñëåäíèõ ñóòîê
        gd_LOW = iLow (gs_Symbol, PERIOD_D1, 1);
        //---- Íàõîäèì íîìåð áàðà ýòîãî Low íà òåêóùåì ãðàôèêå
        i = iBarShift (gs_Symbol, Period(), iTime (gs_Symbol, PERIOD_D1, 1));
        i = iLowest (gs_Symbol, Period(), MODE_LOW, i, 0);
        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;
                Print (gs_fName, ": Íîâûé ìèíèìóì íå íàøëè, ÍÎ íàçíà÷èëè[", li_cnt,"] = ", ls_Low);
                ls_Name = fNamedOBJ_cnt ("arrow_low", li_cnt);
                SetArrow (217, ADD_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 ("New LOW[", li_cnt,"]: "), 5, 30, 10, Font_Table, 0, 0, CLR_NONE, Base_color);
                //---- Òàêîé ìèíèìóì âûäåëÿåòñÿ äðóãèì öâåòîì
                SetLabel ("low_add", ls_Low, 100, 30, 10, Font_Table, 0, 0, CLR_NONE, ADD_color);
                SetLabel ("time_low",  ":  " + TimeToStr (dta_CommentTime[1], TIME_DATE|TIME_MINUTES), 250, 30, 10, Font_Time, 0, 0, CLR_NONE, 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_Rage = 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 = true;}
        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 (gd_Channel_base < ld_MIN_Rage) {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";
                Print (gs_fName, ": Îøèáêà ïðè îòêðûòèè SELL base-îðäåðà: ", ErrorDescription (GetLastError()));
            }
            else
            {
                ls_err = "yes.wav";
                Print (gs_fName, ": TP = ", (Ask - ld_TP) / gd_Point, "; SL = ", (ld_SL - Ask) / gd_Point);
            }
        }
    }
    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[0] > gda_Price[1] && gd_LOW < gda_Price[1])
        {gb_moove_DW = true;}
        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 (gd_Channel_base < ld_MIN_Rage) {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";
                Print (gs_fName, ": Îøèáêà ïðè îòêðûòèè SELL base-îðäåðà: ", ErrorDescription (GetLastError()));
            }
            else
            {
                ls_err = "yes.wav";
                Print (gs_fName, ": TP = ", (ld_TP - Bid) / gd_Point, "; SL = ", (Bid - ld_SL) / gd_Point);
            }
        }
    }
    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()) + gd_Comp_Range)
        {
            //---- Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå âåðøèíû è æä¸ì äàëüíåéøåãî äâèæåíèÿ âíèç
            if (gd_HIGH - gd_Channel_base * gda_otkat[0] < gda_Price[0] && gd_HIGH > gda_Price[0])
            {gb_moove_UP = true;}
            if (gb_moove_UP                                     // áûëè ó âåðøèíû
            && gd_HIGH - gd_MIN_Range >= gda_Price[0]           // îòêàòèëè
            && OrderOpenPrice() + gd_MIN_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() - gd_Comp_Range)
        {
            //---- Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå âïàäèíû è æä¸ì äàëüíåéøåãî äâèæåíèÿ ââåðõ
            if (gd_LOW + gd_Channel_base * gda_otkat[0] > gda_Price[1] && gd_LOW < gda_Price[1])
            {gb_moove_DW = true;}
            //---- Èëè ìèíèìóìà, ñîîòâåòñòâåííî
            if (gb_moove_DW                                     // áûëè ó âïàäèíû
            && gd_LOW + gd_MIN_Range <= gda_Price[1]            // îòêàòèëè
            && OrderOpenPrice() - gd_MIN_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");}
            Print (gs_fName, ": Îøèáêà ïðè îòêðûòèè ", GetNameOP (li_Type), " add-îðäåðà: ", ErrorDescription (GetLastError()));
        }
    }
    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;}
        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");}
            Print (gs_fName, ": Îøèáêà ïðè ìîäèôèêàöèè ", GetNameOP (li_Type), " îðäåðà[", fi_Ticket, "]: ", ErrorDescription (GetLastError()));
        }
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    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()";
    //---- Îïðåäåëÿåì êàíàë
    fGetChannel (ld_MAX, ld_MIN);
    //---- Ãðàíèöû êàíàëà îáíîâëÿþòñÿ äî ìîìåíòà ôîðìèðîâàíèÿ êàíàëà
    if (!gb_flat)
    {
        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 (gb_flat)
    {
        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");}
            Print (gs_fName, ": Îøèáêà ïðè îòêðûòèè ", GetNameOP (li_Type), " flat-îðäåðà: ", ErrorDescription (GetLastError()));
        }
        else {if (SoundAlert) {PlaySound ("yes.wav");}}
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, gs_fName);
//----
    return (li_Ticket);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|    "Ôëýòîâûé êîðèäîð" âêëþ÷àåò Weight_Channel ñâå÷åê, ñîïðîòèâëåíèå è ïîääåðæêà   |
//|     îïðåäåëÿþòñÿ ïî öåíàì îòêðûòèÿ è çàêðûòèÿ                                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGetChannel (double& fd_MAX, double& fd_MIN)
{
    double lda_Range_MAX[], lda_Range_MIN[];
    int    err = GetLastError();
    static bool lb_first = true;
//----
    //---- Ïðè ïåðâîì çàïóñêå îïðåäåëÿåì ðàçìåðû èñïîëüçóåìûõ ìàññèâîâ
    if (lb_first)
    {
        ArrayResize (lda_Range_MAX, Weight_Channel);
        ArrayResize (lda_Range_MIN, Weight_Channel);
        lb_first = false;
    }
    for (int li_Bar = 1; li_Bar <= Weight_Channel; li_Bar++)
    {
        if (Close[li_Bar] > Open[li_Bar])
        {
            lda_Range_MAX[li_Bar-1] = Close[li_Bar];
            lda_Range_MIN[li_Bar-1] = Open[li_Bar];
        }
        else
        {
           lda_Range_MAX[li_Bar-1] = Open[li_Bar];
           lda_Range_MIN[li_Bar-1] = Close[li_Bar];
        }
    }
    ArraySort (lda_Range_MAX);
    ArraySort (lda_Range_MIN);
    fd_MAX = lda_Range_MAX[Weight_Channel-1];
    fd_MIN = lda_Range_MIN[0];
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, "fGetChannel()");
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Òðàë îñíîâíîé è êîìïåíñàòîðíîé ñäåëîê                                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fTrailling (int ar_MG[])
{
    int li_Type, li_Ticket, 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;}
        if (!fCheckMyMagic (OrderMagicNumber(), ar_MG) || OrderSymbol() != gs_Symbol)
        {continue;}
        //---- Íå òðîãàåì êîìïåíñàòîðíûå îðäåðà
        if (OrderComment() == "sell_add" || OrderComment() == "buy_add")
        {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 (OrderMagicNumber() == ar_MG[0]) {ls_order = gsa_NameCom[0];} else {ls_order = gsa_NameCom[2];}
        if (OrderMagicNumber() == ar_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");}
            Print (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));
        }
        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)
{
    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, High[li_Bar] - Low[li_Bar]);
            fd_Tral2 = MathMax (fd_Tral2, MathAbs (Open[li_Bar] - Close[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, err = GetLastError();
    string ls_Name = "", ls_txt = "", ls_Range;
    color  lc_color;
    static double lsd_LOSS_Percent = 0;
//----
    //---- 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, CLR_NONE, Base_color);
    if (fCCV_S (ls_Range, 2))
    {
        if (!RealTrade) {dta_CommentTime[2] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[2] = TimeCurrent();}
        SetLabel ("time_range",  ":  " + TimeToStr (dta_CommentTime[2], TIME_DATE|TIME_MINUTES), 250, li_row * fi_Y, 10, Font_Time, 0, 0, CLR_NONE, 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, CLR_NONE, lc_color);
    if (fCCV_S (ls_txt, 3))
    {
        if (!RealTrade) {dta_CommentTime[3] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[3] = TimeCurrent();}
        SetLabel ("time_channel",  ":  " + TimeToStr (dta_CommentTime[3], TIME_DATE|TIME_MINUTES), 250, li_row * fi_Y, 10, Font_Time, 0, 0, CLR_NONE, 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, CLR_NONE, Base_color);
    if (fCCV_S (ls_txt, 4))
    {
        if (!RealTrade) {dta_CommentTime[4] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[4] = TimeCurrent();}
        SetLabel ("time_trail",  ":  " + TimeToStr (dta_CommentTime[4], TIME_DATE|TIME_MINUTES), 250, li_row * fi_Y, 10, Font_Time, 0, 0, CLR_NONE, 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, CLR_NONE, Base_color);
    if (fCCV_S (ls_txt, 5))
    {
        if (!RealTrade) {dta_CommentTime[5] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[5] = TimeCurrent();}
        SetLabel ("time_trail_ch",  ":  " + TimeToStr (dta_CommentTime[5], TIME_DATE|TIME_MINUTES), 250, li_row * fi_Y, 10, Font_Time, 0, 0, CLR_NONE, 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, CLR_NONE, Base_color);
    if (fCCV_S (ls_txt, 6))
    {
        if (!RealTrade) {dta_CommentTime[6] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[6] = TimeCurrent();}
        SetLabel ("time_part_close",  ":  " + TimeToStr (dta_CommentTime[6], TIME_DATE|TIME_MINUTES), 250, li_row * fi_Y, 10, Font_Time, 0, 0, CLR_NONE, Time_color);
    }
    //---- 8-ÿ ñòðîêà
    li_row++;
    ls_txt = "****************************************";
    SetLabel ("row", ls_txt, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, CLR_NONE, Base_color);
    //---- 9-ÿ ñòðîêà
    li_row++;
    SetLabel ("send", gs_trade, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, CLR_NONE, ADD_color);
    if (fCCV_S (ls_txt, 7))
    {
        if (!RealTrade) {dta_CommentTime[7] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[7] = TimeCurrent();}
        SetLabel ("time_send",  ":  " + TimeToStr (dta_CommentTime[7], TIME_DATE|TIME_MINUTES), 250, li_row * fi_Y, 10, Font_Time, 0, 0, CLR_NONE, 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, CLR_NONE, Base_color);
    if (fCCV_S (ls_txt, 8))
    {
        if (!RealTrade) {dta_CommentTime[8] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[8] = TimeCurrent();}
        SetLabel ("time_loss",  ":  " + TimeToStr (dta_CommentTime[8], TIME_DATE|TIME_MINUTES), 250, li_row * fi_Y, 10, Font_Time, 0, 0, CLR_NONE, Time_color);
    }
    //---- 11-ÿ ñòðîêà
    li_row++;
    ls_txt = "Îáùèé PROFIT:";
    SetLabel ("result", ls_txt, fi_X, li_row * fi_Y, 12, Font_Table, 0, 0, CLR_NONE, 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, CLR_NONE, Base_color);
        SetLabel ("ordersS_" + cnt, ":", 75, li_row_result + fi_Y * cnt, 10, Font_Table, 0, 0, CLR_NONE, 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, CLR_NONE, 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, CLR_NONE, lc_color);
    //---- 15-ÿ ñòðîêà
    li_row += cnt + 1;
    ls_txt = "****************************************";
    SetLabel ("row1", ls_txt, fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, CLR_NONE, Base_color);
    //---- 16-ÿ ñòðîêà
    li_row++;
    ls_txt = "ERROR:";
    SetLabel ("error", ls_txt, fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, CLR_NONE, Base_color);
    if (fCCV_S (gs_ComError, 9))
    {
        if (!RealTrade) {dta_CommentTime[9] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[9] = TimeCurrent();}
        SetLabel ("time_err",  ":  " + TimeToStr (dta_CommentTime[9], TIME_DATE|TIME_MINUTES), 250, li_row * fi_Y, 10, Font_Time, 0, 0, CLR_NONE, 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, CLR_NONE, Gray);}
    //---- Ðèñóåì íà ãðàôèêå êîðèäîð "ôëåòà"
    if (gb_flat)
    {
        ls_txt = StringConcatenate ("Íàðèñîâàë ôëýòîâûé êàíàë: MAX = ", DoubleToStr (gd_flat_MAX, gi_Digits), "; MIN = ", DoubleToStr (gd_flat_MIN, gi_Digits));
        //---- ×òîáû íå ïîâòîðÿòüñÿ, ââîäèì ñðàâíåíèå ñ ïðåäûäóùèì êîììåíòîì
        if (fCCV_S (ls_txt, 10))
        {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[20], 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[20], 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 = StringConcatenate ("Íàðèñîâàëè îñíîâíîé êàíàë: HIGH = ", DoubleToStr (gd_HIGH, gi_Digits), "; LOW = ", DoubleToStr (gd_LOW, gi_Digits));
            //Print (ls_txt);
        }
        if (fCCV_D (gd_HIGH, 0))
        {
            DelObject ("ray_high");
            //ls_txt = StringConcatenate ("Íàðèñîâàëè HIGH = ", DoubleToStr (gd_HIGH, gi_Digits));
            //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[20], 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 = StringConcatenate ("Íàðèñîâàëè LOW = ", DoubleToStr (gd_LOW, gi_Digits));
            //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[20], 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, 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);}
        if (OrderSymbol() == gs_Symbol && fCheckMyMagic (OrderMagicNumber(), ar_MG))
        {
            if (OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
                //---- Åñëè óñòàíîâëåíî, çàêðûâàåì âñå îðäåðà â êîíöå äíÿ
                fCloseHour (AllCloseHour, OrderTicket());
                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 (OrderMagicNumber() == ar_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 = StringConcatenate ("×àñòè÷íî çàêðûëè flat-îðäåð[", li_Ticket, "] !!!");
                                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+
//|  Àâòîð    : 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();
    double   ld_Price;
    int      err = GetLastError();
    bool     lb_result = false;
//----
    if (PERIOD_D1 * 60 * fi_Period + ldt_OpenTime < TimeCurrent())
    {
        //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");}
            Print ("fLossControl(): Óäàëèëè ëîññîâûé îðäåð[", OrderTicket(), "] ïî ïðîøåñòâèè ", fi_Period, " äíåé !!!");
        }
        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, 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))
        {
            if (fCheckMyMagic (OrderMagicNumber(), ar_Magic) && OrderSymbol() == fs_Symbol)
            {
                if (OrderType() < 2 && (op < 0 || OrderType() == op))
                {
                    if (dt < OrderCloseTime())
                    {
                        ld_Pribul = OrderProfit() + OrderSwap() + OrderCommission();
                        ls_Comment = OrderComment();
                        if (StringFind (ls_Comment, "sell_base") == 0 || StringFind (ls_Comment, "buy_base") == 0)
                        {
                            ar_Pribul[0] += ld_Pribul;
                            ar_HistoryOrders[0]++;
                            continue;
                        }
                        if (StringFind (ls_Comment, "sell_add") == 0 || StringFind (ls_Comment, "buy_add") == 0)
                        {
                            ar_Pribul[1] += ld_Pribul;
                            ar_HistoryOrders[1]++;
                            continue;
                        }
                        if (OrderMagicNumber() == ar_Magic[1])
                        {
                            ar_Pribul[2] += ld_Pribul;
                            ar_HistoryOrders[2]++;
                            continue;
                        }
                    }
                }
            }
        }
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    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], ")");}
        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, ")");}
            Print ("fPartClose(): Îøèáêà ïðè ", ls_close, " çàêðûòèè ", GetNameOP (OrderType()), " îðäåðà[", fi_Ticket,
            "/P-", li_ParentTicket, "]: ", ErrorDescription (GetLastError()),
            "\nLot = ", DoubleToStr (OrderLots(), gi_dig), "; LotClose = ", DoubleToStr (ld_LotsClose, gi_dig)," !!!");
        }
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    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+
bool fCheckMyMagic (int fi_Magic, int ar_Magic[2])
{
//----
    for (int li_int = 0; li_int < 2; li_int++)
    {
        if (fi_Magic == ar_Magic[li_int])
        {return (true);}
    }
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Çàêðûâàåì îðäåð ïî âðåìåíè                                                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCloseHour (int fi_HourClose, int fi_Ticket)
{
    double ld_Price;
    string ls_txt;
//----
    if (!TimeControl)
    {return (true);}
    if (fi_HourClose < 24 && fi_HourClose > 0)
    {
        if (TimeHour (GetTime()) >= fi_HourClose)
        {
            RefreshRates();
            if (OrderType() == OP_BUY) {ld_Price = Bid;} else {ld_Price = Ask;}
            if (OrderClose (fi_Ticket, OrderLots(), ld_Price, Slippage, Yellow))
            {
                if (IsOptimization())
                {return (true);}
                gs_trade = StringConcatenate ("fCloseHour(): Çàêðûëè îðäåð[", fi_Ticket, "] â êîíöå äíÿ! (", OrderMagicNumber(), ").");
                Print (gs_trade);
                return (true);
            }
            else
            {
                if (SoundAlert) {PlaySound ("mistake.wav");}
                Print ("fCloseHour(): Îøèáêà ïðè çàêðûòèè ", GetNameOP (OrderType()), " îðäåðà[", fi_Ticket, "] â êîíöå äíÿ: ", ErrorDescription (GetLastError()));
            }
        }
    }
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Îáùèå ôóíêöèè                                                             |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð    : TarasBY                                                               |
//+-----------------------------------------------------------------------------------+
//|  Âåðñèÿ  : 27.10.2009                                                             |
//|  Îïèñàíèå: fControlChangeValue_I Ôèêñèðóåò ôàêò èçìåíåíèÿ ïðîâåðÿåìîãî            |
//|  int ïàðàìåòðà                                                                    |
//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_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);}}
//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_LABEL                                           |
//+-----------------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                       |
//|    name - íàèìåíîâàíèå îáúåêòà                                                    |
//|    text - ñàì îáúåêò                                                              |
//|    X - êîîðäèíàòà X                                                               |
//|    Y - êîîðäèíàòà Y                                                               |
//|    size - ðàçìåð îáúåêòà                                                          |
//|    Font - øðèôò îáúåêòà                                                           |
//|    Angle - óãîë                                       (0  - ïî óìîë÷àíèþ)         |
//|    iWindow - îêíî â êîòîðîì ðàñïîëîæåí îáúåêò         (0  - ïî óìîë÷àíèþ)         |
//|    CL1 - öâåò                                         (CLR_NONE - ïî óìîë÷àíèþ)   |
//|    CL2 - öâåò                                         (CLR_NONE - ïî óìîë÷àíèþ)   |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void SetLabel (string name, string text, int X, int Y, int size, string Font,
               int Angle = 0, int iWindow = 0, color CL1 = CLR_NONE, color CL2 = CLR_NONE)
{
    if (ObjectFind (name) == -1)
    {ObjectCreate (name, OBJ_LABEL, iWindow, 0, 0);}
    ObjectSet (name, OBJPROP_COLOR, CL2);
    ObjectSet (name, OBJPROP_XDISTANCE, X);
    ObjectSet (name, OBJPROP_YDISTANCE, Y);
    if (Angle > 0)
    {ObjectSet (name, OBJPROP_ANGLE, Angle);}
    if (text != "")
    {ObjectSetText (name, text, size, Font, CL1);}
//----
    return;   
}
//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);}
        }
    }
//----
    return (false);
}
//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 (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, 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+
//|     Ôóíêöèÿ 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+

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 ---