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