Orders Execution
0
Views
0
Downloads
0
Favorites
e-PSI0ManagerTrailing
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| e-PSI@ManagerTrailling.mq4 |
//| Copyright © 2010, TarasBY |
//| taras_bulba@tut.by |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
#property copyright "Copyright © 2010-2011, TarasBY WM Z670270286972"
#property link "taras_bulba@tut.by"
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| ***** Ïàðàìåòðû ñîâåòíèêà ***** |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
extern string SETUP_Expert = "========== Îáùèå íàñòðîéêè ñîâåòíèêà ==========";
extern int MG = 880; // Ìàãèê: > 0 - ëþáîé, 0 - îòêðûòûé âðó÷íóþ, > 0 - îòêðûòûé ñîâåòíèêîì
extern datetime TimeControl = D'2010.01.01 00:00'; // Ñ êàêîãî ìîìåíòà ïîäñ÷èòûâàåì èòîãè ðàáîòû íà ñ÷¸òå
extern int NewBarInPeriod = -1; // <= 0 - ðàáîòàåì íà íà÷àëå ïåðèîäà íîâîãî áàðà, -1 - ðàáîòàåì íà êàæäîì òèêå
extern bool ValueInCurrency = FALSE; // Ïî óìîë÷àíèþ ðàñ÷¸òû âåäóòñÿ â ïðîöåíòàõ ê áàëàíñó
extern bool OnlyCurrentSymbol = TRUE; // Ðàáîòàåò òîëüêî ñ òåêóùèì ñèìâîëîì èëè ñ List_Symbols
extern string List_Symbols = "EURUSD,GBPUSD,AUDUSD,NZDUSD,EURGBP"; // Êîíòðîëèðóåìûå âàëþòíûå ïàðû
extern int Slippage = 3; // Äîïóñòèìîå îòêëîíåíèå îò çàïðîøåííîé öåíû
extern int NumberOfTry = 10; // Êîëè÷åñòâî ïîïûòîê íà ñîâåðøåíèå ìîäèôèêàöèè èëè óäàëåíèÿ îðäåðà
extern int PauseAfterError = 10; // Ïàóçà ïîñëå îøèáêè â ñåêóíäàõ
extern int NumberAccount = 0; // Íîìåð òîðãîâîãî ñ÷¸òà. Ðàáîòàòü òîëüêî íà óêàçàííîì ñ÷åòå. Ïðè çíà÷åíèè <=0 - íîìåð ñ÷åòà íå ïðîâåðÿåòñÿ
extern string Setup_TraillingProfit = "============== Trailling Profit ===============";
extern bool TrailProfit_ON = FALSE; // Âêëþ÷åíèÿ òðåéëèíãà îáùåãî Ïðîôèòà
extern double TrailProfit_StartPercent = 10; // Ïðîöåíò Ýêâèòè/Áàëàíñ ïðè êîòîðîì íà÷èíàåòñÿ ïåðåìåùåíèå óðîâíÿ çàêðûòèÿ
extern double TrailProfit_LevelPercent = 5; // Âåëè÷èíà ñíèæåíèÿ ïðîöåíòà Ýêâèòè/Áàëàíñ, ïðè êîòîðîì âûïîëíÿåòñÿ çàêðûòèå
extern double TrailProfit_Start = 50; // Âåëè÷èíà ïðîôèòà ïðè êîòîðîì íà÷èíàåòñÿ ïåðåìåùåíèå óðîâíÿ çàêðûòèÿ
extern double TrailProfit_Level = 25; // Âåëè÷èíà îáðàòíîãî äâèæåíèÿ ïðîôèòà, ïðè êîòîðîì âûïîëíÿåòñÿ çàêðûòèå
extern string Setup_TakeProfit = "================ Take Profit ==================";
extern bool TakeProfit_ON = FALSE; // Âêëþ÷åíèÿ òåéêïðîôèòà äëÿ îáùåãî Ïðîôèòà
extern double TakeProfitPercent = 50.0; // Ïðîöåíò ïðèáûëè
extern double TakeProfit = 50.0; // Ãàðàíòèðîâàííàÿ ïðèáûëü
extern string Setup_StopLoss = "================= Stop Loss ===================";
extern bool StopLoss_ON = FALSE; // Âêëþ÷åíèÿ ñòîïëîññ äëÿ îáùåãî Ïðîôèòà
extern double StopLossPercent = 20.0; // Ïðîöåíò óáûòêà
extern double StopLoss = 20.0; // Ãàðàíòèðîâàííûé óáûòîê
extern string Setup_PartClose = "================== PartClose ==================";
extern bool PartClose_ON = TRUE; // Âêëþ÷åíèå ôóíêöèè ÷àñòè÷íîãî çàêðûòèÿ äëÿ îðäåðîâ
extern string PartClose_Levels = "20/50/200"; // Óðîâíè çàêðûòèÿ. Íàïðèìåð, ïðè ïàðàìåòðàõ 10/20/5 ïåðâîå çàêðûòèå âûïîëíÿåòñÿ ïðè äîñòèæåíèè îðäåðîì ïðèáûëè â 10 ïóíêòîâ, çàòåì åùå ÷åðåç 20 ïóíêòîâ è åùå ÷åðåç 5 ïóíêòîâ.
extern string PartClose_Percents = "50/25/25"; // Ïðîöåíò çàêðûòèÿ (÷åðåç ðàçäåëèòåëü "/") äëÿ ñîîòâåòñòâóþùåãî óðîâíÿ. Çäåñü îòñ÷åò èäåò îò ëîòà ïåðâîãî îðäåðà. Åñëè èñõîäíûé îðäåð îòêðûò ñ ëîòîì 1.0 ëîò, çàêðûâàåòñÿ 50% - 0.5, çàòåì 25% îò 1.0 - 0.3 è íàêîíåö 0.2
#include <b-PSI@TrailingS.mqh> // Áèáëèîòåêà òðåéëèíãà
extern string Setup_Services = "=================== SERVICES ==================";
extern bool ShowComment = TRUE; // Ïîêàçûâàòü êîììåíòàðèé.
extern bool PrintCom = FALSE; // Ïå÷àòàòü êîììåíòàðèé.
extern bool UseSendMail = FALSE; // Èñïîëüçîâàòü ïåðåäà÷ó ïî÷òîâûõ ñîîáùåíèé
extern double MinCangesPercent = 0.5; // Ìèíèìàëüíîå èçìåíåíèå ïðèáûëè ïðè êîòîðîì îòñûëàåòñÿ åìàéë
extern bool SoundAlert = FALSE; // Çâóê
extern string Setup_Tester = "=================== Tester ====================";
extern int InTesterOrder = 1; // Ðàáîòàåò òîëüêî â òåñòåðå äëÿ ïðîâåðêè. 1 - áàé, -1 - ñåëë
//IIIIIIIIIIIIIIIIIII======Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà======IIIIIIIIIIIIIIIIIIIIII+
string gs_NameGV, gs_Base, gs_Info, gs_fName, gs_sign,
gsa_Comment[6], ExpertName, gs_Symbol;
int gia_PartClose_Levels[], gia_PartClose_Percents[], gia_CommTime[6],
gi_Decimal = 1, gi_SL = 200, gi_MyOrders, gi_HistoryOrders, ind_ERR, gi_Digits;
double gd_cur_Profit, gd_LastProfitPC, gd_Pribul, gd_ProfitPercent, gd_cur_ProfitVal,
gd_TrailingStop, gd_TrailingStopPercent, gd_TrailProfit_Level, gd_TrailProfit_Start,
gd_TS_Profit_Percent, gd_Profit_CUR, gd_TS_Profit, gd_TS_Profit_CUR, gd_Point,
gd_TakeProfit, gd_StopLoss, gd_Bid, gd_Ask;
bool flag_BadAccount = False, flag_TrailingStop = False, flag_CloseSignal, gb_InfoPrint = false,
gb_AllSymbols = false;
datetime gdt_NewBarInPeriod, gdt_curTime;
//IIIIIIIIIIIIIIIIIII==========Ïîäêëþ÷åííûå áèáëèîòåêè==========IIIIIIIIIIIIIIIIIIIIII+
#include <stderror.mqh> // Áèáëèîòåêà êîäîâ îøèáîê
//#include <stdlib.mqh> // Áèáëèîòåêà ðàñøèôðîâêè îøèáîê
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Custom expert initialization function |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int init()
{
int li_size, li_int;
string lsa_txt[3], tmpArr[];
//----
//---- Èñêëþ÷àåì ñëó÷àéíóþ ðàáîòó ñîâåòíèêà
if (NumberAccount > 0)
{
if (AccountNumber() != NumberAccount)
{
flag_BadAccount = true;
Alert ("Íå ïðàâèëüíûé íîìåð ñ÷åòà");
return (0);
}
}
gs_NameGV = "ManagerTrailing";
ExpertName = StringConcatenate (WindowExpertName(), "[", IIFs (MG >= 0, MG, "ALL"), "]: ", fGet_NameTF (Period()), "_", Symbol());
gs_sign = IIFs ((AccountCurrency() == "USD"), "$", IIFs ((AccountCurrency() == "EUR"), "", "RUB"));
if (IsTesting())
{gs_NameGV = gs_NameGV + "_t_";}
if (IsDemo())
{gs_NameGV = gs_NameGV + "_d_";}
lsa_txt[0] = "Ñîâåòíèê áóäåò êîíòðîëèðîâàòü îðäåðà íà ñëåäóþùèõ ñèìâîëàõ:\n";
//---- Ïîä÷èùàåì GV-ïåðåìåííûå
if (IsTesting() || IsOptimization())
{
for (li_int = GlobalVariablesTotal() - 1; li_int >= 0; li_int--)
{
if (StringFind (GlobalVariableName (li_int), gs_NameGV, 0) == 0)
{GlobalVariableDel (GlobalVariableName (li_int));}
}
MG = IIFd ((MG >= 0), MG, 0);
TimeControl = D'1990.01.01 00:00';
}
else
{
if (GlobalVariableCheck (StringConcatenate (gs_NameGV, "_#fl_TrailingStop")))
{flag_TrailingStop = GlobalVariableGet (StringConcatenate (gs_NameGV, "_#fl_TrailingStop"));}
}
if (PrintCom || ShowComment)
{gb_InfoPrint = true;}
fGet_MarketInfo();
if (OnlyCurrentSymbol)
{
List_Symbols = Symbol();
lsa_txt[0] = List_Symbols;
}
else
{
if (StringLen (List_Symbols) == 0)
{
gb_AllSymbols = true;
lsa_txt[0] = "ALL ";
}
}
Print (lsa_txt[0], IIFs ((MG == 0), "Áåç êîíòðîëÿ ïî MAGIC !!!", "Ñ êîíòðîëåì ïî MAGIC = " + MG + " !!!"));
gd_Profit_CUR = fGet_Profit (MG);
//---- Çàïîëíÿåì ïåðåìåííûå â ñîîòâåòñòâèè ñ âûáðàííûì òèïîì ðàñ÷¸òîâ
gd_LastProfitPC = IIFd (!ValueInCurrency, NDDig (100.0 * ((AccountBalance() + gd_cur_Profit) / AccountBalance())), gd_cur_Profit);
gd_TrailProfit_Start = IIFd (!ValueInCurrency, 100.0 + TrailProfit_StartPercent, TrailProfit_Start);
gd_TrailProfit_Level = IIFd (!ValueInCurrency, TrailProfit_LevelPercent, TrailProfit_Level);
gd_TakeProfit = IIFd (!ValueInCurrency, 100.0 + TakeProfitPercent, TakeProfit);
gd_StopLoss = IIFd (!ValueInCurrency, 100.0 - StopLossPercent, -StopLoss);
//---- Ó÷èòûâàåì ðàáîòó 5-òè çíàêà
if (gi_Digits == 3 || gi_Digits == 5)
{gi_Decimal = 10;}
Slippage *= gi_Decimal;
gi_SL *= gi_Decimal;
//---- Ïåðåíîñèì äàííûå èç ñòðîê â ðàáî÷èå ìàññèâû
if (PartClose_ON)
{
fSplitStrToStr (PartClose_Levels, tmpArr, "/");
li_size = ArraySize (tmpArr);
ArrayResize (gia_PartClose_Levels, li_size);
for (li_int = 0; li_int < li_size; li_int++)
{
gia_PartClose_Levels[li_int] = StrToInteger (tmpArr[li_int]);
gia_PartClose_Levels[li_int] *= gi_Decimal;
}
lsa_txt[1] = "Çàêðûâàåì îðäåðà ïî ÷àñòÿì â ";
lsa_txt[2] = "ïðè äîñòèæåíèè îðäåðîì ïðîôèòà â ";
fSplitStrToStr (PartClose_Percents, tmpArr, "/");
ArrayResize (gia_PartClose_Percents, li_size);
for (li_int = 0; li_int < li_size; li_int++)
{
gia_PartClose_Percents[li_int] = StrToInteger (tmpArr[li_int]);
lsa_txt[1] = StringConcatenate (lsa_txt[1], gia_PartClose_Percents[li_int], IIFs ((li_int == li_size - 1), " ", ", "));
lsa_txt[2] = StringConcatenate (lsa_txt[2], gia_PartClose_Levels[li_int], IIFs ((li_int == li_size - 1), " ïï.", ", "));
}
lsa_txt[1] = StringConcatenate (lsa_txt[1], " ïðîöåíòàõ îò ëîòà ", lsa_txt[2]);
Print (lsa_txt[1]);
}
//---- Ãîòîâèì êîììåíòû
if (ShowComment)
{
if (!OnlyCurrentSymbol)
{
string ls_ListSymbols = IIFs (gb_AllSymbols, "íà ëþáûõ èíñòðóìåíòàõ", "íà èíñòðóìåíòàõ:\n" + List_Symbols);
if (NumberAccount > 0)
{gs_Info = StringConcatenate ("Ðàáîòàåì íà ñ÷¸òå ¹", AccountNumber(), " ñ îðäåðàìè ", ls_ListSymbols);}
if (NumberAccount == 0)
{gs_Info = StringConcatenate ("Ðàáîòàåì íà òåêóùåì ñ÷¸òå ñ îðäåðàìè ", ls_ListSymbols);}
}
else
{
if (NumberAccount > 0)
{gs_Info = StringConcatenate ("Ðàáîòàåì íà ñ÷¸òå ¹", AccountNumber(), " òîëüêî ñ îðäåðàìè ", Symbol(), ".");}
if (NumberAccount == 0)
{gs_Info = StringConcatenate ("Ðàáîòàåì íà òåêóùåì ñ÷¸òå òîëüêî ñ îðäåðàìè ", Symbol(), ".");}
}
if (!ValueInCurrency)
{gs_Base = StringConcatenate ("Ðàñ÷¸ò â ïðîöåíòàõ îò äåïîçèòà.\nTrailProfit_ON = ", CheckBOOL (TrailProfit_ON), "; TrailProfit_StartPercent = ", DoubleToStr (TrailProfit_StartPercent, 1), " %; TrailProfit_LevelPercent = ", DoubleToStr (TrailProfit_LevelPercent, 1), " %",
"\nTakeProfit_ON = ", CheckBOOL (TakeProfit_ON), "; TPPercent = ", DoubleToStr (TakeProfitPercent, 1), " %; StopLoss_ON = ", CheckBOOL (StopLoss_ON), "; SLPercent = ", DoubleToStr (StopLossPercent, 1), " %");}
else
{gs_Base = StringConcatenate ("Ðàñ÷¸ò â âàëþòå äåïîçèòà.\nTrailProfit_ON = ", CheckBOOL (TrailProfit_ON), "; TrailProfit_Start = ", gs_sign, DS0 (TrailProfit_Start), "; TrailProfit_Level = ", gs_sign, DS0 (TrailProfit_Level),
"\nTakeProfit_ON = ", CheckBOOL (TakeProfit_ON), "; TakeProfit = ", gs_sign, DS0 (TakeProfit), "; StopLoss_ON = ", CheckBOOL (StopLoss_ON), "; StopLoss = ", gs_sign, DS0 (StopLoss));}
gs_Base = StringConcatenate (gs_Base, "\n", IIFs ((NewBarInPeriod < 0), "Ðàáîòàåì íà êàæäîì òèêå", "ÏÀÓÇÀ äî: "));
}
//---- Ïîëó÷àåì òåêóùèå çíà÷åíèÿ ïåðåìåííûõ äëÿ îòîáðàæåíèÿ íà ãðàôèêå
gdt_NewBarInPeriod = TimeCurrent() - NewBarInPeriod * 60;
//---- Ãîòîâèì ê ðàáîòå ìàññèâû
InitializeArray_STR (gsa_Comment);
//---- Îïðåäåëÿåì èíäåêñ "îøèáîê" â ìàññèâå êîììåíòàðèåâ (gsa_Comment)
ind_ERR = ArraySize (gsa_Comment) - 1;
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gsa_Comment, "init()", ind_ERR);
//----
return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Custor expert deinitialization function |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int deinit()
{
//----
if (IsTesting() || IsOptimization())
{
//---- Óäàëÿåì ïîñëå ñåáÿ GV-ïåðåìåííûå
for (int i = GlobalVariablesTotal() - 1; i >= 0; i--)
{
if (StringFind (GlobalVariableName (i), gs_NameGV) == 0)
{GlobalVariableDel (GlobalVariableName (i));}
}
}
else
{GlobalVariableSet (StringConcatenate (gs_NameGV, "_#fl_TrailingStop"), flag_TrailingStop);}
//---- Ðèñóåì íà ãðàôèêå êîììåíòû
if (ShowComment)
{fCommentInChart (gsa_Comment, gia_CommTime);}
//----
return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Custom expert iteration function |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int start()
{
//----
if (flag_BadAccount)
{return (0);}
int err = GetLastError();
//---- Âûñòàâëÿåì â òåñòîâîì ðåæèìå îðäåðà
if (IsTesting())
{
if (OrdersTotal() < 3 && isNewBar (240))
{
if (isLossLastPos ("", -1, -1))
{InTesterOrder = IIFd ((InTesterOrder == 1), -1, 1);}
if (InTesterOrder == 1)
{OrderSend (Symbol(), OP_BUY, 1.0, NDD (Ask), 0, NDD (Ask - gi_SL * Point), 0, NULL, MG, 0, CLR_NONE);}
if (InTesterOrder == -1)
{OrderSend (Symbol(), OP_SELL, 1.0, NDD (Bid), 0, NDD (Bid + gi_SL * Point), 0, NULL, MG, 0, CLR_NONE);}
}
}
gdt_curTime = TimeCurrent();
//---- Ñ÷èòàåì çàðàáîòàííóþ ïðèáûëü â ñîîòâåòñòâèè ñ âûáðàííûìè íàñòðîéêàìè
gd_Pribul = fCalculatePribul (-1, MG, TimeControl);
//---- Ñ÷èòàåì òåêóùèé ïðîôèò â âàëþòå äåïîçèòà
gd_Profit_CUR = fGet_Profit (MG);
//---- Ïåðåâîäèì òåêóùèé ïðîôèò â ïðîöåíòû îò äåïîçèòà
gd_ProfitPercent = NDDig (100.0 + gd_Profit_CUR * 100 / AccountBalance());
//---- Ñ÷èòàåì ïðîôèò â ñîîòâåòñòâèè ñ âûáðàííûìè íàñòðîéêàìè
if (ValueInCurrency) {gd_cur_Profit = gd_Profit_CUR;} else {gd_cur_Profit = gd_ProfitPercent;}
//---- Åñëè óñëîâèÿ âûïîëíåíû, îòïðàâëÿåì ñîîáùåíèå íà ìûëî
if (UseSendMail)
{
if (NDDig (MathAbs (gd_cur_Profit - gd_LastProfitPC)) >= MinCangesPercent)
{
gd_LastProfitPC = gd_cur_Profit;
SendMail ("Account # " + AccountNumber(), StringConcatenate ("Profit Percent: ", DSDig (gd_TS_Profit_Percent), " %. Ïðîôèò: = ", gs_sign, DSDig (gd_cur_Profit)));
if (SoundAlert) {PlaySound ("email.wav");}
}
}
//---- Âûâîäèì èíôîðìàöèþ íà ãðàôèê (åñëè ðàçðåøåíî)
if (ShowComment)
{fCommentInChart (gsa_Comment, gia_CommTime);}
//---- Âõîäèì â íà÷àëå óêàçàííîãî áàðà (åñëè NewBarInPeriod >= 0)
if (NewBarInPeriod >= 0)
{
if (gdt_NewBarInPeriod == iTime (Symbol(), NewBarInPeriod, 0))
{return (0);}
gdt_NewBarInPeriod = iTime (Symbol(), NewBarInPeriod, 0);
}
//---- Ïðîâåðÿåì óñëîâèÿ ñðàáàòûâàíèÿ Take Profit äëÿ íàáëþäàåìûõ îðäåðîâ
if (TakeProfit_ON && gi_MyOrders > 0)
{fProfit_TP (MG);}
//---- Ïðîâåðÿåì óñëîâèÿ ñðàáàòûâàíèÿ Stop Loss äëÿ íàáëþäàåìûõ îðäåðîâ
if (StopLoss_ON && gi_MyOrders > 0)
{fProfit_SL (MG);}
//---- Ïðîâåðÿåì óñëîâèÿ ñðàáàòûâàíèÿ Trailing Profit äëÿ íàáëþäàåìûõ îðäåðîâ
if (TrailProfit_ON && gi_MyOrders > 0)
{fTrail_Profit (MG);}
//---- Îðãàíèçîâûâàåì ÷àñòè÷íîå çàêðûòèå îðäåðîâ è òðåéëèíã
if (!flag_TrailingStop && gi_MyOrders > 0)
{fOrderControl (MG);}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gsa_Comment, "start()", ind_ERR);
//----
return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Trailling Profit |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fTrail_Profit (int fi_Magic = 0)
{
int li_result = -1, err = GetLastError();
string ls_sign = IIFs (ValueInCurrency, gs_sign, "%"), ls_txt = "";
gs_fName = "fTrail_Profit()";
//----
//---- Ôèêñèðóåì âêëþ÷åíèå Trailling
if (gd_cur_Profit >= gd_TrailProfit_Start && !flag_TrailingStop)
{
flag_TrailingStop = true;
GlobalVariableSet (StringConcatenate (gs_NameGV, "_#fl_TrailingStop"), flag_TrailingStop);
ls_txt = fPrepareComment (StringConcatenate (gs_fName, ": Ôèêñèðóåì âêëþ÷åíèå TrailProfit\ncur_Profit = ", ls_sign, DS0 (gd_cur_Profit), "; TrailProfit_Start = ", ls_sign, DS0 (gd_TrailProfit_Start)), gb_InfoPrint);
fPrintAndShowComment (ls_txt, ShowComment, PrintCom, gsa_Comment, 0);
}
//---- Çàïîëíÿåì ïåðåìåííûå äëÿ ñòàòèñòèêè
gd_TS_Profit_Percent = IIFd ((!flag_TrailingStop), gd_TS_Profit_Percent - TrailProfit_LevelPercent, MathMax (gd_TS_Profit_Percent, gd_ProfitPercent - TrailProfit_LevelPercent));
gd_TS_Profit_CUR = IIFd ((!flag_TrailingStop), gd_Profit_CUR - TrailProfit_Level, MathMax (gd_TS_Profit_CUR, gd_Profit_CUR - TrailProfit_Level));
gd_TS_Profit = IIFd (!ValueInCurrency, gd_TS_Profit_Percent, gd_TS_Profit_CUR);
if (flag_TrailingStop)
{
//---- Óñëîâèå ñðàáàòûâàíèÿ çàêðûòèÿ îðäåðîâ ïî TraillingProfit
if (gd_cur_Profit <= gd_TS_Profit)
{
li_result = fOrderClose_All (fi_Magic);
if (li_result == 1)
{
ls_txt = fPrepareComment (StringConcatenate (gs_fName, ": Çàêðûëèñü ïî TrailProfit\ncur_Profit = ", ls_sign, DS0 (gd_cur_Profit), "; TS_Profit = ", ls_sign, DS0 (gd_TS_Profit), "; TrailProfit_Start = ", ls_sign, DS0 (gd_TrailProfit_Start)), gb_InfoPrint);
fPrintAndShowComment (ls_txt, ShowComment, PrintCom, gsa_Comment, 1);
gsa_Comment[0] = "";
if (SoundAlert) {PlaySound ("ok.wav");}
//flag_TrailingStop = false;
//GlobalVariableSet (StringConcatenate (gs_NameGV, "_#fl_TrailingStop"), flag_TrailingStop);
gi_MyOrders = 0;
}
if (UseSendMail)
{
SendMail ("Account # " + AccountNumber(), IIFs ((li_result == 1), "Close all OK", "Close all ERROR"));
if (SoundAlert) {PlaySound ("email.wav");}
}
}
}
if (ShowComment)
{
if (flag_TrailingStop)
{
if (!ValueInCurrency)
{ls_txt = StringConcatenate (gs_fName, ": Çàêðûòèå ïî òðåéëèíãó íà óðîâíå: ", DSDig (gd_TS_Profit_Percent - 100), " %");}
else
{ls_txt = StringConcatenate (gs_fName, ": Çàêðûòèå ïî òðåéëèíãó íà óðîâíå: ", gs_sign, DSDig (gd_TS_Profit_CUR), "");}
}
else
{
if (gd_Profit_CUR <= 0)
{ls_txt = StringConcatenate (gs_fName, ": Ïðèáûëü åùå íå çàôèêñèðîâàíà");}
else
{ls_txt = StringConcatenate (gs_fName, ": Ïðèáûëü åùå íå äîñòèãëà âåëè÷èíû TrailProfit_Start (", DoubleToStr (IIFd (ValueInCurrency, TrailProfit_Start, TrailProfit_StartPercent), 1), " ", ls_sign, ")");}
}
fPrintAndShowComment (ls_txt, ShowComment, False, gsa_Comment, 1);
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gsa_Comment, "fTrail_Profit()", ind_ERR);
if (li_result == 1)
{return (true);}
//----
return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Çàêðûâàåì âñå îðäåðà ïî äîñòèæåíèþ çàïëàíèðîâàííîãî ïðîôèòà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fProfit_TP (int Magic = 0)
{
string ls_txt = "";
int err = GetLastError();
//----
gs_fName = "fProfit_TP()";
if (gd_cur_Profit >= gd_TakeProfit) {flag_CloseSignal = true;} else {flag_CloseSignal = false;}
if (flag_CloseSignal)
{
int result = 0;
result = fOrderClose_All (Magic);
if (result == 1)
{
string ls_sign = IIFs (ValueInCurrency, gs_sign, "%");
flag_CloseSignal = false;
if (SoundAlert) {PlaySound ("ok.wav");}
ls_txt = fPrepareComment (StringConcatenate (gs_fName, ": Ñðàáîòàë TP | Profit = ", DoubleToStr (gd_cur_Profit, 1), " ", ls_sign, "; TakeProfit = ", DoubleToStr (gd_TakeProfit, 1), " ", ls_sign, "."), gb_InfoPrint);
fPrintAndShowComment (ls_txt, ShowComment, PrintCom, gsa_Comment, 2);
gsa_Comment[0] = "";
gi_MyOrders = 0;
}
if (UseSendMail)
{
SendMail ("Account # " + AccountNumber(), IIFs ((result == 0), "Close all OK", "Close all ERROR"));
if (SoundAlert) {PlaySound ("email.wav");}
}
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gsa_Comment, "fProfit_TP()", ind_ERR);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Çàêðûâàåì âñå îðäåðà ïî äîñòèæåíèþ óêàçàííîãî ëîññà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fProfit_SL (int Magic = 0)
{
string ls_txt = "";
int err = GetLastError();
//----
gs_fName = "fProfit_SL()";
if (gd_cur_Profit <= gd_StopLoss) {flag_CloseSignal = true;} else {flag_CloseSignal = false;}
if (flag_CloseSignal)
{
int result = 0;
result = fOrderClose_All (Magic);
if (result == 1)
{
string ls_sign = IIFs (ValueInCurrency, gs_sign, "%");
flag_CloseSignal = false;
if (SoundAlert) {PlaySound ("ok.wav");}
ls_txt = fPrepareComment (StringConcatenate (gs_fName, ": Ñðàáîòàë SL | Profit = ", DoubleToStr (gd_cur_Profit, 1), " ", ls_sign, "; StopLoss = ", DoubleToStr (gd_StopLoss, 1), " ", ls_sign, "."), gb_InfoPrint);
fPrintAndShowComment (ls_txt, ShowComment, PrintCom, gsa_Comment, 3);
gsa_Comment[0] = "";
gi_MyOrders = 0;
}
if (UseSendMail)
{
SendMail ("Account # " + AccountNumber(), IIFs ((result == 0), "Close all OK", "Close all ERROR"));
if (SoundAlert) {PlaySound ("email.wav");}
}
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gsa_Comment, "fProfit_SL()", ind_ERR);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ñîáèðàåì ïðîôèò ïî âñåì ñâîèì îðäåðàì |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fGet_Profit (int Magic)
{
int li_int, li_total = OrdersTotal() - 1;
double ld_Profit = 0;
static int pre_Orders = 0;
//----
gi_MyOrders = 0;
for (li_int = li_total; li_int >= 0; li_int--)
{
if (OrderSelect (li_int, SELECT_BY_POS, MODE_TRADES))
{
if (StringFind (List_Symbols, OrderSymbol()) < 0 && !gb_AllSymbols)
{continue;}
if (OrderMagicNumber() == Magic || Magic < 0)
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
ld_Profit += OrderProfit() + OrderSwap() + OrderCommission();
gi_MyOrders++;
}
}
}
}
//---- Ñáðàñûâàåì ôëàã òðåéëèíãà îáùåãî Ïðîôèòà
if (pre_Orders != gi_MyOrders)
{
pre_Orders = gi_MyOrders;
if (gi_MyOrders == 0)
{
flag_TrailingStop = false;
GlobalVariableSet (StringConcatenate (gs_NameGV, "_#fl_TrailingStop"), flag_TrailingStop);
}
}
//----
return (ld_Profit);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòû ñ îðäåðàìè |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Óäàëÿåì âñå îðäåðà, çà êîòîðûìè ñëåäèëè |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fOrderClose_All (int fi_Magic = 0)
{
int li_result = 0, li_Error = GetLastError(), li_cnt = 0;
double ld_tmp, ld_Itog = 0.0;
//----
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
{
if (StringFind (List_Symbols, OrderSymbol()) < 0 && !gb_AllSymbols)
{continue;}
if (fi_Magic <= 0 || OrderMagicNumber() == fi_Magic)
{
if (!IsTradeContextBusy())
{
fGet_MarketInfo();
if (!ClosePosBySelect (OrderTicket(), ld_tmp))
{
li_Error = GetLastError();
Print ("Error close ", GetNameOP (OrderType()), "[", OrderTicket(), "]: ", ErrorDescription (li_Error));
li_result = -1;
if (SoundAlert) {PlaySound ("alert2.wav");}
}
else
{
if (SoundAlert) {PlaySound ("ok.wav");}
ld_Itog += ld_tmp;
li_result = 1;
li_cnt++;
}
}
else
{
static int cur_time = 0;
if (TimeCurrent() > cur_time + 20)
{
cur_time = TimeCurrent();
Print ("Need close ", GetNameOP (OrderType()), "[", OrderTicket(), "]. Trade Context Busy.");
if (SoundAlert) {PlaySound ("disconnect.wav");}
}
return (-2);
}
}
}
}
if (li_result == 1)
{if (PrintCom) Print ("fOrderClose_All(): Ðåçóëüòàò çàêðûòèÿ ", IIFs ((li_cnt == 1), "îðäåðà", li_cnt + " îðäåðîâ"), " = ", gs_sign, DSDig (ld_Itog));}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gsa_Comment, "fOrderClose_All()", ind_ERR);
//----
return (li_result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ñëåäèì çà îðäåðàìè ïî îòäåëüíî âçÿòîé âàëþòíîé ïàðå |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fOrderControl (int iMagic)
{
int ParentTicket, li_Num, li_Ticket, err = GetLastError();
double ld_Lots, LotsClose, ld_Price, ld_temp;
string ls_result = "", ls_Comment;
//----
gs_fName = "fOrderControl()";
if (PartClose_ON)
{
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
{
if (StringFind (List_Symbols, OrderSymbol()) < 0 && !gb_AllSymbols)
{continue;}
if (OrderMagicNumber() == -1 || OrderMagicNumber() == iMagic)
{
if (OrderType() > 1)
{continue;}
ParentTicket = 0;
li_Num = 0;
ld_Lots = OrderLots();
ls_Comment = OrderComment();
li_Ticket = OrderTicket();
ParentTicket = fGet_ParentTicket (ls_Comment);
if (ParentTicket != 0)
{
if (GlobalVariableCheck (gs_NameGV + ParentTicket + "#_Num"))
{li_Num = GlobalVariableGet (gs_NameGV + ParentTicket + "#_Num") + 1;}
if (GlobalVariableCheck (gs_NameGV + ParentTicket + "#_Lots"))
{ld_Lots = GlobalVariableGet (gs_NameGV + ParentTicket + "#_Lots");}
}
GlobalVariableSet (gs_NameGV + li_Ticket + "#_Num", li_Num);
GlobalVariableSet (gs_NameGV + li_Ticket + "#_Lots", ld_Lots);
if (li_Num >= ArraySize (gia_PartClose_Levels))
{li_Num = ArraySize (gia_PartClose_Levels) - 1;}
RefreshRates();
fGet_MarketInfo();
if (OrderType() == OP_BUY)
{
ld_Price = gd_Bid;
if (ld_Price - OrderOpenPrice() >= NDP (gia_PartClose_Levels[li_Num]))
{
LotsClose = fLotsNormalize (gia_PartClose_Percents[li_Num] * ld_Lots / 100.0);
if (LotsClose > 0)
{
LotsClose = MathMin (LotsClose, OrderLots());
if (!ClosePosBySelect (li_Ticket, ld_temp, LotsClose))
{
Print ("Close error ", GetLastError());
if (SoundAlert) {PlaySound ("alert2.wav");}
}
else
{
ls_result = fPrepareComment (StringConcatenate (gs_fName, ": ", "Ïðîèçâåëè ", IIFs ((li_Num == 2), "îêîí÷àòåëüíîå", "÷àñòè÷íîå"), " çàêðûòèå îðäåðà",
"\n[", gs_Symbol, ":", IIFd ((ParentTicket != 0), ParentTicket, li_Ticket), "/", li_Num, "].", IIFs ((ParentTicket == 0), "", " Êîììåíòàðèé - " + ls_Comment + "."), " LotsClose = ", LotsClose), gb_InfoPrint);
if (SoundAlert) {PlaySound ("ok.wav");}
continue;
}
}
}
}
if (OrderType() == OP_SELL)
{
ld_Price = gd_Ask;
if (OrderOpenPrice() - ld_Price >= NDP (gia_PartClose_Levels[li_Num]))
{
LotsClose = fLotsNormalize (gia_PartClose_Percents[li_Num] * ld_Lots / 100.0);
if (LotsClose > 0)
{
LotsClose = MathMin (LotsClose, OrderLots());
if (!ClosePosBySelect (OrderTicket(), ld_temp, LotsClose))
{
Print ("Close error ", GetLastError());
if (SoundAlert) {PlaySound ("alert2.wav");}
}
else
{
ls_result = fPrepareComment (StringConcatenate (gs_fName, ": ", "Ïðîèçâåëè ", IIFs ((li_Num == 2), "îêîí÷àòåëüíîå", "÷àñòè÷íîå"), " çàêðûòèå îðäåðà",
"\n[", gs_Symbol, ":", IIFd ((ParentTicket != 0), ParentTicket, li_Ticket), "/", li_Num, "].", IIFs ((ParentTicket == 0), "", " Êîììåíòàðèé - " + ls_Comment + "."), " LotsClose = ", LotsClose), gb_InfoPrint);
if (SoundAlert) {PlaySound ("ok.wav");}
continue;
}
}
}
}
if (OrderSymbol() == Symbol())
//---- Òðàëèì âûáðàííóþ ïîçèöèþ
{fTrail_Position (OrderTicket());}
}
}
else
{return (0);}
}
}
fPrintAndShowComment (ls_result, ShowComment, PrintCom, gsa_Comment, 4);
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gsa_Comment, gs_fName, ind_ERR);
//----
return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ïîëó÷àåì òîðãîâóþ èíôîðìàöèþ ïî ñèìâîëó |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGet_MarketInfo()
{
//----
if (gs_Symbol != OrderSymbol())
{
gs_Symbol = OrderSymbol();
gi_Digits = MarketInfo (gs_Symbol, MODE_DIGITS);
gd_Point = MarketInfo (gs_Symbol, MODE_POINT);
}
if (!OnlyCurrentSymbol)
{
gd_Bid = MarketInfo (gs_Symbol, MODE_BID);
gd_Ask = MarketInfo (gs_Symbol, MODE_ASK);
}
else
{
gd_Bid = Bid;
gd_Ask = Ask;
}
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Çàêðûòèå îäíîé ïðåäâàðèòåëüíî âûáðàííîé ïîçèöèè |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool ClosePosBySelect (int ticket, double& dOrderProfit, double LotClose = 0)
{
bool lb_result;
double ld_Lots, ld_Price, ld_Itog;
int Error, it, li_Type;
string ls_Symbol;
//----
li_Type = OrderType();
if (li_Type == OP_BUY || li_Type == OP_SELL)
{
ls_Symbol = OrderSymbol();
for (it = 1; it <= NumberOfTry; it++)
{
if (!IsTesting() && (!IsExpertEnabled() || IsStopped()))
{break;}
while (!IsTradeAllowed())
{Sleep (2000);}
RefreshRates();
ld_Lots = IIFd ((LotClose == 0.0), OrderLots(), LotClose);
ld_Price = MarketInfo (ls_Symbol, IIFd ((li_Type == OP_BUY), MODE_BID, MODE_ASK));
if (OrderClose (ticket, ld_Lots, ld_Price, Slippage, CLR_NONE))
{
dOrderProfit = OrderProfit() / OrderLots() * ld_Lots;
if (PrintCom) Print (gs_fName, ": Çàêðûëè îðäåð-", GetNameOP (li_Type), "[", ticket, "/", DSDig (ld_Lots), "]; Èòîã = ", gs_sign, DSDig (dOrderProfit), ".");
return (true);
}
else
{
Error = GetLastError();
if (Error == 146)
{
while (IsTradeContextBusy())
{Sleep (1000 * 11);}
}
if (PrintCom) Print (gs_fName, ": Error ¹ ", ErrorDescription (Error), ". Çàêðûâàåì ", GetNameOP (li_Type), "; Ïîïûòêà ", it, "-ÿ. \n",
"Ticket = ", ticket, "; ", IIFs ((li_Type == OP_BUY), "Bid", "Ask"), " = ", DSD (ld_Price), ";\n",
"Sym = ", ls_Symbol, "; Lot = ", DSDig (ld_Lots), "; SL = ", DSD (OrderStopLoss()), "; TP = ", DSD (OrderTakeProfit()), "; Magic = ", OrderMagicNumber());
Sleep (1000 * 5);
}
}
}
else
{Print ("Íåêîððåêòíàÿ òîðãîâàÿ îïåðàöèÿ. Close ", GetNameOP (li_Type));}
//----
return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+-----------------------------------------------------------------------------------+
//| Âåðñèÿ : 19.02.2008 |
//| Îïèñàíèå : Âîçâðàùàåò ôëàã óáûòî÷íîñòè ïîñëåäíåé ïîçèöèè. |
//+-----------------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| sy - íàèìåíîâàíèå èíñòðóìåíòà ("" - ëþáîé ñèìâîë, |
//| NULL - òåêóùèé ñèìâîë) |
//| op - îïåðàöèÿ (-1 - ëþáàÿ ïîçèöèÿ) |
//| mn - MagicNumber (-1 - ëþáîé ìàãèê) |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool isLossLastPos (string sy = "", int op = -1, int mn = -1)
{
datetime t;
int i, j = -1, k = OrdersHistoryTotal();
//----
sy = IIFs ((sy == "0" || sy == ""), Symbol(), sy);
for (i = k - 1; i >= 0; i--)
{
if (OrderSelect (i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == sy && (mn < 0 || OrderMagicNumber() == mn))
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if (op < 0 || OrderType() == op)
{
if (t < OrderCloseTime())
{
t = OrderCloseTime();
j = i;
}
}
}
}
}
}
if (OrderSelect (j, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderProfit() < 0)
{return (True);}
}
//----
return (False);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòû ñ ìàññèâàìè |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| UNI: ÈÍÈÖÈÀËÈÇÈÐÓÅÌ ÌÀÑÑÈÂ STRING |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int InitializeArray_STR (string& PrepareArray[], string Value = "")
{
int l_int, size = ArraySize (PrepareArray);
//----
for (l_int = 0; l_int < size; l_int++)
{PrepareArray[l_int] = Value;}
//----
return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Âîçâðàùàåò ìàññèâ STRING èç ñòðîêè, ðàçäåë¸ííîé sDelimiter |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fSplitStrToStr (string aString, string& aArray[], string aDelimiter = ",")
{
string tmp_str = "", tmp_char = "";
//----
ArrayResize (aArray, 0);
for (int i = 0; i < StringLen (aString); i++)
{
tmp_char = StringSubstr (aString, i, 1);
if (tmp_char == aDelimiter)
{
if (StringTrimLeft (StringTrimRight (tmp_str)) != "")
{
ArrayResize (aArray, ArraySize (aArray) + 1);
aArray[ArraySize (aArray) - 1] = tmp_str;
}
tmp_str = "";
}
else
{
if (tmp_char != " ")
{tmp_str = tmp_str + tmp_char;}
}
}
if (StringTrimLeft (StringTrimRight (tmp_str)) != "")
{
ArrayResize (aArray, ArraySize (aArray) + 1);
aArray[ArraySize (aArray) - 1] = tmp_str;
}
//----
return (ArraySize (aArray));
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Îáùèå ôóíêöèè |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Âîçâðàùàåò íàèìåíîâàíèå ñîñòîÿíèÿ (ÄÀ\ÍÅÒ) |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string CheckBOOL (int M)
{
switch (M)
{
case 0: {return ("Íåò");}
case 1: {return ("Äà");}
}
return ("Íå çíàþ...");
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+-----------------------------------------------------------------------------------+
//| Âåðñèÿ : 01.09.2005 |
//| Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òîðãîâîé îïåðàöèè |
//+-----------------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| op - èäåíòèôèêàòîð òîðãîâîé îïåðàöèè |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string GetNameOP (int op)
{
switch (op)
{
case OP_BUY : return ("BUY");
case OP_SELL : return ("SELL");
case OP_BUYLIMIT : return ("BUY Limit");
case OP_SELLLIMIT: return ("SELL Limit");
case OP_BUYSTOP : return ("BUY Stop");
case OP_SELLSTOP : return ("SELL Stop");
default : return ("None (" + op + ")");
}
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Àâòîð : TarasBY |
//+-----------------------------------------------------------------------------------+
//| Âåðñèÿ : 09.08.2009 |
//| Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òàéìôðåéìà |
//+-----------------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| fi_Period - òàéìôðåéì |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string fGet_NameTF (int fi_Period)
{
//----
switch (fi_Period)
{
case 1: return ("M1");
case 5: return ("M5");
case 15: return ("M15");
case 30: return ("M30");
case 60: return ("H1");
case 240: return("H4");
case 1440: return ("D1");
case 10080: return ("W1");
case 43200: return ("MN1");
default: return ("undefined " + fi_Period);
}
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Êîíòðîëèðóåì ïðèõîä íîâîãî áàðà ïî óêàçàííîìó ïåðèîäó |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool isNewBar (int iTimeFrame)
{
int iIndex = -1;
//----
switch (iTimeFrame)
{
case 1 : iIndex = 0; break;
case 5 : iIndex = 1; break;
case 15 : iIndex = 2; break;
case 30 : iIndex = 3; break;
case 60 : iIndex = 4; break;
case 240 : iIndex = 5; break;
case 1440 : iIndex = 6; break;
default : iIndex =-1; break;
}
static int LastBar[7]= {0,0,0,0,0,0,0};
datetime curbar = iTime (Symbol(), iTimeFrame, 0);
if (LastBar[iIndex] != curbar)
{
LastBar[iIndex] = curbar;
return (true);
}
else
{return (false);}
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ïîëó÷àåì Ticket ðîäèòåëüñêîãî îðäåðà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_ParentTicket (string aComment)
{
int tPos1 = StringFind (aComment, "from");
//----
if (tPos1 >= 0)
{
int tPos2 = StringFind (aComment, "#");
if (tPos2 > tPos1)
{return (StrToInteger (StringSubstr (aComment, tPos2 + 1, StringLen (aComment) - tPos2 - 1)));}
}
//----
return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+-----------------------------------------------------------------------------------+
//| Âåðñèÿ : 01.02.2008 |
//| Îïèñàíèå : Âîçâðàùàåò îäíî èç äâóõ çíà÷åíèé âçàâèñèìîñòè îò óñëîâèÿ. |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double IIFd (bool condition, double ifTrue, double ifFalse)
{
if (condition)
{return (ifTrue);}
else {return (ifFalse);}
}
//+-----------------------------------------------------------------------------------+
string IIFs (bool condition, string ifTrue, string ifFalse)
{
if (condition)
{return (ifTrue);}
else {return (ifFalse);}
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ, îïðåäåëåíèÿ ìèíèìàëüíîé ðàçðÿäíîñòè ëîòà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int LotDecimal() {return (MathCeil (MathAbs (MathLog (MarketInfo (Symbol(), MODE_LOTSTEP)) / MathLog (10))));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ, ïåðåâîäà int â double ïî Point |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double NDP (int v) {return (v * gd_Point);}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ, ïåðåâîäà çíà÷åíèÿ èç double â string c íîðìàëèçàöèåé ïî |
//| ìèíèìàëüíîé ðàçðÿäíîñòè ëîòà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string DSDig (double v) {return (DoubleToStr (v, LotDecimal()));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ, íîðìàëèçàöèè çíà÷åíèÿ double äî ìèíèìàëüíîé ðàçðÿäíîñòè ëîòà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double NDDig (double v) {return (NormalizeDouble (v, LotDecimal()));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ, ïåðåâîäà çíà÷åíèÿ èç double â string c íîðìàëèçàöèåé ïî Digit |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string DSD (double v) {return (DoubleToStr (v, gi_Digits));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Money Management |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ïðîèçâîäèì íîðìàëèçàöèþ ëîòà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fLotsNormalize (double aLots)
{
aLots -= MarketInfo (Symbol(), MODE_MINLOT);
aLots /= MarketInfo (Symbol(), MODE_LOTSTEP);
aLots = MathRound (aLots);
aLots *= MarketInfo (Symbol(), MODE_LOTSTEP);
aLots += MarketInfo (Symbol(), MODE_MINLOT);
aLots = NormalizeDouble (aLots, LotDecimal());
//----
return (aLots);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ñ÷èòàåì çàðàáîòàííóþ ïðèáûëü (åñëè âîîáùå çàðàáîòàëè) |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fCalculatePribul (int op = -1, int magic = -1, datetime dt = 0)
{
int li_int, history_total = OrdersHistoryTotal();
static int pre_total = 0;
if (pre_total == history_total)
{
pre_total = history_total;
return (gd_Pribul);
}
double ld_Pribul = 0.0;
//----
gi_HistoryOrders = 0;
for (li_int = history_total - 1; li_int >= 0; li_int--)
{
if (OrderSelect (li_int, SELECT_BY_POS, MODE_HISTORY))
{
if (StringFind (List_Symbols, OrderSymbol()) < 0 && !gb_AllSymbols)
{continue;}
if (op < 0 || OrderType() == op)
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if (magic <= 0 || OrderMagicNumber() == magic)
{
if (dt < OrderCloseTime())
{
ld_Pribul += OrderProfit() + OrderSwap() + OrderCommission();
gi_HistoryOrders++;
}
}
}
}
}
}
return (ld_Pribul);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ñåðâèñíûõ ôóíêöèé |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Âûâîäèì èíôîðìàöèþ íà ÷àðò |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fCommentInChart (string& ar_Comment[], int& ar_ComTime[])
{
static string lsa_Time[], lsa_Comment[], lsa_CommTime[], lsa_tmp[],
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_Error = "", ls_time = "", ls_sign;
//----
//---- Ïðè ïåðâîì çàïóñêå ôîðìèðóåì ðàáî÷èå ìàññèâû
if (lb_first)
{
if (NewBarInPeriod == 0) {li_Period *= Period();} else {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);
li_size_CommTime = ArraySize (ar_ComTime);
ArrayResize (lsa_CommTime, li_size_CommTime);
ArrayResize (lsa_tmp, li_size_CommTime);
InitializeArray_STR (lsa_CommTime);
InitializeArray_STR (lsa_tmp);
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 (gdt_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 (gdt_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]);}
}
}
//---- Ñòðîêà êîíòðîëÿ çà âðåìåíåì ðàáîòû ñîâåòíèêà
if (NewBarInPeriod >= 0) {ls_time = TimeToStr (gdt_NewBarInPeriod + li_Period);}
//---- Ôîðìèðóåì ÂÑÅ áëîêè êîììåíòàðèåâ
ls_BLOCK_Comment = StringConcatenate (ExpertName, "\n", ls_row, gs_Info, "\n",
gs_Base, ls_time, "\n",
ls_row,
//---- Áëîê ðåçóëüòàòîâ ðàáîòû
" PROFIT = ", gs_sign, " ", DoubleToStr (gd_Profit_CUR, 1), " | ", DoubleToStr (gd_ProfitPercent - 100.0, 1), " % [", gi_MyOrders, "]\n",
" RESULT = ", gs_sign, " ", DoubleToStr (gd_Pribul, 1), "[", gi_HistoryOrders, "]\n",
ls_PSI,
//---- Áëîê êîììåíòàðèåâ
ls_Comment,
//---- Îòîáðàæàåì îøèáêè
ls_Error);//,
//---- Âûâîäèì íà ÷àðò ñôîðìèðîâàííûé áëîê êîììåíòàðèåâ
Comment (ls_BLOCK_Comment);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ãîòîâèì ê âûâîäó íà ïå÷àòü è íà ãðàôèê êîììåíòàðèè |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string fPrepareComment (string sText = "", bool bConditions = false)
{if (bConditions) if (StringLen (sText) > 0) {return (sText);} return ("");}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Âûâîäèì íà ïå÷àòü è íà ãðàôèê êîììåíòàðèè |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fPrintAndShowComment (string &Text, bool Show_Conditions, bool Print_Conditions, string& s_Show[], int ind = -1)
{
if (StringLen (Text) > 0)
{
if (Show_Conditions || Print_Conditions)
{
if (ind >= 0 && Show_Conditions)
{s_Show[ind] = Text;}
if (Print_Conditions)
{Print (Text);}
Text = "";
}
}
//----
return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòà ñ îøèáêàìè |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ïîëó÷àåì íîìåð è îïèñàíèå ïîñëåäíåé îøèáêè è âûâîäèì â ìàññèâ êîììåíòîâ |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGetLastError (string& Comm_Array[], string Com = "", int index = -1)
{
int err = GetLastError();
string ls_err;
//----
if (err > 0)
{
ls_err = StringConcatenate (Com, ": Îøèáêà ¹ ", err, ": ", ErrorDescription (err));
Print (ls_err);
if (index >= 0)
{Comm_Array[index] = ls_err;}
}
//----
return (err);
}
//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
---