Orders Execution
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 Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---