e-PSI7MAStoch

Author: Copyright � 2008-12, TarasBY WM R418875277808
Orders Execution
Checks for the total of open ordersChecks for the total of closed orders
0 Views
0 Downloads
0 Favorites
e-PSI7MAStoch
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                                 e-PSI@MAStoch.mq4 |
//|                           Copyright © 2012, ProIgorok & Igor Stepovoi aka TarasBY |
//|                                                                taras_bulba@tut.by |
//|   Îðèãèíàëüíûé ñîâåòíèê: http://codebase.mql4.com/ru/8034                         |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|   Äàííûé ïðîäóêò ïðåäíàçíà÷åí äëÿ íåêîìåð÷åñêîãî èñïîëüçîâàíèÿ. Ïóáëèêàöèÿ ðàçðå- |
//|øåíà òîëüêî ïðè óêàçàíèè èìåíè àâòîðà (TarasBY). Ðåäàêòèðîâàíèå èñõîäíîãî êîäà äî- |
//|ïóñòèìà òîëüêî ïðè óñëîâèè ñîõðàíåíèÿ äàííîãî òåêñòà, ññûëîê è èìåíè àâòîðà.  Ïðî- |
//|äàæà ñîâåòíèêà èëè îòäåëüíûõ åãî ÷àñòåé ÇÀÏÐÅÙÅÍÀ.                                 |
//|   Àâòîð íå íåñ¸ò îòâåòñòâåííîñòè çà âîçìîæíûå óáûòêè, ïîëó÷åííûå â ðåçóëüòàòå èñ- |
//|ïîëüçîâàíèÿ ñîâåòíèêà.                                                             |
//|   Ïî âñåì âîïðîñàì, ñâÿçàííûì ñ  ðàáîòîé ñîâåòíèêà, çàìå÷àíèÿìè èëè ïðåäëîæåíèÿìè |
//|ïî åãî äîðàáîòêå îáðàùàòüñÿ íà Skype: TarasBY èëè e-mail.                          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
#property copyright "Copyright © 2008-12, TarasBY WM R418875277808; Z670270286972"
#property link      "taras_bulba@tut.by"
//IIIIIIIIIIIIIIIIIII==================CONSTANS=================IIIIIIIIIIIIIIIIIIIIII+
#define BULL  0
#define BEAR  1
#define STOP -1
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  *****         Ïàðàìåòðû ñîâåòíèêà         *****                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
extern string SETUP_Expert          = "========== Îáùèå íàñòðîéêè ñîâåòíèêà ==========";
extern int    iMagicNumber             = 2012;
extern int    iNewBarInPeriod          = 1;                // >= 0 - ðàáîòàåì íà íà÷àëå ïåðèîäà íîâîãî áàðà, -1 - ðàáîòàåì íà êàæäîì òèêå
extern int    iTF_Indicators           = PERIOD_H1;        // Ïåðèîä, íà êîòîðîì ïðèíèìàåì ðåøåíèå (ðàáîòàþò èíäèêàòîðû)
#include      <b-PSI@Base.mqh>                             // Áèáëèîòåêà áàçîâûõ ôóíêöèé
extern int    iVariant_Price           = 0;                // Âàðèàíò öåí, ñ êîòîðûìè áóäåò ðàáîòàòü ñîâåòíèê íà îòêðûòèå îðäåðîâ
// 0 - Bid/Ask (original)
// 1 - High/Low[1]
// 2 - Open/Close[1]
// 3 - iMA (NULL, 1, 5, 0, 0, 6, 1)
// 4 - iMA (NULL, iTF_Indicators, 3, 0, 0, 6, 1)
extern string SETUP_RulesSend       = "---------------- RULES`s SEND -----------------";
extern int    iVariantSend             = 0;                // Âàðèàíòû óñëîâèé íà îòêðûòèå îðäåðîâ:
// 0 - original (MA + Stoch);
// 1 - Stoch (alternative) + MA;
// 2 - Stoch (alternative);
// 3 - Stoch (alternative) + MA (alternative);
// 4 - MULTIStoch;
// 5 - MULTIStoch (alternative);
/*extern*/ int    iZone                    = 5;                // Äëÿ 1-ãî è 2-ãî âàðèàíòîâ çîíà óìåðåííîãî ñîñòîÿíèÿ ïåðåêóïëåííîñòè\ïåðåïðîäàííîñòè
extern int    iSendOnlyOrders          = -1;               // 0 - îòêðûâàåì òîëüêî BUY; 1 - òîëüêî SELL; -1 - âñå
extern bool   bUseSignalForNextOrder   = FALSE;            // Èñïîëüçîâàòü ñèãíàëû èíäèêàòðîâ äëÿ îòêðûòèÿ ïîñëåäóþùèõ îðäåðîâ
extern bool   Dinamic_STOPs            = TRUE;             // Äèíàìè÷åñêèå ÑÒÎÏû
extern double dOrder_SL                = 200;              // SL îðäåðîâ (äëÿ 4-¸õ çíàêîâ)
extern double dOrder_TP                = 200;              // TP îðäåðîâ (äëÿ 4-¸õ çíàêîâ)
#include      <b-PSI@VirtualSTOPs.mqh>                     // Áèáëèîòåêà âèðòóàëüíûõ ÑÒÎÏîâ
extern int    iMax_trades              = 5;
extern double dDelta                   = 10;
extern double dK_Delta                 = 0;                // Êîýôôèöèåíò óâåëè÷åíèÿ ðàññòîÿíèÿ ïîñëåäóþùèõ îðäåðîâ, ãäå cur_Delta = dDelta + ((N - 1) * dDelta * dK_Delta) (N - íîìåð îðäåðà â ñåðèè)
extern string Setup_MA              = "******************* Send ÌÀ *******************";
extern int    iPeriod_MA               = 14;
extern int    iShift_MA                = -1;
extern string Setup_Stochastic      = "************ Send/Close Stochastic ************";
/*extern*/ string sPeriodStoch.List        = "15,30,60,240";
extern int    iKPeriod                 = 20;
extern int    iDPeriod                 = 30;
extern int    iSlowing                 = 3;
/*extern*/ double dSt_ZOverbought          = 80;
/*extern*/ double dSt_ZOversold            = 20;
extern string SETUP_RulesClose      = "---------------- RULES`s CLOSE ----------------";
extern int    iUse_close_IND           = 0;                // Çàêðûòèå ïî ñèãíàëàì èíäèêàòîðà:
// 1 - ïî MA;
// 2 - ïî Stochastic;
// 3 - ïî Stochastic (alternative);
// 4 - ïî System 2-óõ MA;
extern int    iNBars_Life              = 0;                // Ìèíèìàëüíàÿ "æèçíü" îðäåðà â iNBars_Life áàðîâ íà iTF_Indicators ïåðèîäå (ïðè iUse_close_IND > 0)
/*extern*/ string Setup_SystemMA        = "***************** SYSTEM 2-ÌÀ *****************";
/*extern*/ int    iPeriod_MA1              = 6;
/*extern*/ int    iShift_MA1               = -2;
/*extern*/ int    iMethod_MA1              = MODE_SMA;         // 0 - 3
/*extern*/ int    iPrice_MA1               = PRICE_CLOSE;      // 0 - 6
/*extern*/ int    iPeriod_MA2              = 14;
/*extern*/ int    iShift_MA2               = 0;
/*extern*/ int    iMethod_MA2              = MODE_LWMA;        // 0 - 3
/*extern*/ int    iPrice_MA2               = PRICE_CLOSE;      // 0 - 6
extern string Setup_STOPs           = "----------------STOPs from ATR ----------------";
extern int    ATR_Period1              = 5;          // ïåðèîä ïåðâîãî ATR (áîëüøå 0; ìîæåò áûòü ðàâåí ATR_Period2, íî ëó÷øå îòëè÷åí îò ïîñëåäíåãî)
extern int    ATR_Period2              = 15;         // ïåðèîä âòîðîãî ATR (áîëüøå 0)
extern double ATR_coeff                = 2.0;        // 
//IIIIIIIIIIIIIIIIIII==========Ïîäêëþ÷åííûå áèáëèîòåêè==========IIIIIIIIIIIIIIIIIIIIII+
#include      <b-PSI@ManagerPA.mqh>                        // Áèáëèîòåêà ïî óïðàâëåíèþ îáùèì ïðîôèòîì ñîâåòíèêà
#include      <b-PSI@MM_Light.mqh>                         // Áèáëèîòåêà óïðàâëåíèÿ êàïèòàëîì
#include      <b-PSI@Services_Light.mqh>                   // Áèáëèîòåêà ñåðâèñíûõ ïåðåìåííûõ
#include      <b-PSI@Trade_Light.mqh>                      // Áèáëèîòåêà ôóíêöèé òîðãîâûõ îïåðàöèé
//IIIIIIIIIIIIIIIIIII======Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà======IIIIIIIIIIIIIIIIIIIIII+
int           gia_MyOrders[2], gia_PeriodStoch[], gia_HistoryOrders[3];
string        gs_Info;
bool          gb_Pause = false;
double        gda_Lots[2];
datetime      gdt_NewBarIndicator;
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  Custom expert initialization function                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int init()
{
    string lsa_Arr[];
    int    err = GetLastError();
//----
    bs_NameGV = StringConcatenate ("MAStoch[", iMagicNumber, "]");
    //---- Ïðèíóäèòåëüíî çàïîëíÿåì èìÿ ñîâåòíèêà äëÿ êîììåíòàðèåâ îðäåðîâ
    if (EXP_Comment == "") EXP_Comment = StringSubstr (WindowExpertName(), StringFind (WindowExpertName(), "@") + 1);
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó áàçîâûõ ôóíêöèé
    fInit_Base (Symbol(), iMagicNumber, iTF_Indicators, ShowCommentInChart, PrintCom, SoundAlert, CreatVStopsInChart);
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó óïðàâëåíèÿ îáùèì ïðîôèòîì
    if (!fInit_ManagerPA()) return (0);
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó âèðòóàëüíûõ ÑÒÎÏîâ
    fInit_VirtualSTOPs();
    //---- Ñîáèðàåì ïåðâîíà÷àëüíóþ ñòàòèñòèêó
    fGet_Statistic (-1);
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó MM
    bd_LotsMM = fInit_MM (Order_Lots, iMagicNumber);
    //---- Ó÷èòûâàåì ðàçðÿäíîñòü êîòèðîâîê
    fCheck_Decimal();
    //---- Ïîëó÷àåì äàòû íà÷àëà è ïîñëåäíåãî òðåéäèíãà
    bdt_BeginTrade = fGet_TermsTrade (bs_Symbol, iMagicNumber, bdt_LastTrade);
    //---- Ñîçäà¸ì ìàññèâ ïåðèîäîâ äëÿ ðàñ÷¸òà ïîêàçàíèé Stochastic
    int li_size = fSplitStrToStr (sPeriodStoch.List, lsa_Arr, ",");
    fCreat_StrToInt (lsa_Arr, gia_PeriodStoch, li_size, 1, "PeriodStoch");
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGet_LastErrorInArray (bsa_Comment, "init()", bi_indERR);
//----
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  Custor expert deinitialization function                          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int deinit()
{
//----
    fMineDeInit();
//----
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|               Custom expert iteration function                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int start()
{
    //---- Äëÿ îïòèìèçàöèè óáèðàåì "ïóñòûå" âàðèàíòû
    if (fSet_Continue()) return (0);
//----
    int    err = GetLastError();
    double ld_Pribul;
//----
    //---- Ñ÷èòàåì "ñâîè" îðäåðà
    bi_MyOrders = fMyPositions (bd_ProfitCUR, gia_MyOrders, iMagicNumber);
    //---- Óïðàâëÿåì ëèíèåé ÁåçÓáûòêà
    fControl_BreakEven (gda_Lots);
    //---- Ñîáèðàåì ñòàòèñòèêó
    fGet_Statistic (PERIOD_D1);
    //---- Âûâîäèì èíôîðìàöèþ íà ãðàôèê (åñëè ðàçðåøåíî)
    if (ShowCommentInChart) {fCommentInChart (bsa_Comment, fGet_StringManagerPA());}
    //---- Âõîäèì â íà÷àëå óêàçàííîãî áàðà (åñëè NewBarInPeriod >= 0)
    if (!fCheck_NewBarInPeriod (iNewBarInPeriod)) return (0);
    //---- Çàïóñêàåì â ðàáîòó áèáëèîòåêó óïðàâëåíèÿ îáùèì ïðîôèòîì ñîâåòíèêà
    if (fManagerPA (bd_ProfitCUR, bd_Balance, bi_MyOrders > 0))
    {
        bi_MyOrders = 0;
        //---- Íà ýòîì áàðå áîëüøå íå âõîäèì
        gdt_NewBarIndicator = iTime (NULL, iTF_Indicators, 0);
    }
    //---- Çàíîñèì â ìàññèâ òåêóùèå öåíû
    RefreshRates();
    for (int li_IND = 0; li_IND < 2; li_IND++)
    {bda_Price[li_IND] = fGet_TradePrice (li_IND, bb_RealTrade, bs_Symbol);}
    //---- Îðãàíèçîâûâàåì óïðàâëåíèå îòêðûòûìè îðäåðàìè
    if (bi_MyOrders > 0)
    {
        if (!bb_TSProfit)
        {
            //---- Îðãàíèçóåì çàêðûòèå îðäåðîâ ïî ïîêàçàíèÿì èíäèêàòîðîâ
            if (fClose_Control (iUse_close_IND, ld_Pribul))
            {fWrite_Log (StringConcatenate ("Çàêðûëèñü ïî ñèãíàëó èíäèêàòîðà. Ðåçóëüòàò = ", bs_sign, DSDig (ld_Pribul)), 4);}
            //---- Îðãàíèçóåì ðàáîòó âèðòóàëüíûõ ÑÒÎÏîâ
            else {fControl_VirtualSTOPs (Slippage, iNBars_Life, iTF_Indicators);}
        }
    }
    //---- Ñëåäèì çà ðûíêîì íà íà÷àëå îòêðûòèÿ áàðà iTF_Indicators
    datetime ldt_BeginBarIndicator = iTime (NULL, iTF_Indicators, 0);
    if (gdt_NewBarIndicator != ldt_BeginBarIndicator)
    {      
        int    li_Ticket, li_Type, cmd, li_Trend = -1, li_cmd;
        double ld_Lot, ld_Price, ld_SL, lda_STOPs[2], lda_Price[2];
        lda_Price[0] = fGet_Price (2, bda_Price, iVariant_Price);
        //---- Ïðîâåðÿåì íà âàëèäíîñòü ïîëó÷åííîå çíà÷åíèå
        if (lda_Price[0] == 0.0) return (0);
        lda_Price[1] = fGet_Price (3, bda_Price, iVariant_Price);
        //---- Ïðîâåðÿåì íà âàëèäíîñòü ïîëó÷åííîå çíà÷åíèå
        if (lda_Price[1] == 0.0) return (0);
        gdt_NewBarIndicator = ldt_BeginBarIndicator;
        //---- Ïîëó÷àåì ñèãíàëû îò èíäèêàòîðîâ
        li_Trend = fSend_Control (iVariantSend, lda_Price);
        //---- Áëîê îòêðûòèÿ îðäåðîâ
        for (int li_ORD = 0; li_ORD < 2; li_ORD++)
        {
            if (li_ORD == 0) {li_cmd = 1;} else {li_cmd = 0;}
            //---- Îðãàíèçóåì îäíîíàïðàâëåííîñòü îòêðûòèÿ îðäåðîâ
            if (iSendOnlyOrders == li_cmd) continue;
            //---- Ïðîâåðÿåì óñëîâèÿ íà îòêðûòèå ïåðâîãî îðäåðà
            if (gia_MyOrders[li_ORD] == 0)
            {
                if (li_Trend == li_ORD)
                {
                    if (iVariant_Price == 0 || (iVariant_Price != 0 && bi_MyOrders == 0))
                    {
                        bd_LotsMM = fGet_SizeLot (Order_Lots, bd_BaseBalance, li_ORD, bs_Symbol, iMagicNumber, bi_MyOrders != 0);
                        if (bd_LotsMM > 0.0)
                        {
                            fGet_STOPs (li_ORD, bda_Price[li_cmd], lda_STOPs, iTF_Indicators);
                            if (iMax_trades == 1) {ld_SL = NDD (lda_STOPs[0]);} else {ld_SL = 0.0;}
                            li_Ticket = fOrderSend (bs_Symbol, li_ORD, bd_LotsMM, bda_Price[li_cmd], Slippage, ld_SL, NDD (lda_STOPs[1]), fGet_OrderComment (li_ORD), iMagicNumber);
                            if (li_Ticket > 0) {bi_cntTrades = 0; return (0);}
                        }
                    }
                }
            }
            //---- Ïðîäîëæàåì ñåðèþ îðäåðîâ
            else
            {
                if (iMax_trades > 1 && bi_MyOrders < iMax_trades + bi_cntTrades)
                {
                    if ((li_Trend == li_ORD && bUseSignalForNextOrder) || !bUseSignalForNextOrder)
                    {
                        //---- Êàëüêóëèðóåì ðàçìåð îòêðûâàåìîãî îðäåðà
                        bd_LotsMM = fGet_SizeLot (Order_Lots, bd_BaseBalance, li_ORD, bs_Symbol, iMagicNumber, true);
                        if (li_ORD == 0) {cmd = 1;} else {cmd = -1;}
                        double ld_curDelta = dDelta + ((bi_MyOrders - 1) * dDelta * dK_Delta);
                        //---- Öåíà èä¸ò â ïðîòèâîïîëîæíóþ ñòîðîíó è ïðîøëà ìèíèìàëüíî çàäàííîå ðàññòîÿíèå
                        if (cmd * (bd_LastPrice - bda_Price[li_cmd]) >= ld_curDelta)
                        {
                            if (bd_LotsMM > 0.0)
                            {
                                fGet_STOPs (li_ORD, bda_Price[li_cmd], lda_STOPs, iTF_Indicators);
                                li_Ticket = fOrderSend (bs_Symbol, li_ORD, bd_LotsMM, bda_Price[li_cmd], Slippage, 0.0, NDD (lda_STOPs[1]), fGet_OrderComment (li_ORD), iMagicNumber);
                                //---- Ïîñëå îòêðûòèÿ ïîñëåäíåãî îðäåðà â ñåðèè ïðîñòàâëÿåì SL ó âñåõ îðäåðîâ
                                if (bi_MyOrders == iMax_trades + bi_cntTrades - 1) {fSet_SL (li_Ticket, NDD (lda_STOPs[0]));}
                                if (li_Ticket > 0) return (0);
                            }
                        }
                    }
                }
            }
        }
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGet_LastErrorInArray (bsa_Comment, "start()", bi_indERR);
//----
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ïîëó÷àåì ðàáî÷èé óðîâåíü öåíû                                              |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fGet_Price (int fi_Type,         // Òèï, ïîëó÷àåìîé öåíû
                   double ar_Price[2],  // Ìàññèâ òåêóùèõ öåí ïî èíñòðóìåíòó
                   int fi_VarPrice)     // Âàðèàíò ïîëó÷àåìûõ ðàáî÷èõ öåí
{
//----
    switch (iVariant_Price)
    {
        case 1:
            if (fi_Type % 2 == 0) return (iLow (bs_Symbol, iTF_Indicators, 1));
            else return (iHigh (bs_Symbol, iTF_Indicators, 1));
        case 2:
            if (fi_Type % 2 == 0) return (MathMin (iOpen (bs_Symbol, iTF_Indicators, 1), iClose (bs_Symbol, iTF_Indicators, 1)));
            else return (MathMax (iOpen (bs_Symbol, iTF_Indicators, 1), iClose (bs_Symbol, iTF_Indicators, 1)));
        case 3: return (iMA (bs_Symbol, PERIOD_M1, 5, 0, MODE_SMA, PRICE_WEIGHTED, 1));
        case 4: return (iMA (bs_Symbol, iTF_Indicators, 3, 0, MODE_SMA, PRICE_WEIGHTED, 1));
        default: 
            if (fi_Type == 2) return (ar_Price[1]);
            if (fi_Type == 3) return (ar_Price[0]);
            if (fi_Type == 4) return (iOpen (bs_Symbol, iTF_Indicators, 0));
            return (ar_Price[fi_Type]);
    }
//----
    return (0.0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ðàññ÷èòûâàåì ÑÒÎÏû                                                         |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGet_STOPs (int fi_CMD,          // òèï îòêðûâàåìîãî îðäåðà
                 double fd_Price,     // òåêóùàÿ öåíà ïî èíñòðóìåíòó
                 double& ar_STOPs[],  // âîçâðàùàåìûå ÑÒÎÏû
                 int fi_Period)       // TF ñ êîòîðîãî áåðóòñÿ High\Low
{
    int err = GetLastError();
//----
    if (!Dinamic_STOPs)
    {
        int li_cmd;
        if (fi_CMD == 0) li_cmd = 1; else li_cmd = -1;
        ar_STOPs[0] = fd_Price - li_cmd * dOrder_SL;
        ar_STOPs[1] = fd_Price + li_cmd * dOrder_TP;
        return;
    }
    //---- Òåêóùåå çíà÷åíèå ATR
    double ld_ATR = iATR (bs_Symbol, fi_Period, ATR_Period1, 1);
    ld_ATR = MathMax (ld_ATR, iATR (bs_Symbol, fi_Period, ATR_Period2, 1));
    int li_BarLow = iLowest (bs_Symbol, fi_Period, MODE_LOW, 2),
        li_BarHigh = iHighest (bs_Symbol, fi_Period, MODE_HIGH, 2);
    switch (fi_CMD)
    {
        case 0:
            ar_STOPs[0] = MathMin (fd_Price - dOrder_SL, iLow (bs_Symbol, fi_Period, li_BarLow) - ld_ATR * ATR_coeff);
            ar_STOPs[1] = MathMax (fd_Price + dOrder_TP, iHigh (bs_Symbol, fi_Period, li_BarHigh) + ld_ATR * ATR_coeff);
            break;
        case 1:
            ar_STOPs[0] = MathMax (fd_Price + dOrder_SL, iHigh (bs_Symbol, fi_Period, li_BarHigh) + ld_ATR * ATR_coeff);
            ar_STOPs[1] = MathMin (fd_Price - dOrder_TP, iLow (bs_Symbol, fi_Period, li_BarLow) - ld_ATR * ATR_coeff);
            break;
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGet_LastErrorInArray (bsa_Comment, "fGet_STOPs()", bi_indERR);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ñîçäà¸ì êîììåíàðèé äëÿ îðäåðà                                              |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string fGet_OrderComment (int fi_Type)
{return (StringConcatenate (EXP_Comment, " | ", fGet_NameOP (fi_Type), " | ", gia_MyOrders[fi_Type] + 1));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|        Ôóíêöèÿ óñòàíàâëèâàåò çíà÷åíèå ñòîïëîñà íà âñå ñäåëêè êîëåíà               |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fSet_SL (int fi_Ticket, double fd_SL)
{
    if (fi_Ticket == 0) return;
//----
    int li_Type;
//----
    if (OrderSelect (fi_Ticket, SELECT_BY_TICKET))
    {
        li_Type = OrderType();
        for (int li_ORD = OrdersTotal() - 1; li_ORD >= 0; li_ORD--)
        {
            if (!OrderSelect (li_ORD, SELECT_BY_POS)) continue;
            if (OrderSymbol() != bs_Symbol) continue;
            if (OrderMagicNumber() != iMagicNumber) continue;
            fOrderModify (OrderTicket(), OrderOpenPrice(), fd_SL, OrderTakeProfit(), 0, White);
        }
    }
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ïîëó÷àåì ñèãíàëû îò èíäèêàòîðîâ                                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fSend_Control (int fi_VariantSend,   // Âàðèàíò ïðàâèë ÂÕÎÄà
                   double fd_Price[])    // Ìàññèâ òåêóùèõ öåí
{
//----
    switch (fi_VariantSend)
    {
        case 0: // îðèãèíàëüíûå óñëîâèÿ
            double lda_Stoch[2], ld_MA = iMA (bs_Symbol, iTF_Indicators, iPeriod_MA, iShift_MA, MODE_SMA, PRICE_CLOSE, 1);
            lda_Stoch[0] = iStochastic (bs_Symbol, iTF_Indicators, iKPeriod, iDPeriod, iSlowing, MODE_SMA, 1, MODE_MAIN, 1);
            lda_Stoch[1] = iStochastic (bs_Symbol, iTF_Indicators, iKPeriod, iDPeriod, iSlowing, MODE_SMA, 1, MODE_MAIN, 2);
            //---- Àíàëèçèðóåì ïîêàçàíèÿ èíäèêàòîðîâ        
            if (ld_MA < fd_Price[0])
            {if (lda_Stoch[0] < dSt_ZOversold && lda_Stoch[1] >= dSt_ZOversold) return (BULL);}
            else {if (ld_MA > fd_Price[1])
            {if (lda_Stoch[0] > dSt_ZOverbought && lda_Stoch[1] <= dSt_ZOverbought) return (BEAR);}}
            break;
        case 1: // Stochastic (alternative) + MA
            ld_MA = iMA (bs_Symbol, iTF_Indicators, iPeriod_MA, iShift_MA, MODE_SMA, PRICE_CLOSE, 1);
            //---- Àíàëèçèðóåì ïîêàçàíèÿ èíäèêàòîðà        
            int li_BeginBar, li_Trend = fGet_TrendStochastic (fi_VariantSend, li_BeginBar, 1, iZone);
            if (ld_MA < fd_Price[0]) {if (li_Trend == BULL) return (BULL);}
            else {if (ld_MA > fd_Price[1]) if (li_Trend == BEAR) return (BEAR);}
            break;
        case 2: // Stochastic (alternative)
            //---- Àíàëèçèðóåì ïîêàçàíèÿ èíäèêàòîðà        
            return (fGet_TrendStochastic (fi_VariantSend, li_BeginBar, 1, iZone));
        case 3: // Stochastic (alternative) + MA (alternative)
            double lda_MA[2];
            //---- Àíàëèçèðóåì ïîêàçàíèÿ èíäèêàòîðà        
            li_Trend = fGet_TrendStochastic (fi_VariantSend, li_BeginBar, 1, 100);
            //---- Öåíà íà âûõîäå èç "çîíû"
            lda_MA[0] = iMA (bs_Symbol, iTF_Indicators, 3, 0, MODE_SMA, PRICE_WEIGHTED, 1);
            //---- Öåíà íà âõîäå â "çîíó"
            lda_MA[1] = iMA (bs_Symbol, iTF_Indicators, 3, 0, MODE_SMA, PRICE_WEIGHTED, li_BeginBar);
            //---- Öåíà íà âûõîäå èç "çîíû" áîëüøå öåíû íà âõîäå â "çîíó"
            if (lda_MA[0] > lda_MA[1]) {if (li_Trend == BULL) return (BULL);}
            //---- Öåíà íà âûõîäå èç "çîíû" ìåíüøå öåíû íà âõîäå â "çîíó"
            else {if (lda_MA[0] < lda_MA[1]) if (li_Trend == BEAR) return (BEAR);}
            break;
        case 4: // MULTIStochastic
            //---- Àíàëèçèðóåì ïîêàçàíèÿ èíäèêàòîðà        
            li_Trend = fGet_TrendStochastic (fi_VariantSend, li_BeginBar, 1, iZone);
            if (li_Trend == BULL) return (BULL);
            else {if (li_Trend == BEAR) return (BEAR);}
            break;
        case 5: // MULTIStochastic (alternative)
            //---- Àíàëèçèðóåì ïîêàçàíèÿ èíäèêàòîðà        
            li_Trend = fGet_TrendStochastic (fi_VariantSend, li_BeginBar, 1, 100);
            //---- Signal íà âûõîäå èç "çîíû"
            lda_Stoch[0] = iStochastic (bs_Symbol, iTF_Indicators, iKPeriod, iDPeriod, iSlowing, MODE_SMA, 1, MODE_SIGNAL, 1);
            //---- Signal íà âõîäå â "çîíó"
            lda_Stoch[1] = iStochastic (bs_Symbol, iTF_Indicators, iKPeriod, iDPeriod, iSlowing, MODE_SMA, 1, MODE_SIGNAL, li_BeginBar);
            //---- Signal íà âûõîäå èç "çîíû" ìåíüøå Signal íà âõîäå â "çîíó"
            if (lda_Stoch[0] < lda_Stoch[1]) {if (li_Trend == BULL) return (BULL);}
            //---- Signal íà âûõîäå èç "çîíû" áîëüøå Signal íà âõîäå â "çîíó"
            else {if (lda_Stoch[0] > lda_Stoch[1]) if (li_Trend == BEAR) return (BEAR);}
            break;
    }
//----
    return (STOP);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Îðãàíèçóåì çàêðûòèå îðäåðîâ ïî ïîêàçàíèÿì èíäèêàòîðîâ                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fClose_Control (int fi_close_IND,   // Âàðèàíò ñòðàòåãèè çàêðûòèÿ îðäåðîâ
                     double& fd_Pribul)  // Ïðèáûëü ïî çàêðûòûì îðäåðàì
{
    int li_Trend = STOP;
//---- 
    switch (fi_close_IND)
    {
        case 1: // Ñèãíàë ïî ÌÀ
            int li_MA_Period;
            if (iVariant_Price == 0) {li_MA_Period = iPeriod_MA;} else {li_MA_Period = iTF_Indicators;}
            double ld_MA = iMA (bs_Symbol, iTF_Indicators, li_MA_Period, iShift_MA, MODE_SMA, PRICE_CLOSE, 1),
                   ld_Price = fGet_Price (4, bda_Price, iVariant_Price);
            if (ld_Price > 0.0)
            {
                if (ld_Price >= ld_MA && bda_Price[0] <= ld_MA) {li_Trend = BEAR;}
                else {if (ld_Price <= ld_MA && bda_Price[1] >= ld_MA) li_Trend = BULL;}
            }
            break;
        case 2: // Ñèãíàë ïî Stochastic
            double ld_Stoch = iStochastic (bs_Symbol, iTF_Indicators, iKPeriod, iDPeriod, iSlowing, MODE_SMA, 1, MODE_MAIN, 1);
            if (ld_Stoch > dSt_ZOverbought) {li_Trend = BEAR;}
            else {if (ld_Stoch < dSt_ZOversold) li_Trend = BULL;}
            break;
        case 3: // Ñèãíàë ïî Stochastic (alternative)
            int li_BeginBar;
            li_Trend = fGet_TrendStochastic (0, li_BeginBar, 5, iZone);
            break;
        case 4: // Ñèãíàë ïî System 2-óõ MA
            double lda_MA1[2], lda_MA2[2];
            lda_MA1[0] = iMA (bs_Symbol, iTF_Indicators, iPeriod_MA1, iShift_MA1, iMethod_MA1, iPrice_MA1, 1);
            lda_MA1[1] = iMA (bs_Symbol, iTF_Indicators, iPeriod_MA1, iShift_MA1, iMethod_MA1, iPrice_MA1, 2);
            lda_MA2[0] = iMA (bs_Symbol, iTF_Indicators, iPeriod_MA2, iShift_MA2, iMethod_MA2, iPrice_MA2, 1);
            lda_MA2[1] = iMA (bs_Symbol, iTF_Indicators, iPeriod_MA2, iShift_MA2, iMethod_MA2, iPrice_MA2, 2);
            //---- Îáå ÌÀ-øêè äîëæíû áûòü íàïðàâëåíû âíèç íà 2-óõ ïîñëåäíèõ áàðàõ
            if (lda_MA1[0] < lda_MA1[1])
            {
                if (lda_MA2[0] < lda_MA2[1])
                {
                    //---- Ïåðâàÿ ÌÀ-øêà íèæå âòîðîé
                    if (lda_MA1[0] < lda_MA2[0] && lda_MA1[0] < lda_MA2[1])
                    {
                        if (lda_MA1[1] < lda_MA2[0] && lda_MA1[1] < lda_MA2[1])
                        {li_Trend = BEAR;}
                    }
                }
            }
            //---- Îáå ÌÀ-øêè äîëæíû áûòü íàïðàâëåíû ââåðõ íà 2-óõ ïîñëåäíèõ áàðàõ
            else if (lda_MA1[0] > lda_MA1[1])
            {
                if (lda_MA2[0] > lda_MA2[1])
                {
                    //---- Ïåðâàÿ ÌÀ-øêà âûøå âòîðîé
                    if (lda_MA1[0] > lda_MA2[0] && lda_MA1[0] > lda_MA2[1])
                    {
                        if (lda_MA1[1] > lda_MA2[0] && lda_MA1[1] > lda_MA2[1])
                        {li_Trend = BULL;}
                    }
                }
            }
            break;
    }
    //---- Åñëè òðåíä íå ñôîðìèðîâàí - âûõîäèì
    if (li_Trend == STOP) return (false);
    int li_cmd = 1;
    if (li_Trend == 1) li_cmd = 0;
    if (gia_MyOrders[li_cmd] > 0)
    {if (fClose_AllOrders (bs_Symbol, iMagicNumber, fd_Pribul, li_cmd, iNBars_Life, iTF_Indicators) > 0) return (true);}
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ïîëó÷àåì çíà÷åíèå Stohastic íà fi_Bar áàðå                                 |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fGet_Stochastic (int fi_Period, int fi_Bar = 1)
{return (iStochastic (bs_Symbol, fi_Period, iKPeriod, iDPeriod, iSlowing, MODE_SMA, 1, MODE_MAIN, fi_Bar));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ïîëó÷àåì çíà÷åíèå Stohastic íà íåñê. ïåðèîäàõ (ar_Periods) â fi_Time       |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fGet_MULTIStochastic (int fi_Variant,    // Âàðèàíòû ðàáîòû ñî Stochastic
                             int ar_Periods[],  // Ìàññèâ ïåðèîäîâ äëÿ ðàñ÷¸òà Stochastic
                             int fi_Period,     // Ïåðèîä Stochastic äëÿ MONO-âàðèàíòà
                             datetime fi_Time,  // Âðåìÿ íà÷àëà ðàñ÷¸òà
                             int fi_Bar = 1)    // Áàð íà÷àëà ðàñ÷¸òà
{
    int li_size = ArraySize (ar_Periods);
    double ld_Stoch = 0.0;
//----
    if (fi_Variant > 3)
    {
        for (int li_IND = 0; li_IND < li_size; li_IND++)
        {ld_Stoch += fGet_Stochastic (ar_Periods[li_IND], iBarShift (bs_Symbol, ar_Periods[li_IND], fi_Time));}
        return (NormalizeDouble (ld_Stoch / li_size, 1));
    }
    else return (NormalizeDouble (fGet_Stochastic (fi_Period, fi_Bar), 1));
//----
    return (0.0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ïîëó÷àåì ñèãíàë Stohastic íà fi_Bar áàðå                                   |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_TrendStochastic (int fi_Variant,    // Âàðèàíòû ðàáîòû ñî Stochastic
                          int& fi_BeginBar,  // Íîìåð áàðà íà âõîäå â çîíó
                          int fi_Bar = 1,    // Íà êàêîì áàðå ïîëó÷àåì ñèãíàë
                          int fi_Zone = 5)   // Êîëè÷åñòâî áàðîâ îò âõîäà â çîíó äî âûõîäà èç íå¸
{
    double lda_Stoch[3];
    int    li_int;
//----
    fi_Bar++;
    fi_Zone += 2;
    fi_BeginBar = 0;
    //---- Àíàëèçèðóåì ïîêàçàíèÿ èíäèêàòîðà        
    for (int li_IND = fi_Bar; li_IND < fi_Bar + fi_Zone; li_IND++)
    {
        //---- Ôèêñèðóåì íà ïðåäûäóùåì áàðå ïåðåñå÷åíèå çîíû ïåðåïðîäàííîñòè ñíèçó ââåðõ
        if (li_IND == fi_Bar)
        {
            for (li_int = 0; li_int < 3; li_int++)
            {lda_Stoch[li_int] = fGet_MULTIStochastic (fi_Variant, gia_PeriodStoch, iTF_Indicators, iTime (bs_Symbol, iTF_Indicators, li_IND - 1 + li_int), li_IND - 1 + li_int);}
            if (lda_Stoch[0] <= dSt_ZOversold
            //---- 2-îé èëè 3-òèé áàð äîëæíû áûòü "çà ãðàíèöåé" çîíû
            || (lda_Stoch[1] >= dSt_ZOversold && lda_Stoch[2] >= dSt_ZOversold))
            {break;}
        }
        //---- Èùåì óìåðåííîå ñîñòîÿíèå ïåðåïðîäàííîñòè
        else if (fGet_MULTIStochastic (fi_Variant, gia_PeriodStoch, iTF_Indicators, iTime (bs_Symbol, iTF_Indicators, li_IND), li_IND) > dSt_ZOversold)
        {fi_BeginBar = li_IND; return (BULL);}
    }
    for (li_IND = fi_Bar; li_IND < fi_Bar + fi_Zone; li_IND++)
    {
        //---- Ôèêñèðóåì íà ïðåäûäóùåì áàðå ïåðåñå÷åíèå çîíû ïåðåêóïëåííîñòè ñâåðõó âíèç
        if (li_IND == fi_Bar)
        {
            if (lda_Stoch[0] >= dSt_ZOverbought
            //---- 2-îé èëè 3-òèé áàð äîëæíû áûòü "çà ãðàíèöåé" çîíû
            || (lda_Stoch[1] <= dSt_ZOverbought && lda_Stoch[2] <= dSt_ZOverbought))
            {break;}
        }
        //---- Èùåì óìåðåííîå ñîñòîÿíèå ïåðåêóïëåííîñòè
        else if (fGet_MULTIStochastic (fi_Variant, gia_PeriodStoch, iTF_Indicators, iTime (bs_Symbol, iTF_Indicators, li_IND), li_IND) < dSt_ZOverbought)
        {fi_BeginBar = li_IND; return (BEAR);}
    }
//----
    return (STOP);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ïðîâåðÿåì íàëè÷èå "ñâîèõ" îòêðûòûõ ïîçèöèé                                 |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fMyPositions (double& fd_Profit,    // Âîçâðàùàåìûé ðàçìåð ïðèáûëè ïî îòêðûòûì îðäåðàì
                  int& ar_MyOrders[],   // êîëè÷åñòâî îòêðûòûõ îðäåðîâ ïî òèïàì
                  int fi_Magic = -1)    // Magic
{
    int li_total = OrdersTotal(), li_ord = 0;
//----
    fd_Profit = 0.0;
    ArrayInitialize (ar_MyOrders, 0);
    ArrayInitialize (gda_Lots, 0);
    if (li_total == 0) {return (0);}
    for (int li_pos = li_total - 1; li_pos >= 0; li_pos--)
    {
        if (!OrderSelect (li_pos, SELECT_BY_POS, MODE_TRADES)) continue;
        if (OrderSymbol() != bs_Symbol) continue;
        if (OrderMagicNumber() != fi_Magic) {if (fi_Magic >= 0) continue;}
        if (OrderType() > 1) continue;
        fd_Profit += (OrderProfit() + OrderSwap() + OrderCommission());
        ar_MyOrders[OrderType()]++;
        gda_Lots[OrderType()] += OrderLots();
        li_ord++;
    }
//----
    return (li_ord);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ó÷èòûâàåì ðàçðÿäíîñòü êîòèðîâîê                                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fCheck_Decimal()
{
//----
    if (dOrder_TP > 0) dOrder_TP = NDP (dOrder_TP * bi_Decimal);
    if (dOrder_SL > 0) dOrder_SL = NDP (dOrder_SL * bi_Decimal);
    dDelta = NDP (dDelta * bi_Decimal);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Äåèíèöèàëèçèðóåì ñîâåòíèê                                                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fMineDeInit()
{
//----
    if (!bb_RealTrade) GlobalVariablesDeleteAll (bs_NameGV);
    //---- Â òåñòåðå (ïðè îïòèìèçàöèè) äàëüíåéøèå äåéñòâèÿ íå íóæíû
    if (bb_VirtualTrade) return (0);
    //---- Ïîä÷èùàåì ïîñëå ñåáÿ ãðàôèê
    if (ClearALLAfterTrade)
    {
        Comment ("");
        //---- Óäàëÿåì ãðàôè÷åñêèå îáúåêòû ñ ÷àðòà
        fObjectsDeleteAll (bs_NameGV, -1, -1); 
        //---- Óäàëÿåì GV-ïåðåìåííûå
        GlobalVariablesDeleteAll (bs_NameGV);
    }
    else
    {
        //---- Ïîäñ÷èòûâàåì èòîãè ðàáîòû
        fGet_Statistic (-1);
        //---- Ðèñóåì íà ãðàôèêå êîììåíòû
        if (ShowCommentInChart) {fCommentInChart (bsa_Comment, fGet_StringManagerPA());}
    }
    if (ObjectFind ("STOP") == 0) ObjectDelete ("STOP");
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ñåðâèñíûõ ôóíêöèé                                                         |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Âûâîäèì èíôîðìàöèþ íà ÷àðò                                                 |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fCommentInChart (string& ar_Comment[],      // ìàññèâ ñ êîììåíòàðèÿìè
                      string fs_ManagerPA = "")  // ñòðîêà ñî ñòàòèñòèêîé îò áèáëèîòåêè óïðàâëåíèÿ îáùèì ïðîôèòîì
{
    static string lsa_Time[], lsa_Comment[], ls_BeginTrade, ls_Conditions, ls_SendOrders = "BUY&SELL",
                  ls_row = "—————————————————————————————————\n",
                  ls_PSI = "————————————• PSI©TarasBY •————————————\n";
    static bool   lb_first = true;
    static int    li_size, li_size_CommTime, li_Period = 60;
    string ls_CTRL = "", ls_BLOCK_Comment, ls_Comment = "", ls_TermsTrade,
           ls_Error = "", ls_time = "", ls_sign;
//----
    //---- Ïðè ïåðâîì çàïóñêå ôîðìèðóåì ðàáî÷èå ìàññèâû
    if (lb_first)
    {
        li_Period *= iNewBarInPeriod;
        li_size = ArraySize (ar_Comment);
        ArrayResize (lsa_Time, li_size);
        ArrayResize (lsa_Comment, li_size);
        InitializeArray_STR (lsa_Comment, "");
        InitializeArray_STR (lsa_Time, "");
        if (iSendOnlyOrders == 0) ls_SendOrders = "BUY"; else if (iSendOnlyOrders == 1) ls_SendOrders = "SELL";
        ls_BeginTrade = StringConcatenate ("Terms Trade :: Begin - ", TimeToStr (bdt_BeginTrade));
        ls_Conditions = StringConcatenate ("NewBarInPeriod - ", fGet_NameTF (iNewBarInPeriod), " | TF Indicators - ", fGet_NameTF (iTF_Indicators),
        "\nUseSignalForNextOrder - ", CheckBOOL (bUseSignalForNextOrder), " | SendOnlyOrders - ", ls_SendOrders, "\n");
        gdt_NewBarIndicator = iTime (Symbol(), iTF_Indicators, 1);
        bdt_NewBarInPeriod = iTime (Symbol(), iNewBarInPeriod, 0);
        lb_first = false;
    }
    //---- ÁËÎÊ ÊÎÌÌÅÍÒÀÐÈÅÂ
    for (int li_MSG = 0; li_MSG < li_size; li_MSG++)
    {
        //---- Çàïîìèíàåì âðåìÿ ïîñëåäíåãî ñîîáùåíèÿ
        if (StringLen (ar_Comment[li_MSG]) > 0)
        {
            if (ar_Comment[li_MSG] != lsa_Comment[li_MSG])
            {lsa_Comment[li_MSG] = ar_Comment[li_MSG];}
            if (li_MSG == li_size - 1) {ls_sign = "";} else {ls_sign = " : ";}
            lsa_Time[li_MSG] = StringConcatenate (TimeToStr (bdt_curTime), ls_sign);
            ar_Comment[li_MSG] = "";
        }
        //---- Ôîðìèðóåì áëîê êîììåíòàðèåâ
        if (li_MSG < li_size - 1)
        {if (StringLen (lsa_Comment[li_MSG]) > 0) {ls_Comment = StringConcatenate (ls_Comment, lsa_Time[li_MSG], lsa_Comment[li_MSG], "\n");}}
        //---- Ôîðìèðóåì áëîê îøèáîê
        else if (li_MSG == li_size - 1)
        {
            //---- Ñïóñòÿ 2 ÷àñà óïîìèíàíèå îá îøèáêå óáèðàåì
            if (bdt_curTime > StrToTime (lsa_Time[li_MSG]) + 7200)
            {lsa_Comment[li_MSG] = "";}
            if (StringLen (lsa_Comment[li_MSG]) > 0) {ls_Error = StringConcatenate (ls_row, "ERROR:  ", lsa_Time[li_MSG], "\n", lsa_Comment[li_MSG]);}
        }
    }
    //---- Ñòðîêà êîíòðîëÿ çà âðåìåíåì ðàáîòû ñîâåòíèêà
    ls_time = StringConcatenate ("\nTime :: cur ", TimeToStr (bdt_curTime, TIME_DATE|TIME_SECONDS), " | local ", TimeToStr (TimeLocal(), TIME_MINUTES|TIME_SECONDS));
    if (iNewBarInPeriod > 0) {ls_time = StringConcatenate (TimeToStr (bdt_NewBarInPeriod + li_Period), " | ", TimeToStr (gdt_NewBarIndicator + iTF_Indicators * 60), ls_time);}
    ls_TermsTrade = StringConcatenate (ls_BeginTrade, " | Last - ", TimeToStr (bdt_LastTrade), "\n");
    //---- Ôîðìèðóåì ÂÑÅ áëîêè êîììåíòàðèåâ
    ls_BLOCK_Comment = StringConcatenate (bs_ExpertName, "\n", ls_row, gs_Info, ls_time, "\n",
                 ls_TermsTrade,
                 ls_Conditions,
                 ls_row,
                 //---- Áëîê ðåçóëüòàòîâ ðàáîòû
                 "          PROFIT    = ", bs_sign, " ", fSplitField (DoubleToStr (bd_ProfitCUR, 1)), " | ", DoubleToStr (bd_ProfitPercent - 100.0, 1), " % [ ", bi_MyOrders, " | ", gia_MyOrders[0], " / ", gia_MyOrders[1], " ]\n",
                 //---- Áëîê ðàáîòû ñ îáùèì ïðîôèòîì
                 fs_ManagerPA,
                 "          RESULT    = ", bs_sign, " ", fSplitField (DoubleToStr (bd_Pribul, 1)), " [ ", fSplitField (gia_HistoryOrders[2]), " | ", fSplitField (gia_HistoryOrders[0]), " / ", fSplitField (gia_HistoryOrders[1]), " ]\n",
                 ls_PSI,
                 //---- Áëîê êîììåíòàðèåâ
                 ls_Comment,
                 //---- Îòîáðàæàåì îøèáêè
                 ls_Error);//,
    //---- Âûâîäèì íà ÷àðò ñôîðìèðîâàííûé áëîê êîììåíòàðèåâ
    Comment (ls_BLOCK_Comment);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ñîáèðàåì ñòàòèñòèêó                                                        |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGet_Statistic (int fi_Period = 0,           // Ìèíèìàëüíûé ïåðèîä (TF) íà êîòîðîì ñîáèðàåì ñòàòèñòèêó
                     bool fb_IsTimeGMT = false)   // Êàêîå âðåìÿ ó÷èòûâàåì
{
    static datetime ldt_NewBar = 0;
    static int li_PreHistOrders = 0;
    int      li_ORD, err = GetLastError(), li_Period =  MathMax (0, fi_Period);
    datetime ldt_NewPeriod = iTime (bs_Symbol, li_Period, 0);
//----
    //---- Ôèêñèðóåì âðåìÿ â "íàñòîÿùèé ìîìåíò"
    bdt_curTime = TimeCurrent();
    //bdt_curTime = fGet_Time (fb_IsTimeGMT, bi_ShiftLocalDC_sec);
    //bi_curHOUR = TimeHour (bdt_curTime);
    //bi_curDAY = TimeDay (bdt_curTime);
    bd_Balance = AccountBalance();
    bd_Equity = AccountEquity();
    bd_FreeMargin = AccountFreeMargin();
    bd_Margin = AccountMargin();
    if (li_PreHistOrders != OrdersHistoryTotal() || ldt_NewBar != ldt_NewPeriod || fi_Period < 0)
    {
        li_PreHistOrders = OrdersHistoryTotal();
        ldt_NewBar = ldt_NewPeriod;
        //---- Ïîäñ÷èòûâàåì èòîãè ðàáîòû
        bd_Pribul = fCalculate_Pribul (gia_HistoryOrders, bs_Symbol, iMagicNumber);
    }
    //---- Ïîëó÷àåì òåêóùèå çíà÷åíèÿ ïåðåìåííûõ äëÿ îòîáðàæåíèÿ íà ãðàôèêå
    fCheckInfo();
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
	 fGet_LastErrorInArray (bsa_Comment, "fGet_Statistic()", bi_indERR);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ñîçäà¸ì èíôîðìàöèþ äëÿ îòîáðàæåíèÿ íàñòðîåê íà ãðàôèêå                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fCheckInfo()
{
    static double ld_pre_Lot = 0.0;
//----
    if (ShowCommentInChart)
    {
        if (ld_pre_Lot != bd_LotsMM)
        {
            string ls_Trail = "", ls_MM, ls_addConditions;
            ls_MM = IIFs (UseMM, StringConcatenate ("MM (", DSDig (bd_LotsMM), ")", fGet_MeansType (MeansType, LotsPercent)), "L: " + DSDig (bd_LotsMM));
            ls_addConditions = StringConcatenate (IIFs ((StringLen (ls_Trail) > 0), ls_Trail, ""),
            IIFs ((StringLen (ls_MM) > 0), " - ", ""),
            IIFs ((StringLen (ls_MM) > 0), ls_MM, ""));
            //---- Óáèðàåì " - " èç íà÷àëà ñòðîêè (åñëè åñòü)
            ls_addConditions = IIFs ((StringFind (ls_addConditions, " - ") == 0), StringSubstr (ls_addConditions, 3), ls_addConditions);
            //---- Ôîðìèðóåì èíôîðìàöèîííóþ ñòðîêó
            gs_Info = StringConcatenate (bs_NameGV, ":     STOP`s", " [ ", NDPD (dOrder_SL), "/", NDPD (dOrder_TP), " | ", Virtual_Order_SL, "/", Virtual_Order_TP, " ]", "\n",
            IIFs ((StringLen (ls_addConditions) > 0), StringConcatenate (ls_addConditions, "\n"), ""),
            "Lots: MIN = ", DSDig (bd_MINLOT), " | MAX = ", DSDig (bd_MAXLOT), " | STEP = ", bd_LOTSTEP, "\n",
            IIFs ((iNewBarInPeriod < 0), "Ðàáîòàåì íà êàæäîì òèêå", "ÏÀÓÇÀ äî: "));
            ld_pre_Lot = bd_LotsMM;
        }
    }
//---- 
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: TESTER                                                                    |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Äëÿ îïòèìèçàöèè óáèðàåì "ïóñòûå" âàðèàíòû                                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fSet_Continue()
{
    static bool lb_Continue = true;
//----
    if (!bb_RealTrade)
    {
        //---- Ñëåäèì çà íàëè÷èåì èñòîðèè (êîòèðîâîê)
        if (iNewBarInPeriod >= 0) if (iTime (bs_Symbol, iNewBarInPeriod, 0) == 0)
        {fPrintAlert (bs_Symbol, iNewBarInPeriod, 0); return (true);}
        if (iTime (bs_Symbol, iTF_Indicators, 0) == 0)
        {fPrintAlert (bs_Symbol, iTF_Indicators, 1); return (true);}
    }
    //---- Ïðîâåðêó ïàðàìåòðîâ ïðîèçâîäèì îäèí ðàç
    if (!lb_Continue) return (false);
    if (IsOptimization())
    {
        if (bb_OptimContinue) return (true);
        if (fGet_NumPeriods (iTF_Indicators) < 0) {bb_OptimContinue = true; return (true);}
        if (fGet_NumPeriods (iNewBarInPeriod) < 0) {bb_OptimContinue = true; return (true);}
        if (iMax_trades == 1)
        {
            if (dDelta != 0) {bb_OptimContinue = true; return (true);}
            if (K_Lots != 1.0) {bb_OptimContinue = true; return (true);}
        }
        else
        {
            if (dDelta == 0) {bb_OptimContinue = true; return (true);}
            if (K_Lots <= 1.0) {bb_OptimContinue = true; return (true);}
        }
        if (iVariantSend > 1) {if (iUse_close_IND != 1) if (iVariant_Price > 1) {bb_OptimContinue = true; return (true);}}
    }
    else {if (fSTOPTRADE()) return (true);}
    lb_Continue = false;
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

Comments