e-PSI9Multi_Scalper_new

Author: Copyright � 2008-14, 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-PSI9Multi_Scalper_new
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                           e-PSI@Multi_Scalper.mq4 |
//|                                    Copyright © 2012-14, Igor Stepovoi aka TarasBY |
//|                                                                taras_bulba@tut.by |
//|                                                                                   |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|   Äàííûé ïðîäóêò ïðåäíàçíà÷åí äëÿ íåêîììåð÷åñêîãî èñïîëüçîâàíèÿ. Ïóáëèêàöèÿ ðàç-  |
//|ðåøåíà òîëüêî ïðè óêàçàíèè èìåíè àâòîðà (TarasBY).  Ðåäàêòèðîâàíèå èñõîäíîãî êîäà  |
//|äîïóñòèìî òîëüêî ïðè  óñëîâèè ñîõðàíåíèÿ äàííîãî òåêñòà, ññûëîê è èìåíè àâòîðà.    |
//|   Ïðîäàæà ñîâåòíèêà èëè îòäåëüíûõ å¸ ÷àñòåé ÇÀÏÐÅÙÅÍÀ.                            |
//|   Àâòîð íå íåñ¸ò îòâåòñòâåííîñòè çà âîçìîæíûå óáûòêè, ïîëó÷åííûå â ðåçóëüòàòå èñ- |
//|ïîëüçîâàíèÿ ñîâåòíèêà.                                                             |
//|   Ïî âñåì âîïðîñàì, ñâÿçàííûì ñ  ðàáîòîé ñîâåòíèêà, çàìå÷àíèÿìè èëè ïðåäëîæåíèÿìè |
//|ïî åãî äîðàáîòêå îáðàùàòüñÿ íà Skype: TarasBY èëè e-mail.                          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
#property copyright "Copyright © 2008-14, TarasBY WM R418875277808; Z670270286972"
#property link      "taras_bulba@tut.by"
#property version   "2.0"
//IIIIIIIIIIIIIIIIIII==================CONSTANS=================IIIIIIIIIIIIIIIIIIIIII+
#define dSUM_Trade           2
//---- Êîíñòàíòû ñèãíàëîâ èíäèêàòîðîâ
#define BULL                 0
#define BEAR                 1
#define STOP                -1
//---- Êîíñòàíòû èíäåêñîâ â ìàññèâå bda_MM[]
#define dMM_MaxLot           0
#define dMM_MinLot           1
#define dMM_LotStep          2
#define dMM_LotSize          3
#define dMM_TickSize         4
#define dMM_Leverage         5
#define dMM_Balance          6
#define dMM_Equity           7
#define dMM_FreeMargin       8
#define dMM_Margin           9
//---- Êîíñòàíòû èíäåêñîâ â ìàññèâå êîììåíòîâ bsa_Comment[]
#define dMM                  0
#define dTIME                1
#define dTRAIL               2
#define dTRADE               3
#define dSTOP                4
#define dNET                 5
#define dPART                6
#define dPA                  7
#define dSIGNAL              8
#define dERR                 9
#define dCOM_SIZE            10
#define dCOMTIME_SIZE        7
//---- Êîíñòàíòû ñîñòîÿíèé òðåíäà
#define WITE                -2
#define UP                   1
#define DW                  -1
#define NONE                 0
#define FL                   0
#define OTKAT                1
#define CORRECTION           2
#define TREND                3
//#include      <Custom\b-PSI@Trade_Defines.mq4>
//IIIIIIIIIIIIIIIIIII================ÏÅÐÅ×ÈÑËÅÍÈß================IIIIIIIIIIIIIIIIIIIII+
enum ENUM_PERIOD
{
    PERIOD_NO  = -1,      // AllTick
    PERIOD_0   = 0,       // Period()
    PERIOD_m1  = 1,       // M1
    PERIOD_m5  = 5,       // M5
    PERIOD_m15 = 15,      // M15
    PERIOD_m30 = 30,      // M30
    PERIOD_h1  = 60,      // H1
    PERIOD_h4  = 240,     // H4
    PERIOD_d1  = 1440,    // D1
    PERIOD_w1  = 10080,   // W1
    PERIOD_mn1 = 43200    // MN1
};
enum ENUM_PART_UNIT
{
    Null = 0,             // 0.0
    Part_1,               // 0.1
    Part_2,               // 0.2
    Part_3,               // 0.3
    Part_4,               // 0.4
    Part_5,               // 0.5
    Part_6,               // 0.6
    Part_7,               // 0.7
    Part_8,               // 0.8
    Part_9,               // 0.9
    Unit                  // 1.0
};
enum ENUM_SHOW_INFO
{
    INFO_NOT = 0,         // íå ïîêàçûâàòü
    INFO_Com,             // Comment()
    INFO_OBJ,             // Objects
    INFO_Com_And_OBJ      // Comment() & Objects
};
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  *****         Ïàðàìåòðû ñîâåòíèêà         *****                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
sinput string SETUP_Expert          = "========== Îáùèå íàñòðîéêè ñîâåòíèêà ==========";
input  int    MG                       = 2014;
extern  ENUM_PERIOD NewBarInPeriod     = PERIOD_m1;        // >= 0 - ðàáîòàåì íà íà÷àëå ïåðèîäà íîâîãî áàðà, -1 - ðàáîòàåì íà êàæäîì òèêå
#include      <Custom\b-PSI@Base.mq4>                      // Áèáëèîòåêà áàçîâûõ ôóíêöèé
#include      <Custom\b-PSI@MULTI_Light.mq4>               // Áèáëèîòåêà ñîçäàíèÿ ðàáî÷åãî ñïèñêà âàëþòíûõ ïàð
#include      <Custom\b-PSI@STOPs_Light.mq4>               // Áèáëèîòåêà ñîçäàíèÿ è êîíòðîëÿ ÑÒÎÏîâ
sinput string SETUP_RulesClose      = "---------------- RULES`s CLOSE ----------------";
extern bool   CloseInverseSignal       = FALSE;            // Çàêðûòèå ïî îáðàòíîìó ñèãíàëó
extern ushort NBars_LifeMIN            = 0;                // Ìèíèìàëüíàÿ "æèçíü" îðäåðà â NBars_LifeMIN áàðîâ íà TF_Indicators ïåðèîäå
extern short  NBars_LifeMAX            = -1;               // Ìàêñèìàëüíàÿ "æèçíü" îðäåðà â NBars_LifeMAX áàðîâ íà TF_Indicators ïåðèîäå (0 - îðäåðà æèâóò äî êîíöà òåêóùèõ ñóòîê)
sinput string SETUP_Indicator       = "=============== Setup Indicator ===============";
extern ENUM_TIMEFRAMES TF_Indicators   = PERIOD_H1;        // Ïåðèîä èíäèêàòîðà
/*extern*/ int    FilterPeriod             = 22;
/*extern*/ int    SL_distance_pips         = 20;
extern ushort BarControl               = 4;                // >= 2 - íîìåð áàðà ñ êîòîðîãî ñíèìàåì ñèãíàë
extern ENUM_PART_UNIT LevelControl     = Part_8;           // <= 1 - óðîâåíü ïèêîâîãî çíà÷åíèÿ
extern ENUM_PART_UNIT Popravka         = Part_3;           // <= 1 - îòêàò îò ïèêîâîãî çíà÷åíèÿ
//IIIIIIIIIIIIIIIIIII==========Ïîäêëþ÷åííûå áèáëèîòåêè==========IIIIIIIIIIIIIIIIIIIIII+
#include      <Custom\b-PSI@Trail_Stairs.mq4>              // Áèáëèîòåêà òðåéëèíãà îðäåðîâ (ñòàíäàðòíàÿ)
#include      <Custom\b-PSI@ManagerPA_new.mq4>             // Áèáëèîòåêà ïî óïðàâëåíèþ îáùèì ïðîôèòîì ñîâåòíèêà
#include      <Custom\b-PSI@MM_Light.mq4>                  // Áèáëèîòåêà óïðàâëåíèÿ êàïèòàëîì
#include      <Custom\b-PSI@Services_Light.mq4>            // Áèáëèîòåêà ñåðâèñíûõ ïåðåìåííûõ
#include      <Custom\b-PSI@Trade_Light.mq4>               // Áèáëèîòåêà ôóíêöèé òîðãîâûõ îïåðàöèé
//IIIIIIIIIIIIIIIIIII======Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà======IIIIIIIIIIIIIIIIIIIIII+
double        gda_Point[], gd_LevelControl, gd_Popravka;
int           gia_MyOrders[][3], gia_HistoryOrders[3], ShowInfoInChart,
              gia_Digits[], gia_MyOrd[2];
string        gs_Info;
datetime      gdt_NewBarIndicator;
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  Custom expert initialization function                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int OnInit()
{
    ResetLastError();
    ShowInfoInChart = ShowCommentInChart;
    //---- Ïðîâåðÿåì ïåðåäàííûå â ñîâåòíèê âíåøíèå ïàðàìåòðû
    if (!fCheck_ExternParameters()) {bb_OptimContinue = true; return (INIT_FAILED);}
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó áàçîâûõ ôóíêöèé
    fInit_Base (_Symbol, MG, TF_Indicators, ShowCommentInChart, PrintCom, SoundAlert, CreatVStopsInChart);
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó óïðàâëåíèÿ îáùèì ïðîôèòîì
    if (!fInit_ManagerPA()) return (INIT_FAILED);
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó ÑÒÎÏîâ
    if (!fInit_STOPs()) return (INIT_FAILED);
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó òðåéëèíãà
    if (!fInit_Trail()) return (INIT_FAILED);
    //---- Äëÿ îïòèìèçàöèè óáèðàåì "ïóñòûå" âàðèàíòû
    if (fSet_Continue()) return (INIT_FAILED);
    //---- Ñîáèðàåì ïåðâîíà÷àëüíóþ ñòàòèñòèêó
    fGet_Statistic (-1);
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó MM
    bd_LotsMM = fInit_MM (Order_Lots);
    //---- Äëÿ òåñòåðà îñòàâëÿåì ÒÎËÜÊÎ èíñòðóìåíò ãðàôèêà
    if (!bb_RealTrade) {Symbol_List = _Symbol;}
    //---- Ãîòîâèì ðàáî÷èé ìàññèâ äëÿ ðàáîòû â ìóëüòèâàëþòíîì ðåæèìå
    fWork_MULTI();
    ArrayResize (gia_MyOrders, bi_cntSMB);
    ArrayResize (gda_Point, bi_cntSMB);
    ArrayResize (gia_Digits, bi_cntSMB);
    //---- Ïîëó÷àåì äàòû íà÷àëà è ïîñëåäíåãî òðåéäèíãà
    bdt_BeginTrade = fGet_TermsTrade (bdt_LastTrade);
    bs_ExpertName = StringConcatenate (WindowExpertName(), ":  ", fGet_NameTF (_Period), " | S-", bi_cntSMB);
    //---- Çàïîëíÿåì äàííûìè ðàáî÷èå ìàññèâû
    for (int li_IND = 0; li_IND < bi_cntSMB; li_IND++)
    {
        gda_Point[li_IND] = MarketInfo (bsa_SMB[li_IND], MODE_POINT);
        gia_Digits[li_IND] = MarketInfo (bsa_SMB[li_IND], MODE_DIGITS);
    }
    gd_LevelControl = LevelControl / 10.;
    gd_Popravka = Popravka / 10.;
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGet_LastErrorInArray ("init()", bi_indERR);
//----
    return (INIT_SUCCEEDED);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  Custor expert deinitialization function                          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void OnDeinit (const int reason)
{
//----
    fMineDeInit();
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|               Custom expert iteration function                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void OnTick()
{
    bdt_BeginNewBar = fGet_SymbolTime (_Symbol, TF_Indicators, 0);
    ResetLastError();
    //---- Ñ÷èòàåì "ñâîè" îðäåðà
    bi_MyOrders = fMyPositions (bd_ProfitCUR, gia_MyOrders, bsa_SMB, MG);
    //---- Ñîáèðàåì ñòàòèñòèêó
    fGet_Statistic (PERIOD_D1);
    //---- Çàïóñêàåì â ðàáîòó ðàáî÷èå èíäèêàòîðû ôîðìèðîâàíèÿ ÑÒÎÏîâ
    //for (int li_SMB = 0; li_SMB < bi_cntSMB; li_SMB++)
    //{fCheck_MyIndicatorsSTOP (bsa_SMB[li_SMB]);}
    //---- Âûâîäèì èíôîðìàöèþ íà ãðàôèê (åñëè ðàçðåøåíî)
    if (ShowCommentInChart) {fCommentInChart (bsa_Comment, fGet_StringManagerPA());}
    //---- Âõîäèì â íà÷àëå áàðà TF èíäèêàòîðà
    if (gdt_NewBarIndicator == bdt_BeginNewBar) {return;}
    //---- Âõîäèì â íà÷àëå óêàçàííîãî áàðà (åñëè NewBarInPeriod >= 0)
    if (!fCheck_NewBarInPeriod (NewBarInPeriod)) return;
    //---- Çàïóñêàåì â ðàáîòó áèáëèîòåêó óïðàâëåíèÿ îáùèì ïðîôèòîì ñîâåòíèêà
    if (fManagerPA (bd_ProfitCUR, bd_Balance, bi_MyOrders > 0)) {bi_MyOrders = 0;}
    else
    {
        //---- Ðàáîòàåì ñ êàæäûì ñèìâîëîì ïî îòäåëüíîñòè
        for (int li_SMB = 0; li_SMB < bi_cntSMB; li_SMB++)
        {fControl_Symbol (bsa_SMB[li_SMB], li_SMB);}
        //---- Îðãàíèçóåì ðàáîòó ïî ñîïðîâîæäåíèþ îòêðûòûõ îðäåðîâ
        if (bi_MyOrders > 0) {if (!bb_TSProfit) fControl_Positions();}
    }
    //---- Äî ñëåäóþùåãî áàðà íå âõîäèì
    if (bi_MyOrders == 0) gdt_NewBarIndicator = bdt_BeginNewBar;
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGet_LastErrorInArray ("start()", bi_indERR);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ñîçäà¸ì êîììåíàðèé äëÿ îðäåðà                                              |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string fGet_OrderComment (int fi_Type)
{return (StringConcatenate (EXP_Comment, " | ", fGet_NameOP (fi_Type), " | ", bi_MyOrders + 1));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Âîçâðàùàåò òîðãîâûé ñèãíàë                                                 |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_Signal (
    string fs_Symbol,               // Èíñòðóìåíò
    int fi_Bar = 5)                 // Íà êàêîì áàðå ïîëó÷àåì ñèãíàë
{
    double ld_Signal_0 = iCustom (fs_Symbol, TF_Indicators, "scalping future", FilterPeriod, SL_distance_pips, BarControl, gd_LevelControl, True, 0, 1),
           ld_Signal_Bar = iCustom (fs_Symbol, TF_Indicators, "scalping future", FilterPeriod, SL_distance_pips, BarControl, gd_LevelControl, True, 0, fi_Bar);
    int    li_Signal = STOP;
//----
    if (ld_Signal_Bar <= -gd_LevelControl && ld_Signal_0 > gd_Popravka - gd_LevelControl) li_Signal = BULL; //up
    if (ld_Signal_Bar >= gd_LevelControl && ld_Signal_0 < gd_LevelControl - gd_Popravka) li_Signal = BEAR;  //down
//----
    return (li_Signal);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Óïðàâëåíèå ïîçèöèÿìè ïî ñèìâîëó (fs_Symbol)                                |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fControl_Symbol (
    string fs_Symbol,               // Symbol
    int fi_IND)                     // èíäåêñ èíñòðóìåíòà â ìàññèâå bsa_SMB[]
{
    int li_Signal = fGet_Signal (fs_Symbol, BarControl);
//----
    if (li_Signal < 0) return;
    int li_cmd, li_Ticket;
    if (gia_MyOrders[fi_IND][dSUM_Trade] == 0)
    {
        RefreshRates();
        if (li_Signal == 0) li_cmd = 1; else li_cmd = 0;
        double ld_Price = NormalizeDouble (fGet_TradePrice (li_cmd, bb_RealTrade, fs_Symbol), gia_Digits[fi_IND]);
        bd_LotsMM = fGet_SizeLot (Order_Lots, bd_BaseBalance, 0, li_Signal);
        if (bd_LotsMM > 0.0)
        {li_Ticket = fOrderSend (fs_Symbol, li_Signal, bd_LotsMM, ld_Price, Slippage, 0.0, 0.0, fGet_OrderComment (li_Signal), MG);}
        if (li_Ticket > 0) bi_MyOrders++;
    }
    else
    {
        if (!CloseInverseSignal || bb_TSProfit) return;
        double ld_Pribul;
        if (li_Signal == 0) li_cmd = 1; else li_cmd = 0;
        if (gia_MyOrders[fi_IND][li_cmd] > 0)
        {if (fClose_AllOrders (ld_Pribul, li_cmd, NBars_LifeMIN) > 0) bi_MyOrders--;}
    }
//----
    return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ïðîâåðÿåì íàëè÷èå "ñâîèõ" îòêðûòûõ ïîçèöèé                                 |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fMyPositions (
    double& fd_Profit,              // âîçâðàùàåìûé ïðîôèò ïî îòêðûòûì îðäåðàì
    int& ar_MyOrders[][],           // âîçâðàùàåìûé ìàññèâ îòêðûòûõ îðäåðîâ ïî ñèìâîëàì
    string& ar_Symbols[],           // ìàññèâ ñ ðàáî÷èìè ñèìâîëàìè
    int fi_Magic = -1)              // Magic
{
    int li_total = OrdersTotal(), li_Ord = 0, li_ind_SMB;
//----
    //fMyPositions (gd_Profit, gia_MyOrders, bsa_SMB, MG);
    ArrayInitialize (ar_MyOrders, 0);
    ArrayInitialize (gia_MyOrd, 0);
    fd_Profit = 0.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;
        li_ind_SMB = fGet_INDInArray (OrderSymbol(), ar_Symbols);
        if (li_ind_SMB < 0) continue;
        if (OrderMagicNumber() != fi_Magic) {if (fi_Magic >= 0) continue;}
        if (OrderType() > 1) continue;
        fd_Profit += (OrderProfit() + OrderSwap() + OrderCommission());
        ar_MyOrders[li_ind_SMB][dSUM_Trade]++;
        ar_MyOrders[li_ind_SMB][OrderType()]++;
        gia_MyOrd[OrderType()]++;
        li_Ord++;
    }
//----
    return (li_Ord);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//         Ïðîâåðÿåì ïåðåäàííûå â ñîâåòíèê âíåøíèå ïàðàìåòðû.                         |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCheck_ExternParameters()
{
//----
    bs_ERROR = "";
    //---- Ïðîâåðÿåì ðàçðåøåíèå ñîâåòíèêó íà òîðãîâëþ
    if (!IsTesting() && !IsOptimization()) {if (!IsExpertEnabled()) {return (false);}}
    //---- Ñîçäà¸ì ïðåôèêñ GV-ïåðåìåííûõ ñîâåòíèêà
    bs_NameGV = StringConcatenate ("MScalper[", MG, "]");
    //---- Ïðîâåðÿåì êîððåêòíîñòü ââåä¸ííûõ äàííûõ
    if (BarControl < 1) {bs_ERROR = "Ïîñòàâüòå BarControl >= 1 !!!"; return (false);}
    //if (LevelControl > 1.0 || LevelControl < 0.5) {bs_ERROR = "Ïîñòàâüòå 0.5 <= LevelControl <= 1.0 !!!"; return (false);}
    //if (Popravka > 0.4 || Popravka < 0.0) {bs_ERROR = "Ïîñòàâüòå 0.0 <= Popravka <= 0.4 !!!"; return (false);}
    if (TF_Indicators == 0) TF_Indicators = (ENUM_TIMEFRAMES) _Period;
    if (NewBarInPeriod == 0) NewBarInPeriod = (ENUM_PERIOD) _Period;
    if (CloseInverseSignal) if (NBars_LifeMIN == 0)
    {bs_ERROR = StringConcatenate ("Âîçìîæíî ðàííåå ñðàáàòûâàíèå îáðàòíîãî ñèãíàëà. Ïîñòàâüòå NBars_LifeMIN > 0 èëè",
    "\nîòêàæèòåñü îò èñïîëüçîâàíèÿ îáðàòíîãî ñèãíàëà íà çàêðûòèå îðäåðîâ CloseInverseSignal = False"); return (false);}
    //---- Ïðèíóäèòåëüíî çàïîëíÿåì èìÿ ñîâåòíèêà äëÿ êîììåíòàðèåâ îðäåðîâ
    if (EXP_Comment == "") EXP_Comment = StringSubstr (WindowExpertName(), StringFind (WindowExpertName(), "@") + 1);
    //---- Ñðàçó ïîñëå èíèöèàëèçàöèè íå îòêðûâàåìñÿ
    bi_curBarControlPeriod = fControl_NewBar (TF_Indicators);
    bdt_NewBar = fGet_SymbolTime (Symbol(), TF_Indicators, 0);
//----
    return (true);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Äåèíèöèàëèçèðóåì ñîâåòíèê                                                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fMineDeInit()
{
//----
    if (!bb_RealTrade) GlobalVariablesDeleteAll (bs_NameGV);
    //---- Â òåñòåðå (ïðè îïòèìèçàöèè) äàëüíåéøèå äåéñòâèÿ íå íóæíû
    if (bb_VirtualTrade) return;
    //---- Ïîä÷èùàåì ïîñëå ñåáÿ ãðàôèê
    if (ClearALLAfterTrade)
    {
        Comment ("");
        //---- Óäàëÿåì ãðàôè÷åñêèå îáúåêòû èíäèêàòîðà ñ ÷àðòà
        fObjectsDeleteAll ("sculpF", -1, -1); 
        //---- Óäàëÿåì ãðàôè÷åñêèå îáúåêòû ñîâåòíèêà ñ ÷àðòà
        fObjectsDeleteAll (bs_NameGV, -1, -1); 
        //---- Óäàëÿåì GV-ïåðåìåííûå
        GlobalVariablesDeleteAll (bs_NameGV);
    }
    else
    {
        if (ShowCommentInChart)
        {
            //---- Ïîäñ÷èòûâàåì èòîãè ðàáîòû
            fGet_Statistic (-1);
            //---- Ðèñóåì íà ãðàôèêå êîììåíòû
            fCommentInChart (bsa_Comment, fGet_StringManagerPA());
        }
    }
    //---- Óäàëÿåì ïðåäóïðåäèòåëüíûå íàäïèñè
    for (int li_IND = 0; li_IND < 3; li_IND++)
    {if (ObjectFind ("STOP" + li_IND) == 0) ObjectDelete ("STOP" + li_IND);}
    //---- "Ïåðåäûøêà"
    Sleep (500);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòû ñ îðäåðàìè                                                         |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Óïðàâëÿåì "ñâîèìè" îòêðûòûìè ïîçèöèÿìè                                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fControl_Positions()
{
    int    li_Ticket, li_LifeBar;
    string ls_Symbol = Symbol();
    bool   lb_NewBar = false;
    static datetime ldt_NewBar = 0;
    datetime ldt_BeginBar = fGet_SymbolTime (ls_Symbol, TF_STOPs, 0);
//----
    ResetLastError();
    if (ldt_NewBar != ldt_BeginBar) lb_NewBar = true;
    for (int li_pos = OrdersTotal() - 1; li_pos >= 0; li_pos--)
    {
        if (!fCheck_MyOrders (li_pos, -2)) continue;
        li_Ticket = OrderTicket();
        li_LifeBar = iBarShift (ls_Symbol, TF_Indicators, OrderOpenTime());
        //---- Ïîëó÷àåì àêòóàëüíûå äàííûå ïî ñèìâîëó
        fGet_MarketInfo (OrderSymbol(), li_Ticket);
        //---- Îðãàíèçóåì çàêðûòèå ïî ÌÀÊÑ æèçíè îðäåðà
        if (fControl_MAXLife (li_LifeBar, NBars_LifeMAX)) continue;
        //---- Îðãàíèçóåì ðàáîòó âèðòóàëüíûõ ñòîïîâ
        if (fUSE_VSTOP (li_Ticket, NBars_LifeMIN, li_LifeBar, Slippage, USE_Dinamic_TP)) continue;
        //---- Ïðîèçâîäèì óñòàíîâêó ÑÒÎÏîâ
        if (fCreat_STOPs (N_STOPs, li_Ticket, bda_Price[OrderType()], TF_STOPs, lb_NewBar, USE_VirtualSTOPs)) continue;
        //---- Òðàëèì âûáðàííóþ ïîçèöèþ
        fTrail_Position (li_Ticket, Slippage);
    }
    if (lb_NewBar) ldt_NewBar = ldt_BeginBar;
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGet_LastErrorInArray ("fControl_Positions()", bi_indERR);
//----
}
//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_row = "—————————————————————————————————\n",
                  ls_PSI = "————————————• PSI©TarasBY •————————————\n";
    static bool   lb_first = true;
    static int    li_size, li_Period = 60;
    string ls_CTRL = "", ls_BLOCK_Comment, ls_Comment = "", ls_TermsTrade,
           ls_Error = "", ls_time = "", ls_sign;
//----
    //---- Ïðè ïåðâîì çàïóñêå ôîðìèðóåì ðàáî÷èå ìàññèâû
    if (lb_first)
    {
        li_Period *= NewBarInPeriod;
        li_size = ArraySize (ar_Comment);
        ArrayResize (lsa_Time, li_size);
        ArrayResize (lsa_Comment, li_size);
        ArrayInitializeSTR (lsa_Comment, "     ");
        ArrayInitializeSTR (lsa_Time, "     ");
        ls_BeginTrade = StringConcatenate ("Terms Trade :: Begin - ", TimeToStr (bdt_BeginTrade));
        ls_Conditions = StringConcatenate ("NewBarInPeriod - ", fGet_NameTF (NewBarInPeriod), " | TF Indicators - ", fGet_NameTF (TF_Indicators),
        "\nCloseInverseSignal - ", CheckBOOL (CloseInverseSignal), " | VirtualSTOPs - ", CheckBOOL (USE_VirtualSTOPs),
        "\nDinamic SL - ", CheckBOOL (USE_Dinamic_SL), " | Dinamic TP - ", CheckBOOL (USE_Dinamic_TP), "\n");
        gdt_NewBarIndicator = fGet_SymbolTime (_Symbol, TF_Indicators, 1);
        bdt_NewBarInPeriod = fGet_SymbolTime (_Symbol, NewBarInPeriod, 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 (NewBarInPeriod > 0) {ls_time = StringConcatenate (TimeToStr (bdt_NewBarInPeriod + li_Period), " | ", TimeToStr (gdt_NewBarIndicator + TF_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_MyOrd[0], " / ", gia_MyOrd[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_Period = MathMax (0, fi_Period);
    bool     lb_CondON = true;
    datetime ldt_NewPeriod = fGet_SymbolTime (_Symbol, li_Period, 0);
//----
    ResetLastError();
    //---- Ôèêñèðóåì âðåìÿ â "íàñòîÿùèé ìîìåíò"
    bdt_curTime = TimeCurrent();
    bd_Balance = AccountBalance();
    bd_Equity = AccountEquity();
    bd_FreeMargin = AccountFreeMargin();
    bd_Margin = AccountMargin();
    //---- Ñ÷èòàåì ñòàòèñòèêó ïî çàêðûòûì îðäåðàì
    if (ldt_NewBar == ldt_NewPeriod) if (li_PreHistOrders == OrdersHistoryTotal()) if (fi_Period >= 0)
    {lb_CondON = false;}
    if (lb_CondON)
    {
        li_PreHistOrders = OrdersHistoryTotal();
        ldt_NewBar = ldt_NewPeriod;
        //---- Ïîäñ÷èòûâàåì èòîãè ðàáîòû
        bd_Pribul = fCalculate_Pribul (gia_HistoryOrders);
    }
    //---- Ïîëó÷àåì òåêóùèå çíà÷åíèÿ ïåðåìåííûõ äëÿ îòîáðàæåíèÿ íà ãðàôèêå
    fCheckInfo();
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
	   fGet_LastErrorInArray ("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 = IIF (UseMM, StringConcatenate ("MM (", DSDig (bd_LotsMM), ")", fGet_MeansType (MeansType, LotsPercent)), "L: " + DSDig (bd_LotsMM));
            ls_addConditions = StringConcatenate (IIF ((StringLen (ls_Trail) > 0), ls_Trail, ""),
            IIF ((StringLen (ls_MM) > 0), " - ", ""),
            IIF ((StringLen (ls_MM) > 0), ls_MM, ""));
            //---- Óáèðàåì " - " èç íà÷àëà ñòðîêè (åñëè åñòü)
            ls_addConditions = IIF ((StringFind (ls_addConditions, " - ") == 0), StringSubstr (ls_addConditions, 3), ls_addConditions);
            //---- Ôîðìèðóåì èíôîðìàöèîííóþ ñòðîêó
            gs_Info = StringConcatenate (bs_NameGV, ":     STOP`s", " [ ", StopLoss, "/", TakeProfit, " | ", Virtual_Order_SL, "/", Virtual_Order_TP, " ]", "\n",
            IIF ((StringLen (ls_addConditions) > 0), StringConcatenate (ls_addConditions, "\n"), ""),
            "Lots: MIN = ", DSDig (bd_MINLOT), " | MAX = ", DSDig (bd_MAXLOT), " | STEP = ", bd_LOTSTEP, "\n",
            IIF ((NewBarInPeriod < 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 (NewBarInPeriod >= 0) if (fGet_SymbolTime (_Symbol, NewBarInPeriod, 0) == 0)
        {fPrintAlert (_Symbol, NewBarInPeriod, 0); return (true);}
        if (fGet_SymbolTime (_Symbol, TF_Indicators, 0) == 0)
        {fPrintAlert (_Symbol, TF_Indicators, 1); return (true);}
    }*/
    //---- Ïðîâåðêó ïàðàìåòðîâ ïðîèçâîäèì îäèí ðàç
    //if (!lb_Continue) return (false);
    if (IsOptimization())
    {
        if (bb_OptimContinue) return (true);
        if (fGet_NumPeriods (TF_Indicators) < 0) {bb_OptimContinue = true; return (true);}
        if (NewBarInPeriod > 0) if (fGet_NumPeriods ((ENUM_TIMEFRAMES) NewBarInPeriod) < 0) {bb_OptimContinue = true; return (true);}
        //---- Ñïîðíîå óòâåðæäåíèå
        //if (TF_STOPs < TF_Indicators) {bb_OptimContinue = true; return (true);}
    }
    else {if (fSTOPTRADE()) return (true);}
    //lb_Continue = false;
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

Comments