Author: Copyright � 2010-11, TarasBY & Evgeniy Trofimov
Orders Execution
Checks for the total of open orders
0 Views
0 Downloads
0 Favorites
e-PSIhPROC
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                                    e-PSI@PROC.mq4 |
//|                                      Copyright © 2011, TarasBY & Evgeniy Trofimov |
//|                                                                taras_bulba@tut.by |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
#property copyright "Copyright © 2010-11, TarasBY & Evgeniy Trofimov"
#property link      "taras_bulba@tut.by"
/* * Ïîñëå óñòàíîâêè ýêñïåðòà íà ãðàôèê ìåíÿòü òàéìôðåéì íå ðåêîìåíäóåòñÿ!
   * Ðåêîìåíäóåìûå Òàéìôðåéìû H4 - D1 !!!
   * Äîïóñêàåòñÿ äîáàâëÿòü â êîä ïðî÷èå òîðãîâûå ñèñòåìû, ñïîñîáíûå ñòàáèëüíî
   * ðàáîòàòü íà òàêîì æå òàéìôðåéìå, ÷òî è îñòàëüíûå òîðãîâûå ñòðàòåãèè.
   * ÂÍÈÌÀÍÈÅ: Ïàðàìåòðû óêàçàíû äëÿ 4-¸õ çíàêîâ!*/
//IIIIIIIIIIIIIIIIIII==================CONSTANS=================IIIIIIIIIIIIIIIIIIIIII+
#define  MAX_TC                   8    // ìàêñèìàëüíîå êîëè÷åñòâî èñïîëüçóåìûõ ñòðàòåãèé
#define  Trend_UP                 0    // Êîíñòàíòà äëÿ ðàáîòû TraillingProfit
#define  Trend_DW                 1    // Êîíñòàíòà äëÿ ðàáîòû TraillingProfit
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  *****         Ïàðàìåòðû ñîâåòíèêà         *****                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
extern string SETUP_Expert    = "==================== SETUP EXPERT ===================";
extern string file               = "virtual.csv"; // ôàéë âèðòóàëüíîé òîðãîâëè
extern int    MinRating          = 50;            // Ìèíèìàëüíûé ðåéòèíã â ïðîöåíòàõ äëÿ îòêðûòèÿ ðåàëüíîé ïîçèöèè
extern int    Base.Magic		   = 878;           // Áàçîâûé ðàáî÷èé ìàãèê äëÿ òîðãîâûõ ñèñòåì
extern int    NewBarInPeriod     = 1;             // <= 0 - ðàáîòàåì íà íà÷àëå ïåðèîäà íîâîãî áàðà, -1 - ðàáîòàåì íà êàæäîì òèêå
extern int    Variant_TradePrice = 1;             // Âàðèàíò öåí, ñ êîòîðûìè áóäåò ðàáîòàòü ñîâåòíèê
extern int    MAX_OrdersOnTC	   = 1;             // Ìàêñèìàëüíîå ÷èñëî îòêðûòûõ îðäåðîâ íà îäíó Òîðãîâóþ Ñèñòåìó
extern int    Period.New.Send	   = 1440;          // Ïåðèîäè÷íîñòü ïðîâåðêè íà îòêðûòèå ñëåäóþùåãî îðäåðà îäíîé ñòðàòåãèåé, åñëè MAX_OrdersOnTC > 1
extern int    Period.Indicators  = 1440;          // Ðàáî÷èé ïåðèîä äëÿ èíäèêàòîðîâ
extern int    STOP.Period        = 70;            // Ïåðèîä äëÿ ðàñ÷¸òà Ñòîïîâ ïî ÌÀ
extern string Setup_TraillingMA  = "---- Trailling By MA ----";
extern int    MAMode             = 1;             // 0 = SMA, 1 = EMA, 2 = SSMA, 3 = LWMA
extern int    XFactor            = 84;
extern int    TrailPeriod        = 83;
extern string SETUP_TP        = "================= Trailling Profit ==================";
extern bool   TrailProfit_ON     = TRUE;          // Âêëþ÷åíèå òðåéëèíãà îáùåãî Ïðîôèòà
extern bool   TrailProfitByMA    = TRUE;          // Òðåéëèíã îáùåãî Ïðîôèòà ïî MA
extern int    TrailProfitPeriod  = 50;            // Ïåðèîä MA äëÿ òðåéëèíãà ïî MA
extern double TrailProfit_Start  = 300;           // Âåëè÷èíà ïðîôèòà ïðè êîòîðîì íà÷èíàåòñÿ ïåðåìåùåíèå óðîâíÿ çàêðûòèÿ 
extern double TrailProfit_Level  = 200;           // Âåëè÷èíà îáðàòíîãî äâèæåíèÿ ïðîôèòà, ïðè êîòîðîì âûïîëíÿåòñÿ çàêðûòèå 
extern string SETUP_TC_1      = "================= TRADE SYSTEM ¹ 1 ==================";
extern int    T1.Enabled         = 1;             // 1 - âêë.; 0 - âûêë. 
extern double T1.lot             = 0.10;          // Âåëè÷èíà ôèêñèðîâàííîãî ëîòà
extern int    T1.Var.STOP        = 1;             // Âàðèàíò Ñòîïîâ: 0 - classic; 1 - By MA
extern int    T1.SL              = 300;           // Ñòîï ëîññ
extern int    T1.TP              = 300;           // Òýéê ïðîôèò
extern int    T1.Var.TS          = 1;             // Âàðèàíò Òðåéëèíã ñòîïà: 0 - classic; 1 - By MA
extern int    T1.TS              = 100;           // Òðåéëèíã ñòîï
extern bool   T1.OnlyBU          = False;         // TraillinStop òîëüêî â ÁÓ
extern int    T1.Fast            = 10;            // Ïåðèîä áûñòðîé ÌÀ
extern int    T1.Slow            = 100;           // Ïåðèîä ìåäëåííîé ÌÀ
extern int    T1.PeriodRating    = 5;             // Ïåðèîä óñðåäíåíèÿ ðåéòèíãà
extern string SETUP_TC_2      = "================= TRADE SYSTEM ¹ 2 ==================";
extern int    T2.Enabled         = 1;             // 1 - âêë.; 0 - âûêë. 
extern double T2.lot             = 0.10;          // Âåëè÷èíà ôèêñèðîâàííîãî ëîòà
extern int    T2.Var.STOP        = 1;             // Âàðèàíò Ñòîïîâ: 0 - classic; 1 - By MA
extern int    T2.SL              = 500;           // Ñòîï ëîññ
extern int    T2.TP              = 500;           // Òýéê ïðîôèò
extern int    T2.Var.TS          = 1;             // Âàðèàíò Òðåéëèíã ñòîïà: 0 - classic; 1 - By MA
extern int    T2.TS              = 150;           // Òðåéëèíã ñòîï
extern bool   T2.OnlyBU          = False;         // TraillinStop òîëüêî â ÁÓ
extern int    T2.PeriodCCI       = 30;
extern int    T2.LevelCCI        = 200;
extern int    T2.PeriodRating    = 3;             // Ïåðèîä óñðåäíåíèÿ ðåéòèíãà
extern string SETUP_TC_3      = "================= TRADE SYSTEM ¹ 3 ==================";
extern int    T3.Enabled         = 1;             // 1 - âêë.; 0 - âûêë. 
extern double T3.lot             = 0.10;          // Âåëè÷èíà ôèêñèðîâàííîãî ëîòà
extern int    T3.Var.STOP        = 1;             // Âàðèàíò Ñòîïîâ: 0 - classic; 1 - By MA
extern int    T3.SL              = 300;           // Ñòîï ëîññ
extern int    T3.TP              = 300;           // Òýéê ïðîôèò
extern int    T3.Var.TS          = 1;             // Âàðèàíò Òðåéëèíã ñòîïà: 0 - classic; 1 - By MA
extern int    T3.TS              = 80;            // Òðåéëèíã ñòîï
extern bool   T3.OnlyBU          = False;         // TraillinStop òîëüêî â ÁÓ
extern int    T3.Fast            = 30;            // Ïåðèîä áûñòðîé ÌÀ
extern int    T3.Slow            = 200;           // Ïåðèîä ìåäëåííîé ÌÀ
extern int    T3.PeriodRating    = 5;             // Ïåðèîä óñðåäíåíèÿ ðåéòèíãà
extern string SETUP_TC_4      = "================= TRADE SYSTEM ¹ 4 ==================";
extern int    T4.Enabled         = 1;             // 1 - âêë.; 0 - âûêë. 
extern double T4.lot             = 0.10;          // Âåëè÷èíà ôèêñèðîâàííîãî ëîòà
extern int    T4.Var.STOP        = 1;             // Âàðèàíò Ñòîïîâ: 0 - classic; 1 - By MA
extern double T4.SL              = 500;           // Ñòîï ëîññ
extern int    T4.TP              = 500;           // Òýéê ïðîôèò
extern int    T4.Var.TS          = 1;             // Âàðèàíò Òðåéëèíã ñòîïà: 0 - classic; 1 - By MA
extern double T4.TS              = 150;           // Òðåéëèíã ñòîï
extern bool   T4.OnlyBU          = False;         // TraillinStop òîëüêî â ÁÓ
extern double T4.LimitMACD       = 0.002;
extern int    T4.PeriodRating    = 5;             // Ïåðèîä óñðåäíåíèÿ ðåéòèíãà
extern string SETUP_TC_5      = "================= TRADE SYSTEM ¹ 5 ==================";
extern int    T5.Enabled         = 1;             // 1 - âêë.; 0 - âûêë. 
extern double T5.lot             = 0.10;          // Âåëè÷èíà ôèêñèðîâàííîãî ëîòà
extern int    T5.Var.STOP        = 1;             // Âàðèàíò Ñòîïîâ: 0 - classic; 1 - By MA
extern int    T5.SL              = 500;           // Ñòîï ëîññ
extern int    T5.TP              = 500;           // Òýéê ïðîôèò
extern int    T5.Var.TS          = 1;             // Âàðèàíò Òðåéëèíã ñòîïà: 0 - classic; 1 - By MA
extern int    T5.TS              = 300;           // Òðåéëèíã ñòîï
extern bool   T5.OnlyBU          = True;          // TraillinStop òîëüêî â ÁÓ
extern int    T5.PeriodCCI       = 90;
extern int    T5.LevelCCI        = 100;
extern int    T5.TralingCCI      = 10;
extern int    T5.PeriodRating    = 5;             // Ïåðèîä óñðåäíåíèÿ ðåéòèíãà
extern string SETUP_TC_6      = "================= TRADE SYSTEM ¹ 6 ==================";
extern int    T6.Enabled         = 1;             // 1 - âêë.; 0 - âûêë. 
extern int    VarPerceptron      = 1;             // 0 - Perceptron íà Close\Open; 1 - íà iStochastic; 2 - íà CCI
extern double T6.lot             = 0.10;          // Âåëè÷èíà ôèêñèðîâàííîãî ëîòà
extern int    T6.Var.STOP        = 1;             // Âàðèàíò Ñòîïîâ: 0 - classic; 1 - By MA
extern int    T6.SL              = 500;           // Ñòîï ëîññ
extern int    T6.TP              = 500;           // Òýéê ïðîôèò
extern int    T6.Var.TS          = 1;             // Âàðèàíò Òðåéëèíã ñòîïà: 0 - classic; 1 - By MA
extern int    T6.TS              = 150;           // Òðåéëèíã ñòîï
extern bool   T6.OnlyBU          = False;         // TraillinStop òîëüêî â ÁÓ
extern int    x1                 = 120;           // 0 - 200: D = 1
extern int    x2                 = 172;           // 0 - 200: D = 1
extern int    x3                 = 39;            // 0 - 200: D = 1
extern int    x4                 = 172;           // 0 - 200: D = 1
extern double Per_BUY            = 20.0;
extern double Per_Close_BUY      = -5.0;
extern double Per_SELL           = -20.0;
extern double Per_Close_SELL     = 5.0;
extern string PerceptronBars     = "1,3,5,10,15";
extern string Setup_TC_6_Stoch   = "---- Íàñòðîéêè iStochastic ----";
extern int    T6.K_Period        = 92;
extern int    T6.D_Period        = 5;
extern int    T6.Slowing         = 11;
extern string Setup_TC_6_CCI     = "-------- Íàñòðîéêè iCCI -------";
extern int    T6.Period_CCI      = 14;
extern int    T6.Price_CCI       = 0;
extern int    T6.PeriodRating    = 5;             // Ïåðèîä óñðåäíåíèÿ ðåéòèíãà
extern string SETUP_TC_7      = "================= TRADE SYSTEM ¹ 7 ==================";
extern int    T7.Enabled         = 1;             // 1 - âêë.; 0 - âûêë. 
extern double T7.lot             = 0.10;          // Âåëè÷èíà ôèêñèðîâàííîãî ëîòà
extern int    T7.Var.STOP        = 1;             // Âàðèàíò Ñòîïîâ: 0 - classic; 1 - By MA
extern int    T7.SL              = 500;           // Ñòîï ëîññ
extern int    T7.TP              = 500;           // Òýéê ïðîôèò
extern int    T7.Var.TS          = 1;             // Âàðèàíò Òðåéëèíã ñòîïà: 0 - classic; 1 - By MA
extern int    T7.TS              = 150;           // Òðåéëèíã ñòîï
extern bool   T7.OnlyBU          = False;         // TraillinStop òîëüêî â ÁÓ
extern int    Warp               = -42;           // -100 - 100: D = 1
extern double Deviation          = 0.14;          // 0 - 2:      D = 0.01
extern int    Amplitude          = 8;             // 0 - 200:    D = 1
extern double Distortion         = 0.52;          // -1 - 1:     D = 0.01
extern double Dir_BUY            = 1.0;
extern double Dir_Close_BUY      = -0.8;
extern double Dir_SELL           = -1.0;
extern double Dir_Close_SELL     = 0.8;
extern string DirectionBars      = "1,3,5,10";
extern int    T7.PeriodRating    = 5;             // Ïåðèîä óñðåäíåíèÿ ðåéòèíãà
extern string SETUP_TC_8      = "================= TRADE SYSTEM ¹ 8 ==================";
extern int    T8.Enabled         = 1;             // 1 - âêë.; 0 - âûêë. 
extern double T8.lot             = 0.10;          // Âåëè÷èíà ôèêñèðîâàííîãî ëîòà
extern int    T8.Var.STOP        = 1;             // Âàðèàíò Ñòîïîâ: 0 - classic; 1 - By MA
extern int    T8.SL              = 300;           // Ñòîï ëîññ
extern int    T8.TP              = 300;           // Òýéê ïðîôèò
extern int    T8.Var.TS          = 1;             // Âàðèàíò Òðåéëèíã ñòîïà: 0 - classic; 1 - By MA
extern int    T8.TS              = 120;           // Òðåéëèíã ñòîï
extern bool   T8.OnlyBU          = False;         // TraillinStop òîëüêî â ÁÓ
extern int    T8.MA              = 40;            // Ïåðèîä áûñòðîé ÌÀ
extern int    T8.PeriodRating    = 5;             // Ïåðèîä óñðåäíåíèÿ ðåéòèíãà
//IIIIIIIIIIIIIIIIIII======Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà======IIIIIIIIIIIIIIIIIIIIII+
double        gda_Price[2],               // ìàññèâ öåí èíñòðóìåíòà
              // gda_Price[0] - Bid
              // gda_Price[1] - Ask
              gda_TC.SL[MAX_TC],
              gda_TC.TP[MAX_TC],
              gda_TC.TS[MAX_TC],
              gda_TC.lot[MAX_TC],
              gd_Point, /*gd_MaxLot, gd_MinLot, gd_StepLot*/
              gd_Profit,
              gd_XFactor;
int           gia_TC.Magic[MAX_TC],
              gia_TC.Enable[MAX_TC],
              gia_TC.PeriodRating[MAX_TC],
              gia_TC.Var.TS[MAX_TC],
              gia_TC.Var.STOP[MAX_TC],
              gia_TC.Orders[MAX_TC],      // ìàññèâ ñ÷¸ò÷èêîâ îòêðûòûõ îðäåðîâ ïî êàæäîé ñòàðàòåãèè
              gia_PerceptronBars[5],
              gia_DirectionBars[4],
              gi_MyOrders,                // ñ÷¸ò÷èê îòêðûòûõ îðäåðîâ ïî âñåì ñòðàòåãèÿì
              gi_flag_TP,                 // ôëàã Traiiling Profit
              gi_flag_NullStop,           // ôëàã îáíóëåíèÿ ñòîïîâ
              gi_LastTrend = -1,          // ïðåäûäóùåå ïîêàçàíèå òðåíäà
              gi_Decimal = 1, gi_Digits, gi_dig = 0;
string        gs_Symbol, gs_NameGV, gs_trade, gs_TradeCom[3], gs_VirtCom[3];
bool          gba_TC.OnlyBU[MAX_TC];
datetime      NewBar;
//IIIIIIIIIIIIIIIIIII==========Ïîäêëþ÷åííûå áèáëèîòåêè==========IIIIIIIIIIIIIIIIIIIIII+
#include      <VirtualTrendForPROC.mqh>   // áèáëèîòåêà âèðòóàëüíûõ ñäåëîê
#include      <RealTrendForPROC.mqh>      // áèáëèîòåêà òîðãîâûõ îïðåàöèé
#include      <b-PSI@ICManagerForPROC.mqh>       // áèáëèîòåêà óïðàâëåíèÿ èíâåñò-êàïèòàëîì
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  Custom expert initialization function                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int init()
{
//----
    gs_NameGV = "PROC";
    //---- Ôîðìèðóåì ïðåôèêñ GV-ïåðåìåííûõ
    if (IsTesting())
    {gs_NameGV = gs_NameGV + "_t";}
    if (IsDemo())
    {gs_NameGV = gs_NameGV + "_d";}
	 gs_Symbol = Symbol();
    gd_MaxLot = MarketInfo (gs_Symbol, MODE_MAXLOT);
    gd_MinLot = MarketInfo (gs_Symbol, MODE_MINLOT);
    gd_StepLot = MarketInfo (gs_Symbol, MODE_LOTSTEP);
    gd_Point = MarketInfo (gs_Symbol, MODE_POINT);
    gi_Digits = MarketInfo (gs_Symbol, MODE_DIGITS);
    if (PrintCom) Print ("minLot = ", gd_MinLot," | stepLot = ", gd_StepLot);
    //---- Ðàñ÷èòûâàåì ðàçðÿäíîñòü ëîòà
    while (MathPow (10, gi_dig) * gd_StepLot < 1)
    {gi_dig += 1;}
    //---- Ó÷èòûâàåì ðàáîòó 5-òè çíàêà
    if (gi_Digits == 3 || gi_Digits == 5)
    {gi_Decimal = 10;}
    Slippage *= gi_Decimal;
    //---- Ãîòîâèì ê ðàáîòå ìàññèâû äàííûõ
    fInitialArrays();
    gi_flag_TP = GlobalVariableGet (gs_NameGV + "_#flagTP");
    file = StringSubstr (file, 0, StringFind (file, ".csv"));
    file = StringConcatenate (file, "_", Symbol(), "_", Period(), ".csv");
    if (IsDemo() && !IsTesting())
    {file = "virtual_d.csv";}
    if (PrintCom) Print ("NameFile = ", file);
    gd_XFactor = NDD ((1.6180339887 - XFactor / 1.6180339887) * gd_Point);
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó
    Init_ICManager (K_Begin);
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, "init()");
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  Custor expert deinitialization function                          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void deinit()
{
//----
    FastTest = false;
    VirtualFileSave (file);
    //---- Äåèíèöèàëèçèðóåì áèáëèîòåêó ïî óïðàâëåíèþ èíâåñò-êàïèòàëîì
    deInit_ICManager (5, 15);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|               Custom expert iteration function                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void start()
{
    int  err = GetLastError();
    bool lb_result = false;
//----
    //---- Çàïóñêàåì â ðàáîòó áèáëèîòåêó ïî óïðàâëåíèþ èíâåñò-êàïèòàëîì
    if (gb_RealTrade)
    {f_ICManager (5, 15, False, K_Begin);}
    //---- Îïðåäåëÿåì ïåðèîäè÷íîñòü ðàáîòû ñîâåòíèêà
    if (NewBarInPeriod >= 0)
    {
        if (NewBar == iTime (gs_Symbol, NewBarInPeriod, 0))
        {return (0);}
        NewBar = iTime (gs_Symbol, NewBarInPeriod, 0);
    }
    //---- Ïîëó÷àåì öåíû, ñ êîòîðûìè áóäåò ðàáîòàòü ñîâåòíèê
    fGet_MineTradePrice (Variant_TradePrice, gda_Price);
    //---- Îáíîâëÿåì ðûíî÷íóþ èíôîðìàöèþ âèðòóàëüíîé òîðãîâëè
    VirtualUpdate (file);
    //---- Ïðîâåðÿåì ðûíî÷íûå ïîçèöèè íà çàêðûòèå
    fClosings();
    //---- Òðåéëèíã îðäåðîâ
    fTrailling();
    //---- Trailling Profit
    if (gi_MyOrders >= 2)
    {
        if (TrailProfitByMA)
        {lb_result = fTrailingProfitByMA (20.0, gd_Profit, gs_NameGV, gi_flag_TP, gi_flag_NullStop);}
        else
        {lb_result = fTrailingProfit (20.0, TrailProfit_Start, TrailProfit_Level, gd_Profit, gs_NameGV, gi_flag_TP, gi_flag_NullStop);}
        if (lb_result)
        {
            if (CloseOrderAll (gia_TC.Magic))
            return;
        }
    }
    //---- Ïðîâåðÿåì óñëîâèÿ íà îòêðûòèå îðäåðîâ
    fOpenings();
    //---- Çàïóñêàåì â ðàáîòó áèáëèîòåêó ïî óïðàâëåíèþ èíâåñò-êàïèòàëîì (äëÿ òåñòèðîâàíèÿ ïî öåíàì îòêðûòèÿ)
    if (!gb_RealTrade)
    f_ICManager (5, 15, False, K_Begin);
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, "start()");
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|         Ïðîöåäóðà çàêðûòèÿ ïîçèöèé ïî ñèãíàëó                                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fClosings()
{
    int    i, j, li_total, li_POS, myFilter[], li_IND, err = GetLastError();
    double PriceClose;
    bool   lb_close;
//----
    //---- Ïåðåáèðàåì âñå ñòðàòåãèè ïî î÷åðåäè
    for (int li_TC = 0; li_TC < MAX_TC; li_TC++)
    {
        if (!(IsTesting() && gia_TC.Enable[li_TC] != 1))
        {
            li_total = OrdersTotal();
            for (li_POS = li_total - 1; li_POS >= 0; li_POS--)
            {
                if (OrderSelect (li_POS, SELECT_BY_POS))
                {
                    //---- Ïðîïóñêàåì íå ðûíî÷íûå îðäåðà
                    if (OrderType() > 1)
                    {continue;}
                    if (OrderMagicNumber() == gia_TC.Magic[li_TC])
                    {
                        lb_close = false;
                        switch (li_TC)
                        {
                            case 0: lb_close = T1_SignalClose (OrderType(), Period.Indicators); break;
                            case 1: lb_close = T2_SignalClose (OrderType(), Period.Indicators); break;
                            case 2: lb_close = T3_SignalClose (OrderType(), Period.Indicators); break;
                            case 3: lb_close = T4_SignalClose (OrderType(), Period.Indicators); break;
                            case 4: lb_close = T5_SignalClose (OrderType(), Period.Indicators); break;
                            case 5: lb_close = T6_SignalClose (OrderType(), Period.Indicators); break;
                            case 6: lb_close = T7_SignalClose (OrderType(), Period.Indicators); break;
                            case 7: lb_close = T8_SignalClose (OrderType(), OrderOpenTime(), Period.Indicators); break;
                        }
                        if (lb_close)
                        {
                            PriceClose = gda_Price[OrderType()];
                            if (!Block()) OrderClose (OrderTicket(), OrderLots(), PriceClose, Slippage);
                            if (PrintCom) Print ("close #", OrderTicket(), "[", li_TC + 1, "]: ", GetNameOP (OrderType()), " ", DSDig (OrderLots()), " at ", DSD (OrderOpenPrice()), " SL: ", DSD (OrderStopLoss()), " TP: ", DSD (OrderTakeProfit()), " Profit: $", DSD (OrderProfit()), " on a signal.");
                        }
                    }
                }
            }// Next li_POS
            VirtualFileLoad (file);
            VirtualFilter (VIRT_TRADES, -1, -1, Symbol(), gia_TC.Magic[li_TC]);
            if (Virt.Filter.Count > 0)
            {
                ArrayResize (myFilter, Virt.Filter.Count);
                for (li_POS = 0; li_POS < Virt.Filter.Count; li_POS++)
                {myFilter[li_POS] = Virt.Filter[li_POS];}// Next li_POS
                for (li_POS = 0; li_POS < ArraySize (myFilter); li_POS++)
                {
                    lb_close = false;
                    li_IND = myFilter[li_POS];
                    switch (li_TC)
                    {
                        case 0: lb_close = T1_SignalClose (Virt.Type[li_IND], Period.Indicators); break;
                        case 1: lb_close = T2_SignalClose (Virt.Type[li_IND], Period.Indicators); break;
                        case 2: lb_close = T3_SignalClose (Virt.Type[li_IND], Period.Indicators); break;
                        case 3: lb_close = T4_SignalClose (Virt.Type[li_IND], Period.Indicators); break;
                        case 4: lb_close = T5_SignalClose (Virt.Type[li_IND], Period.Indicators); break;
                        case 5: lb_close = T6_SignalClose (Virt.Type[li_IND], Period.Indicators); break;
                        case 6: lb_close = T7_SignalClose (Virt.Type[li_IND], Period.Indicators); break;
                        case 7: lb_close = T8_SignalClose (Virt.Type[li_IND], Virt.OpenTime[li_IND], Period.Indicators); break;
                    }
                    if (lb_close)
                    {
                        VirtualClose (Virt.Ticket[li_IND], file);
                        if (PrintCom) Print ("close Virtual #", Virt.Ticket[li_IND], "[", li_TC + 1, "]: ", GetNameOP (Virt.Type[li_IND]), " ", DSDig (Virt.Lots[li_IND]), " at ", Virt.OpenPrice[li_IND], " SL = ", DSD (Virt.StopLoss[li_IND]), " TP = ", DSD (Virt.TakeProfit[li_IND]), " at price = ", DSD (Virt.ClosePrice[li_IND]), " Profit = $", DoubleToStr (Virt.Profit[li_IND], 1));
                    }
                }// Next li_POS
            }
        }
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, "fClosings()");
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|         Ïðîöåäóðà ñîïðîâîæäåíèÿ îòêðûòûõ ïîçèöèé (òðàë)                           |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fTrailling()
{
    double ld_TS, ld_Profit, ld_Price,
           ld_TS_step = 3 * gi_Decimal * gd_Point,
           ld_BU = 5 * gi_Decimal * gd_Point;
    int    li_total, li_cmd, li_POS, li_Ticket, myFilter[], cnt = 0, li_IND,
           err = GetLastError();
    bool   lb_modify;
//----
    gd_Profit = 0.0;
    gi_MyOrders = 0;
    //---- Ïåðåáèðàåì âñå ñòðàòåãèè ïî î÷åðåäè
    for (int li_TC = 0; li_TC < MAX_TC; li_TC++)
    {
        if (!IsTesting() || gia_TC.Enable[li_TC] == 1)
        {
            li_total = OrdersTotal();
            for (li_POS = li_total - 1; li_POS >= 0; li_POS--)
            {
                if (OrderSelect (li_POS, SELECT_BY_POS))
                {
                    //---- Ïðîïóñêàåì íå ðûíî÷íûå îðäåðà
                    if (OrderType() > 1)
                    {continue;}
                    if (OrderMagicNumber() == gia_TC.Magic[li_TC])
                    {
                        //----- Ðàññ÷èòûâàåì ïðîôèò äëÿ ðàáîòû TraillingProfit
                        ld_Profit = OrderProfit() + OrderSwap() + OrderCommission();
                        gd_Profit += ld_Profit;
                        li_Ticket = OrderTicket();
                        gi_MyOrders++;
                        if (gi_flag_NullStop == 0)
                        {
                            if (gi_flag_TP == 1)
                            {
                                Modify (li_Ticket, 0.0, 0.0, True);
                                if (PrintCom) {Print ("Delete STOP`s #", li_Ticket, "[", li_TC + 1, "]");}
                                cnt++;
                                continue;
                            }
                        }
                        else
                        {continue;}
                        ld_Price = gda_Price[OrderType()];
                        if (OrderType() == OP_BUY) {li_cmd = 1;} else {li_cmd = -1;}
                        //---- Ðàññ÷èòûâàåì ðàçìåð òðåéëèíã ñòîïà
                        switch (gia_TC.Var.TS[li_TC])
                        {
                            case 0: ld_TS = gda_TC.TS[li_TC]; break;
                            case 1: ld_TS = NDD (MathAbs (ld_Price - (iMA (NULL, Period.Indicators, TrailPeriod, 0, MAMode, PRICE_OPEN, 0) + li_cmd * gd_XFactor))); break;
                        }
                        if (OrderType() == OP_BUY)
                        {
                            //---- Ïðîïèñûâàåì ðàáîòó ÁÓ
                            if (gba_TC.OnlyBU[li_TC])
                            {
                                if (OrderStopLoss() == 0 || OrderStopLoss() < OrderOpenPrice())
                                {
                                    if (ld_Price - OrderOpenPrice() > ld_TS)
                                    {
                                        Modify (li_Ticket, ld_Price - ld_TS + ld_BU);
                                        if (PrintCom) {Print ("Make BU #", li_Ticket, "[", li_TC + 1, "]: ", GetNameOP (OrderType()));}
                                    }
                                }
                            }
                            else
                            {
                                if (ld_Price - OrderOpenPrice() > ld_TS)
                                {
                                    if (OrderStopLoss() == 0 || ld_Price - OrderStopLoss() > ld_TS + ld_TS_step)
                                    {Modify (li_Ticket, ld_Price - ld_TS);}
                                }
                            }
                        }
                        else if (OrderType() == OP_SELL)
                        {
                            //---- Ïðîïèñûâàåì ðàáîòó ÁÓ
                            if (gba_TC.OnlyBU[li_TC])
                            {
                                if (OrderStopLoss() == 0 || OrderStopLoss() > OrderOpenPrice())
                                {
                                    if (OrderOpenPrice() - ld_Price > ld_TS)
                                    {
                                        Modify (li_Ticket, ld_Price + ld_TS - ld_BU);
                                        if (PrintCom) {Print ("Make BU #", li_Ticket, "[", li_TC + 1, "]: ", GetNameOP (OrderType()));}
                                    }
                                }
                            }
                            else
                            {
                                if (OrderOpenPrice() - ld_Price > ld_TS)
                                {
                                    if (OrderStopLoss() == 0 || OrderStopLoss() - ld_Price > ld_TS + ld_TS_step)
                                    {Modify (li_Ticket, ld_Price + ld_TS);}
                                }
                            }
                        }
                    }
                }
            }// Next li_POS
            VirtualFileLoad (file);
            VirtualFilter (VIRT_TRADES, -1, -1, Symbol(), gia_TC.Magic[li_TC]);
            if (Virt.Filter.Count > 0)
            {
                ArrayResize (myFilter, Virt.Filter.Count);
                for (li_POS = 0; li_POS < Virt.Filter.Count; li_POS++)
                {myFilter[li_POS] = Virt.Filter[li_POS];}
                for (li_POS = 0; li_POS < ArraySize (myFilter); li_POS++)
                {
                    lb_modify = false;
                    li_IND = myFilter[li_POS];
                    if (Virt.Type[li_IND] == OP_BUY)
                    {
                        if (gba_TC.OnlyBU[li_TC])
                        {
                            if (Virt.StopLoss[li_IND] == 0 || Virt.StopLoss[li_IND] < Virt.OpenPrice[li_IND])
                            {
                                if (ld_Price - Virt.OpenPrice[li_IND] > ld_TS)
                                {lb_modify = VirtualModify (Virt.Ticket[li_IND], 0, ld_Price - ld_TS + ld_BU, 0, 0, file);}
                            }
                        }
                        else
                        {
                            if (ld_Price - Virt.OpenPrice[li_IND] > ld_TS + ld_TS_step)
                            {
                                if (Virt.StopLoss[li_IND] == 0 || ld_Price - Virt.StopLoss[li_IND] > ld_TS)
                                {lb_modify = VirtualModify (Virt.Ticket[li_IND], 0, ld_Price - ld_TS, 0, 0, file);}
                            }
                        }
                    }
                    else if (Virt.Type[li_IND] == OP_SELL)
                    {
                        if (gba_TC.OnlyBU[li_TC])
                        {
                            if (Virt.StopLoss[li_IND] == 0 || Virt.StopLoss[li_IND] > Virt.OpenPrice[li_IND])
                            {   
                                if (Virt.OpenPrice[li_IND] - ld_Price > ld_TS)
                                {lb_modify = VirtualModify (Virt.Ticket[li_IND], 0, ld_Price + ld_TS - ld_BU, 0, 0, file);}
                            }
                        }
                        else
                        {
                            if (Virt.OpenPrice[li_IND] - ld_Price > ld_TS + ld_TS_step)
                            {
                                if (Virt.StopLoss[li_IND] == 0 || Virt.StopLoss[li_IND] - ld_Price > ld_TS)
                                {lb_modify = VirtualModify (Virt.Ticket[li_IND], 0, ld_Price + ld_TS, 0, 0, file);}
                            }
                        }
                    }
                    if (lb_modify)
                    {if (PrintCom) Print ("modify Virtual #", Virt.Ticket[li_IND], "[", li_TC + 1, "]: ", GetNameOP (Virt.Type[li_IND]), " ", DSDig (Virt.Lots[li_IND]), " at ", DSD (Virt.OpenPrice[li_IND]), " SL: ", DSD (Virt.StopLoss[li_IND]), " TP: ", DSD (Virt.TakeProfit[li_IND]));}
                }// Next li_POS
            }
        }
    }
    //---- Çàêðûâàåì òðåéëèíã
    if (gi_flag_NullStop == 0 && gi_flag_TP == 1)
    {
        if (PrintCom) Print ("Delete STOP`s on ", cnt, " orders");
        gi_flag_NullStop = 1;
        GlobalVariableSet (gs_NameGV + "_#NULLStops", gi_flag_NullStop);
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, "fTrailling()");
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|         Ïðîöåäóðà îòêðûòèÿ ïîçèöèé ïî ñèãíàëó                                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fOpenings()
{
    int    li_CMD, li_Magic, li_Ticket, li_cmd, err = GetLastError();
    double ld_R, ld_OpenPrice, ld_StopLoss, ld_TakeProfit, ld_SL, ld_TP, ld_Lot,
           gd_StopLevel = MarketInfo (Symbol(), MODE_STOPLEVEL) * gd_Point;
    string ls_Comment;
//----
    //ArrayInitialize (gia_TC.Orders, 0);
    //---- Ïåðåáèðàåì âñå ñòðàòåãèè ïî î÷åðåäè
    for (int li_TC = 0; li_TC < MAX_TC; li_TC++)
    {
        if (gia_TC.Enable[li_TC] == 1)
        {   
            switch (li_TC)
            {
                case 0: li_CMD = T1_SignalOpen (Period.Indicators); break;
                case 1: li_CMD = T2_SignalOpen (Period.Indicators); break;
                case 2: li_CMD = T3_SignalOpen (Period.Indicators); break;
                case 3: li_CMD = T4_SignalOpen (Period.Indicators); break;
                case 4: li_CMD = T5_SignalOpen (Period.Indicators); break;
                case 5: li_CMD = T6_SignalOpen (Period.Indicators); break;
                case 6: li_CMD = T7_SignalOpen (Period.Indicators); break;
                case 7: li_CMD = T8_SignalOpen (Period.Indicators); break;
            }
            if (li_CMD > -1)
            {
                li_Magic = gia_TC.Magic[li_TC];
                VirtualFilter (VIRT_TRADES, -1, -1, Symbol(), li_Magic);
                gia_TC.Orders[li_TC] = Virt.Filter.Count;
                //---- Îãðàíè÷èâàåì êîëè÷åñòâî îòêðûâàåìûõ îðäåðîâ îäíîé ñòðàòåãèåé
                if (Virt.Filter.Count < MAX_OrdersOnTC)
                {
                    ld_R = VirtualRating (li_Magic, Symbol(), gia_TC.PeriodRating[li_TC], 0, file);
                    gda_R[li_TC] = ld_R;
                    if (!VirtualExist (iTime (Symbol(), Period.New.Send, 0), li_Magic))
                    {
                        if (li_CMD == OP_BUY) {li_cmd = 1;} else {li_cmd = -1;}
                        if (li_CMD == OP_BUY) {ld_OpenPrice = gda_Price[1];} else {ld_OpenPrice = gda_Price[0];}
                        switch (gia_TC.Var.STOP[li_TC])
                        {
                            case 0: 
                                ld_StopLoss = ld_OpenPrice - li_cmd * MathMax (gd_StopLevel, gda_TC.SL[li_TC]);
                                ld_TakeProfit = ld_OpenPrice + li_cmd * MathMax (gd_StopLevel, gda_TC.TP[li_TC]);
                                break;
                            case 1:
                                ld_SL = MathAbs (ld_OpenPrice - (iMA (NULL, Period.Indicators, STOP.Period, 0, MAMode, PRICE_OPEN, 0) + li_cmd * gd_XFactor)); 
                                ld_StopLoss = NDD (ld_OpenPrice - li_cmd * MathMax (gd_StopLevel, ld_SL));
                                if (gda_TC.TP[li_TC] == 0)
                                {
                                    if (li_cmd == 1) {li_cmd = -1;} else {li_cmd = 1;}
                                    ld_TP = MathAbs (ld_OpenPrice - (iMA (NULL, Period.Indicators, STOP.Period, 0, MAMode, PRICE_OPEN, 0) + li_cmd * gd_XFactor)); 
                                    ld_TakeProfit = MathAbs (NDD (ld_OpenPrice - li_cmd * MathMax (gd_StopLevel, ld_TP)));
                                }
                                else
                                {ld_TakeProfit = ld_OpenPrice + li_cmd * MathMax (gd_StopLevel, gda_TC.TP[li_TC]);}
                                break; 
                        }
                        ld_SL = MathMax (gd_StopLevel, ld_SL);
                        ld_Lot = gda_TC.lot[li_TC];
                        if (RatingON) if (PrintCom) Print ("System ", li_TC + 1, ": Rating = ", DS0 (ld_R), "%");
                        li_Ticket = VirtualSend (Symbol(), li_CMD, ld_Lot, ld_OpenPrice, Slippage, ld_StopLoss, ld_TakeProfit, "R = " + DoubleToStr (ld_R, 1) + "%", li_Magic, 0, file);
                        if (PrintCom) Print ("open Virtual #", li_Ticket, "[", li_TC + 1, "]: ", GetNameOP (li_CMD), " ", DSDig (ld_Lot), " at ", DSD (ld_OpenPrice), " SL[", MathAbs (ld_OpenPrice - ld_StopLoss) / gd_Point, "]: ", DSD (ld_StopLoss), " TP[", MathAbs (ld_OpenPrice - ld_TakeProfit) / gd_Point, "]: ", DSD (ld_TakeProfit), " R: ", DS0 (ld_R), "%");
                        //---- Åñëè ðåéòíèã ñòðàòåãèè > ìèíèìàëüíîãî ðåéòèíãà, îòêðûâàåì ðûíî÷íûé îðäåð
                        if (ld_R > MinRating        // óñëîâèå ñîîòâåòñâèÿ ðåéòèíãà
                        && gi_flag_TP == 0)         // íå ðàáîòàåò (âêëþ÷¸í) Trailling Profit
                        {
                            if (!OrderExist (iTime (Symbol(), Period.New.Send, 0), li_Magic))
                            {
                                li_Ticket = 0;
                                ld_Lot = ld_Lot * ld_R / 100;
                                ls_Comment = StringConcatenate ("System ", li_TC + 1, " (R = ", DoubleToStr (ld_R, 1), "%)");
                                if (li_CMD == OP_BUY)
                                {li_Ticket = BUY_pips (ld_Lot, ld_StopLoss, ld_TakeProfit, li_Magic, ls_Comment);}
                                else if (li_CMD == OP_SELL)
                                {li_Ticket = SELL_pips (ld_Lot, ld_StopLoss, ld_TakeProfit, li_Magic, ls_Comment);}
                                if (li_Ticket > 0)
                                {
                                    //Print ("Open orders #", li_Ticket, "[", ld_Lot, "/", li_Magic, "] from ", li_TC + 1, " strategy");
                                    if (OrderSelect (li_Ticket, SELECT_BY_TICKET))
                                    {OrderPrint();}
                                }
                            }
                        }
                    }// if (!VirtualExist...
                }
            }
        }
    }
    if (gi_MyOrders == 0)
    {
        gi_flag_TP = 0;
        gi_flag_NullStop = 0;
        GlobalVariableSet (gs_NameGV + "_#flagTP", gi_flag_TP);
        GlobalVariableSet (gs_NameGV + "_#NULLStops", gi_flag_NullStop);
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, "fOpenings()");
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ôóíêöèÿ âîçâðàùàåò ñèãíàë íà îòêðûòèå ïîçèöèè:                               |
//|         -1 - íå îòêðûâàòü ïîçèöèþ                                                 |
//|         0 - ïîêóïàòü                                                              |
//|         1 - ïðîäàâàòü                                                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int T1_SignalOpen (int fi_Period = 0)
{
    double MA_Fast = iMA (NULL, fi_Period, T1.Fast, 0, MODE_EMA, PRICE_CLOSE, 1),
           MA_Fast_Last = iMA (NULL, fi_Period, T1.Fast, 0, MODE_EMA, PRICE_CLOSE, 2),
           MA_Slow = iMA (NULL, fi_Period, T1.Slow, 0, MODE_EMA, PRICE_CLOSE, 1),
           MA_Slow_Last = iMA (NULL, fi_Period, T1.Slow, 0, MODE_EMA, PRICE_CLOSE, 2);
//----
    if (MA_Slow > MA_Slow_Last)
    {
        if (MA_Fast > MA_Slow && MA_Fast_Last < MA_Slow_Last)
        {return (OP_BUY);}
    }
    if (MA_Slow < MA_Slow_Last)
    {
        if (MA_Fast < MA_Slow && MA_Fast_Last > MA_Slow_Last)
        {return (OP_SELL);}
    }
//----
    return (-1);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ôóíêöèÿ âîçâðàùàåò ñèãíàë íà çàêðûòèå ïîçèöèè:                               |
//|         false - íå çàêðûâàòü ïîçèöèþ                                              |
//|         true - çàêðûòü                                                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool T1_SignalClose (int type, int fi_Period = 0)
{
    if (type == T1_SignalOpen (fi_Period)) return (false);
//----
    double MA_Fast = iMA (NULL, fi_Period, T1.Fast, 0, MODE_EMA, PRICE_CLOSE, 1),
           MA_Slow = iMA (NULL, fi_Period, T1.Slow, 0, MODE_EMA, PRICE_CLOSE, 1);
//----
    if (type == OP_BUY)
    {if (MA_Fast < MA_Slow) return (true);}
    else if (type == OP_SELL)
    {if (MA_Fast > MA_Slow) return (true);}
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ôóíêöèÿ âîçâðàùàåò ñèãíàë íà îòêðûòèå ïîçèöèè:                               |
//|         -1 - íå îòêðûâàòü ïîçèöèþ                                                 |
//|         0 - ïîêóïàòü                                                              |
//|         1 - ïðîäàâàòü                                                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int T2_SignalOpen (int fi_Period = 0, int Candle = 0)
{
    double CCI = iCCI (NULL, fi_Period, T2.PeriodCCI, PRICE_TYPICAL, Candle + 1),
           CCILast = iCCI (NULL, fi_Period, T2.PeriodCCI, PRICE_TYPICAL, Candle + 2);
//----
    if ((CCI < T2.LevelCCI) && (CCILast > T2.LevelCCI)) return (OP_SELL);
    if ((CCI > -T2.LevelCCI) && (CCILast < -T2.LevelCCI)) return (OP_BUY);
//----
    return (-1);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ôóíêöèÿ âîçâðàùàåò ñèãíàë íà çàêðûòèå ïîçèöèè:                               |
//|         false - íå çàêðûâàòü ïîçèöèþ                                              |
//|         true - çàêðûòü                                                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool T2_SignalClose (int type, int fi_Period = 0)
{
    int i = 0, SS = -1;
//----
    while (SS == -1)
    {
        SS = T2_SignalOpen (fi_Period, i);
        i++;
    }
    if (type == SS) return (false);
//----
    return (true);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ôóíêöèÿ âîçâðàùàåò ñèãíàë íà îòêðûòèå ïîçèöèè:                               |
//|         -1 - íå îòêðûâàòü ïîçèöèþ                                                 |
//|         0 - ïîêóïàòü                                                              |
//|         1 - ïðîäàâàòü                                                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int T3_SignalOpen (int fi_Period = 0)
{
    double MA_Fast = iMA (NULL, fi_Period, T3.Fast, 0, MODE_EMA, PRICE_CLOSE, 1),
           MA_Fast_Last = iMA (NULL, fi_Period, T3.Fast, 0, MODE_EMA, PRICE_CLOSE, 2),
           MA_Slow = iMA (NULL, fi_Period, T3.Slow, 0, MODE_EMA, PRICE_CLOSE, 1),
           MA_Slow_Last = iMA (NULL, fi_Period, T3.Slow, 0, MODE_EMA, PRICE_CLOSE, 2);
//----
    if (MA_Slow > MA_Slow_Last)
    {
        if (MA_Fast > MA_Slow && MA_Fast_Last < MA_Slow_Last)
        {return (OP_BUY);}
    }
    if (MA_Slow < MA_Slow_Last)
    {
        if (MA_Fast < MA_Slow && MA_Fast_Last > MA_Slow_Last)
        {return (OP_SELL);}
    }
//----
    return (-1);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ôóíêöèÿ âîçâðàùàåò ñèãíàë íà çàêðûòèå ïîçèöèè:                               |
//|         false - íå çàêðûâàòü ïîçèöèþ                                              |
//|         true - çàêðûòü                                                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool T3_SignalClose (int type, int fi_Period = 0)
{
    if (type == T3_SignalOpen (fi_Period)) return (false);
//----
    double MA_Fast =iMA (NULL, fi_Period, T3.Fast, 0, MODE_EMA, PRICE_CLOSE, 1),
           MA_Slow = iMA (NULL, fi_Period, T3.Slow, 0, MODE_EMA, PRICE_CLOSE, 1);
//----
    if (type == OP_BUY)
    {if (MA_Fast < MA_Slow) return (true);}
    else if (type == OP_SELL)
    {if (MA_Fast > MA_Slow) return (true);}
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ôóíêöèÿ âîçâðàùàåò ñèãíàë íà îòêðûòèå ïîçèöèè:                               |
//|         -1 - íå îòêðûâàòü ïîçèöèþ                                                 |
//|         0 - ïîêóïàòü                                                              |
//|         1 - ïðîäàâàòü                                                             |
//|      Ñòðàòåãèÿ Ñåðãåÿ Ëîçîâèêà                                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int T4_SignalOpen (int fi_Period = 0, int CurrentCandle = 0)
{
    double LMA200 = iMA (NULL, fi_Period, 200, 0, MODE_EMA, PRICE_OPEN, CurrentCandle + 1),
           MA200 = iMA (NULL, fi_Period, 200, 0, MODE_EMA, PRICE_OPEN, CurrentCandle),
           LMA50 = iMA (NULL, fi_Period, 50, 0, MODE_EMA, PRICE_OPEN, CurrentCandle + 1),
           MA50 = iMA (NULL, fi_Period, 50, 0, MODE_EMA, PRICE_OPEN, CurrentCandle),
           LMA10 = iMA (NULL, fi_Period, 10, 0, MODE_EMA, PRICE_OPEN, CurrentCandle + 1),
           MA10 = iMA (NULL, fi_Period, 10, 0, MODE_EMA, PRICE_OPEN, CurrentCandle),
           LMACD = iMACD (NULL, fi_Period, 12, 26, 9, PRICE_OPEN, MODE_MAIN, CurrentCandle + 1),
           MACD = iMACD (NULL, fi_Period, 12, 26, 9, PRICE_OPEN, MODE_MAIN, CurrentCandle);
//----
    if (MA200 > LMA200)
    {
        if (MA50 > LMA50 && MA50 > MA200)
        {
            if (MA10 > LMA10 && MA10 > MA50)
            {
                if (MACD > LMACD && MACD > T4.LimitMACD)
                {return (0);}
            }
        }
    }
    else if (MA200 < LMA200)
    {
        if (MA50 < LMA50 && MA50 < MA200)
        {
            if (MA10 < LMA10 && MA10 < MA50)
            {
                if (MACD < LMACD && MACD < -T4.LimitMACD)
                {return (1);}
            }
        }
    }
//----
    return (-1);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ôóíêöèÿ âîçâðàùàåò ñèãíàë íà çàêðûòèå ïîçèöèè:                               |
//|         false - íå çàêðûâàòü ïîçèöèþ                                              |
//|         true - çàêðûòü                                                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool T4_SignalClose (int type, int fi_Period = 0)
{
    double MA50 = iMA (NULL, fi_Period, 50, 0, MODE_EMA, PRICE_OPEN, 0);
//----
    if (type == OP_BUY)
    {
        if (Close[1] < MA50)
        {return (true);}
    }
    else if (type == OP_SELL)
    {
        if (Close[1] > MA50)
        {return (true);}
    }
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ôóíêöèÿ âîçâðàùàåò ñèãíàë íà îòêðûòèå ïîçèöèè:                               |
//|         -1 - íå îòêðûâàòü ïîçèöèþ                                                 |
//|         0 - ïîêóïàòü                                                              |
//|         1 - ïðîäàâàòü                                                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int T5_SignalOpen (int fi_Period = 0, int Candle = 0)
{
    double CCI = iCCI (NULL, fi_Period, T5.PeriodCCI, PRICE_TYPICAL, Candle + 1),
           CCILast = iCCI (NULL, fi_Period, T5.PeriodCCI, PRICE_TYPICAL, Candle + 2);
//----
    if ((CCI > T5.LevelCCI) && (CCILast < T5.LevelCCI)) return (OP_BUY);
    if ((CCI < -T5.LevelCCI) && (CCILast > -T5.LevelCCI)) return (OP_SELL);
//----
    return (-1);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ôóíêöèÿ âîçâðàùàåò ñèãíàë íà çàêðûòèå ïîçèöèè:                               |
//|         false - íå çàêðûâàòü ïîçèöèþ                                              |
//|         true - çàêðûòü                                                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool T5_SignalClose (int type, int fi_Period = 0)
{
    int i = 0, SS = -1;
    double MyLevel, CCI;
//----
    if (type == OP_BUY)
    {MyLevel = T5.LevelCCI - T5.TralingCCI;}
    else {MyLevel = T5.LevelCCI + T5.TralingCCI;}
    while (SS == -1)  // Ïîèñê ñèãíàëà íà ïîêóïêó
    {
        SS = T5_SignalOpen (fi_Period, i);
        i++;
        CCI = iCCI (NULL, fi_Period, T5.PeriodCCI, PRICE_TYPICAL, i);
        if (type == OP_BUY)
        {
            if (CCI > MyLevel + 2 * T5.TralingCCI)
            {MyLevel = MyLevel + T5.TralingCCI;}
        }
        else
        {
            if (CCI < MyLevel - 2 * T5.TralingCCI)
            {MyLevel = MyLevel - T5.TralingCCI;}
        }
    }
    CCI = iCCI (NULL, fi_Period, T5.PeriodCCI, PRICE_TYPICAL, 1);
    if (type == OP_BUY)
    {if (CCI < MyLevel) return (true);}
    else
    {if (CCI > MyLevel) return (true);}
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ôóíêöèÿ âîçâðàùàåò ñèãíàë íà îòêðûòèå ïîçèöèè:                               |
//|         -1 - íå îòêðûâàòü ïîçèöèþ                                                 |
//|         0 - ïîêóïàòü                                                              |
//|         1 - ïðîäàâàòü                                                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int T6_SignalOpen (int fi_Period = 0)
{
    double ld_Perceptron;
//----
    ld_Perceptron = Perceptron (fi_Period, VarPerceptron);
    if (ld_Perceptron >= Per_BUY) return (OP_BUY);
    if (ld_Perceptron <= Per_SELL) return (OP_SELL);
//----
    return (-1);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ôóíêöèÿ âîçâðàùàåò ñèãíàë íà çàêðûòèå ïîçèöèè:                               |
//|         false - íå çàêðûâàòü ïîçèöèþ                                              |
//|         true - çàêðûòü                                                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool T6_SignalClose (int type, int fi_Period = 0)
{
    double ld_Perceptron;
//----
    ld_Perceptron = Perceptron (fi_Period, VarPerceptron);
    if (type == OP_BUY)
    {
        if (ld_Perceptron <= Per_Close_BUY)
        {return (true);}
    }
    else if (type == OP_SELL)
    {
        if (ld_Perceptron >= Per_Close_SELL)
        {return (true);}
    }
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ðàñ÷èòûâàåì Perceptron                                                       |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double Perceptron (int fi_TF, int fi_varPerceptron)
{
   double lda_PRC[4], lda_X[4], ld_result = 0;
//----
   lda_X[0] = x1 - 100.0;
   lda_X[1] = x2 - 100.0;
   lda_X[2] = x3 - 100.0;
   lda_X[3] = x4 - 100.0;
   for (int li_PRC = 0; li_PRC < 4; li_PRC++)
   {
       switch (fi_varPerceptron)
       {
           case 0: lda_PRC[li_PRC] = iClose (NULL, fi_TF, gia_PerceptronBars[li_PRC]) - iOpen (NULL, fi_TF, gia_PerceptronBars[li_PRC+1]); break;
           case 1: lda_PRC[li_PRC] = iStochastic (NULL, fi_TF, T6.K_Period, T6.D_Period, T6.Slowing, MODE_EMA, 0, MODE_MAIN, gia_PerceptronBars[li_PRC]) - 50.0; break;
           case 2: lda_PRC[li_PRC] = iCCI (NULL, fi_TF, T6.Period_CCI, T6.Price_CCI, gia_PerceptronBars[li_PRC]); break;
       }
       ld_result += lda_X[li_PRC] * lda_PRC[li_PRC];
   }
   return (ld_result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ôóíêöèÿ âîçâðàùàåò ñèãíàë íà îòêðûòèå ïîçèöèè:                               |
//|         -1 - íå îòêðûâàòü ïîçèöèþ                                                 |
//|         0 - ïîêóïàòü                                                              |
//|         1 - ïðîäàâàòü                                                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int T7_SignalOpen (int fi_Period = 0)
{
    double ld_Direction;
//----
    ld_Direction = Direction (gia_DirectionBars, Warp, Deviation, Amplitude, Distortion, fi_Period);
    if (ld_Direction >= Dir_BUY) return (OP_BUY);
    if (ld_Direction <= Dir_SELL) return (OP_SELL);
//----
    return (-1);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ôóíêöèÿ âîçâðàùàåò ñèãíàë íà çàêðûòèå ïîçèöèè:                               |
//|         false - íå çàêðûâàòü ïîçèöèþ                                              |
//|         true - çàêðûòü                                                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool T7_SignalClose (int type, int fi_Period = 0)
{
    double ld_Direction;
//----
    ld_Direction = Direction (gia_DirectionBars, Warp, Deviation, Amplitude, Distortion, fi_Period);
    if (type == OP_BUY)
    {
        if (ld_Direction <= Dir_Close_BUY)
        {return (true);}
    }
    else if (type == OP_SELL)
    {
        if (ld_Direction >= Dir_Close_SELL)
        {return (true);}
    }
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ðàñ÷èòûâàåì Direction                                                        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double Direction (int iar_NBars[],       // ìàññèâ íîìåðîâ áàðîâ äëÿ ðàñ÷¸òà Direction
                  int fi_Warp, 
                  double fd_Deviation, 
                  int fi_Amplitude, 
                  double fd_Distortion, 
                  int fi_TF = 0)         // òàéìôðåéì èíäèêàòîðà AC
{
    double ld_iAC[4];
//----
    for (int li_int = 0; li_int < 4; li_int++)
    {ld_iAC[li_int] = iAC (Symbol(), fi_TF, iar_NBars[li_int]);}
//----
    return (fi_Warp * ld_iAC[0] + 100.0 * (fd_Deviation - 1.0) * ld_iAC[1] + (fi_Amplitude - 100) * ld_iAC[2] + 100.0 * fd_Distortion * ld_iAC[3]);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ôóíêöèÿ âîçâðàùàåò ñèãíàë íà îòêðûòèå ïîçèöèè:                               |
//|         -1 - íå îòêðûâàòü ïîçèöèþ                                                 |
//|         0 - ïîêóïàòü                                                              |
//|         1 - ïðîäàâàòü                                                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int T8_SignalOpen (int fi_Period = 0)
{
    double li_Trend;
//----
    li_Trend = fMA_TrendDetection (fi_Period);
    if (gi_LastTrend < 0)
    {gi_LastTrend = li_Trend;}
    if (li_Trend == Trend_UP && gi_LastTrend == Trend_DW)
    {
        gi_LastTrend = Trend_UP;
        return (OP_BUY);
    }
    if (li_Trend == Trend_DW && gi_LastTrend == Trend_UP)
    {
        gi_LastTrend = Trend_DW;
        return (OP_SELL);
    }
//----
    return (-1);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ôóíêöèÿ âîçâðàùàåò ñèãíàë íà çàêðûòèå ïîçèöèè:                               |
//|         false - íå çàêðûâàòü ïîçèöèþ                                              |
//|         true - çàêðûòü                                                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool T8_SignalClose (int type, datetime fdt_OpenTime, int fi_Period = 0)
{
    if (fdt_OpenTime + Period.New.Send * 60 > TimeCurrent())
    {return (false);}
    double li_Trend;
//----
    li_Trend = fMA_TrendDetection (fi_Period);
    if (type == OP_BUY)
    {
        if (li_Trend == Trend_DW && gi_LastTrend == Trend_UP)
        {return (true);}
    }
    else if (type == OP_SELL)
    {
        if (li_Trend == Trend_UP && gi_LastTrend == Trend_DW)
        {return (true);}
    }
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      TrendDetection                                                               |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fMA_TrendDetection (int fi_TF = 0)
{
    double ld_MA, ld_MA_next;
    int    lia_Price[] = {PRICE_CLOSE,PRICE_WEIGHTED,PRICE_TYPICAL,PRICE_MEDIAN,PRICE_OPEN},
           liaTrend[] = {0,0};
//-----
    for (int li_MA = 0; li_MA < 4; li_MA++)
    {
        ld_MA = iMA (NULL, fi_TF, T8.MA, 0, MAMode, lia_Price[li_MA], 0);
        ld_MA_next = iMA (NULL, fi_TF, T8.MA, 0, MAMode, lia_Price[li_MA+1], 0);
        if (ld_MA > ld_MA_next)
        {liaTrend[0]++;}
        if (ld_MA < ld_MA_next)
        {liaTrend[1]++;}
    }
    if (liaTrend[0] == 4)
    return (Trend_UP);
    if (liaTrend[1] == 4)
    return (Trend_DW);
//-----
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ïðîâåðêà íà âîçìîæíîñòü îñóùåñòâëåíèÿ òîðãîâûõ îïåðàöèé                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool Block()
{
//----
    if (!IsTradeAllowed() || IsTradeContextBusy() || !IsConnected())
    {
        Print ("Ðûíîê çàíÿò, íåò ñâÿçè, èëè ñîâåòíèêó íå ðàçðåøåíî òîðãîâàòü");
        return (true);
    }
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ãîòîâèì ê ðàáîòå ìàññèâû äàííûõ                                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fInitialArrays()
{
    int    li_size, li_int;
    string tmpArr[];
//----
    //---- Ïîäãîòîâêà êîìïîíåíòîâ Perceptron
    if (T6.Enabled == 1)
    {
        fSplitStrToStr (PerceptronBars, tmpArr);
        li_size = ArraySize (tmpArr);
        ArrayResize (gia_PerceptronBars, li_size);
        for (li_int = 0; li_int < li_size; li_int++)
        {gia_PerceptronBars[li_int] = StrToInteger (tmpArr[li_int]);}
    }
    //---- Ïîäãîòîâêà êîìïîíåíòîâ Direction
    if (T7.Enabled == 1)
    {
        fSplitStrToStr (DirectionBars, tmpArr);
        li_size = ArraySize (tmpArr);
        ArrayResize (gia_DirectionBars, li_size);
        for (li_int = 0; li_int < li_size; li_int++)
        {gia_DirectionBars[li_int] = StrToInteger (tmpArr[li_int]);}
    }
    //---- Ïîäãîòîâêà ðàáî÷èõ ìàññèâîâ
    for (int li_MG = 0; li_MG < MAX_TC; li_MG++)
    {
        gia_TC.Magic[li_MG] = Base.Magic + li_MG;
        switch (li_MG)
        {
            case 0:
                gia_TC.Enable[li_MG] = T1.Enabled;
                gda_TC.SL[li_MG] = T1.SL * gi_Decimal * gd_Point;
                gda_TC.TP[li_MG] = T1.TP * gi_Decimal * gd_Point;
                gda_TC.TS[li_MG] = T1.TS * gi_Decimal * gd_Point;
                gda_TC.lot[li_MG] = T1.lot;
                gia_TC.PeriodRating[li_MG] = T1.PeriodRating;
                gba_TC.OnlyBU[li_MG] = T1.OnlyBU;
                gia_TC.Var.STOP[li_MG] = T1.Var.STOP;
                gia_TC.Var.TS[li_MG] = T1.Var.TS;
                break;
            case 1:
                gia_TC.Enable[li_MG] = T2.Enabled;
                gda_TC.SL[li_MG] = T2.SL * gi_Decimal * gd_Point;
                gda_TC.TP[li_MG] = T2.TP * gi_Decimal * gd_Point;
                gda_TC.TS[li_MG] = T2.TS * gi_Decimal * gd_Point;
                gda_TC.lot[li_MG] = T2.lot;
                gia_TC.PeriodRating[li_MG] = T2.PeriodRating;
                gba_TC.OnlyBU[li_MG] = T2.OnlyBU;
                gia_TC.Var.STOP[li_MG] = T2.Var.STOP;
                gia_TC.Var.TS[li_MG] = T2.Var.TS;
                break;
            case 2:
                gia_TC.Enable[li_MG] = T3.Enabled;
                gda_TC.SL[li_MG] = T3.SL * gi_Decimal * gd_Point;
                gda_TC.TP[li_MG] = T3.TP * gi_Decimal * gd_Point;
                gda_TC.TS[li_MG] = T3.TS * gi_Decimal * gd_Point;
                gda_TC.lot[li_MG] = T3.lot;
                gia_TC.PeriodRating[li_MG] = T3.PeriodRating;
                gba_TC.OnlyBU[li_MG] = T3.OnlyBU;
                gia_TC.Var.STOP[li_MG] = T3.Var.STOP;
                gia_TC.Var.TS[li_MG] = T3.Var.TS;
                break;
            case 3:
                gia_TC.Enable[li_MG] = T4.Enabled;
                gda_TC.SL[li_MG] = T4.SL * gi_Decimal * gd_Point;
                gda_TC.TP[li_MG] = T4.TP * gi_Decimal * gd_Point;
                gda_TC.TS[li_MG] = T4.TS * gi_Decimal * gd_Point;
                gda_TC.lot[li_MG] = T4.lot;
                gia_TC.PeriodRating[li_MG] = T4.PeriodRating;
                gba_TC.OnlyBU[li_MG] = T4.OnlyBU;
                gia_TC.Var.STOP[li_MG] = T4.Var.STOP;
                gia_TC.Var.TS[li_MG] = T4.Var.TS;
                break;
            case 4:
                gia_TC.Enable[li_MG] = T5.Enabled;
                gda_TC.SL[li_MG] = T5.SL * gi_Decimal * gd_Point;
                gda_TC.TP[li_MG] = T5.TP * gi_Decimal * gd_Point;
                gda_TC.TS[li_MG] = T5.TS * gi_Decimal * gd_Point;
                gda_TC.lot[li_MG] = T5.lot;
                gia_TC.PeriodRating[li_MG] = T5.PeriodRating;
                gba_TC.OnlyBU[li_MG] = T5.OnlyBU;
                gia_TC.Var.STOP[li_MG] = T5.Var.STOP;
                gia_TC.Var.TS[li_MG] = T5.Var.TS;
                T5.TralingCCI *= gi_Decimal;
                break;
            case 5:
                gia_TC.Enable[li_MG] = T6.Enabled;
                gda_TC.SL[li_MG] = T6.SL * gi_Decimal * gd_Point;
                gda_TC.TP[li_MG] = T6.TP * gi_Decimal * gd_Point;
                gda_TC.TS[li_MG] = T6.TS * gi_Decimal * gd_Point;
                gda_TC.lot[li_MG] = T6.lot;
                gia_TC.PeriodRating[li_MG] = T6.PeriodRating;
                gba_TC.OnlyBU[li_MG] = T6.OnlyBU;
                gia_TC.Var.STOP[li_MG] = T6.Var.STOP;
                gia_TC.Var.TS[li_MG] = T6.Var.TS;
                break;
            case 6:
                gia_TC.Enable[li_MG] = T7.Enabled;
                gda_TC.SL[li_MG] = T7.SL * gi_Decimal * gd_Point;
                gda_TC.TP[li_MG] = T7.TP * gi_Decimal * gd_Point;
                gda_TC.TS[li_MG] = T7.TS * gi_Decimal * gd_Point;
                gda_TC.lot[li_MG] = T7.lot;
                gia_TC.PeriodRating[li_MG] = T7.PeriodRating;
                gba_TC.OnlyBU[li_MG] = T7.OnlyBU;
                gia_TC.Var.STOP[li_MG] = T7.Var.STOP;
                gia_TC.Var.TS[li_MG] = T7.Var.TS;
                break;
            case 7:
                gia_TC.Enable[li_MG] = T8.Enabled;
                gda_TC.SL[li_MG] = T8.SL * gi_Decimal * gd_Point;
                gda_TC.TP[li_MG] = T8.TP * gi_Decimal * gd_Point;
                gda_TC.TS[li_MG] = T8.TS * gi_Decimal * gd_Point;
                gda_TC.lot[li_MG] = T8.lot;
                gia_TC.PeriodRating[li_MG] = T8.PeriodRating;
                gba_TC.OnlyBU[li_MG] = T8.OnlyBU;
                gia_TC.Var.STOP[li_MG] = T8.Var.STOP;
                gia_TC.Var.TS[li_MG] = T8.Var.TS;
                break;
        }
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, "fInitialArrays()");
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//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+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                          |
//+-----------------------------------------------------------------------------------+
//|  Âåðñèÿ   : 01.09.2005                                                            |
//|  Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òîðãîâîé îïåðàöèè                             |
//+-----------------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                       |
//|    op - èäåíòèôèêàòîð òîðãîâîé îïåðàöèè                                           |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string GetNameOP (int op) 
{
    switch (op) 
    {
        case OP_BUY      : return ("BUY");
        case OP_SELL     : return ("SELL");
        case OP_BUYLIMIT : return ("BUYLIMIT");
        case OP_SELLLIMIT: return ("SELLLIMIT");
        case OP_BUYSTOP  : return ("BUYSTOP");
        case OP_SELLSTOP : return ("SELLSTOP");
    }
    return (StringConcatenate ("None (", op, ")"));
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ, íîðìàëèçàöèè çíà÷åíèÿ double äî Digit                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double NDD (double v) {return (NormalizeDouble (v, gi_Digits));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ, ïåðåâîäà çíà÷åíèÿ èç double â string c íîðìàëèçàöèåé ïî 0         |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string DS0 (double v) {return (DoubleToStr (v, 0));} 
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ, ïåðåâîäà çíà÷åíèÿ èç double â string c íîðìàëèçàöèåé ïî Digit     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string DSD (double v) {return (DoubleToStr (v, gi_Digits));} 
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ, ïåðåâîäà çíà÷åíèÿ èç double â string c íîðìàëèçàöèåé ïî           |
//| ìèíèìàëüíîé ðàçðÿäíîñòè ëîòà                                                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string DSDig (double v) {return (DoubleToStr (v, gi_dig));} 
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Âîçâðàùàåò íàèìåíîâàíèå ñîñòîÿíèÿ (ÄÀ\ÍÅÒ)                                 |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string CheckBOOL (int M)
{
//----
    switch (M)
    {
        case 0: {return ("Íåò");}
        case 1: {return ("Äà");}
    }
//----
    return ("Íå çíàþ...");
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòà ñ îðäåðàìè                                                         |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ çàêðûòèÿ îðäåðîâ ïî òèïó (OP) è Magic (iMG)                        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool CloseOrderAll (int iar_MG[], int OP = -1)
{
    color  lc_close;
    int    li_Type, li_NUM, err = GetLastError();
    double ld_ClosePrice;
    bool   lb_Close = false;
//----
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if (!OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
        {continue;}
        li_NUM = fCheckMyMagic (OrderMagicNumber(), iar_MG);
        if (li_NUM < 0)
        {continue;}
        if (OrderSymbol() != Symbol() || OrderType() > 1)
        {continue;}
        li_Type = OrderType();
        if (OP == li_Type || OP == -1)
        {
            ld_ClosePrice = gda_Price[li_Type];
            if (li_Type == OP_BUY) {lc_close = Blue;} else {lc_close = Red;}
            lb_Close = OrderClose (OrderTicket(), OrderLots(), ld_ClosePrice, Slippage, lc_close);
        }
    }
    fGetLastError (gs_ComError, "CloseOrderAll()");
//----
    return (lb_Close);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð    : TarasBY                                                               |
//+-----------------------------------------------------------------------------------+
//|  Îïèñàíèå : Ïîëó÷àåì öåíû, ñ êîòîðûìè áóäåò ðàáîòàòü ñîâåòíèê                     |
//+-----------------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                       |
//|    iPrice          : 0 - Bid; 1 - Ask                                             |
//|    fi_VariantPrice : 0 - Bid\Ask; 1 - Open[0]; 2 - Close [1]; 3 - Close[0]        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGet_MineTradePrice (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 = iOpen (Symbol(), NewBarInPeriod, 0); break;
        case 2: ld_Price = iClose (Symbol(), NewBarInPeriod, 1); break;
        case 3: ld_Price = iClose (Symbol(), NewBarInPeriod, 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+
//|  UNI:      Òðàëèì ïðîôèò ïî ñ÷¸òó ïî MA                                           |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fTrailingProfitByMA (int TrailStopMin,     // íèæíÿÿ ãðàíèöà ñðàáàòûâàíèÿ Trailing
                         double dProfit,       // ïðîôèò (êîíòðîëèðóåìàÿ âåëè÷èíà)
                         string Name_GV,       // ïðåôèêñ äëÿ GV-ïåðåìåííûõ
                         int& flag_TP,         // ôëàã ñðàáàòûâàíèÿ Trailing
                         int& flag_Stop)       // ôëàã îáíóëåíèÿ ñòîïîâ
{
    static double MaxProfit, ld_Profit_BU, ld_ProfitMIN, ld_ProfitSL;
    static int    li_Trend = -1;
    static bool   lsb_ON = false, lsb_BU = false;
    double ld_MA, ld_ProfitTS, ld_Price;
    string ls_fName = "fTrailingProfitByMA()";
    int    err = GetLastError();
    bool   lb_result = false;
//---- 
    if (dProfit > 0)
    {
        //---- Ôèêñèðóåì óðîâåíü ÁÓ äëÿ îáùåãî ïðîôèòà
        if (!lsb_BU)
        {
            ld_Profit_BU = gda_Price[0];
            lsb_BU = true;
        }
        if (dProfit > TrailStopMin)
        {
            //---- Ôèêñèðóåì óðîâåíü MinProfit äëÿ îáùåãî ïðîôèòà
            if (!lsb_ON)
            {
                ld_ProfitMIN = gda_Price[0];
                fCreat_OBJ ("Profit BU", OBJ_HLINE, 0, "Profit BU", 0, Time[0], ld_Profit_BU, false, Gold);
                lsb_ON = true;
                if (ld_ProfitMIN > ld_Profit_BU)
                {li_Trend = Trend_UP;} else {li_Trend = Trend_DW;}
                if (PrintCom) Print ("Profit BU = ", DSD (ld_Profit_BU));
            }
        }
    }
    else if (dProfit < 0)
    {
        ld_Profit_BU = 0.0;
        ld_ProfitMIN = 0.0;
        lsb_BU = false;
        lsb_ON = false;
        li_Trend = -1;
        flag_TP = 0;
        flag_Stop = 0;
        DelObject ("Profit BU");
        DelObject ("Profit SL");
    }
    if (ld_Profit_BU > 0.0)
    {
        ld_MA = iMA (NULL, Period.Indicators, TrailProfitPeriod, 0, MAMode, PRICE_OPEN, 0);
        if (li_Trend == Trend_UP)      // Trend UP
        {
            ld_Price = gda_Price[0];
            //---- Îïðåäåëÿåì ðàçìåð òðåéëèíã ñòîïà
            ld_ProfitTS = NDD (MathAbs (ld_Price - (ld_MA + gd_XFactor)));
            if (flag_TP == 0)
            {
                if (ld_Price - ld_Profit_BU > ld_ProfitTS)
                {
                    ld_ProfitSL = NDD (ld_MA + gd_XFactor);
                    flag_TP = 1;
                    ObjectSet ("Profit BU", OBJPROP_COLOR, Blue);
                    GlobalVariableSet (Name_GV + "_#flagTP", flag_TP);
                    gs_trade = fPrepareComment (StringConcatenate (ls_fName, ": TrailingProfit_ON[UP]. flagTrailProfit = ", CheckBOOL (flag_TP), "."), gb_InfoPrint);
                    if (PrintCom) Print ("Trailling Stop = ", ld_ProfitTS / gd_Point, " pips; Profit SL[", (ld_Price - ld_ProfitSL) / gd_Point, "] = ", DSD (ld_ProfitSL), "; Price = ", ld_Price);
                    if (PrintCom) {Print (gs_trade);}
                }
            }
            if (flag_TP == 1)
            {
                if (ld_Price - ld_ProfitSL > ld_ProfitTS)
                {
                    ld_ProfitSL = ld_Price - ld_ProfitTS;
                    MaxProfit = MathMax (MaxProfit, dProfit);
                    DelObject ("Profit BU");
                    fCreat_OBJ ("Profit SL", OBJ_HLINE, 0, "Profit SL", 0, Time[0], ld_ProfitSL, false, Blue);
                    ObjectSet ("Profit SL", OBJPROP_STYLE, DRAW_SECTION);
                    gs_trade = fPrepareComment (StringConcatenate (ls_fName, ": Work TP - MAX = $", DS0 (MaxProfit), "; Profit SL [", (ld_Price - ld_ProfitSL) / gd_Point, "] = ", DSD (ld_ProfitSL), ")."), gb_InfoPrint);
                    if (PrintCom && fCCV_D (ND0 (MaxProfit), 3)) {Print (gs_trade);}
                }
                if (ld_Price < ld_ProfitSL)
                {lb_result = true;}
            }
        }
        if (li_Trend == Trend_DW)      // Trend DW
        {
            ld_Price = gda_Price[1];
            ld_ProfitTS = NDD (MathAbs ((ld_MA - gd_XFactor) - ld_Price));
            if (flag_TP == 0)
            {
                if (ld_Profit_BU - ld_Price > ld_ProfitTS)
                {
                    ld_ProfitSL = NDD (ld_MA - gd_XFactor);
                    flag_TP = 1;
                    ObjectSet ("Profit BU", OBJPROP_COLOR, Red);
                    GlobalVariableSet (Name_GV + "_#flagTP", flag_TP);
                    gs_trade = fPrepareComment (StringConcatenate (ls_fName, ": TrailingProfit_ON[DW]. flagTrailProfit = ", CheckBOOL (flag_TP), "."), gb_InfoPrint);
                    if (PrintCom) Print ("Trailling Stop = ", ld_ProfitTS / gd_Point, " pips; Profit SL[", (ld_ProfitSL - ld_Price) / gd_Point, "] = ", DSD (ld_ProfitSL), "; Price = ", ld_Price);
                    if (PrintCom) {Print (gs_trade);}
                }
            }
            if (flag_TP == 1)
            {
                if (ld_ProfitSL - ld_Price > ld_ProfitTS)
                {
                    ld_ProfitSL = ld_Price + ld_ProfitTS;
                    MaxProfit = MathMax (MaxProfit, dProfit);
                    DelObject ("Profit BU");
                    fCreat_OBJ ("Profit SL", OBJ_HLINE, 0, "Profit SL", 0, Time[0], ld_ProfitSL, false, Red);
                    ObjectSet ("Profit SL", OBJPROP_STYLE, DRAW_SECTION);
                    gs_trade = fPrepareComment (StringConcatenate (ls_fName, ": Work TP - MAX = $", DS0 (MaxProfit), "; Profit SL[", (ld_ProfitSL - ld_Price) / gd_Point, "] = ", DSD (ld_ProfitSL), ")."), gb_InfoPrint);
                    if (PrintCom && fCCV_D (ND0 (MaxProfit), 3)) {Print (gs_trade);}
                }
                if (ld_Price > ld_ProfitSL)
                {lb_result = true;}
            }
        }
    }
    if (lb_result)
    {
        gs_trade = fPrepareComment (StringConcatenate (ls_fName, ": Close from TP, Profit = $", DS0 (dProfit), "."), gb_InfoPrint);
        if (PrintCom) {Print (gs_trade);}
        MaxProfit = 0;
        flag_TP = 0;
        flag_Stop = 0;
        GlobalVariableSet (Name_GV + "_#flagTP", flag_TP);
        GlobalVariableSet (Name_GV + "_#NULLStops", flag_Stop);
        DelObject ("Profit BU");
        DelObject ("Profit SL");
        return (true);
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, ls_fName);
    return (false);
//---- 
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  UNI:      Òðàëèì ïðîôèò ïî ñ÷¸òó                                                 |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fTrailingProfit (int TrailStopMin,     // íèæíÿÿ ãðàíèöà ñðàáàòûâàíèÿ Trailing
                      int TrailStart,       // âåëè÷èíà ñðàáàòûâàíèÿ Trailing
                      int TrailValue,       // âåëè÷èíà îáðàòíîãî îòêàòà ïîñëå ñðàáàòûâàíèÿ
                      double dProfit,       // ïðîôèò (êîíòðîëèðóåìàÿ âåëè÷èíà)
                      string Name_GV,       // ïðåôèêñ äëÿ GV-ïåðåìåííûõ
                      int& flag_TP,         // ôëàã ñðàáàòûâàíèÿ Trailing
                      int& flag_Stop)       // ôëàã îáíóëåíèÿ ñòîïîâ
{
    static double MinProfit, MaxProfit;
    static int cur_TrailValue, cur_TrailStart, cur_TrailStopMin;
    string ls_fName = "fTrailingProfit()";
    int    err = GetLastError();
//---- 
    cur_TrailValue = TrailValue;
    cur_TrailStart = TrailStart;
    if (MinProfit > 0)
    {cur_TrailStopMin = MathMin (TrailStopMin, MinProfit);}
//---- 
    if (flag_TP == 0)
    {
        if (dProfit >= cur_TrailStart)
        {
            MinProfit = dProfit - cur_TrailValue;      // íèæíÿÿ ãðàíèöà êîðèäîðà
            MaxProfit = MinProfit + cur_TrailValue;    // âåðõíÿÿ ãðàíèöà êîðèäîðà
            flag_TP = 1;
            GlobalVariableSet (Name_GV + "_#flagTP", flag_TP);
            gs_trade = fPrepareComment (StringConcatenate (ls_fName, ": TrailingProfit_ON. flagTrailProfit = ", CheckBOOL (flag_TP), "."), gb_InfoPrint);
            if (PrintCom) {Print (gs_trade);}
            return (false);
        }
    }
    if (flag_TP == 1)
    {
        if (dProfit >= cur_TrailStart)
        {
            MinProfit = MathMax (MinProfit, dProfit - cur_TrailValue);
            MaxProfit = MathMax (MaxProfit, dProfit);
            fCreat_OBJ ("Profit SL", OBJ_HLINE, 0, "Profit SL", 0, Time[0], MinProfit, false, Yellow);
            ObjectSet ("Profit SL", OBJPROP_STYLE, DRAW_SECTION);
            gs_trade = fPrepareComment (StringConcatenate (ls_fName, ": Work TP. (UP = $", DS0 (MaxProfit), "; DOWN = $", DS0 (MinProfit), "), ProfitStart = ", DS0 (cur_TrailStart), "."), gb_InfoPrint);
            if (PrintCom && fCCV_D (ND0 (MaxProfit), 3)) {Print (gs_trade);}
        }
        if (dProfit < MinProfit)
        {
            if (MinProfit == cur_TrailStopMin)
            {gs_trade = fPrepareComment (StringConcatenate (ls_fName, ": Close by ProfitMin[", TrailStopMin, "], Profit = $", DS0 (dProfit), "."), gb_InfoPrint);}
            if (MinProfit > cur_TrailStopMin)
            {gs_trade = fPrepareComment (StringConcatenate (ls_fName, ": Close from TP, Profit = $", DS0 (dProfit), "."), gb_InfoPrint);}
            if (PrintCom) {Print (gs_trade);}
            MaxProfit = 0;
            MinProfit = 0;
            flag_TP = 0;
            flag_Stop = 0;
            DelObject ("Profit SL");
            GlobalVariableSet (Name_GV + "_#flagTP", flag_TP);
            GlobalVariableSet (Name_GV + "_#NULLStops", flag_Stop);
            return (true);
        }
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGetLastError (gs_ComError, ls_fName);
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ñåðâèñíûõ ôóíêöèé                                                         |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ãîòîâèì ê âûâîäó íà ïå÷àòü è íà ãðàôèê êîììåíòàðèè                                |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string fPrepareComment (string sText = "", bool bConditions = false)
{if (bConditions) if (StringLen (sText) > 0) {return (sText);}}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Âûâîäèì íà ïå÷àòü è íà ãðàôèê êîììåíòàðèè                                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fPrintAndShowComment (string Text, bool Show_Conditions, bool Print_Conditions, string& s_Show[], int ind = -1)
{
    if ((Show_Conditions || Print_Conditions) && StringLen (Text) > 0)
    {
        if (ind >= 0 && Show_Conditions)
        {s_Show[ind] = Text;}
        if (Print_Conditions)
        {Print (Text);}
    }
//---- 
    return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòà ñ ãðàôè÷åñêèìè îáúåêòàìè                                           |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Ðèñóåì OBJ_TREND, OBJ_ARROW, OBJ_HLINE                                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCreat_OBJ (string fs_Name, int fi_OBJ, int fi_ArrowCode, string fs_Text, int fi_FontSize,
                 datetime fdt_Time1, double fd_Price1, bool fb_Ray = true, color fc_Color = Gold,
                 datetime fdt_Time2 = 0, double fd_Price2 = 0)
{
    int err = GetLastError();
    bool lb_result = false;
//----
    if (ObjectFind (fs_Name) == -1)
    {lb_result = ObjectCreate (fs_Name, fi_OBJ, 0, 0, 0);}
    ObjectSet (fs_Name, OBJPROP_TIME1, fdt_Time1);
    ObjectSet (fs_Name, OBJPROP_PRICE1, fd_Price1);
    if (fdt_Time2 != 0 || fd_Price2 != 0)
    {
        ObjectSet (fs_Name, OBJPROP_TIME2, fdt_Time2);
        ObjectSet (fs_Name, OBJPROP_PRICE2, fd_Price2);
    }
    ObjectSet (fs_Name, OBJPROP_COLOR, fc_Color);
    if (fi_OBJ == OBJ_TREND)
    {ObjectSet (fs_Name, OBJPROP_RAY, fb_Ray);}
    if (fi_OBJ == OBJ_ARROW)
    {ObjectSet (fs_Name, OBJPROP_ARROWCODE, fi_ArrowCode);}
    if (StringLen (fs_Text) > 0)
    {ObjectSetText (fs_Name, fs_Text, fi_FontSize, "Calibri", fc_Color);}
    fGetLastError (gs_ComError, "fCreat_OBJ()");
//----
    return (lb_result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//          ÓÄÀËÅÍÈÅ ÃÐÀÔÈ×ÅÑÊÎÃÎ ÎÁÚÅÊÒÀ                                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool DelObject (string fs_partTXT)
{
    int    err = GetLastError();
    string ls_Name;
    bool   lb_result = false;
//----
    if (ObjectFind (fs_partTXT) != -1)
    {
        if (ObjectDelete (fs_partTXT))
        {return (true);}
    }
    //---- Óäàëÿåì âñå îáúåêòû ñ çàäàííûì ïðåôèêñîì fs_partTXT
    for (int li_OBJ = ObjectsTotal() - 1; li_OBJ >= 0; li_OBJ--)
    {
        ls_Name = ObjectName (li_OBJ);
        if (StringFind (ls_Name, fs_partTXT, 0) > -1)
        {
            if (ObjectDelete (ls_Name))
            {lb_result = true;}
        }
    }
    fGetLastError (gs_ComError, StringConcatenate ("DelObject()[", fs_partTXT, "]"));
//----
    return (lb_result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

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