e-PSI4TD-Lines

Author: Copyright � 2011, TarasBY WM Z670270286972
Profit factor:
0.00
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-PSI4TD-Lines
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                                e-PSI@TD-Lines.mq4 |
//|                                           Copyright © 2008-2011, TarasBY & funyoo |
//|                                                                taras_bulba@tut.by |
//|                              Àâòîðñêàÿ âåðñèÿ íà http://codebase.mql4.com/ru/4775 |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
#property copyright "Copyright © 2011, TarasBY WM Z670270286972"
#property link      "taras_bulba@tut.by"
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  *****         Ïàðàìåòðû ñîâåòíèêà         *****                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
extern string   SETUP_Expert      = "=========== Îáùèå íàñòðîéêè ñîâåòíèêà ===========";
extern int	  	 MagicNumber         = 346;
extern int      NewBarInPeriod      = 1;      // >= 0 - ðàáîòàåì íà íà÷àëå ïåðèîäà íîâîãî áàðà, -1 - ðàáîòàåì íà êàæäîì òèêå
extern bool 	 Reverse             = false;
extern string	 TradeComment        = "Trade";
extern int	  	 TradeBar            = 9;      // N áàð, ñ êîòîðîãî ñíèìàåì ïîêàçàíèÿ èíäèêàòîðà (>=1)
extern int	  	 N_TradeBars         = 1;      // Êîëè÷åñòâî áàðîâ îò TradeBar, ñ êîòîðûõ ñíèìàåì ïîêàçàíèÿ èíäèêàòîðà (>=1)
extern int	  	 LifeMinBar          = 7;      // Ìèíèìàëüíîå âðåìÿ æèçíè îðäåðà â áàðàõ
extern string   SETUP_AutoTrading = "================= AUTO TRADING ==================";
extern bool     AutoSTOPs_ON        = true;   // Ôîðìèðîâàíèå ÑÒÎÏîâ îò ïîêàçàíèé èíäèêàòîðà
extern int	  	 MIN_Stop            = 15;     // Ìèíèìàëüíûå ñòîïû (äëÿ 4-ð¸õ çíàêîâ) äëÿ AutoSTOPs_ON
extern int 		 TradeOrders         = 4;      // Êîëè÷åñòâî îäíîâðåìåííî îòêðûâàåìûõ îðäåðîâ (1-4)
extern string   SETUP_Trailling   = "=================== TRAILLING ===================";
extern int 		 TrailingStop        = 0;
extern int 		 TrailingStep        = 1;      // Trailing step
extern int    	 BreakEven           = 0;      // ÁåçÓáûòîê
extern string   Setup_TrailATR    = "----------------- Traiiling ATR -----------------";
extern bool     Use_TrailATR        = true;   // Ôîðìèðîâàíèå ÑÒÎÏîâ îò ïîêàçàíèé èíäèêàòîðà
extern int      ATR_TF              = 0;      // Òàéìôðåéì ATR
extern int      ATR_Period          = 14;     // Ïåðèîä óñðåäíåíèÿ
extern double   ATR_Trailing        = 2.0;
extern string   Setup_Lots        = "========= Ïàðàìåòðû ìîäóëÿ ðàñ÷¸òà ëîòà =========";
extern bool     UseMM               = TRUE;   // Èñïîëüçîâàòü ðàñøèðÿþùèéñÿ ëîò
extern string   Setup_MeansType_1_3 = "MeansType: 1-Balance; 2-Equity; 3-FreeMargin;";
extern int      MeansType           = 2;      // Òèï ñðåäñòâ èñïîëüçóåìûõ ïðè ðàñ÷åòå ðàçìåðà ëîòà:
extern int      LotsPercent         = 10;     // Ïðîöåíò îò MeansType (ñóììàðíûé ëîò âñåõ TradeOrders îðäåðîâ)
extern string   QuotaEachOrders     = "50,20,20,10"; // LotsPercent ðàçáèâàåòñÿ íà TradeOrders ÷àñòåé (100 %)
extern bool     Use_Prioritity      = TRUE;   // Èñïîëüçîâàíèå ïðèîðèòåòà ðàçìåðà ëîòà îðäåðîâ ïî ðåçóëüòàòàì ðàáîòû
extern double   MinLot              = 0.01;   // Ìèíèìàëüíûé ëîò ðûíî÷íîãî îðäåðà
extern double   MaxLot              = 50.0;   // Ìàêñèìàëüíûé ëîò ðûíî÷íîãî îðäåðà 
extern double   RiskDepo            = 2000.0; // Ðàçìåð Depo â âàëþòå äåïîçèòà, íà êîòîðûé èãðàåì
extern int      MAXLossDepoPercent  = 50;     // Ïðè êàêîì ëîññå îò Depo (â ïðîöåíòàõ) çàêðûâàþòñÿ âñå îðäåðà
extern string   Setup_Order1      = "--------------- Setting Order ¹ 1 ---------------";
extern bool 	 TradeOrder1         = true;
extern double	 TradeLots1          = 0.1;
extern int		 TradeSL1            = 30;
extern int		 TradeTS1            = 50;
extern int		 TradeTP1            = 0;
extern string   Setup_Order2      = "--------------- Setting Order ¹ 2 ---------------";
extern bool 	 TradeOrder2         = true;
extern double	 TradeLots2          = 0.1;
extern int		 TradeSL2            = 50;
extern int		 TradeTS2            = 80;
extern int		 TradeTP2            = 0;
extern string   Setup_Order3      = "--------------- Setting Order ¹ 3 ---------------";
extern bool 	 TradeOrder3         = true;
extern double	 TradeLots3          = 0.1;
extern int		 TradeSL3            = 80;
extern int		 TradeTS3            = 120;
extern int		 TradeTP3            = 0;
extern string   Setup_Order4      = "--------------- Setting Order ¹ 4 ---------------";
extern bool 	 TradeOrder4         = true;
extern double	 TradeLots4          = 0.1;
extern int		 TradeSL4            = 120;
extern int		 TradeTS4            = 160;
extern int		 TradeTP4            = 0;
extern string   Setup_Services    = "==================== SERVICES ===================";
extern int      Repeat              = 3;     // Ïåðåìåííàÿ äëÿ Alert
extern int      Periods             = 5;     // Ïåðåìåííàÿ äëÿ Alert
extern bool     UseAlert            = false;
extern bool     SoundPlay           = false;
extern bool     SendEmail           = false;
extern string   TradeLog            = "TD-Lines";
extern int      NumberOfTries       = 3;     // Êîëè÷åñòâî òîðãîâûõ ïîïûòîê
extern int      Slippage            = 2;
//IIIIIIIIIIIIIIIIIII======Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà======IIIIIIIIIIIIIIIIIIIIII+
int 	          gi_Digits, gi_Decimal = 1, gia_HistoryOrders[], DotLoc = 7,
          	    Crepeat = 0, AlertTime = 0, gi_HistoryOrders, gi_dig, gia_PartLots[],
          	    gia_Priority[], gia_TP[4], gia_SL[4], gia_MyOrders[2], gi_MyOrders,
          	    RetryTime = 3;               // Ïàóçà â ñåê. ì\ó òîðãîâûìè ïîïûòêàìè
double          gd_Point, AheadTradeSec = 0, AheadExitSec = 0, gda_Pribul[],
                gda_TradeLots[4], gda_SL[4], gda_TP[4], gda_TS[4],
                gd_TrailingStep, gd_TrailingStop, gd_BreakEven, gd_Pribul, gd_MIN_Stop,
                gd_Balance, gd_Equity, gd_FreeMargin, gd_Margin, LotsMM,
                gd_LOTSTEP, gd_MAXLOT, gd_MINLOT, sig_buy, sig_sell, gd_ATR_Trailing,
                gd_BeginBalance;             // íà÷àëüíîå çíà÷åíèå Áàëàíñà
bool            gba_OrderTrade[4], gb_VirtualTrade = false, gb_Pause;
string          gsa_TradeComment[4], filename, gs_NameGV, sound = "alert.wav",
                gs_Symbol, gs_pref, gs_sign, gs_Conditions;
datetime        gdt_NewBarControl, gdt_NewBar;
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  *****         Ïàðàìåòðû èíäèêàòîðà        *****                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
extern string   Indicator_Setting = "=============== Indicator Setting ===============";
extern int      ShowBars            = 300;   // if ShowBars= 0 so the indicator will be shown for all the chart
extern int      LevDP               = 2;     // Demar Pint Levels; 2 = central bar will be higher (lower) then 2 bars on the left side and 2 bars on the right one.
extern int      Steps               = 1;     // number of steps/ no more than 3
extern int      BackStep            = 0;     // number of staps back
extern int      StartBar            = 0;     // if StartBar = 0 so we have recommendation for the current bar, if 1 - for possible next bar
extern bool     TrendLine           = false; // false = no trend lines
extern bool     HorizontLine        = false; // true = break levels
extern bool     ChannelLine         = false; // true = channels which is parallel with trend lines 
extern bool     TakeLines           = false; // true = take profit lines
extern bool     Comments            = false; // true = comments
extern int      Trend               = 0;     // 1 = for UpTrendLines only, -1 = for DownTrendLines only, 0 = for all TrendLines
extern bool     ShowArrows          = true;
extern bool     CustomFeatures      = true;
extern color    UpTrendColor        = Green;
extern color    DownTrendColor      = Red;
extern int      TrendlineWidth      = 3;
extern bool     ShowAlerts          = false;
extern bool     EmailAlert          = false;
//IIIIIIIIIIIIIIIIIII==========Ïîäêëþ÷åííûå áèáëèîòåêè==========IIIIIIIIIIIIIIIIIIIIII+
#include <stdlib.mqh>
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  Custom expert initialization function                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int init()
{
    string tmpArr[], ls_txt = "", ls_tmp = "";
//---- 
    filename = StringConcatenate (Symbol(), TradeLog, "-", Month(), "-", Day(), ".log");
    gi_Digits = Digits;
    gd_Point = Point;
    gs_Symbol = Symbol();
    gi_dig = LotDecimal();
    gs_pref = StringConcatenate (Symbol(), "_", Period(), "_");
    gs_NameGV = StringConcatenate ("TD-Lines[", MagicNumber, "]");
    //---- Ó÷èòûâàåì ðàáîòó 5-òè çíàêà
    if (gi_Digits == 3 || gi_Digits == 5)
    {gi_Decimal = 10;}
    MIN_Stop *= gi_Decimal;
    gd_MIN_Stop = MIN_Stop * gd_Point;
    TrailingStep *= gi_Decimal;
    gd_TrailingStep = TrailingStep * gd_Point;
    TrailingStop *= gi_Decimal;
    gd_TrailingStop = TrailingStop * gd_Point;
    BreakEven *= gi_Decimal;
    gd_BreakEven = BreakEven * gd_Point;
    DotLoc *= gi_Decimal;
    gd_MAXLOT = MarketInfo (gs_Symbol, MODE_MAXLOT);
    gd_MINLOT = MarketInfo (gs_Symbol, MODE_MINLOT);
    gd_LOTSTEP = MarketInfo (gs_Symbol, MODE_LOTSTEP);
    //---- Ïîäãîíÿåì êëþ÷åâûå ìàññèâû ïîä ðàçìåð
    ArrayResize (gda_Pribul, TradeOrders);
    ArrayResize (gia_HistoryOrders, TradeOrders);
    ArrayResize (gia_Priority, TradeOrders);
    ArrayResize (gia_PartLots, TradeOrders);
    
    //---- Çàïîëíÿåì ìàññèâû
    if (!AutoSTOPs_ON)
    {
        gba_OrderTrade[0] = TradeOrder1;
        gba_OrderTrade[1] = TradeOrder2;
        gba_OrderTrade[2] = TradeOrder3;
        gba_OrderTrade[3] = TradeOrder4;
        TradeSL1 *= gi_Decimal;
        gda_SL[0] = TradeSL1 * gd_Point;
        TradeSL2 *= gi_Decimal;
        gda_SL[1] = TradeSL2 * gd_Point;
        TradeSL3 *= gi_Decimal;
        gda_SL[2] = TradeSL3 * gd_Point;
        TradeSL4 *= gi_Decimal;
        gda_SL[3] = TradeSL4 * gd_Point;
        TradeTP1 *= gi_Decimal;
        gda_TP[0] = TradeTP1 * gd_Point;
        TradeTP2 *= gi_Decimal;
        gda_TP[1] = TradeTP2 * gd_Point;
        TradeTP3 *= gi_Decimal;
        gda_TP[2] = TradeTP3 * gd_Point;
        TradeTP4 *= gi_Decimal;
        gda_TP[3] = TradeTP4 * gd_Point;
        TradeTS1 *= gi_Decimal;
        gda_TS[0] = TradeTS1 * gd_Point;
        TradeTS2 *= gi_Decimal;
        gda_TS[1] = TradeTS2 * gd_Point;
        TradeTS3 *= gi_Decimal;
        gda_TS[2] = TradeTS3 * gd_Point;
        TradeTS4 *= gi_Decimal;
        gda_TS[3] = TradeTS4 * gd_Point;
    }
    else
    {TakeLines = true;}
    gda_TradeLots[0] = TradeLots1;
    gda_TradeLots[1] = TradeLots2;
    gda_TradeLots[2] = TradeLots3;
    gda_TradeLots[3] = TradeLots4;
    for (int li_int = 0; li_int < TradeOrders; li_int++)
    {gsa_TradeComment[li_int] = StringConcatenate (TradeComment, li_int);}
    Crepeat = Repeat;
    if (UseMM)
    {
        //---- Çàïîëíÿåì ðàáî÷èé ìàññèâ íàñòðîå÷íûìè äàííûìè
        fSplitStrToStr (QuotaEachOrders, tmpArr);
        int li_size = ArraySize (tmpArr);
        ArrayResize (gia_PartLots, li_size);
        for (li_int = 0; li_int < li_size; li_int++)
        {
            gia_PartLots[li_int] = StrToInteger (tmpArr[li_int]);
            ls_tmp = StringConcatenate (ls_tmp, "PartLots[", li_int, "] = ", gia_PartLots[li_int], "; ");
        }
        Print (ls_tmp);
        ls_tmp = "";
    }
    if (IsOptimization() || (IsTesting() && !IsVisualMode()))
    {gb_VirtualTrade = true;}
    else
    {
        if (GlobalVariableCheck (StringConcatenate (gs_NameGV, "_#BeginBalance")))
        {gd_BeginBalance = GlobalVariableGet (StringConcatenate (gs_NameGV, "_#BeginBalance"));}
        else
        {gd_BeginBalance = AccountBalance();}
    }
    if (TradeBar <= 0)
    {Alert ("Íå ìîãó òîðãîâàòü íà 0-îì áàðå !!!");}
    //---- Îïðåäåëÿåì çíà÷¸ê âàëþòû äåïîçèòà
    gs_sign = IIFs ((AccountCurrency() == "USD"), "$", IIFs ((AccountCurrency() == "EUR"), "ˆ", "RUB"));
	 Print ("MIN Lot = ", DSDig (gd_MINLOT), "; SPREAD = ", MarketInfo (gs_Symbol, MODE_SPREAD));
	 gs_Conditions = StringConcatenate ("TradeBar = ", TradeBar, "; N TradeBars = ", N_TradeBars, "; LifeMinBar = ", LifeMinBar, "\n",
	 "Reverse [", On (Reverse), "] MM [", On (UseMM), "] Prioritity [", On (Use_Prioritity), "] TrailATR [", On (Use_TrailATR), "]\n");
//----
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  Custor expert deinitialization function                          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int deinit()
{
//---- 
    gd_Pribul = fCalculate_Pribul (gi_HistoryOrders, MagicNumber);
    //---- Âûâîäèì êîììåíòàðèè
    fCommentInChart();
//----
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|               Custom expert iteration function                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int start()
{
    //---- Óñëîâèå - íà ýòîì áàðå ðàáîòàåì îäèí ðàç
    if (gdt_NewBarControl == iTime (gs_Symbol, NewBarInPeriod, 0))
    {return (0);}
    gdt_NewBarControl = iTime (gs_Symbol, NewBarInPeriod, 0);
//----
    int    li_pos, fl_OpenSell = 0, fl_OpenBuy = 0, fl_CloseSell = 0,
           li_IND, li_total, fl_CloseBuy = 0, fl_AllowTrade = 0, fl_AllowExit = 0,
           lia_BAR[] = {1,1}, lia_LastBAR[] = {0,0};
    string ls_txt;
//----
    //---- Åñëè íåò îòêðûòûõ îðäåðîâ, ðàáîòàåì â íà÷àëå áàðà
    if (gdt_NewBar != Time[0])
    {
        gdt_NewBar = Time[0];
        //---- Íà îòêðûòèå îðäåðîâ ïðîâåðÿåì îäèí ðàç íà íà÷àëå áàðà ãðàôèêà
        gb_Pause = false;
    }
    else
    {
        gb_Pause = true;
        if (gi_MyOrders == 0)
        {return (0);}
    }
    //---- Trade before bar current bar closed
    if (TimeCurrent() >= Time[0] + Period() * 60 - AheadTradeSec) {fl_AllowTrade = 1;} else {fl_AllowTrade = 0;}
    if (TimeCurrent() >= Time[0] + Period() * 60 * LifeMinBar) {fl_AllowExit = 1;} else {fl_AllowExit = 0;}
    if (AheadTradeSec == 0) fl_AllowTrade = 1;
    if (AheadExitSec == 0) fl_AllowExit = 1;
    //---- Ïîäñ÷èòûâàåì ñòàòèñòèêó
    fGet_Statistic();
    //---- Ñ÷èòàåì "ñâîè" îðäåðà
    gi_MyOrders = fMyOrders (-1, MagicNumber);
    //---- Âûâîäèì êîììåíòàðèè
    fCommentInChart();
    //---- Åñëè ëîññ ïðåâûñèë äîïóñòèìîå çíà÷åíèå îò áàëàíñà, çàêðûâàåì âñå îðäåðà !!!
    //---- Åñëè ïðîèãðàëè RiskDepo, çàêðûâàåì âñå îðäåðà !!!
    if (fControl_RiskDEPO (ls_txt, RiskDepo, MAXLossDepoPercent, gd_BeginBalance, gd_Balance, AccountProfit()))
    {
        if (gi_MyOrders > 0)
        {
            li_total = CloseOrderAll (-1);
            if (li_total > 0)
            {ls_txt = StringConcatenate (ls_txt, " Delete ALL[", li_total, "] orders !!!");}
        }
        fWrite_Log (ls_txt);
        return (0);
    }
    //---- Conditions to open the position
    sig_buy = 0;
    while (sig_buy == 0 || sig_buy == EMPTY_VALUE)
    {
        sig_buy = iCustom (NULL, 0, "i-PSI@TD-Lines", ShowBars, LevDP, Steps, BackStep, StartBar, TrendLine, HorizontLine, ChannelLine, TakeLines, Comments, Trend, ShowArrows, CustomFeatures, UpTrendColor, DownTrendColor, TrendlineWidth, ShowAlerts, EmailAlert, 2, lia_BAR[0]);
        lia_BAR[0]++;
        if (lia_BAR[0] >= ShowBars)
        {
            lia_BAR[0] = 0;
            break;
        }
    }
    //---- Èùåì ïðåäûäóùèé ñèãíàë íà ïîêóïêó
    lia_LastBAR[0] = lia_BAR[0] + 1;
    sig_buy = 0;
    while (sig_buy == 0 || sig_buy == EMPTY_VALUE)
    {
        sig_buy = iCustom (NULL, 0, "i-PSI@TD-Lines", ShowBars, LevDP, Steps, BackStep, StartBar, TrendLine, HorizontLine, ChannelLine, TakeLines, Comments, Trend, ShowArrows, CustomFeatures, UpTrendColor, DownTrendColor, TrendlineWidth, ShowAlerts, EmailAlert, 2, lia_LastBAR[0]);
        lia_LastBAR[0]++;
        if (lia_LastBAR[0] >= ShowBars)
        {
            lia_LastBAR[0] = ShowBars;
            break;
        }
    }
    sig_sell = 0;
    while (sig_sell == 0 || sig_sell == EMPTY_VALUE)
    {
        sig_sell = iCustom (NULL, 0, "i-PSI@TD-Lines", ShowBars, LevDP, Steps, BackStep, StartBar, TrendLine, HorizontLine, ChannelLine, TakeLines, Comments, Trend, ShowArrows, CustomFeatures, UpTrendColor, DownTrendColor, TrendlineWidth, ShowAlerts, EmailAlert, 3, lia_BAR[1]);
        lia_BAR[1]++;
        if (lia_BAR[1] >= ShowBars)
        {
            lia_BAR[1] = 0;
            break;
        }
    }
    //---- Èùåì ïðåäûäóùèé ñèãíàë íà ïîêóïêó
    lia_LastBAR[1] = lia_BAR[1] + 1;
    sig_sell = 0;
    while (sig_sell == 0 || sig_sell == EMPTY_VALUE)
    {
        sig_sell = iCustom (NULL, 0, "i-PSI@TD-Lines", ShowBars, LevDP, Steps, BackStep, StartBar, TrendLine, HorizontLine, ChannelLine, TakeLines, Comments, Trend, ShowArrows, CustomFeatures, UpTrendColor, DownTrendColor, TrendlineWidth, ShowAlerts, EmailAlert, 3, lia_LastBAR[1]);
        lia_LastBAR[1]++;
        if (lia_LastBAR[1] >= ShowBars)
        {
            lia_LastBAR[1] = ShowBars;
            break;
        }
    }
    //---- Ïðîâåðÿåì óñëîâèÿ íà îòêðûòèå îðäåðîâ
    if (lia_BAR[0] < lia_BAR[1])
    {
	     if (Ask > High[lia_BAR[0]])                 // òåêóùàÿ öåíà âûøå ñèãíàëüíîãî áàðà
        {
            if ((lia_BAR[0] >= TradeBar             // ïîäòâåðæäåíèå ñèãíàëà (íå îòìåí¸í)
            || lia_LastBAR[0] < lia_LastBAR[1])     // ýòî ïîäðÿä ñëåäóþùèé ñèãíàë â òîì æå íàïðàâëåíèè
            && lia_BAR[0] < TradeBar + N_TradeBars) // ïðîäîëæèòåëüíîñòü äåéñòâèÿ ñèãíàëà
	         {fl_OpenBuy = 1;}
	         if (gia_MyOrders[1] > 0)
	         {fl_CloseSell = 1;}
	     }
    }
    else if (lia_BAR[1] < lia_BAR[0])
    {
	     if (Bid < Low[lia_BAR[1]])                  // òåêóùàÿ öåíà íèæå ñèãíàëüíîãî áàðà
        {
            if ((lia_BAR[1] >= TradeBar             // ïîäòâåðæäåíèå ñèãíàëà (íå îòìåí¸í)
            || lia_LastBAR[1] < lia_LastBAR[0])     // ýòî ïîäðÿä ñëåäóþùèé ñèãíàë â òîì æå íàïðàâëåíèè
            && lia_BAR[1] < TradeBar + N_TradeBars) // ïðîäîëæèòåëüíîñòü äåéñòâèÿ ñèãíàëà
	         {fl_OpenSell = 1;}
	         if (gia_MyOrders[0] > 0)
	         {fl_CloseBuy = 1;}
	     }
    }
    if (Reverse)
    {
        int OpTmp = fl_OpenSell;
	     fl_OpenSell = fl_OpenBuy;
	     fl_OpenBuy = OpTmp;
	     OpTmp = fl_CloseSell;
	     fl_CloseSell = fl_CloseBuy;
	     fl_CloseBuy = OpTmp;
    }
    if (Use_TrailATR)
    {gd_ATR_Trailing = ATR_Trailing * iATR (Symbol(), ATR_TF, ATR_Period, 1);}
    //---- Çàêðûâàåì îðäåðà ïî ïðîòèâîïîëîæíîìó ñèãíàëó
    if (gi_MyOrders > 0)
    {
        li_total = OrdersTotal();
        if (fl_AllowExit == 1)
        {
            for (li_pos = li_total - 1; li_pos >= 0; li_pos--)
            {
                OrderSelect (li_pos, SELECT_BY_POS, MODE_TRADES);
	             if (OrderSymbol() == Symbol() && ((OrderMagicNumber() == MagicNumber) || MagicNumber < 0))
	             {
	                 if (OrderType() == OP_BUY)
	                 {
                        if (fl_CloseBuy == 1)
                        {
                            if (fOrderClose (OrderTicket(), OrderLots(), NDD (Bid), Slippage, Red))
                            {
                                if (!gb_VirtualTrade)
                                {
                                    SetText (Time[0], High[0] + 1 * DotLoc * Point, ("CloseBuy" + DoubleToStr (Time[0], 0)), CharToStr (251), Magenta);
                                    fPlay_Sound ("alert.wav");
                                    Alerts (0, 0, fl_CloseBuy, fl_CloseSell, Bid, 0, 0, OrderTicket());
                                }
                                return (0);
                            }
                        }
                    }	
                    if (OrderType() == OP_SELL)
                    {
		                  if (fl_CloseSell == 1)
		                  {
				                if (fOrderClose (OrderTicket(), OrderLots(), NDD (Ask), Slippage, Red))
				                {
				                    if (!gb_VirtualTrade)
				                    {
				                        SetText (Time[0], High[0] - 0.3 * DotLoc * Point, ("CloseSell" + DoubleToStr (Time[0], 0)), CharToStr (251), Magenta);
				                        fPlay_Sound ("alert.wav");
                                    Alerts (0, 0, fl_CloseBuy, fl_CloseSell, Ask, 0, 0, OrderTicket());
                                }
					                 return (0);
					             }
		                  }
	                 }
	                 //---- Ïðîâîäèì òðåéëèíã
                    li_IND = fCheck_MyComment (OrderComment(), gsa_TradeComment);
                    if (li_IND < 0)
                    {continue;}
                    fTrailing (li_IND);
                    fTrailing2 (OrderComment(), gda_TS[li_IND]);
                }
            }
        }
    }
    //---- Should we open a position?
    else
    {
        if (gb_Pause)
        {return (0);}
        if (fl_AllowTrade == 1)
        {
            double MyStopLoss, MyTakeProfit;
            int ticket = 0;
	         if (fl_OpenSell == 1)
	         {
                //SetText (Time[0], High[0] + 1 * DotLoc * gd_Point, ("Sell" + DoubleToStr (Time[0], 0)), CharToStr (234), Red);
                fPlay_Sound ("alert.wav");
                //---- Ïîëó÷àåì îò èíäèêàòîðà ÑÒÎÏû
	             if (AutoSTOPs_ON)
	             {fGet_STOPs (1);}
	             //---- Ïîëó÷àåì ñóììàðíûé ëîò äëÿ âñåõ îðäåðîâ
	             LotsMM = fGet_SizeLot();
	             //---- Ïîëó÷àåì äèíàìè÷åñêèå ëîòû äëÿ êàæäîãî îðäåðà
                fGet_MULTILots (LotsMM, gia_Priority, gia_PartLots, gda_TradeLots, gba_OrderTrade);
                for (int li_ORD = 0; li_ORD < TradeOrders; li_ORD++)
                {
                    if (gba_OrderTrade[li_ORD])
                    {
	                     if (!AutoSTOPs_ON)
	                     {
	                         if (gda_TP[li_ORD] == 0) MyTakeProfit = 0; else MyTakeProfit = NDD (Bid - gda_TP[li_ORD]);
 			                   if (gda_SL[li_ORD] == 0) MyStopLoss = 0; else MyStopLoss = NDD (Bid + gda_SL[li_ORD]);
 			               }
 			               else
 			               {
 			                   MyTakeProfit = NDD (gda_TP[li_ORD]);
 			                   MyStopLoss = NDD (gda_SL[li_ORD]);
 			               }
      	               ticket = fOrderSend (Symbol(), OP_SELL, gda_TradeLots[li_ORD], NDD (Bid), Slippage, MyStopLoss, MyTakeProfit, gsa_TradeComment[li_ORD], MagicNumber, 0, Red);
      	               if (ticket > 0)
      	               {
	                         if (AutoSTOPs_ON)
	                         {
	                             OrderSelect (ticket, SELECT_BY_TICKET);
	                             gda_TS[li_ORD] = NDD ((OrderOpenPrice() - gda_TP[li_ORD]) / 2);
	                             gia_TP[li_ORD] = (OrderOpenPrice() - OrderTakeProfit()) / gd_Point;
	                             gia_SL[li_ORD] = (OrderStopLoss() - OrderOpenPrice()) / gd_Point;
	                         }
	                         gi_MyOrders++;
      	               }
			               Alerts (fl_OpenBuy, fl_OpenSell, 0, 0, Bid, MyStopLoss, MyTakeProfit, ticket);
		              }
                }
		          return (0);
	         }	
	         if (fl_OpenBuy == 1)
	         {
                //SetText (Time[0], Low[0] - 0.3 * DotLoc * gd_Point, ("Buy" + DoubleToStr (Time[0], 0)), CharToStr (233), Lime);
                fPlay_Sound ("alert.wav");
                //---- Ïîëó÷àåì îò èíäèêàòîðà ÑÒÎÏû
	             if (AutoSTOPs_ON)
	             {fGet_STOPs (0);}
	             //---- Ïîëó÷àåì ñóììàðíûé ëîò äëÿ âñåõ îðäåðîâ
	             LotsMM = fGet_SizeLot();
	             //---- Ïîëó÷àåì äèíàìè÷åñêèå ëîòû äëÿ êàæäîãî îðäåðà
                fGet_MULTILots (LotsMM, gia_Priority, gia_PartLots, gda_TradeLots, gba_OrderTrade);
                for (li_ORD = 0; li_ORD < TradeOrders; li_ORD++)
                {
                    if (gba_OrderTrade[li_ORD])
                    {
	                     if (!AutoSTOPs_ON)
	                     {
	                         if (gda_TP[li_ORD] == 0) MyTakeProfit = 0; else MyTakeProfit = NDD (Ask + gda_TP[li_ORD]);
 			                   if (gda_SL[li_ORD] == 0) MyStopLoss = 0; else MyStopLoss = NDD (Ask - gda_SL[li_ORD]);
 			               }	
 			               else
 			               {
 			                   MyTakeProfit = NDD (gda_TP[li_ORD]);
 			                   MyStopLoss = NDD (gda_SL[li_ORD]);
 			               }
      	               ticket = fOrderSend (Symbol(), OP_BUY, gda_TradeLots[li_ORD], NDD (Ask), Slippage, MyStopLoss, MyTakeProfit, gsa_TradeComment[li_ORD], MagicNumber, 0, Green);
      	               if (ticket > 0)
      	               {
	                         if (AutoSTOPs_ON)
	                         {
	                             OrderSelect (ticket, SELECT_BY_TICKET);
	                             gda_TS[li_ORD] = NDD ((gda_TP[li_ORD] - OrderOpenPrice()) / 2);
	                             gia_TP[li_ORD] = (OrderTakeProfit() - OrderOpenPrice()) / gd_Point;
	                             gia_SL[li_ORD] = (OrderOpenPrice() - OrderStopLoss()) / gd_Point;
	                         }
	                         gi_MyOrders++;
      	               }
			               Alerts (fl_OpenBuy, fl_OpenSell, 0, 0, Ask, MyStopLoss, MyTakeProfit, ticket);
		              }    
		          }
		          return (0);
		      }
	     }
    }
    //---- Ñ÷èòàåì "ñâîè" îðäåðà
    gi_MyOrders = fMyOrders (-1, MagicNumber);
//----
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ïîëó÷àåì îò èíäèêàòîðà ÑÒÎÏû èç ãëîáàëüíûõ ïåðåìåííûõ                        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGet_STOPs (int fi_Type)
{
    if (!AutoSTOPs_ON)
    {return;}
//----
    string ls_Name, ls_Line;
//----
    //---- Îáíóëÿåì ìàññèâû
    ArrayInitialize (gda_SL, 0.0);
    ArrayInitialize (gda_TP, 0.0);
    ArrayInitialize (gba_OrderTrade, false);
    if (!Use_TrailATR)
    {gd_ATR_Trailing = ATR_Trailing * iATR (Symbol(), ATR_TF, ATR_Period, 1);}
    switch (fi_Type)
    {
        case 0:
            for (int li_GV = 0; li_GV < TradeOrders; li_GV++)
            {
                //---- Ðåâåðñèðóåì ñòîïû
                if (!Reverse) {ls_Line = "HTL_";} else {ls_Line = "LTL_";}
                //---- TP äëÿ BUY
                ls_Name = StringConcatenate (gs_pref, ls_Line, li_GV);
                if (GlobalVariableCheck (ls_Name))
                {
                    gda_TP[li_GV] = GlobalVariableGet (ls_Name);
                    gda_TP[li_GV] = MathMax (gda_TP[li_GV], Ask + gd_ATR_Trailing);
                    //---- Ðåâåðñèðóåì ñòîïû
                    if (!Reverse) {ls_Line = "LTL_";} else {ls_Line = "HTL_";}
                    //---- SL äëÿ BUY
                    ls_Name = StringConcatenate (gs_pref, ls_Line, li_GV);
                    if (GlobalVariableCheck (ls_Name))
                    {
                        gda_SL[li_GV] = GlobalVariableGet (ls_Name);
                        if (Ask - gda_SL[li_GV] <= gd_MIN_Stop)
                        {
                            fWrite_Log (StringConcatenate ("BUY: SL íå êîððåêòåí (Ask[", DSD (Ask), "] - SL[", DSD (gda_SL[li_GV]), "])"));
                            gda_SL[li_GV] = Ask - gd_ATR_Trailing * (li_GV + 1);
                        }
                    }
                    else
                    {
                        fWrite_Log (StringConcatenate ("BUY: SL íå çàäàí (Ask[", DSD (Ask), "] - SL[", DSD (gda_SL[li_GV]), "])"));
                        gda_SL[li_GV] = Ask - gd_ATR_Trailing * (li_GV + 1);
                    }
                    //---- Åñëè ÑÒÎÏû åñòü, ðàçðåøàåì îòêðûòèå îðäåðà
                    gba_OrderTrade[li_GV] = true;
                }
            }
            break;
        case 1:
            for (li_GV = 0; li_GV < TradeOrders; li_GV++)
            {
                //---- Ðåâåðñèðóåì ñòîïû
                if (!Reverse) {ls_Line = "LTL_";} else {ls_Line = "HTL_";}
                //---- TP äëÿ SELL
                ls_Name = StringConcatenate (gs_pref, ls_Line, li_GV);
                if (GlobalVariableCheck (ls_Name))
                {
                    gda_TP[li_GV] = GlobalVariableGet (ls_Name);
                    gda_TP[li_GV] = MathMin (gda_TP[li_GV], Bid - gd_ATR_Trailing);
                    //---- Ðåâåðñèðóåì ñòîïû
                    if (!Reverse) {ls_Line = "HTL_";} else {ls_Line = "LTL_";}
                    //---- SL äëÿ SELL
                    ls_Name = StringConcatenate (gs_pref, ls_Line, li_GV);
                    if (GlobalVariableCheck (ls_Name))
                    {
                        gda_SL[li_GV] = GlobalVariableGet (ls_Name);
                        if (gda_SL[li_GV] - Bid <= gd_MIN_Stop)
                        {
                            fWrite_Log (StringConcatenate ("SELL: SL íå êîððåêòåí (Bid[", DSD (Bid), "] - SL[", DSD (gda_SL[li_GV]), "])"));
                            gda_SL[li_GV] = Bid + gd_ATR_Trailing * (li_GV + 1);
                        }
                    }
                    else
                    {
                        fWrite_Log (StringConcatenate ("SELL: SL íå çàäàí (Bid[", DSD (Bid), "] - SL[", DSD (gda_SL[li_GV]), "])"));
                        gda_SL[li_GV] = Bid + gd_ATR_Trailing * (li_GV + 1);
                    }
                    //---- Åñëè ÑÒÎÏû åñòü, ðàçðåøàåì îòêðûòèå îðäåðà
                    gba_OrderTrade[li_GV] = true;
                }
            }
            break;
    }
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Îáùèå ôóíêöèè                                                             |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Ïðîâåðÿåì êîììåíòàðèé                                                       |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fCheck_MyComment (string fs_Comment, string ar_Comment[])
{
//----
    for (int li_int = 0; li_int < ArraySize (ar_Comment); li_int++)
    {
        if (StringFind (fs_Comment, ar_Comment[li_int]) >= 0)
        {return (li_int);}
    }
//----
    return (-1);
}
//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_D Ôèêñèðóåò ôàêò èçìåíåíèÿ ïðîâåðÿåìîãî            |
//|  double ïàðàìåòðà ñ ïîãðåøíîñòüþ (deviation)                                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCCV_D (double param, int ix)
{
    static double cur_param[10];
    static bool   lb_first = true;
//---- 
    //---- Ïðè ïåðâîì çàïóñêå èíèöèàëèçèðóåì ìàññèâ
    if (lb_first)
    {
        for (int l_int = 0; l_int < ArraySize (cur_param); 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.02.2008                                                            |
//|  Îïèñàíèå : Âîçâðàùàåò îäíî èç äâóõ çíà÷åíèé âçàâèñèìîñòè îò óñëîâèÿ.             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string IIFs (bool condition, string ifTrue, string ifFalse)
{if (condition) {return (ifTrue);} else {return (ifFalse);}}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ, íîðìàëèçàöèè çíà÷åíèÿ double äî Digit                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double NDD (double v)
{return (NormalizeDouble (v, gi_Digits));}
//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+
//|        Ôóíêöèÿ, ïåðåâîäà çíà÷åíèÿ èç double â string c íîðìàëèçàöèåé ïî 0         |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string DS0 (double v) {return (DoubleToStr (v, 0));} 
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double LotDecimal()
{
    double steplot = MarketInfo (Symbol(), MODE_LOTSTEP);
//---- 
    return (MathCeil (MathAbs (MathLog (steplot) / MathLog (10))));
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ñîáèðàåì ñòàòèñòèêó                                                        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGet_Statistic()
{
    int err = GetLastError();
//----
    gd_Balance = AccountBalance();
    gd_Equity = AccountEquity();
    gd_FreeMargin = AccountFreeMargin();
    gd_Margin = AccountMargin();
    if (fCCV_D (OrdersHistoryTotal(), 0))
    {
        //---- Ñ÷èòàåì ñòàòèñòèêó ïî óäàë¸ííûì îðäåðàì
        gd_Pribul = fCalculate_Pribul (gi_HistoryOrders, MagicNumber);
        //---- Ïî ðåçóëüòàòàì ðàáîòû êàæäîãî ñåòà, óñòàíàâëèâàåì ïðèîðèòåò èñïîëíåíèÿ
        if (Use_Prioritity)
        {fRun_Sort (gia_Priority, gda_Pribul);}
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    //fGetLastError (gsa_Comment, "fGet_Statistic()", 4);
//----
    return;
}
//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+
//|                                                                                   |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string On (bool On)
//{if (On) return ("on"); else return ("off");}
{if (On) return ("Âêë."); else return ("Âûêë.");}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ñåðâèñíûõ ôóíêöèé                                                         |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      PRINT COMMENT FUNCTION                                                       |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fCommentInChart()
{
    if (gb_VirtualTrade)
    {return;}
    string ls_Comment = "", ls_Stops,
           sp         = "—————————————————————————————————\n",
           NL         = "\n";
	 int    li_IND;
//----
    ls_Comment = StringConcatenate (gs_NameGV, NL, gs_Conditions);
    ls_Comment = StringConcatenate (ls_Comment, sp);
    for (int li_ORD = 0; li_ORD < TradeOrders; li_ORD++)
    {
        li_IND = gia_Priority[li_ORD];
        if (AutoSTOPs_ON)
        {ls_Stops = StringConcatenate ("SL = ", gia_SL[li_IND], " | ", "TP = ", gia_TP[li_IND]);}
        else
        {ls_Stops = StringConcatenate ("SL = ", DS0 (gda_SL[li_IND] / gd_Point), " | ", "TP = ", DS0 (gda_TP[li_IND] / gd_Point));}
        ls_Comment = StringConcatenate (ls_Comment, li_IND + 1, ":  Lots = ", DSDig (gda_TradeLots[li_IND]), " | ", ls_Stops, " | TS = ", DS0 (gda_TS[li_IND] / gd_Point), " | Profit = ", gs_sign, " ", DS0 (gda_Pribul[li_IND]), " [", gia_HistoryOrders[li_IND], "]\n");
    }
    sp = "————————————• PSI©TarasBY •————————————\n";
    ls_Comment = StringConcatenate (ls_Comment, sp);
    ls_Comment = StringConcatenate (ls_Comment, "PROFIT = ", gs_sign, " ", DS0 (gd_Pribul), " [", gi_HistoryOrders, "]\n");   
    if (TrailingStop > 0)
    {ls_Comment = StringConcatenate (ls_Comment, "TrailingStop = ", DS0 (TrailingStop), NL);}
    Comment (ls_Comment);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                                                   |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fPlay_Sound (string fs_Name)
{if (SoundPlay) PlaySound (fs_Name);}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                                                   |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void SetText (int X1, double Y1, string TEXT_NAME, string TEXT_VALUE, int TEXT_COLOR)
{
    if (gb_VirtualTrade)
    {return;}
//----
    if (ObjectFind (TEXT_NAME) != 0)
    {
        ObjectCreate (TEXT_NAME, OBJ_TEXT, 0, X1, Y1);
        ObjectSet (TEXT_NAME, OBJPROP_COLOR, TEXT_COLOR);
        ObjectSetText (TEXT_NAME, TEXT_VALUE, 10, "Wingdings", EMPTY);         
    }
    else
    {ObjectMove (TEXT_NAME, 0, X1, Y1);}                  
//----
    return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                                                   |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void Alerts (int _buy, int _sell, int _exitbuy, int _exitsell, double _op, double _sl, double _tp, int _ticket)
{
    if (gb_VirtualTrade)
    {return;}
//----
    string AlertStr = "", 
           CurDate = TimeToStr (TimeCurrent(), TIME_DATE|TIME_MINUTES);
//----
    //----Alert system
    if (UseAlert)
    {
        if (_buy == 1) 
        { 
            if (Crepeat == Repeat)
            {AlertTime = 0;}
            if (Crepeat > 0 && (TimeCurrent() - AlertTime) > Periods)
            {
                if (_buy == 1)
                {
                    AlertStr = StringConcatenate (AlertStr, "Buy @ ", DSD (_op), "; SL: ", DSD (_sl), "; TP: ", DSD (_tp), " at ", CurDate, " Order: ", _ticket, "."); 
                    Alert (Symbol(), " ", Period(), ": ", AlertStr); 
                    if (SendEmail) 
                    {SendMail (StringConcatenate (Symbol(), " ", Period(), ": "), StringConcatenate (Symbol(), " ", Period(), ": ", AlertStr));}
                    Crepeat = Crepeat - 1;
                    AlertTime = TimeCurrent();
                }
            } 
        }
        if (_sell == 1) 
        { 
            if (Crepeat == Repeat)
            {AlertTime = 0;}
            if (Crepeat > 0 && (TimeCurrent() - AlertTime) > Periods)
            {
                if (_sell == 1)
                {
                    AlertStr = StringConcatenate (AlertStr, "Sell @ ", DSD (_op), "; SL: ", DSD (_sl), "; TP: ", DSD (_tp), " at ", CurDate, " Order: ", _ticket, "."); 
                    Alert (Symbol(), " ", Period(), ": ", AlertStr); 
                    if (SendEmail) 
                    {SendMail (StringConcatenate (Symbol(), " ", Period(), ": "), StringConcatenate (Symbol(), " ", Period(), ": ", AlertStr));}
                    Crepeat = Crepeat - 1;
                    AlertTime = TimeCurrent();
                }
            } 
        }
        if (_exitsell == 1) 
        { 
            if (Crepeat == Repeat)
            {AlertTime = 0;}
            if (Crepeat > 0 && (TimeCurrent() - AlertTime) > Periods)
            {
                if (_exitsell == 1)
                {
                    AlertStr = StringConcatenate (AlertStr, " Close Sell @ ", DSD (_op), " at ", CurDate, " Order:", _ticket, "."); 
                    Alert (Symbol(), " ", Period(), ": ", AlertStr); 
                    if (SendEmail) 
                    {SendMail (StringConcatenate (Symbol(), " ", Period(), ": "), StringConcatenate (Symbol(), " ", Period(), ": ", AlertStr));}
                    Crepeat = Crepeat - 1;
                    AlertTime = TimeCurrent();
                }
            }
        } 
        if (_exitbuy == 1) 
        { 
            if (Crepeat == Repeat)
            {AlertTime = 0;}
            if (Crepeat > 0 && (TimeCurrent() - AlertTime) > Periods)
            {
                if (_exitbuy == 1)
                {
                    AlertStr = StringConcatenate (AlertStr, " Close Buy @ ", DSD (_op), " at ", CurDate, " Order:", _ticket, "."); 
                    Alert (Symbol(), " ", Period(), ": ", AlertStr); 
                    if (SendEmail) 
                    {SendMail (StringConcatenate (Symbol(), " ", Period(), ": "), StringConcatenate (Symbol(), " ", Period(), ": ", AlertStr));}
                    Crepeat = Crepeat - 1;
                    AlertTime = TimeCurrent();
                }
            } 
        }
        if (_exitbuy == 0 && _exitsell == 0 && _buy == 0 && _sell == 0)  
        {
            Crepeat = Repeat;
            AlertTime = 0;
        }
    }
//----
    return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|     Ïèøåì Log-ôàéë                                                                |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fWrite_Log (string fs_Txt)
{
    if (gb_VirtualTrade)
    {return;}
    static datetime ldt_NewDay = 0;
    //---- Èìÿ ëîã ôàéëà îïðåäåëÿåì îäèí ðàç â ñóòêè
    if (ldt_NewDay != iTime (Symbol(), NULL, PERIOD_D1))
    {
        filename = StringConcatenate (Symbol(), TradeLog, "-", Month(), "-", Day(), ".log");
        ldt_NewDay = iTime (Symbol(), NULL, PERIOD_D1);
    }
    int handle = FileOpen (filename, FILE_READ|FILE_WRITE|FILE_CSV, "/t");
//----
    FileSeek (handle, 0, SEEK_END);      
    FileWrite (handle, StringConcatenate (" Time ", TimeToStr (TimeCurrent(), TIME_DATE|TIME_SECONDS), ": ", fs_Txt));
    FileClose (handle);
	 Print (fs_Txt);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòà ñ îðäåðàìè                                                         |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|     Return number of orders with specific parameters                              |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fMyOrders (int Type, int Magic)
{
    int _CntOrd = 0;
//----
    ArrayInitialize (gia_MyOrders, 0);
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        OrderSelect (i, SELECT_BY_POS, MODE_TRADES);
        if (OrderSymbol() == Symbol())
        {
            if (OrderType() == Type || Type == -1)
            {
                if (OrderMagicNumber() == Magic || Magic < 0)
                {
                    _CntOrd++;
                    gia_MyOrders[OrderType()]++;
                }
            }
        }
    }
//----
    return (_CntOrd);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ çàêðûòèÿ îðäåðîâ ïî òèïó (OP) è Magic (iMG)                        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int CloseOrderAll (int iMG = -1, int OP = -1)
{
    color  lc_close;
    int    li_Type, li_orders = 0, err = GetLastError();
    double ld_ClosePrice;
    bool   lb_Close = false;
//----
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if (!OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
        {continue;}
        if (OrderMagicNumber() != iMG && iMG >= 0)
        {continue;}
        //if (OrderSymbol() != Symbol())
        //{continue;}
        li_Type = OrderType();
        if (OP == li_Type || OP == -1)
        {
            if (li_Type == OP_BUY) {ld_ClosePrice = Bid;} else {ld_ClosePrice = Ask;}
            if (li_Type == OP_BUY) {lc_close = Blue;} else {lc_close = Red;}
            lb_Close = fOrderClose (OrderTicket(), OrderLots(), ld_ClosePrice, Slippage, lc_close);
            if (lb_Close)
            {li_orders++;}
        }
    }
    //fGetLastError (gsa_Comment, "CloseOrderAll()", 4);
//----
    return (li_orders);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|         Send order with retry capabilities and log                                |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fOrderSend (string _symbol, int _cmd, double _volume, double _price, int _slippage, double _stoploss, double _takeprofit,
             string _comment = "", int _magic = 0, datetime _expiration = 0, color _arrow_color = CLR_NONE)
{
    int _stoplevel = MarketInfo (_symbol, MODE_STOPLEVEL);
    double _priceop = 0;
    int ticket, err, tries = 0;
//----
    switch (_cmd)
    {
	     case OP_BUY:
		      if (!IsTradeContextBusy() && IsTradeAllowed())
		      {
		          while (tries < NumberOfTries)
		          {
			           RefreshRates();
			           ticket = OrderSend (_symbol, OP_BUY, _volume, NDD (Ask), _slippage, NDD (_stoploss), NDD (_takeprofit), _comment, _magic, _expiration, _arrow_color);
			           if (ticket <= 0)
			           {
				            fWrite_Log (StringConcatenate ("Error Occured : ", ErrorDescription (GetLastError())));
				            fWrite_Log (StringConcatenate (Symbol(), " Buy @ ", DSD (Ask), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
				            tries++;
			           }
			           else
			           {
				            tries = NumberOfTries;
				            OrderSelect (ticket, SELECT_BY_TICKET);
				            fWrite_Log (StringConcatenate ("Order opened : ", Symbol(), " Buy @ ", DSD (Ask), " SL[", (OrderOpenPrice() - _stoploss) / gd_Point, "]: ", DSD (_stoploss), " TP[", (_takeprofit - OrderOpenPrice()) / gd_Point, "]: ", DSD (_takeprofit), " ticket = ", ticket));
			           }
			           Sleep (RetryTime * 1000);
		          }
	         }
		      err = ticket;
		      break;
	     case OP_SELL:
		      if (!IsTradeContextBusy() && IsTradeAllowed())
		      {
		          while (tries < NumberOfTries)
		          {
			           RefreshRates();
			           ticket = OrderSend (_symbol, OP_SELL, _volume, NDD (Bid), _slippage, NDD (_stoploss), NDD (_takeprofit), _comment, _magic, _expiration, _arrow_color);
			           if (ticket <= 0)
			           {
				            fWrite_Log (StringConcatenate ("Error Occured : ", ErrorDescription (GetLastError())));
				            fWrite_Log (StringConcatenate (Symbol(), " Sell @ ", DSD (Bid), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
				            tries++;
			           }
			           else
			           {
				            tries = NumberOfTries;
				            OrderSelect (ticket, SELECT_BY_TICKET);
				            fWrite_Log (StringConcatenate ("Order opened : ", Symbol(), " Sell @ ", DSD (Bid), " SL[", (_stoploss - OrderOpenPrice()) / gd_Point, "]: ", DSD (_stoploss), " TP[", (OrderOpenPrice() - _takeprofit) / gd_Point, "]: ", DSD (_takeprofit), " ticket = ", ticket));
			           }
			           Sleep (RetryTime * 1000);	
		          }
		      }
		      err = ticket;
		      break;
	     case OP_BUYSTOP:
		      if (!IsTradeContextBusy() && IsTradeAllowed())
		      {
		          while (tries < NumberOfTries)
		          {
			           RefreshRates();
			           if ((_price - Ask) < _stoplevel * Point) _priceop = Ask + _stoplevel * Point; else _priceop = _price;			
			           ticket = OrderSend (_symbol, OP_BUYSTOP, _volume, NDD (_priceop), _slippage, NDD (_stoploss), NDD (_takeprofit), _comment, _magic, _expiration, _arrow_color);
			           if (ticket <= 0)
			           {
				            fWrite_Log (StringConcatenate ("Error Occured : ", ErrorDescription (GetLastError())));
				            fWrite_Log (StringConcatenate (Symbol(), " Buy Stop @ ", DSD (_priceop), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
				            tries++;
			           }
			           else
			           {
				            tries = NumberOfTries;
				            fWrite_Log (StringConcatenate ("Order opened : ", Symbol(), " Buy Stop@ ", DSD (_priceop), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
			           }
			           Sleep (RetryTime * 1000);
			       }
		      }
		      err = ticket;
		      break;
        case OP_SELLSTOP:
		      if (!IsTradeContextBusy() && IsTradeAllowed())
		      {
		          while (tries < NumberOfTries)
		          {
			           RefreshRates();
			           if ((Bid - _price) < _stoplevel * Point) _priceop = Bid - _stoplevel * Point; else _priceop = _price;			
			           ticket = OrderSend (_symbol, OP_SELLSTOP, _volume, NDD (_priceop), _slippage, NDD (_stoploss), NDD (_takeprofit), _comment, _magic, _expiration, _arrow_color);
			           if (ticket <= 0)
			           {
				            fWrite_Log (StringConcatenate ("Error Occured : ", ErrorDescription (GetLastError())));
				            fWrite_Log (StringConcatenate (Symbol(), " Sell Stop @ ", DSD (_priceop), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
				            tries++;
			           }
			           else
			           {
				            tries = NumberOfTries;
				            fWrite_Log (StringConcatenate ("Order opened : ", Symbol(), " Sell Stop @ ", DSD (_priceop), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
			           }
			           Sleep (RetryTime * 1000);
		          }
		      }
		      err = ticket;
		      break;
	     case OP_BUYLIMIT:
		      if (!IsTradeContextBusy() && IsTradeAllowed())
		      {
		          while (tries < NumberOfTries)
		          {
			           RefreshRates();
			           if ((Ask - _price) < _stoplevel * Point) _priceop = Ask - _stoplevel * Point; else _priceop = _price;			
			           ticket = OrderSend (_symbol, OP_BUYLIMIT, _volume, NDD (_priceop), _slippage, NDD (_stoploss), NDD (_takeprofit), _comment, _magic, _expiration, _arrow_color);
			           if (ticket <= 0)
			           {
				            fWrite_Log (StringConcatenate ("Error Occured : ", ErrorDescription (GetLastError())));
				            fWrite_Log (StringConcatenate (Symbol(), " Buy Limit @ ", DSD (_priceop), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
				            tries++;
			           }
			           else
			           {
				            tries = NumberOfTries;
				            fWrite_Log (StringConcatenate ("Order opened : ", Symbol(), " Buy Limit @ ", DSD (_priceop), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
			           }
			           Sleep (RetryTime * 1000);
		          }
		      }
		      err = ticket;
		      break;
	     case OP_SELLLIMIT:
		      if (!IsTradeContextBusy() && IsTradeAllowed())
		      {
		          while (tries < NumberOfTries)
		          {
			           RefreshRates();
			           if ((_price - Bid) < _stoplevel * Point) _priceop = Bid + _stoplevel * Point; else _priceop = _price;			
			           ticket = OrderSend (_symbol, OP_BUYLIMIT, _volume, NDD (_priceop), _slippage, NDD (_stoploss), NDD (_takeprofit), _comment, _magic, _expiration, _arrow_color);
			           if (ticket <= 0)
			           {
				            fWrite_Log (StringConcatenate ("Error Occured : ", ErrorDescription (GetLastError())));
				            fWrite_Log (StringConcatenate (Symbol(), " Sell Limit @ ", DSD (_priceop), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
				            tries++;
			           }
			           else
			           {
				            tries = NumberOfTries;
				            fWrite_Log (StringConcatenate ("Order opened : ", Symbol(), " Sell Limit @ ", DSD (_priceop), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
			           }
			           Sleep (RetryTime * 1000);
		          }
		      }
		      err = ticket;
		      break;
	     default:
		      fWrite_Log ("No valid type of order found");
		      err = -1;
		      break;
    }
//----
    return (err);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|          The function close order with log                                        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fOrderClose (int _ticket, double _lots, double _price, int _slippage, color _color = CLR_NONE)
{
    int    tries = 0;
    bool   lb_result = false;				
//----
    if (!IsTradeContextBusy() && IsTradeAllowed())
    {
		  while (tries < NumberOfTries)
		  {
			   RefreshRates();
			   lb_result = OrderClose (_ticket,_lots, NDD (_price), _slippage, _color);
			   if (!lb_result)
			   {
				    fWrite_Log (StringConcatenate ("Error Occured : ", ErrorDescription (GetLastError())));
				    fWrite_Log (StringConcatenate (Symbol(), " Close @ ", DSD (_price), " ticket = ", _ticket));
                tries++;
			   }
			   else
			   {
				    OrderSelect (_ticket, SELECT_BY_TICKET, MODE_HISTORY);
				    tries = NumberOfTries;
				    fWrite_Log (StringConcatenate ("Order closed : ", OrderSymbol(), " Close @ ", DSD (_price), " Profit = ", DoubleToStr (OrderProfit() + OrderCommission() + OrderSwap(), 1), " ticket = ", _ticket));
		      }
			   Sleep (RetryTime * 1000);
		  }
    }
//----
    return (lb_result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|          The function modify order with log                                       |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fOrderModify (int _ticket, double _price, double _stoploss, double _takeprofit, datetime _expiration, color _color = CLR_NONE)
{
    int    tries = 0;
    bool   lb_result = false;				
//----
    if (!IsTradeContextBusy() && IsTradeAllowed())
    {
		  while (tries < NumberOfTries)
		  {
			   RefreshRates();
			   lb_result = OrderModify (_ticket, NDD (_price), NDD (_stoploss), NDD (_takeprofit), _expiration, _color);
			   if (!lb_result)
			   {
				    fWrite_Log (StringConcatenate ("Error Occured : ", ErrorDescription (GetLastError())));
				    fWrite_Log (StringConcatenate (Symbol(), " Modify @ ", DSD (_price), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", _ticket));
				    tries++;
			   }
			   else
			   {
				    tries = NumberOfTries;
				    fWrite_Log (StringConcatenate ("Order modified : ", Symbol(), " Modify @ ", DSD (_price), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", _ticket));
			   }
			   Sleep (RetryTime * 1000);
		  }
    }
//----
    return (lb_result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                                                   |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fTrailing (int fi_IND)
{
    double pBid, pAsk, ld_TrailFast, ld_Trail;
    bool   lb_BU = false;
//----
    if (Use_TrailATR)
    {gd_TrailingStop = gd_ATR_Trailing;}
    if (OrderType() == OP_BUY)
    {
        pBid = Bid;
        //---- BreakEven routine
        if (BreakEven > 0)
        {
	         if (AutoSTOPs_ON)
	         {
	             gd_BreakEven = MathMax (BreakEven * gd_Point, (gda_TP[fi_IND] - OrderOpenPrice()) / 3);
	             //---- Ïðè äîñòèæåíèè ïåðâîé öåëè, îñòàâøèåñÿ îðäåðà ïîäòÿãèâàåì â ÁÓ
	             if (pBid > gda_TP[0] && gda_TP[0] > 0)
	             {
	                 lb_BU = true;
                    fWrite_Log (StringConcatenate ("BUY[", OrderTicket(), "]: 1-ÿ öåëü äîñòèãíóòà - SL â ÁÓ"));
	             }
	         }
            if ((pBid - OrderOpenPrice()) > gd_BreakEven || lb_BU)
            {
                if ((OrderStopLoss() - OrderOpenPrice()) < 0)
                {fModifyStopLoss ("fTrailing", NDD (OrderOpenPrice() + gd_TrailingStep));}   
            }    
        }
        if (TrailingStop > 0 || Use_TrailATR)
        {
            if ((pBid - OrderOpenPrice()) > gd_TrailingStop)
            {
                if (OrderStopLoss() < pBid - (gd_TrailingStop + gd_TrailingStep) || OrderStopLoss() == 0)
                {
                    fModifyStopLoss ("fTrailing", NDD (pBid - gd_TrailingStop));
                    return;
                }
            }
        }
    }
    if (OrderType() == OP_SELL)
    {
        pAsk = Ask;
        if (BreakEven > 0)
        {
	         if (AutoSTOPs_ON)
	         {
	             gd_BreakEven = MathMax (BreakEven * gd_Point, (OrderOpenPrice() - gda_TP[fi_IND]) / 3);
	             //---- Ïðè äîñòèæåíèè ïåðâîé öåëè, îñòàâøèåñÿ îðäåðà ïîäòÿãèâàåì â ÁÓ
	             if (pAsk < gda_TP[0])
	             {
	                 lb_BU = true;
                    fWrite_Log (StringConcatenate ("SELL[", OrderTicket(), "]: 1-ÿ öåëü äîñòèãíóòà - SL â ÁÓ"));
	             }
	         }
            if ((OrderOpenPrice() - pAsk) > gd_BreakEven || lb_BU)
            {
                if ((OrderOpenPrice() - OrderStopLoss()) < 0)
                {fModifyStopLoss ("fTrailing", NDD (OrderOpenPrice() - gd_TrailingStep));}
            }
        }
        if (gd_TrailingStop > 0 || Use_TrailATR)
        {
            if (OrderOpenPrice() - pAsk > gd_TrailingStop)
            {
                if (OrderStopLoss() > pAsk + (gd_TrailingStop + gd_TrailingStep) || OrderStopLoss() == 0)
                {
                    fModifyStopLoss ("fTrailing", NDD (pAsk + gd_TrailingStop));
                    return;
                }
            }
        }
    }
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|   Modify StopLoss                                                                 |
//|   Parameters:                                                                     |
//|     ldStopLoss - StopLoss Leve                                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fModifyStopLoss (string fs_Func, double ldStopLoss)
{
//----
    fPlay_Sound ("alert.wav");
    if (fOrderModify (OrderTicket(), OrderOpenPrice(), ldStopLoss, OrderTakeProfit(), 0, CLR_NONE))
    {
        if (AutoSTOPs_ON || Use_TrailATR)
        {fWrite_Log (StringConcatenate (fs_Func, " - ", GetNameOP (OrderType()), "[", OrderTicket(), "]: äî öåëè ", DS0 (MathAbs (OrderTakeProfit() - OrderStopLoss()) / gd_Point), " ïï. TrailingStop = ", DS0 (gd_TrailingStop / gd_Point), " ïï."));}
    }
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                                                   |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fTrailing2 (string com, double fd_Trailing)
{
    double pBid, pAsk;
//----
    if (OrderType() == OP_BUY)
    {
        pBid = MarketInfo (OrderSymbol(), MODE_BID);
        if (fd_Trailing > 0 && OrderComment() == com)
        {
            if ((pBid - OrderOpenPrice()) > fd_Trailing)
            {
                if (OrderStopLoss() < pBid - (fd_Trailing + gd_TrailingStep) || OrderStopLoss() == 0)
                {
                    fModifyStopLoss ("fTrailing2", NormalizeDouble (pBid - fd_Trailing, gi_Digits));
                    return;
                }
            }
        }
    }
    if (OrderType() == OP_SELL)
    {
        pAsk = MarketInfo (OrderSymbol(), MODE_ASK);
        if (fd_Trailing > 0 && OrderComment() == com)
        {
            if (OrderOpenPrice() - pAsk > fd_Trailing)
            {
                if (OrderStopLoss() > pAsk + (fd_Trailing + gd_TrailingStep) || OrderStopLoss() == 0)
                {
                    fModifyStopLoss ("fTrailing2", NormalizeDouble (pAsk + fd_Trailing, gi_Digits));
                    return;
                }
            }
        }
    }
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Money Management                                                          |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|           Ãëàâíàÿ ôóíêöèÿ ïîëó÷åíèÿ ðàçìåðà ëîòà (âûçûâàåòñÿ èç ñîâåòíèêà)        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fGet_SizeLot()
{
    //---- Åñëè MM íå èñïîëüçóåòñÿ - âûõîäèì
    if (!UseMM)
    {return (0);}
    double ld_Lots, Money = 0, ld_LastLot;
    int    err = GetLastError();
//----
    switch (MeansType)
    {
        case 1: Money = gd_Balance; break;
        case 2: Money = gd_Equity; break;
        case 3: Money = gd_FreeMargin; break;
        case 4: Money = RiskDepo; break; 
    }                
    if (MeansType == 3)
    {ld_Lots = (gd_FreeMargin * LotsPercent) / (MarketInfo (gs_Symbol, MODE_MARGINREQUIRED) * 100.0);}
    else
    {ld_Lots = Money * MathMin (AccountLeverage(), 100) * LotsPercent / (100000 * 100);}
    //---- Íîðìàëèçóåì ëîò
    ld_Lots = fLotsNormalize (ld_Lots);
    ld_Lots = MathMax (ld_Lots, MinLot);
    ld_Lots = MathMin (ld_Lots, MaxLot);
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    //fGetLastError (gsa_Comment, "fGet_SizeLot()", 4);
//----
    return (ld_Lots);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Ïðîèçâîäèì íîðìàëèçàöèþ ëîòà                                                |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fLotsNormalize (double fd_Lots)
{
    fd_Lots -= gd_MINLOT;
    fd_Lots /= gd_LOTSTEP;
    fd_Lots = MathRound (fd_Lots);
    fd_Lots *= gd_LOTSTEP;
    fd_Lots += gd_MINLOT;
    fd_Lots = NormalizeDouble (fd_Lots, gi_dig);
    fd_Lots = MathMax (fd_Lots, gd_MINLOT);
    fd_Lots = MathMin (fd_Lots, gd_MAXLOT);
//----
    return (fd_Lots);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|      Ïîëó÷àåì ìóëüòè-ëîò                                                          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGet_MULTILots (double fd_SUMLots,           // Ñóììàðíûé ëîò
                     int ar_INDPrioritet[],       // ìàññèâ èíäåêñîâ ïðèîðèòåòà
                     int ar_PartLots[],           // ìàññèâ ñ ïðîöåíòàìè ëîòîâ
                     double& ar_TradeLots[],      // âîçâðàùàåìûé ìàññèâ ëîòîâ
                     bool& ar_OrderTrade[])       // ðàçðåøåíèÿ íà òîðãîâëþ
{
    //---- Åñëè MM íå èñïîëüçóåòñÿ - âûõîäèì
    if (!UseMM)
    {return;}
    int li_IND, li_TradeOrders = 0, li_cnt = 0;
    double ld_SUM = 0.0, ld_plus;
//----
    // fGet_MULTILots (LotsMM, gia_Priority, gia_PartLots, gda_TradeLots, gba_OrderTrade);
    //---- Ïîäñ÷èòûâàåì êîëè÷åñòâî îðäåðîâ íà ïðåäñòîÿùóþ "ñåññèþ"
    for (int li_int = 0; li_int < TradeOrders; li_int++)
    {
        if (ar_OrderTrade[li_int])
        {li_TradeOrders++;}
    }
    for (li_int = 0; li_int < TradeOrders; li_int++)
    {
        //---- Èçâëåêàåì èíäåêñ ïðèîðèòåòà
        if (Use_Prioritity)
        {li_IND = ar_INDPrioritet[li_int];}
        else {li_IND = li_int;}
        if (ar_OrderTrade[li_IND])
        {
            //---- Âíîñèì ðàñ÷¸òíûå çíà÷åíèÿ â ñîîòâåòñòâèè ñ ïðèîðèòåòîì
            ar_TradeLots[li_IND] = fLotsNormalize (fd_SUMLots / 100 * ar_PartLots[li_int]);
            ld_SUM += ar_TradeLots[li_IND];
            if (fd_SUMLots >= ld_SUM)
            {
                li_cnt++;
                if (li_cnt == li_TradeOrders)
                {
                    while (fd_SUMLots < ld_SUM)
                    {
                        ld_plus = fLotsNormalize ((fd_SUMLots - ld_SUM) / li_TradeOrders);
                        for (int li_int1 = 0; li_int1 < li_TradeOrders; li_int1++)
                        {
                            //---- Èçâëåêàåì èíäåêñ ïðèîðèòåòà
                            li_IND = ar_INDPrioritet[li_int1];
                            //---- Äîáàâëÿåì îñòàòîê â ñîîòâåòñòâèè ñ ïðèîðèòåòîì
                            ar_TradeLots[li_IND] += fLotsNormalize (ld_plus);
                            ld_SUM += ar_TradeLots[li_IND];
                        }
                    }
                }
            }
            else
            {
                if (li_cnt < TradeOrders)
                {
                    //---- Çàïðåùàåì ýòîò îðäåð â ýòîé "ñåññèè"
                    ar_OrderTrade[li_IND] = false;
                    continue;
                }
                break;
            }
        }
    }
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|           Ñëåäèì çà êðèòè÷åñêèì óìåíüøåíèåì ðàçìåðà äåïî                          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fControl_RiskDEPO (string& fs_Info,               // âîçâðàùàåìûé êîììåíòàðèé
                        double fd_RiskDepo,            // Ðèñêîâûé êàïèòàë îò ïåðâîíà÷àëüíîãî Äåïî
                        double fd_MAXLossDepoPercent,  // ìàêñèìàëüíûé LOSS Äåïî
                        double fd_BeginBalance,        // íà÷àëüíûé ðàçìåð Äåïî
                        double fd_Balance,             // îò êàêîé âåëè÷èíû âåä¸ì ðàñ÷¸ò
                        double fd_Profit)              // òåêóùèé ðåçóëüòàò ðàáîòû
{
    bool lb_STOPRiskBeginDepo, lb_STOPMAXLossDepoPercent, lb_CLOSE = false;
    string ls_prichina, ls_fName = "fControl_RiskDEPO()";
    double ld_ChangeBalance;
//----
    //fRiskDEPOControl (ls_txt, RiskDepo, MAXLossDepoPercent, gd_BeginBalance, AccountBalance(), AccountProfit());
    lb_STOPRiskBeginDepo = (fd_BeginBalance - fd_RiskDepo > fd_Balance + fd_Profit);
    ld_ChangeBalance = fd_Balance * fd_MAXLossDepoPercent / 100;
    lb_STOPMAXLossDepoPercent = (-ld_ChangeBalance > fd_Profit);
    lb_CLOSE = (lb_STOPMAXLossDepoPercent || lb_STOPRiskBeginDepo);
    if (lb_CLOSE)
    {
        if (lb_STOPMAXLossDepoPercent) {ls_prichina = StringConcatenate ("MAX Loss[", DS0 (ld_ChangeBalance), "] < cur[|", DS0 (MathAbs (fd_Profit)), "|].");}
        else if (lb_STOPRiskBeginDepo) {ls_prichina = StringConcatenate ("RiskDepo[", DS0 (fd_BeginBalance - fd_RiskDepo), "] > cur[", DS0 (fd_Balance + fd_Profit), "].");} 
        fs_Info = StringConcatenate (ls_fName, ": STOP TRADE - ", ls_prichina);
        return (true);
    }
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|       Ñ÷èòàåì çàðàáîòàííóþ ïðèáûëü (åñëè âîîáùå çàðàáîòàëè)                       |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fCalculate_Pribul (int& fi_HistoryOrders,       // âîçâàðùàåìûé ìàññèâ çàêðûòûõ îðäåðîâ ïî òð¸ì òèïàì îðäåðîâ
                          int fi_Magic = -1,           // ìàññèâ Magic
                          int fi_OP = -1,              // òèï (BUY\SELL) ó÷èòûâàåìûõ îðäåðîâ
                          datetime fdt_TimeBegin = 0)  // ìîìåíò âðåìåíè, ñ êîòîðîãî ïðîèçâîäèì ðàñ÷¸ò
{
    int    li_IND, err = GetLastError(), history_total = OrdersHistoryTotal();
    double ld_Pribul = 0.0, ld_ALLPribul = 0.0;
    string ls_Name;
    static bool lb_first = true;
//----
    //fCalculate_Pribul (gi_HistoryOrders, MG);
    ArrayInitialize (gda_Pribul, 0.0);
    ArrayInitialize (gia_HistoryOrders, 0);
    fi_HistoryOrders = 0;
    for (int li_int = history_total - 1; li_int >= 0; li_int--)
    {
        if (OrderSelect (li_int, SELECT_BY_POS, MODE_HISTORY))
        {
            if (Symbol() == OrderSymbol())
            {
                if (OrderType() < 2 && (fi_OP < 0 || OrderType() == fi_OP))
                {
                    if (OrderMagicNumber() == fi_Magic || fi_Magic < 0)
                    {
                        li_IND = fCheck_MyComment (OrderComment(), gsa_TradeComment);
                        if (li_IND < 0)
                        {continue;}
                        if (fdt_TimeBegin < OrderCloseTime())
                        {
                            //---- Ñ÷èòàåì èòîãè ðàáîòû
                            ld_Pribul = OrderProfit() + OrderSwap() + OrderCommission();
                            ld_ALLPribul += ld_Pribul;
                            gda_Pribul[li_IND] += ld_Pribul;
                            gia_HistoryOrders[li_IND]++;
                            fi_HistoryOrders++;
                        }
                    }
                }
            }
        }
    }
//----
    return (ld_ALLPribul);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòà ñ ìàññèâàìè                                                        |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  UNI:               Ñîðòèðóåì èíäåêñû ìàññèâà ïî âîçðàñòàíèþ                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fRun_Sort (int& ar_INDEX[], double fda_Value[])
{
    int li_IND, li_int, li_tmp, li_size = ArraySize (fda_Value);
//----
    for (li_IND = 0; li_IND < li_size; li_IND++)
    {ar_INDEX[li_IND] = li_IND;}
   
    for (li_IND = 0; li_IND < li_size; li_IND++)
    {
		for (li_int = li_IND + 1; li_int < li_size; li_int++)
		{
			if (fda_Value[ar_INDEX[li_IND]] < fda_Value[ar_INDEX[li_int]])
			{
				li_tmp = ar_INDEX[li_int]; 
				ar_INDEX[li_int] = ar_INDEX[li_IND]; 
				ar_INDEX[li_IND] = li_tmp;
			}
		}
	}
//----
    return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

Comments