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