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-PSIgSAR
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                                     e-PSI@SAR.mq4 |
//|                                       Copyright © 2012, Igor Stepovoi aka TarasBY |
//|                                                                taras_bulba@tut.by |
//|                                                                                   |
//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    MagicNumber              = 2012;
extern int    NewBarInPeriod           = 1;                // >= 0 - ðàáîòàåì íà íà÷àëå ïåðèîäà íîâîãî áàðà, -1 - ðàáîòàåì íà êàæäîì òèêå
extern int    TF_Indicators            = PERIOD_H1;        // Ïåðèîä, íà êîòîðîì ðàáîòàþò èíäèêàòîðû
//IIIIIIIIIIIIIIIIIII==========Ïîäêëþ÷åííûå áèáëèîòåêè==========IIIIIIIIIIIIIIIIIIIIII+
#include      <b-PSI@Base.mqh>                             // Áèáëèîòåêà áàçîâûõ ôóíêöèé
#include      <b-PSI@STOPs_Light.mqh>                      // Áèáëèîòåêà ñîçäàíèÿ è êîíòðîëÿ ÑÒÎÏîâ
#include      <bc-PSI@SAR_Complete_Light.mqh>              // Áèáëèîòåêà ïîëó÷åíèÿ ñèãíàëîâ
#include      <b-PSI@MM_Light.mqh>                         // Áèáëèîòåêà óïðàâëåíèÿ êàïèòàëîì
#include      <b-PSI@NET_Light.mqh>                        // Áèáëèîòåêà òîðãîâëè ñåòüþ îðäåðîâ
#include      <b-PSI@Trail_Stairs.mqh>                     // Áèáëèîòåêà òðåéëèíãà îðäåðîâ (ñòàíäàðòíàÿ)
#include      <b-PSI@ManagerPA.mqh>                        // Áèáëèîòåêà ïî óïðàâëåíèþ îáùèì ïðîôèòîì ñîâåòíèêà
#include      <b-PSI@Services_Light.mqh>                   // Áèáëèîòåêà ñåðâèñíûõ ïåðåìåííûõ
#include      <b-PSI@Trade_Light.mqh>                      // Áèáëèîòåêà ôóíêöèé òîðãîâûõ îïåðàöèé
//IIIIIIIIIIIIIIIIIII======Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà======IIIIIIIIIIIIIIIIIIIIII+
double        gda_Lots[2];
int           gia_MyOrders[2], gia_HistoryOrders[3];
string        gs_Info;
bool          gb_VirtSTOPs;                                // ôëàã íàëè÷èÿ ó îðäåðîâ âèðòóàëüíûõ ÑÒÎÏîâ
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                  Custom expert initialization function                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int init()
{
    int err = GetLastError();
//----
    //---- Ïðîâåðÿåì ïåðåäàííûå â ñîâåòíèê âíåøíèå ïàðàìåòðû
    if (!fCheck_ExternParameters()) {bb_OptimContinue = true; return (0);}
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó áàçîâûõ ôóíêöèé
    fInit_Base (Symbol(), MagicNumber, TF_Indicators, ShowCommentInChart, PrintCom, SoundAlert, CreatVStopsInChart);
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó óïðàâëåíèÿ îáùèì ïðîôèòîì
    if (!fInit_ManagerPA()) return (0);
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó ÑÒÎÏîâ
    if (!fInit_STOPs()) return (0);
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó òðåéëèíãà
    if (!fInit_Trail()) return (0);
    //---- Ñîáèðàåì ïåðâîíà÷àëüíóþ ñòàòèñòèêó
    fGet_Statistic (-1);
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó MM
    bd_LotsMM = fInit_MM (Order_Lots, MagicNumber);
    //---- Èíèöèàëèçèðóåì áèáëèîòåêó ïîñòðîåíèÿ ñåòè
    if (!fInit_NET()) return (0);
    //---- Ïîëó÷àåì äàòû íà÷àëà è ïîñëåäíåãî òðåéäèíãà
    bdt_BeginTrade = fGet_TermsTrade (bs_Symbol, MagicNumber, bdt_LastTrade);
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    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);
    //---- Ôèêñèðóåì íà÷àëî òåêóùåãî êîíòðîëüíîãî áàðà
    bdt_BeginNewBar = iTime (bs_Symbol, TF_Indicators, 0);
//----
    int err = GetLastError();
//----
    //---- Ñ÷èòàåì "ñâîè" îðäåðà
    bi_MyOrders = fMyPositions (bd_ProfitCUR, gia_MyOrders, MagicNumber);
    //---- Óïðàâëÿåì ëèíèåé ÁåçÓáûòêà
    fControl_BreakEven (gda_Lots);
    //---- Ñîáèðàåì ñòàòèñòèêó
    fGet_Statistic (PERIOD_D1);
    //---- Âûâîäèì èíôîðìàöèþ íà ãðàôèê (åñëè ðàçðåøåíî)
    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;
        //---- Îáíóëÿåì ñ÷¸ò÷èê ñåðèè
        bi_curOrdersInSeries = 0;
        //---- Íà ýòîì áàðå áîëüøå íå âõîäèì
        bdt_NewBar = bdt_BeginNewBar;
        return (0);
    }
    //---- Îðãàíèçîâûâàåì óïðàâëåíèå îòêðûòûìè îðäåðàìè
    if (bi_MyOrders > 0)
    {
        //---- Îðãàíèçóåì çàêðûòèå îðäåðîâ ïî ïîêàçàíèÿì èíäèêàòîðîâ
        if (!bb_TSProfit)
        {
            //---- Îðãàíèçóåì çàêðûòèå îðäåðîâ ïî ïîêàçàíèÿì èíäèêàòîðîâ
            if (fClose_Control()) return (0);
            //---- Îðãàíèçóåì ðàáîòó âèðòóàëüíûõ ÑÒÎÏîâ è òðåéëèíãà îðäåðîâ
            else fControl_Positions();
        }
    }
    else bi_cntTrades = 0;
    //---- Ñëåäèì çà ðûíêîì íà íà÷àëå îòêðûòèÿ áàðà TF_Indicators
    if (bdt_NewBar != bdt_BeginNewBar)
    {      
        //---- Çàíîñèì â ìàññèâ òåêóùèå öåíû
        RefreshRates();
        for (int li_IND = 0; li_IND < 2; li_IND++)
        {bda_Price[li_IND] = fGet_TradePrice (li_IND, bb_RealTrade, bs_Symbol);}
        //---- Ïîëó÷àåì ñèãíàëû îò èíäèêàòîðîâ
        int li_Send = fSend_Control (bi_TREND);
        //----Ñòðîèì ñåòü îðäåðîâ
        fControl_NET (MagicNumber, gia_HistoryOrders[2], bd_BaseBalance, bd_ProfitCUR, Order_Lots, bd_LotsMM, EXP_Comment, li_Send, bb_IsOpenOrders, SendOnlyOrders, Slippage);
        bdt_NewBar = bdt_BeginNewBar;
    }
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGet_LastErrorInArray (bsa_Comment, "start()", bi_indERR);
//----
    return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Çàêðûâàåìñÿ ïî ïîêàçàíèÿì èíäèêàòîðîâ                                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fClose_Control()
{
//----
    int li_SignalClose;
    if (fGet_SignalClose (bs_Symbol, TF_Indicators, Use_close_IND, li_SignalClose, SignalCloseOnBar, VerificationCloseBars))
    {
        if (gia_MyOrders[li_SignalClose] > 0)
        {
            double ld_Pribul;
            if (fClose_AllOrders (bs_Symbol, MagicNumber, ld_Pribul, li_SignalClose, NBars_LifeMIN, TF_Indicators) > 0)
            {fWrite_Log (StringConcatenate ("Çàêðûëèñü ïî ñèãíàëó èíäèêàòîðà. Ðåçóëüòàò = ", bs_sign, DSDig (ld_Pribul)), 4); return (true);}
        }
    }
//----
    return (false);
}
//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
    {
        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+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//         Ïðîâåðÿåì ïåðåäàííûå â ñîâåòíèê âíåøíèå ïàðàìåòðû.                         |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCheck_ExternParameters()
{
//----
    bs_ERROR = "";
    //---- Ïðîâåðÿåì ðàçðåøåíèå ñîâåòíèêó íà òîðãîâëþ
    if (!IsTesting() && !IsOptimization()) {if (!IsExpertEnabled()) {return (false);}}
    //---- Ïðîâåðÿåì êîððåêòíîñòü ââåä¸ííûõ äàííûõ
    if (!fCheck_ExternParametersSAR()) {return (false);}
    //---- Ñîçäà¸ì ïðåôèêñ GV-ïåðåìåííûõ ñîâåòíèêà
    bs_NameGV = StringConcatenate ("SAR[", MagicNumber, "]");
    if (NewBarInPeriod == 0) {NewBarInPeriod = Period();}
    if (TF_Indicators == 0) {TF_Indicators = Period();}
    if (IsOptimization()) {if (DeleteBallastOrders == 1) USE_Dinamic_TP = True;}
    else {if (DeleteBallastOrders == 1) if (!USE_Dinamic_TP)
    {bs_ERROR =  "Ïîñòàâüòå USE_Dinamic_TP = True èëè DeleteBallastOrders != 1!!!"; return (false);}}
    //---- Ïðèíóäèòåëüíî çàïîëíÿåì èìÿ ñîâåòíèêà äëÿ êîììåíòàðèåâ îðäåðîâ
    if (EXP_Comment == "") EXP_Comment = StringSubstr (WindowExpertName(), StringFind (WindowExpertName(), "@") + 1);
    gb_VirtSTOPs = USE_VirtualSTOPs || VirtualTrail_ON;
    //---- Ñðàçó ïîñëå èíèöèàëèçàöèè íå îòêðûâàåìñÿ
    bdt_NewBar = iTime (Symbol(), TF_Indicators, 0);
//----
    return (true);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòû ñ îðäåðàìè                                                         |
//|***********************************************************************************|
//+===================================================================================+
//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;
        //---- Ïîäñ÷èòûâàåì ñóììàðíûé Profit îòêðûòûõ ïîçèöèé
        fd_Profit += (OrderProfit() + OrderSwap() + OrderCommission());
        //---- Ïîäñ÷èòûâàåì îðäåðà ïî èõ òèïó (BUY/SELL)
        ar_MyOrders[OrderType()]++;
        //---- Ïîäñ÷èòûâàåì ñóììàðíîå êîëè÷åñòâî îòêðûòûõ ïîçèöèé
        li_ord++;
        //---- Ïîäñ÷èòûâàåì ñóììàðíûé ëîò îòêðûòûõ ïîçèöèé
        gda_Lots[OrderType()] += OrderLots();
    }
//----
    return (li_ord);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Óïðàâëÿåì "ñâîèìè" îòêðûòûìè ïîçèöèÿìè                                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fControl_Positions()
{
    int    li_Ticket, li_LifeBar, err = GetLastError();
    double ld_Profit;
    bool   lb_NewBar = false;
    static datetime ldt_NewBar = 0;
    datetime ldt_BeginBar = iTime (NULL, TF_STOPs, 0);
//----
    if (ldt_NewBar != ldt_BeginBar) lb_NewBar = true;
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if (!OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continue;
        if (OrderSymbol() != bs_Symbol) continue;
        if (OrderMagicNumber() != MagicNumber) if (MagicNumber >= 0) continue;
        if (OrderType() > 1) continue;
        li_Ticket = OrderTicket();
        //---- Îïðåäåëÿåì "æèçíü" îðäåðà â TF_Indicators áàðàõ
        li_LifeBar = iBarShift (Symbol(), TF_Indicators, OrderOpenTime());
        //---- Ïîëó÷àåì àêòóàëüíûå äàííûå ïî ñèìâîëó
        fGet_MarketInfo (bs_Symbol);
        //---- Îðãàíèçóåì çàêðûòèå ïî ÌÀÊÑ æèçíè îðäåðà
        if (fControl_MAXLife (li_LifeBar, NBars_LifeMAX)) continue;
        //---- Ìîäèôèöèðóåì 1-ûé îðäåð è ñàìûé ïîñëåäíèé â ñåðèè, èëè âñå, åñëè óäàëÿåì áàëëàñòíûå îðäåðà
        if (!DeleteBallastOrders) if (bi_curOrdersInSeries != 1) {if (bi_curOrdersInSeries != Max_trades + bi_cntTrades) continue;}
        //---- Îðãàíèçóåì ðàáîòó âèðòóàëüíûõ ñòîïîâ
        if (Virtual_Order_SL != 0 || Virtual_Order_TP != 0 || USE_VirtualSTOPs)
        {
            //---- Êîíòðîëèðóåì "æèçíü" îðäåðà
            if ((NBars_LifeMIN > 0 && NBars_LifeMIN < li_LifeBar) || NBars_LifeMIN == 0)
            {if (fVirtualSTOPs (li_Ticket, Virtual_Order_SL, Virtual_Order_TP, Slippage)) continue;}
        }
        //---- Ïðîèçâîäèì óñòàíîâêó ÑÒÎÏîâ
        if (lb_NewBar || !GlobalVariableCheck (StringConcatenate (li_Ticket, "_#STOP")))
        {if (fCreat_STOPs (N_STOPs, li_Ticket, bda_Price[OrderType()], TF_STOPs, USE_VirtualSTOPs, (bi_curOrdersInSeries != Max_trades + bi_cntTrades))) continue;}
        //---- Óäàëÿåì áàëëàñòíûå îðäåðà
        if (DeleteBallastOrders == 1) if (fDelete_BallastOrders (li_Ticket, Slippage, gb_VirtSTOPs, bi_MyOrders > 1)) {bi_MyOrders--; continue;}
        //---- Òðàëèì âûáðàííóþ ïîçèöèþ
        fTrail_Position (li_Ticket, Slippage);
    }
    if (lb_NewBar) ldt_NewBar = ldt_BeginBar;
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
    fGet_LastErrorInArray (bsa_Comment, "fControl_Positions()", bi_indERR);
//----
    return;
}
//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 *= NewBarInPeriod;
        li_size = ArraySize (ar_Comment);
        ArrayResize (lsa_Time, li_size);
        ArrayResize (lsa_Comment, li_size);
        InitializeArray_STR (lsa_Comment, "");
        InitializeArray_STR (lsa_Time, "");
        if (SendOnlyOrders == 0) ls_SendOrders = "BUY"; else if (SendOnlyOrders == 1) ls_SendOrders = "SELL";
        ls_BeginTrade = StringConcatenate ("Terms Trade :: Begin - ", TimeToStr (bdt_BeginTrade));
        ls_Conditions = StringConcatenate ("NewBarInPeriod - ", fGet_NameTF (NewBarInPeriod), " | TF Indicators - ", fGet_NameTF (TF_Indicators), " | TF STOPs - ", fGet_NameTF (TF_STOPs),
        "\niMax trades - ", Max_trades, " | SendOnlyOrders - ", ls_SendOrders, "\n");
        bdt_NewBar = iTime (Symbol(), TF_Indicators, 1);
        bdt_NewBarInPeriod = iTime (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 (bdt_NewBar + 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_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();
    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, MagicNumber);
    }
    //---- Ïîëó÷àåì òåêóùèå çíà÷åíèÿ ïåðåìåííûõ äëÿ îòîáðàæåíèÿ íà ãðàôèêå
    fCheckInfo();
    //---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
	 fGet_LastErrorInArray (bsa_Comment, "fGet_Statistic()", bi_indERR);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Àâòîð : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Ñîçäà¸ì èíôîðìàöèþ äëÿ îòîáðàæåíèÿ íàñòðîåê íà ãðàôèêå                     |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fCheckInfo()
{
    static double ld_preLot = 0.0;
//----
    if (ShowCommentInChart)
    {
        if (ld_preLot != 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", " [ ", StopLoss, "/", TakeProfit, " | ", 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 ((NewBarInPeriod < 0), "Ðàáîòàåì íà êàæäîì òèêå", "ÏÀÓÇÀ äî: "));
            ld_preLot = 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 (iTime (bs_Symbol, NewBarInPeriod, 0) == 0)
        {fPrintAlert (bs_Symbol, NewBarInPeriod, 0); return (true);}
        if (iTime (bs_Symbol, TF_Indicators, 0) == 0)
        {fPrintAlert (bs_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 (fGet_NumPeriods (NewBarInPeriod) < 0) {bb_OptimContinue = true; return (true);}
        //---- Ïåðåìåííûå òðåéëèíãà
        if (TrailStairs_ON)
        {
            if (Virtual_Order_TP > 0.0) {if (TrailingStop >= Virtual_Order_TP) {bb_OptimContinue = true; return (true);}}
            else
            {
                if (!USE_VirtualSTOPs) if (N_STOPs == 0)
                {if (TrailingStop >= TakeProfit) {bb_OptimContinue = true; return (true);}}
            }
        }
        if (BreakEven > 0.0)
        {
            if (Virtual_Order_TP > 0.0) {if (BreakEven >= Virtual_Order_TP) {bb_OptimContinue = true; return (true);}}
            else
            {
                if (!USE_VirtualSTOPs) if (N_STOPs == 0)
                {if (BreakEven >= TakeProfit) {bb_OptimContinue = true; return (true);}}
            }
        }
        //---- Ïåðåìåííûå NET
        if (fSet_ContinueNET()) {bb_OptimContinue = true; return (true);}
        //---- Ïåðåìåííûå èíäèêàòîðîâ
        if (fSet_ContinueSARComplete()) {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

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