e-PSI1ManagerTrailing

Author: Copyright � 2008-13, TarasBY WM R418875277808
Price Data Components
Series array that contains open time of each bar
Orders Execution
Checks for the total of open ordersChecks for the total of closed orders
0 Views
0 Downloads
0 Favorites
e-PSI1ManagerTrailing
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                         e-PSI@ManagerTrailing.mq4 |
//|                                    Copyright © 2010-13, Igor Stepovoi aka TarasBY |
//|                                                                taras_bulba@tut.by |
//|                                                                                   |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|   Äàííûé ïðîäóêò ïðåäíàçíà÷åí äëÿ íåêîììåð÷åñêîãî èñïîëüçîâàíèÿ. Ïóáëèêàöèÿ ðàç-  |
//|ðåøåíà òîëüêî ïðè óêàçàíèè èìåíè àâòîðà (TarasBY). Ðåäàêòèðîâàíèå èñõîäíîãî êîäà   |
//|äîïóñòèìà òîëüêî ïðè  óñëîâèè ñîõðàíåíèÿ äàííîãî òåêñòà, ññûëîê è èìåíè àâòîðà.    |
//|   Ïðîäàæà ñîâåòíèêà èëè îòäåëüíûõ å¸ ÷àñòåé ÇÀÏÐÅÙÅÍÀ.                            |
//|   Àâòîð íå íåñ¸ò îòâåòñòâåííîñòè çà âîçìîæíûå óáûòêè, ïîëó÷åííûå â ðåçóëüòàòå èñ- |
//|ïîëüçîâàíèÿ ñîâåòíèêà.                                                             |
//|   Ïî âñåì âîïðîñàì, ñâÿçàííûì ñ  ðàáîòîé ñîâåòíèêà, çàìå÷àíèÿìè èëè ïðåäëîæåíèÿìè |
//|ïî åãî äîðàáîòêå îáðàùàòüñÿ íà Skype: TarasBY èëè e-mail.                          |
//+-----------------------------------------------------------------------------------+
//|   This product is intended for non-commercial use.  The publication is only allo- |
//|wed when you specify the name of the author (TarasBY). Edit the source code is va- |
//|lid only under condition of preservation of the text, links and author's name.     |
//|   Selling a expert or(and) parts of it PROHIBITED.                                |
//|   The author is not liable for any damages resulting from the use of a expert.    |
//|   For all matters relating to the work of the expert, comments or suggestions for |
//|their improvement in the contact Skype: TarasBY or e-mail.                         |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
#property copyright "Copyright © 2008-13, TarasBY WM R418875277808; Z670270286972"
#property link      "taras_bulba@tut.by"
//IIIIIIIIIIIIIIIIIII==========Ïîäêëþ÷åííûå áèáëèîòåêè==========IIIIIIIIIIIIIIIIIIIIII+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  *****         Ïàðàìåòðû ñîâåòíèêà         *****                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
extern string   SETUP_Expert        = "========== Îáùèå íàñòðîéêè ñîâåòíèêà ==========";
extern int      NumberAccount          = 0;             // Íîìåð òîðãîâîãî ñ÷¸òà. Ðàáîòàòü òîëüêî íà óêàçàííîì ñ÷åòå. Ïðè çíà÷åíèè <=0 - íîìåð ñ÷åòà íå ïðîâåðÿåòñÿ 
extern int      MG                     = 880;           // Ìàãèê: < 0 - ëþáîé (ñî âñåìè), 0 - îòêðûòûé âðó÷íóþ, > 0 - îòêðûòûé ñîâåòíèêîì (êîíêðåòíîãî)
extern datetime TimeControl            = D'2013.01.01 00:00';// Ñ êàêîãî ìîìåíòà ïîäñ÷èòûâàåì èòîãè ðàáîòû íà ñ÷¸òå
extern int      NewBarInPeriod         = -1;            // <= 0 - ðàáîòàåì íà íà÷àëå ïåðèîäà íîâîãî áàðà, -1 - ðàáîòàåì íà êàæäîì òèêå
#include        <b-PSI@Base.mqh>                        // Áèáëèîòåêà áàçîâûõ ôóíêöèé
extern bool     OnlyCurrentSymbol      = TRUE;          // Ðàáîòàåò òîëüêî ñ òåêóùèì ñèìâîëîì èëè ñ List_Symbols
extern string   List_Symbols           = "EURUSD,GBPUSD";// Êîíòðîëèðóåìûå âàëþòíûå ïàðû
extern int      NBars_LifeMIN          = 0;             // Ìèíèìàëüíàÿ "æèçíü" îðäåðà â NBars_LifeMIN áàðîâ íà ïåðèîäå ãðàôèêà
extern int      NBars_LifeMAX          = -1;            // Ìàêñèìàëüíàÿ "æèçíü" îðäåðà â NBars_LifeMAX áàðîâ íà ïåðèîäå ãðàôèêà (0 - îðäåðà æèâóò äî êîíöà òåêóùèõ ñóòîê)
#include        <b-PSI@STOPs_Light.mqh>                 // Áèáëèîòåêà ñîçäàíèÿ è êîíòðîëÿ ÑÒÎÏîâ
#include        <b-PSI@TrailSymbol.mqh>                 // Áèáëèîòåêà òðåéëèíãà
#include        <b-PSI@PartClose_Light.mqh>             // Áèáëèîòåêà ÷àñòè÷íîãî çàêðûòèÿ îðäåðîâ
#include        <b-PSI@ManagerPA.mqh>                   // Áèáëèîòåêà ïî óïðàâëåíèþ îáùèì ïðîôèòîì ñîâåòíèêà
extern string   Setup_Services      = "=================== SERVICES ==================";
extern bool     ShowCommentInChart     = TRUE;          // Ïîêàçûâàòü êîììåíòàðèé. 
extern bool     PrintCom               = TRUE;          // Ïå÷àòàòü êîììåíòàðèé.
extern bool     SoundAlert             = FALSE;         // Çâóê
extern bool     CreatVStopsInChart     = FALSE;         // Ðèñîâàòü íà ÷àðòå âèðòóàëüíûå ñòîïû (åñëè çàäåéñòâîâàíû)
extern bool     ClearALLAfterTrade     = FALSE;         // Î÷èñòêà ãðàôèêà è GV-ïåðåìåííûõ ïîñëå ñåáÿ
#include        <b-PSI@Trade_Light.mqh>                 // Áèáëèîòåêà òîðãîâûõ îïåðàöèé
extern string   Setup_Tester        = "=================== Tester ====================";
extern int      InTesterOrder          = 1;             // Ðàáîòàåò òîëüêî â òåñòåðå äëÿ ïðîâåðêè. 1 - áàé, -1 - ñåëë 
//IIIIIIIIIIIIIIIIIII======Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà======IIIIIIIIIIIIIIIIIIIIII+
string          gs_Base, gs_Info;
int             gi_SL = 200, gia_HistoryOrders[3], gia_MyOrders[2];
bool            flag_BadAccount = false, gb_Pause = false;
//IIIIIIIIIIIIIIIIIII==========Ïîäêëþ÷åííûå áèáëèîòåêè==========IIIIIIIIIIIIIIIIIIIIII+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  Custom expert initialization function                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int init()
{
    int err = GetLastError();
//----
    //---- Èñêëþ÷àåì ñëó÷àéíóþ ðàáîòó ñîâåòíèêà
    if (!fCheck_MyAccount()) return (0);
    //---- Ïðîâåðÿåì ïåðåäàííûå â ñîâåòíèê âíåøíèå ïàðàìåòðû
    if (!fCheck_ExternParameters()) {bb_OptimContinue = true; return (0);}
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó áàçîâûõ ôóíêöèé
    fInit_Base (List_Symbols, MG, Period(), ShowCommentInChart, PrintCom, SoundAlert, CreatVStopsInChart);
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó óïðàâëåíèÿ îáùèì ïðîôèòîì
    if (!fInit_ManagerPA()) return (0);
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó ÑÒÎÏîâ
    if (!fInit_STOPs()) return (0);
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó ÷àñòè÷íîãî çàêðûòèÿ
    if (!fInit_PartClose()) return (0);
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó òðåéëèíãà
    if (!fInit_Trail (fGet_PeriodFromNum (fGet_NumPeriods (TF_STOPs) + 1))) return (0);
    //---- Ñîáèðàåì ïåðâîíà÷àëüíóþ ñòàòèñòèêó
    fGet_Statistic (-1);
    //---- Ó÷èòûâàåì ðàçðÿäíîñòü êîòèðîâîê
    fCheck_Decimal();
    if (OnlyCurrentSymbol || !bb_RealTrade) {bs_SymbolList = Symbol();}
    bs_ExpertName = StringConcatenate (WindowExpertName(), "[", IIFs (MG >= 0, MG, "ALL"), "]:  ", fGet_NameTF (Period()), "_", Symbol());
    //---- Ïîëó÷àåì äàòû íà÷àëà è ïîñëåäíåãî òðåéäèíãà
    bdt_BeginTrade = fGet_TermsTrade (bdt_LastTrade);
    //---- Ãîòîâèì êîììåíòû
    fPrepareComments();
    //---- Ïîä÷èùàåì GV-ïåðåìåííûå
    if (!bb_RealTrade)
    {
        GlobalVariablesDeleteAll (bs_NameGV);
        TimeControl = D'1990.01.01 00:00';
    }
    if (!bb_VirtualTrade) {if (bb_OptimContinue) Alert ("Ïðîâåðüòå ëîã! ÍÀÑÒÐÎÉÊÈ ÍÅ Â ÏÎÐßÄÊÅ !!!");}
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
	 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 (flag_BadAccount) {return (0);}
    //---- Åñëè åñòü íåâåðíûå íàñòðîéêè
    if (fSTOPTRADE()) return (0);
//----
    int err = GetLastError();
//----
    //---- Îòêðûâàåì â òåñòîâîì ðåæèìå îðäåðà
    fOrderSend_Tester();
    //---- Ñ÷èòàåì "ñâîè" îðäåðà
    bi_MyOrders = fMyPositions (bd_ProfitCUR);
    //---- Ñîáèðàåì ñòàòèñòèêó
    fGet_Statistic (PERIOD_D1);
    //---- Çàïóñêàåì â ðàáîòó ðàáî÷èå èíäèêàòîðû ôîðìèðîâàíèÿ ÑÒÎÏîâ
    fCheck_MyIndicatorsSTOP (bs_Symbol);
    //---- Âûâîäèì èíôîðìàöèþ íà ãðàôèê (åñëè ðàçðåøåíî)
    if (ShowCommentInChart) {fCommentInChart (bsa_Comment, fGet_StringManagerPA());}
    //---- Âõîäèì â íà÷àëå óêàçàííîãî áàðà (åñëè NewBarInPeriod >= 0)
    if (!fCheck_NewBarInPeriod (NewBarInPeriod)) return (0);
    //---- Çàïóñêàåì â ðàáîòó áèáëèîòåêó óïðàâëåíèÿ îáùèì ïðîôèòîì ñîâåòíèêà
    if (fManagerPA (bd_ProfitCUR, bd_Balance, bi_MyOrders > 0)) bi_MyOrders = 0;
    //---- Îðãàíèçîâûâàåì óïðàâëåíèå îòêðûòûìè îðäåðàìè
    if (!bb_TSProfit) {if (bi_MyOrders > 0) fControl_Positions();}
    bb_first = false;
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
	 fGet_LastErrorInArray (bsa_Comment, "start()", bi_indERR);
//----
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ïðîâåðÿåì íàëè÷èå "ñâîèõ" îòêðûòûõ ïîçèöèé                                 |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fMyPositions (double& fd_Profit)      // Âîçâðàùàåìûé ïðîôèò îòêðûòûõ îðäåðîâ
{
    int li_ord = 0, li_total = OrdersTotal();
//----
    fd_Profit = 0.0;
    ArrayInitialize (gia_MyOrders, 0);
    if (li_total == 0) {return (0);}
    for (int li_pos = li_total - 1; li_pos >= 0; li_pos--)
    {
        if (!fCheck_MyOrders (li_pos, -2)) continue;
        fd_Profit += (OrderProfit() + OrderSwap() + OrderCommission());
        gia_MyOrders[OrderType()]++;
        li_ord++;
    }
//----
    return (li_ord);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòû ñ îðäåðàìè                                                         |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Óïðàâëÿåì "ñâîèìè" îòêðûòûìè ïîçèöèÿìè                                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fControl_Positions()
{
    int      li_Type, li_Ticket, li_LifeBar, err = GetLastError();
    double   ld_Profit;
    bool     lb_NewBar = false;
    datetime ldt_BeginBar = fGet_SymbolTime (Symbol(), TF_STOPs, 0);
    static datetime ldt_NewBar = 0;
//----
    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 (Symbol(), TF_STOPs, 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[bi_Type], TF_STOPs, lb_NewBar, USE_VirtualSTOPs)) continue;
        //---- Òðàëèì âûáðàííóþ ïîçèöèþ
        if (fTrail_Position (li_Ticket, Slippage) == 0) continue;
        if (!PartClose_ON) continue;
        ld_Profit = OrderProfit() + OrderCommission() + OrderSwap();
        //---- Êîíòðîëèðóåì ÷àñòè÷íîå çàêðûòèå îðäåðîâ
        if (ld_Profit > 0.0) {fPartClose (li_Ticket, Slippage, USE_VirtualSTOPs);}
    }
    if (lb_NewBar) ldt_NewBar = ldt_BeginBar;
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGet_LastErrorInArray (bsa_Comment, "fControl_Positions()", bi_indERR);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ôëàã óáûòî÷íîñòè ïîñëåäíåãî çàêðûòîãî îðäåðà                               |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fIs_LossLastPos()
{
    datetime ldt_CloseTime;
    int li_Ticket = -1, li_total = OrdersHistoryTotal();
//----
    for (int li_ORD = li_total - 1; li_ORD >= 0; li_ORD--)
    {
        if (!fCheck_MyOrders (li_ORD, -2, MODE_HISTORY)) continue;
        if (ldt_CloseTime >= OrderCloseTime()) continue;
        ldt_CloseTime = OrderCloseTime();
        li_Ticket = OrderTicket();
    }
    if (OrderSelect (li_Ticket, SELECT_BY_TICKET, MODE_HISTORY))
    {if (OrderProfit() < 0) return (True);}
//----
    return (False);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Îáùèå ôóíêöèè                                                             |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ó÷èòûâàåì ðàçðÿäíîñòü êîòèðîâîê                                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fCheck_Decimal()
{
//----
    gi_SL *= bi_Decimal;
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//         Ïðîâåðÿåì ïåðåäàííûå â ñîâåòíèê âíåøíèå ïàðàìåòðû.                         |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCheck_ExternParameters()
{
//----
    bs_ERROR = "";
    //---- Ïðîâåðÿåì ðàçðåøåíèå ñîâåòíèêó íà òîðãîâëþ
    if (!IsTesting()) {if (!IsOptimization()) if (!IsExpertEnabled()) return (false);}
    //---- Ñîçäà¸ì ïðåôèêñ GV-ïåðåìåííûõ ñîâåòíèêà
    bs_NameGV = "ManagerTrailing";
    if (NewBarInPeriod == 0) NewBarInPeriod = Period();
    //---- Ïîëó÷àåì òåêóùåå çíà÷åíèÿ ïðåäûäóùèì áàðîì
    bdt_NewBarInPeriod = fGet_SymbolTime (Symbol(), MathMax (0, NewBarInPeriod), 1);
//----
    return (true);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Äåèíèöèàëèçèðóåì ñîâåòíèê                                                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fMineDeInit()
{
//----
    //---- Óäàëÿåì ïîñëå ñåáÿ GV-ïåðåìåííûå
    if (!bb_RealTrade) {GlobalVariablesDeleteAll (bs_NameGV);}
    //---- Ïîä÷èùàåì ïîñëå ñåáÿ ãðàôèê
    if (ClearALLAfterTrade)
    {
        Comment ("");
        //---- Óäàëÿåì ãðàôè÷åñêèå îáúåêòû ñ ÷àðòà
        fObjectsDeleteAll (bs_NameGV, -1, 0); 
        //---- Óäàëÿåì GV-ïåðåìåííûå
        GlobalVariablesDeleteAll (bs_NameGV);
    }
    else
    {
        //---- Ïîäñ÷èòûâàåì èòîãè ðàáîòû
        fGet_Statistic (-1);
        //---- Ðèñóåì íà ãðàôèêå êîììåíòû
        if (ShowCommentInChart) {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);}
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: MONEY MANAGEMENT                                                          |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ñ÷èòàåì èòîãè ðàáîòû ïî ñâîèì îðäåðàì                                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fCalculate_Pribul (int& ar_HistoryOrders[3],    // âîçâàðùàåìûé ìàññèâ çàêðûòûõ îðäåðîâ ïî òð¸ì òèïàì îðäåðîâ
                          int fi_OP = -2,              // òèï (BUY\SELL) ó÷èòûâàåìûõ îðäåðîâ
                          datetime fdt_TimeBegin = 0)  // ìîìåíò âðåìåíè, ñ êîòîðîãî ïðîèçâîäèì ðàñ÷¸ò
{
    double   ld_Pribul = 0.0;
    int      li_Type, history_total = OrdersHistoryTotal(), li_Ticket,
             err = GetLastError();
    datetime ldt_preLastTrade = bdt_LastTrade - 1209600;
//----
    ArrayInitialize (ar_HistoryOrders, 0);
    for (int li_ORD = 0; li_ORD < history_total; li_ORD++)
    {
        if (!fCheck_MyOrders (li_ORD, fi_OP, MODE_HISTORY)) continue;
        if (fdt_TimeBegin > OrderCloseTime()) continue;
        li_Type = OrderType();
        ld_Pribul += (OrderProfit() + OrderSwap() + OrderCommission());
        ar_HistoryOrders[2]++;
        ar_HistoryOrders[li_Type]++;
        if (bdt_LastTrade < OrderCloseTime()) bdt_LastTrade = OrderCloseTime();
        //---- Îðãàíèçóåì óäàëåíèå GV-ïåðåìåííûõ çà ïîñëåäíèõ 2-íåäåëè
        if (!bb_ClearGV) continue;
        if (ldt_preLastTrade >= OrderCloseTime()) continue;
        li_Ticket = OrderTicket();
        //---- Ïåðåäà¸ì ñâîéñòâà îò ðîäèòåëüñêîãî îðäåðà ê äî÷åðíåìó
        if (fTransmit_Sets (li_Ticket)) continue;
        //---- Ïîä÷èùàåì îòðàáîòàâøèå GV-ïåðåìåííûå
        fClear_WasteGV (bsa_prefGV, li_Ticket);
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
	 fGet_LastErrorInArray (bsa_Comment, "fCalculate_Pribul()", bi_indERR);
//----
    return (ld_Pribul);
}
//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);
    bool     lb_CondON = true;
    datetime ldt_NewPeriod = fGet_SymbolTime (Symbol(), li_Period, 0);
//----
    //---- Ôèêñèðóåì âðåìÿ â "íàñòîÿùèé ìîìåíò"
    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, -2, TimeControl);
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
	 fGet_LastErrorInArray (bsa_Comment, "fGet_Statistic()", bi_indERR);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ïåðåäà¸ì ñâîéñòâà îò ðîäèòåëüñêîãî îðäåðà ê äî÷åðíåìó                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fTransmit_Sets (string fs_Ticket)    // Ticket
{
    string ls_Name, ls_NameChild;
    int    li_ChildTicket = fGet_ÑhildTicket (OrderComment());
    static string lsa_NameGV[] = {"_#VirtSL","_#VirtTP","_#BU","_#STOP"};
//---- 
    //---- Åñëè åñòü äî÷åðíèé îðäåð, èùåì åãî ñðåäè çàêðûòûõ
    if (li_ChildTicket == 0) return (false);
    if (!OrderSelect (li_ChildTicket, SELECT_BY_TICKET)) return (false);
    //---- Åñëè îðäåð çàêðûò - íàñëåäîâàòü íå÷åãî
    if (OrderCloseTime() > 0) return (false);
    for (int li_GV = 0; li_GV < 4; li_GV++)
    {
        //---- Íàñëåäóåì äàííûå îò ðîäèòåëüñêîãî îðäåðà ê äî÷åðíåìó
        ls_Name = StringConcatenate (fs_Ticket, lsa_NameGV[li_GV]);
        if (!GlobalVariableCheck (ls_Name)) continue;
        ls_NameChild = StringConcatenate (li_ChildTicket, lsa_NameGV[li_GV]);
        if (GlobalVariableCheck (ls_NameChild)) continue;
        GlobalVariableSet (ls_NameChild, GlobalVariableGet (ls_Name));
    }
//----
    return (true);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ïî Òèêåòó ïîä÷èùàåì îòðàáîòàâøèå GV-ïåðåìåííûå                             |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fClear_WasteGV (string ar_NameGV[],  // ìàññèâ ñ ïðåôèêñàìè âðåìåííûõ GV-ïåðìåííûõ
                     string fs_Ticket)    // Ticket
{
    string ls_Name;
    int    li_size = ArraySize (ar_NameGV);
//---- 
    for (int li_IND = 0; li_IND < li_size; li_IND++)
    {
        ls_Name = StringConcatenate (fs_Ticket, ar_NameGV[li_IND]);
        if (GlobalVariableCheck (ls_Name)) GlobalVariableDel (ls_Name);
    }
//---- 
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ïîëó÷àåì Ticket äî÷åðíåãî îðäåðà                                           |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_ÑhildTicket (string fs_Comment)
{
    int li_N1 = StringFind (fs_Comment, "to");
//----
    if (li_N1 >= 0)
    {
        int li_N2 = StringFind (fs_Comment, "#");
        if (li_N2 > li_N1)
        {return (StrToInteger (StringSubstr (fs_Comment, li_N2 + 1, StringLen (fs_Comment) - li_N2 - 1)));}
    }
//----
    return (0);
}
//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_row = "—————————————————————————————————\n",
                  ls_PSI = "————————————• PSI©TarasBY •————————————\n";
    static int    li_size, li_size_CommTime, li_Period = 60;
    string ls_CTRL = "", ls_BLOCK_Comment, ls_Comment = "",
           ls_Error = "", ls_time = "", ls_sign, ls_TermsTrade;
//----
    //---- Ïðè ïåðâîì çàïóñêå ôîðìèðóåì ðàáî÷èå ìàññèâû
    if (bb_first)
    {
        li_Period *= NewBarInPeriod;
        li_size = ArraySize (ar_Comment);
        ArrayResize (lsa_Time, li_size);
        ArrayResize (lsa_Comment, li_size);
        InitializeArray_STR (lsa_Comment, "");
        InitializeArray_STR (lsa_Time, "");
        ls_BeginTrade = StringConcatenate ("Terms Trade :: Begin - ", TimeToStr (bdt_BeginTrade));
        //bdt_NewBarInPeriod = fGet_SymbolTime (Symbol(), NewBarInPeriod, 0);
    }
    //---- ÁËÎÊ ÊÎÌÌÅÍÒÀÐÈÅÂ
    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), ls_time);}
    ls_TermsTrade = StringConcatenate (ls_BeginTrade, " | Last - ", TimeToStr (bdt_LastTrade), "\n");
    //---- Ôîðìèðóåì ÂÑÅ áëîêè êîììåíòàðèåâ
    ls_BLOCK_Comment = StringConcatenate (bs_ExpertName, "\n", ls_row, gs_Info, "\n",
                 gs_Base, ls_time, "\n",
                 ls_TermsTrade,
                 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 fPrepareComments()
{
    string ls_txt;
//---- 
    if (ShowCommentInChart)
    {
        if (!OnlyCurrentSymbol)
        {
            string ls_ListSymbols = IIFs (List_Symbols == "", "íà ëþáûõ èíñòðóìåíòàõ", "íà èíñòðóìåíòàõ:\n" + bs_SymbolList);
            if (NumberAccount > 0)
            {gs_Info = StringConcatenate ("Ðàáîòàåì íà ñ÷¸òå ¹", AccountNumber(), " ñ îðäåðàìè ", ls_ListSymbols);}
            if (NumberAccount == 0)
            {gs_Info = StringConcatenate ("Ðàáîòàåì íà òåêóùåì ñ÷¸òå ñ îðäåðàìè ", ls_ListSymbols);}
        }
        else
        {
            ls_ListSymbols = StringConcatenate ("c ", bs_SymbolList);
            if (NumberAccount > 0)
            {gs_Info = StringConcatenate ("Ðàáîòàåì íà ñ÷¸òå ¹", AccountNumber(), " òîëüêî ñ îðäåðàìè ", Symbol(), ".");}
            if (NumberAccount == 0)
            {gs_Info = StringConcatenate ("Ðàáîòàåì íà òåêóùåì ñ÷¸òå òîëüêî ñ îðäåðàìè ", Symbol(), ".");}
        }
        if (!ValueInCurrency)
        {gs_Base = StringConcatenate ("Ðàñ÷¸ò â ïðîöåíòàõ îò äåïîçèòà.\nTrailProfit_ON = ", CheckBOOL (TrailProfit_ON), "; TrailProfit_StartPercent = ", DoubleToStr (TrailProfit_StartPercent, 1), " %; TrailProfit_LevelPercent = ", DoubleToStr (TrailProfit_LevelPercent, 1), " %",
        "\nTakeProfit_ON = ", CheckBOOL (TakeProfit_ON), "; TPPercent = ", DoubleToStr (TP_AdvisorPercent, 1), " %; StopLoss_ON = ", CheckBOOL (StopLoss_ON), "; SLPercent = ", DoubleToStr (SL_AdvisorPercent, 1), " %");}
        else {gs_Base = StringConcatenate ("Ðàñ÷¸ò â âàëþòå äåïîçèòà.\nTrailProfit_ON = ", CheckBOOL (TrailProfit_ON), "; TrailProfit_Start = ", bs_sign, DS0 (TrailProfit_Start), "; TrailProfit_Level = ", bs_sign, DS0 (TrailProfit_Level),
        "\nTakeProfit_ON = ", CheckBOOL (TakeProfit_ON), "; TakeProfit = ", bs_sign, DS0 (TP_Advisor), "; StopLoss_ON = ", CheckBOOL (StopLoss_ON), "; StopLoss = ", bs_sign, DS0 (SL_Advisor));}
        gs_Base = StringConcatenate (gs_Base, "\n", IIFs ((NewBarInPeriod < 0), "Ðàáîòàåì íà êàæäîì òèêå", "ÏÀÓÇÀ äî: "));
    }
    if (ls_ListSymbols != "")
    {
        ls_txt = StringConcatenate ("Ñîâåòíèê áóäåò ðàáîòàòü ", ls_ListSymbols);
        Print (ls_txt);
    }
    Print (IIFs ((MG == 0), "Áåç êîíòðîëÿ ïî MAGIC !!!", StringConcatenate ("Ñ êîíòðîëåì ïî MAGIC = ", MG, " !!!")));
//---- 
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Èñêëþ÷àåì ñëó÷àéíóþ ðàáîòó ñîâåòíèêà                                       |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCheck_MyAccount()
{
//----
    if (NumberAccount > 0)
    {
        if (AccountNumber() != NumberAccount)
        {
            flag_BadAccount = true;
            Alert ("Íå ïðàâèëüíûé íîìåð ñ÷åòà");
            return (false);
        }
    }      
//----
    return (true);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: TESTER                                                                    |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Îòêðûâàåì â òåñòîâîì ðåæèìå îðäåðà                                         |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fOrderSend_Tester()
{
//---- 
    if (!IsTesting()) return;
    static datetime ldt_NewBar = 0;
    datetime ldt_curBar = fGet_SymbolTime (Symbol(), PERIOD_H4, 0);
    if (OrdersTotal() < 3) if (ldt_NewBar != ldt_curBar)
    {
        if (fIs_LossLastPos()) {InTesterOrder = IIFi ((InTesterOrder == 1), -1, 1);}
        if (InTesterOrder == 1)
        {fOrderSend (Symbol(), OP_BUY, 0.6, NDD (Ask), 2, 0., 0., NULL, MathMax (MG, 0));}
        if (InTesterOrder == -1)
        {fOrderSend (Symbol(), OP_SELL, 0.6, NDD (Bid), 2, 0., 0., NULL, MathMax (MG, 0));}
        ldt_NewBar = ldt_curBar;
    }
//---- 
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---