//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| e-PSI@TD-Lines.mq4 |
//| Copyright © 2008-2011, TarasBY & funyoo |
//| taras_bulba@tut.by |
//| Àâòîðñêàÿ âåðñèÿ íà http://codebase.mql4.com/ru/4775 |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
#property copyright "Copyright © 2011, TarasBY WM Z670270286972"
#property link "taras_bulba@tut.by"
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| ***** Ïàðàìåòðû ñîâåòíèêà ***** |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
extern string SETUP_Expert = "=========== Îáùèå íàñòðîéêè ñîâåòíèêà ===========";
extern int MagicNumber = 346;
extern int NewBarInPeriod = 1; // >= 0 - ðàáîòàåì íà íà÷àëå ïåðèîäà íîâîãî áàðà, -1 - ðàáîòàåì íà êàæäîì òèêå
extern bool Reverse = false;
extern string TradeComment = "Trade";
extern int TradeBar = 9; // N áàð, ñ êîòîðîãî ñíèìàåì ïîêàçàíèÿ èíäèêàòîðà (>=1)
extern int N_TradeBars = 1; // Êîëè÷åñòâî áàðîâ îò TradeBar, ñ êîòîðûõ ñíèìàåì ïîêàçàíèÿ èíäèêàòîðà (>=1)
extern int LifeMinBar = 7; // Ìèíèìàëüíîå âðåìÿ æèçíè îðäåðà â áàðàõ
extern string SETUP_AutoTrading = "================= AUTO TRADING ==================";
extern bool AutoSTOPs_ON = true; // Ôîðìèðîâàíèå ÑÒÎÏîâ îò ïîêàçàíèé èíäèêàòîðà
extern int MIN_Stop = 15; // Ìèíèìàëüíûå ñòîïû (äëÿ 4-ð¸õ çíàêîâ) äëÿ AutoSTOPs_ON
extern int TradeOrders = 4; // Êîëè÷åñòâî îäíîâðåìåííî îòêðûâàåìûõ îðäåðîâ (1-4)
extern string SETUP_Trailling = "=================== TRAILLING ===================";
extern int TrailingStop = 0;
extern int TrailingStep = 1; // Trailing step
extern int BreakEven = 0; // ÁåçÓáûòîê
extern string Setup_TrailATR = "----------------- Traiiling ATR -----------------";
extern bool Use_TrailATR = true; // Ôîðìèðîâàíèå ÑÒÎÏîâ îò ïîêàçàíèé èíäèêàòîðà
extern int ATR_TF = 0; // Òàéìôðåéì ATR
extern int ATR_Period = 14; // Ïåðèîä óñðåäíåíèÿ
extern double ATR_Trailing = 2.0;
extern string Setup_Lots = "========= Ïàðàìåòðû ìîäóëÿ ðàñ÷¸òà ëîòà =========";
extern bool UseMM = TRUE; // Èñïîëüçîâàòü ðàñøèðÿþùèéñÿ ëîò
extern string Setup_MeansType_1_3 = "MeansType: 1-Balance; 2-Equity; 3-FreeMargin;";
extern int MeansType = 2; // Òèï ñðåäñòâ èñïîëüçóåìûõ ïðè ðàñ÷åòå ðàçìåðà ëîòà:
extern int LotsPercent = 10; // Ïðîöåíò îò MeansType (ñóììàðíûé ëîò âñåõ TradeOrders îðäåðîâ)
extern string QuotaEachOrders = "50,20,20,10"; // LotsPercent ðàçáèâàåòñÿ íà TradeOrders ÷àñòåé (100 %)
extern bool Use_Prioritity = TRUE; // Èñïîëüçîâàíèå ïðèîðèòåòà ðàçìåðà ëîòà îðäåðîâ ïî ðåçóëüòàòàì ðàáîòû
extern double MinLot = 0.01; // Ìèíèìàëüíûé ëîò ðûíî÷íîãî îðäåðà
extern double MaxLot = 50.0; // Ìàêñèìàëüíûé ëîò ðûíî÷íîãî îðäåðà
extern double RiskDepo = 2000.0; // Ðàçìåð Depo â âàëþòå äåïîçèòà, íà êîòîðûé èãðàåì
extern int MAXLossDepoPercent = 50; // Ïðè êàêîì ëîññå îò Depo (â ïðîöåíòàõ) çàêðûâàþòñÿ âñå îðäåðà
extern string Setup_Order1 = "--------------- Setting Order ¹ 1 ---------------";
extern bool TradeOrder1 = true;
extern double TradeLots1 = 0.1;
extern int TradeSL1 = 30;
extern int TradeTS1 = 50;
extern int TradeTP1 = 0;
extern string Setup_Order2 = "--------------- Setting Order ¹ 2 ---------------";
extern bool TradeOrder2 = true;
extern double TradeLots2 = 0.1;
extern int TradeSL2 = 50;
extern int TradeTS2 = 80;
extern int TradeTP2 = 0;
extern string Setup_Order3 = "--------------- Setting Order ¹ 3 ---------------";
extern bool TradeOrder3 = true;
extern double TradeLots3 = 0.1;
extern int TradeSL3 = 80;
extern int TradeTS3 = 120;
extern int TradeTP3 = 0;
extern string Setup_Order4 = "--------------- Setting Order ¹ 4 ---------------";
extern bool TradeOrder4 = true;
extern double TradeLots4 = 0.1;
extern int TradeSL4 = 120;
extern int TradeTS4 = 160;
extern int TradeTP4 = 0;
extern string Setup_Services = "==================== SERVICES ===================";
extern int Repeat = 3; // Ïåðåìåííàÿ äëÿ Alert
extern int Periods = 5; // Ïåðåìåííàÿ äëÿ Alert
extern bool UseAlert = false;
extern bool SoundPlay = false;
extern bool SendEmail = false;
extern string TradeLog = "TD-Lines";
extern int NumberOfTries = 3; // Êîëè÷åñòâî òîðãîâûõ ïîïûòîê
extern int Slippage = 2;
//IIIIIIIIIIIIIIIIIII======Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà======IIIIIIIIIIIIIIIIIIIIII+
int gi_Digits, gi_Decimal = 1, gia_HistoryOrders[], DotLoc = 7,
Crepeat = 0, AlertTime = 0, gi_HistoryOrders, gi_dig, gia_PartLots[],
gia_Priority[], gia_TP[4], gia_SL[4], gia_MyOrders[2], gi_MyOrders,
RetryTime = 3; // Ïàóçà â ñåê. ì\ó òîðãîâûìè ïîïûòêàìè
double gd_Point, AheadTradeSec = 0, AheadExitSec = 0, gda_Pribul[],
gda_TradeLots[4], gda_SL[4], gda_TP[4], gda_TS[4],
gd_TrailingStep, gd_TrailingStop, gd_BreakEven, gd_Pribul, gd_MIN_Stop,
gd_Balance, gd_Equity, gd_FreeMargin, gd_Margin, LotsMM,
gd_LOTSTEP, gd_MAXLOT, gd_MINLOT, sig_buy, sig_sell, gd_ATR_Trailing,
gd_BeginBalance; // íà÷àëüíîå çíà÷åíèå Áàëàíñà
bool gba_OrderTrade[4], gb_VirtualTrade = false, gb_Pause;
string gsa_TradeComment[4], filename, gs_NameGV, sound = "alert.wav",
gs_Symbol, gs_pref, gs_sign, gs_Conditions;
datetime gdt_NewBarControl, gdt_NewBar;
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| ***** Ïàðàìåòðû èíäèêàòîðà ***** |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
extern string Indicator_Setting = "=============== Indicator Setting ===============";
extern int ShowBars = 300; // if ShowBars= 0 so the indicator will be shown for all the chart
extern int LevDP = 2; // Demar Pint Levels; 2 = central bar will be higher (lower) then 2 bars on the left side and 2 bars on the right one.
extern int Steps = 1; // number of steps/ no more than 3
extern int BackStep = 0; // number of staps back
extern int StartBar = 0; // if StartBar = 0 so we have recommendation for the current bar, if 1 - for possible next bar
extern bool TrendLine = false; // false = no trend lines
extern bool HorizontLine = false; // true = break levels
extern bool ChannelLine = false; // true = channels which is parallel with trend lines
extern bool TakeLines = false; // true = take profit lines
extern bool Comments = false; // true = comments
extern int Trend = 0; // 1 = for UpTrendLines only, -1 = for DownTrendLines only, 0 = for all TrendLines
extern bool ShowArrows = true;
extern bool CustomFeatures = true;
extern color UpTrendColor = Green;
extern color DownTrendColor = Red;
extern int TrendlineWidth = 3;
extern bool ShowAlerts = false;
extern bool EmailAlert = false;
//IIIIIIIIIIIIIIIIIII==========Ïîäêëþ÷åííûå áèáëèîòåêè==========IIIIIIIIIIIIIIIIIIIIII+
#include <stdlib.mqh>
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Custom expert initialization function |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int init()
{
string tmpArr[], ls_txt = "", ls_tmp = "";
//----
filename = StringConcatenate (Symbol(), TradeLog, "-", Month(), "-", Day(), ".log");
gi_Digits = Digits;
gd_Point = Point;
gs_Symbol = Symbol();
gi_dig = LotDecimal();
gs_pref = StringConcatenate (Symbol(), "_", Period(), "_");
gs_NameGV = StringConcatenate ("TD-Lines[", MagicNumber, "]");
//---- Ó÷èòûâàåì ðàáîòó 5-òè çíàêà
if (gi_Digits == 3 || gi_Digits == 5)
{gi_Decimal = 10;}
MIN_Stop *= gi_Decimal;
gd_MIN_Stop = MIN_Stop * gd_Point;
TrailingStep *= gi_Decimal;
gd_TrailingStep = TrailingStep * gd_Point;
TrailingStop *= gi_Decimal;
gd_TrailingStop = TrailingStop * gd_Point;
BreakEven *= gi_Decimal;
gd_BreakEven = BreakEven * gd_Point;
DotLoc *= gi_Decimal;
gd_MAXLOT = MarketInfo (gs_Symbol, MODE_MAXLOT);
gd_MINLOT = MarketInfo (gs_Symbol, MODE_MINLOT);
gd_LOTSTEP = MarketInfo (gs_Symbol, MODE_LOTSTEP);
//---- Ïîäãîíÿåì êëþ÷åâûå ìàññèâû ïîä ðàçìåð
ArrayResize (gda_Pribul, TradeOrders);
ArrayResize (gia_HistoryOrders, TradeOrders);
ArrayResize (gia_Priority, TradeOrders);
ArrayResize (gia_PartLots, TradeOrders);
//---- Çàïîëíÿåì ìàññèâû
if (!AutoSTOPs_ON)
{
gba_OrderTrade[0] = TradeOrder1;
gba_OrderTrade[1] = TradeOrder2;
gba_OrderTrade[2] = TradeOrder3;
gba_OrderTrade[3] = TradeOrder4;
TradeSL1 *= gi_Decimal;
gda_SL[0] = TradeSL1 * gd_Point;
TradeSL2 *= gi_Decimal;
gda_SL[1] = TradeSL2 * gd_Point;
TradeSL3 *= gi_Decimal;
gda_SL[2] = TradeSL3 * gd_Point;
TradeSL4 *= gi_Decimal;
gda_SL[3] = TradeSL4 * gd_Point;
TradeTP1 *= gi_Decimal;
gda_TP[0] = TradeTP1 * gd_Point;
TradeTP2 *= gi_Decimal;
gda_TP[1] = TradeTP2 * gd_Point;
TradeTP3 *= gi_Decimal;
gda_TP[2] = TradeTP3 * gd_Point;
TradeTP4 *= gi_Decimal;
gda_TP[3] = TradeTP4 * gd_Point;
TradeTS1 *= gi_Decimal;
gda_TS[0] = TradeTS1 * gd_Point;
TradeTS2 *= gi_Decimal;
gda_TS[1] = TradeTS2 * gd_Point;
TradeTS3 *= gi_Decimal;
gda_TS[2] = TradeTS3 * gd_Point;
TradeTS4 *= gi_Decimal;
gda_TS[3] = TradeTS4 * gd_Point;
}
else
{TakeLines = true;}
gda_TradeLots[0] = TradeLots1;
gda_TradeLots[1] = TradeLots2;
gda_TradeLots[2] = TradeLots3;
gda_TradeLots[3] = TradeLots4;
for (int li_int = 0; li_int < TradeOrders; li_int++)
{gsa_TradeComment[li_int] = StringConcatenate (TradeComment, li_int);}
Crepeat = Repeat;
if (UseMM)
{
//---- Çàïîëíÿåì ðàáî÷èé ìàññèâ íàñòðîå÷íûìè äàííûìè
fSplitStrToStr (QuotaEachOrders, tmpArr);
int li_size = ArraySize (tmpArr);
ArrayResize (gia_PartLots, li_size);
for (li_int = 0; li_int < li_size; li_int++)
{
gia_PartLots[li_int] = StrToInteger (tmpArr[li_int]);
ls_tmp = StringConcatenate (ls_tmp, "PartLots[", li_int, "] = ", gia_PartLots[li_int], "; ");
}
Print (ls_tmp);
ls_tmp = "";
}
if (IsOptimization() || (IsTesting() && !IsVisualMode()))
{gb_VirtualTrade = true;}
else
{
if (GlobalVariableCheck (StringConcatenate (gs_NameGV, "_#BeginBalance")))
{gd_BeginBalance = GlobalVariableGet (StringConcatenate (gs_NameGV, "_#BeginBalance"));}
else
{gd_BeginBalance = AccountBalance();}
}
if (TradeBar <= 0)
{Alert ("Íå ìîãó òîðãîâàòü íà 0-îì áàðå !!!");}
//---- Îïðåäåëÿåì çíà÷¸ê âàëþòû äåïîçèòà
gs_sign = IIFs ((AccountCurrency() == "USD"), "$", IIFs ((AccountCurrency() == "EUR"), "", "RUB"));
Print ("MIN Lot = ", DSDig (gd_MINLOT), "; SPREAD = ", MarketInfo (gs_Symbol, MODE_SPREAD));
gs_Conditions = StringConcatenate ("TradeBar = ", TradeBar, "; N TradeBars = ", N_TradeBars, "; LifeMinBar = ", LifeMinBar, "\n",
"Reverse [", On (Reverse), "] MM [", On (UseMM), "] Prioritity [", On (Use_Prioritity), "] TrailATR [", On (Use_TrailATR), "]\n");
//----
return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Custor expert deinitialization function |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int deinit()
{
//----
gd_Pribul = fCalculate_Pribul (gi_HistoryOrders, MagicNumber);
//---- Âûâîäèì êîììåíòàðèè
fCommentInChart();
//----
return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Custom expert iteration function |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int start()
{
//---- Óñëîâèå - íà ýòîì áàðå ðàáîòàåì îäèí ðàç
if (gdt_NewBarControl == iTime (gs_Symbol, NewBarInPeriod, 0))
{return (0);}
gdt_NewBarControl = iTime (gs_Symbol, NewBarInPeriod, 0);
//----
int li_pos, fl_OpenSell = 0, fl_OpenBuy = 0, fl_CloseSell = 0,
li_IND, li_total, fl_CloseBuy = 0, fl_AllowTrade = 0, fl_AllowExit = 0,
lia_BAR[] = {1,1}, lia_LastBAR[] = {0,0};
string ls_txt;
//----
//---- Åñëè íåò îòêðûòûõ îðäåðîâ, ðàáîòàåì â íà÷àëå áàðà
if (gdt_NewBar != Time[0])
{
gdt_NewBar = Time[0];
//---- Íà îòêðûòèå îðäåðîâ ïðîâåðÿåì îäèí ðàç íà íà÷àëå áàðà ãðàôèêà
gb_Pause = false;
}
else
{
gb_Pause = true;
if (gi_MyOrders == 0)
{return (0);}
}
//---- Trade before bar current bar closed
if (TimeCurrent() >= Time[0] + Period() * 60 - AheadTradeSec) {fl_AllowTrade = 1;} else {fl_AllowTrade = 0;}
if (TimeCurrent() >= Time[0] + Period() * 60 * LifeMinBar) {fl_AllowExit = 1;} else {fl_AllowExit = 0;}
if (AheadTradeSec == 0) fl_AllowTrade = 1;
if (AheadExitSec == 0) fl_AllowExit = 1;
//---- Ïîäñ÷èòûâàåì ñòàòèñòèêó
fGet_Statistic();
//---- Ñ÷èòàåì "ñâîè" îðäåðà
gi_MyOrders = fMyOrders (-1, MagicNumber);
//---- Âûâîäèì êîììåíòàðèè
fCommentInChart();
//---- Åñëè ëîññ ïðåâûñèë äîïóñòèìîå çíà÷åíèå îò áàëàíñà, çàêðûâàåì âñå îðäåðà !!!
//---- Åñëè ïðîèãðàëè RiskDepo, çàêðûâàåì âñå îðäåðà !!!
if (fControl_RiskDEPO (ls_txt, RiskDepo, MAXLossDepoPercent, gd_BeginBalance, gd_Balance, AccountProfit()))
{
if (gi_MyOrders > 0)
{
li_total = CloseOrderAll (-1);
if (li_total > 0)
{ls_txt = StringConcatenate (ls_txt, " Delete ALL[", li_total, "] orders !!!");}
}
fWrite_Log (ls_txt);
return (0);
}
//---- Conditions to open the position
sig_buy = 0;
while (sig_buy == 0 || sig_buy == EMPTY_VALUE)
{
sig_buy = iCustom (NULL, 0, "i-PSI@TD-Lines", ShowBars, LevDP, Steps, BackStep, StartBar, TrendLine, HorizontLine, ChannelLine, TakeLines, Comments, Trend, ShowArrows, CustomFeatures, UpTrendColor, DownTrendColor, TrendlineWidth, ShowAlerts, EmailAlert, 2, lia_BAR[0]);
lia_BAR[0]++;
if (lia_BAR[0] >= ShowBars)
{
lia_BAR[0] = 0;
break;
}
}
//---- Èùåì ïðåäûäóùèé ñèãíàë íà ïîêóïêó
lia_LastBAR[0] = lia_BAR[0] + 1;
sig_buy = 0;
while (sig_buy == 0 || sig_buy == EMPTY_VALUE)
{
sig_buy = iCustom (NULL, 0, "i-PSI@TD-Lines", ShowBars, LevDP, Steps, BackStep, StartBar, TrendLine, HorizontLine, ChannelLine, TakeLines, Comments, Trend, ShowArrows, CustomFeatures, UpTrendColor, DownTrendColor, TrendlineWidth, ShowAlerts, EmailAlert, 2, lia_LastBAR[0]);
lia_LastBAR[0]++;
if (lia_LastBAR[0] >= ShowBars)
{
lia_LastBAR[0] = ShowBars;
break;
}
}
sig_sell = 0;
while (sig_sell == 0 || sig_sell == EMPTY_VALUE)
{
sig_sell = iCustom (NULL, 0, "i-PSI@TD-Lines", ShowBars, LevDP, Steps, BackStep, StartBar, TrendLine, HorizontLine, ChannelLine, TakeLines, Comments, Trend, ShowArrows, CustomFeatures, UpTrendColor, DownTrendColor, TrendlineWidth, ShowAlerts, EmailAlert, 3, lia_BAR[1]);
lia_BAR[1]++;
if (lia_BAR[1] >= ShowBars)
{
lia_BAR[1] = 0;
break;
}
}
//---- Èùåì ïðåäûäóùèé ñèãíàë íà ïîêóïêó
lia_LastBAR[1] = lia_BAR[1] + 1;
sig_sell = 0;
while (sig_sell == 0 || sig_sell == EMPTY_VALUE)
{
sig_sell = iCustom (NULL, 0, "i-PSI@TD-Lines", ShowBars, LevDP, Steps, BackStep, StartBar, TrendLine, HorizontLine, ChannelLine, TakeLines, Comments, Trend, ShowArrows, CustomFeatures, UpTrendColor, DownTrendColor, TrendlineWidth, ShowAlerts, EmailAlert, 3, lia_LastBAR[1]);
lia_LastBAR[1]++;
if (lia_LastBAR[1] >= ShowBars)
{
lia_LastBAR[1] = ShowBars;
break;
}
}
//---- Ïðîâåðÿåì óñëîâèÿ íà îòêðûòèå îðäåðîâ
if (lia_BAR[0] < lia_BAR[1])
{
if (Ask > High[lia_BAR[0]]) // òåêóùàÿ öåíà âûøå ñèãíàëüíîãî áàðà
{
if ((lia_BAR[0] >= TradeBar // ïîäòâåðæäåíèå ñèãíàëà (íå îòìåí¸í)
|| lia_LastBAR[0] < lia_LastBAR[1]) // ýòî ïîäðÿä ñëåäóþùèé ñèãíàë â òîì æå íàïðàâëåíèè
&& lia_BAR[0] < TradeBar + N_TradeBars) // ïðîäîëæèòåëüíîñòü äåéñòâèÿ ñèãíàëà
{fl_OpenBuy = 1;}
if (gia_MyOrders[1] > 0)
{fl_CloseSell = 1;}
}
}
else if (lia_BAR[1] < lia_BAR[0])
{
if (Bid < Low[lia_BAR[1]]) // òåêóùàÿ öåíà íèæå ñèãíàëüíîãî áàðà
{
if ((lia_BAR[1] >= TradeBar // ïîäòâåðæäåíèå ñèãíàëà (íå îòìåí¸í)
|| lia_LastBAR[1] < lia_LastBAR[0]) // ýòî ïîäðÿä ñëåäóþùèé ñèãíàë â òîì æå íàïðàâëåíèè
&& lia_BAR[1] < TradeBar + N_TradeBars) // ïðîäîëæèòåëüíîñòü äåéñòâèÿ ñèãíàëà
{fl_OpenSell = 1;}
if (gia_MyOrders[0] > 0)
{fl_CloseBuy = 1;}
}
}
if (Reverse)
{
int OpTmp = fl_OpenSell;
fl_OpenSell = fl_OpenBuy;
fl_OpenBuy = OpTmp;
OpTmp = fl_CloseSell;
fl_CloseSell = fl_CloseBuy;
fl_CloseBuy = OpTmp;
}
if (Use_TrailATR)
{gd_ATR_Trailing = ATR_Trailing * iATR (Symbol(), ATR_TF, ATR_Period, 1);}
//---- Çàêðûâàåì îðäåðà ïî ïðîòèâîïîëîæíîìó ñèãíàëó
if (gi_MyOrders > 0)
{
li_total = OrdersTotal();
if (fl_AllowExit == 1)
{
for (li_pos = li_total - 1; li_pos >= 0; li_pos--)
{
OrderSelect (li_pos, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && ((OrderMagicNumber() == MagicNumber) || MagicNumber < 0))
{
if (OrderType() == OP_BUY)
{
if (fl_CloseBuy == 1)
{
if (fOrderClose (OrderTicket(), OrderLots(), NDD (Bid), Slippage, Red))
{
if (!gb_VirtualTrade)
{
SetText (Time[0], High[0] + 1 * DotLoc * Point, ("CloseBuy" + DoubleToStr (Time[0], 0)), CharToStr (251), Magenta);
fPlay_Sound ("alert.wav");
Alerts (0, 0, fl_CloseBuy, fl_CloseSell, Bid, 0, 0, OrderTicket());
}
return (0);
}
}
}
if (OrderType() == OP_SELL)
{
if (fl_CloseSell == 1)
{
if (fOrderClose (OrderTicket(), OrderLots(), NDD (Ask), Slippage, Red))
{
if (!gb_VirtualTrade)
{
SetText (Time[0], High[0] - 0.3 * DotLoc * Point, ("CloseSell" + DoubleToStr (Time[0], 0)), CharToStr (251), Magenta);
fPlay_Sound ("alert.wav");
Alerts (0, 0, fl_CloseBuy, fl_CloseSell, Ask, 0, 0, OrderTicket());
}
return (0);
}
}
}
//---- Ïðîâîäèì òðåéëèíã
li_IND = fCheck_MyComment (OrderComment(), gsa_TradeComment);
if (li_IND < 0)
{continue;}
fTrailing (li_IND);
fTrailing2 (OrderComment(), gda_TS[li_IND]);
}
}
}
}
//---- Should we open a position?
else
{
if (gb_Pause)
{return (0);}
if (fl_AllowTrade == 1)
{
double MyStopLoss, MyTakeProfit;
int ticket = 0;
if (fl_OpenSell == 1)
{
//SetText (Time[0], High[0] + 1 * DotLoc * gd_Point, ("Sell" + DoubleToStr (Time[0], 0)), CharToStr (234), Red);
fPlay_Sound ("alert.wav");
//---- Ïîëó÷àåì îò èíäèêàòîðà ÑÒÎÏû
if (AutoSTOPs_ON)
{fGet_STOPs (1);}
//---- Ïîëó÷àåì ñóììàðíûé ëîò äëÿ âñåõ îðäåðîâ
LotsMM = fGet_SizeLot();
//---- Ïîëó÷àåì äèíàìè÷åñêèå ëîòû äëÿ êàæäîãî îðäåðà
fGet_MULTILots (LotsMM, gia_Priority, gia_PartLots, gda_TradeLots, gba_OrderTrade);
for (int li_ORD = 0; li_ORD < TradeOrders; li_ORD++)
{
if (gba_OrderTrade[li_ORD])
{
if (!AutoSTOPs_ON)
{
if (gda_TP[li_ORD] == 0) MyTakeProfit = 0; else MyTakeProfit = NDD (Bid - gda_TP[li_ORD]);
if (gda_SL[li_ORD] == 0) MyStopLoss = 0; else MyStopLoss = NDD (Bid + gda_SL[li_ORD]);
}
else
{
MyTakeProfit = NDD (gda_TP[li_ORD]);
MyStopLoss = NDD (gda_SL[li_ORD]);
}
ticket = fOrderSend (Symbol(), OP_SELL, gda_TradeLots[li_ORD], NDD (Bid), Slippage, MyStopLoss, MyTakeProfit, gsa_TradeComment[li_ORD], MagicNumber, 0, Red);
if (ticket > 0)
{
if (AutoSTOPs_ON)
{
OrderSelect (ticket, SELECT_BY_TICKET);
gda_TS[li_ORD] = NDD ((OrderOpenPrice() - gda_TP[li_ORD]) / 2);
gia_TP[li_ORD] = (OrderOpenPrice() - OrderTakeProfit()) / gd_Point;
gia_SL[li_ORD] = (OrderStopLoss() - OrderOpenPrice()) / gd_Point;
}
gi_MyOrders++;
}
Alerts (fl_OpenBuy, fl_OpenSell, 0, 0, Bid, MyStopLoss, MyTakeProfit, ticket);
}
}
return (0);
}
if (fl_OpenBuy == 1)
{
//SetText (Time[0], Low[0] - 0.3 * DotLoc * gd_Point, ("Buy" + DoubleToStr (Time[0], 0)), CharToStr (233), Lime);
fPlay_Sound ("alert.wav");
//---- Ïîëó÷àåì îò èíäèêàòîðà ÑÒÎÏû
if (AutoSTOPs_ON)
{fGet_STOPs (0);}
//---- Ïîëó÷àåì ñóììàðíûé ëîò äëÿ âñåõ îðäåðîâ
LotsMM = fGet_SizeLot();
//---- Ïîëó÷àåì äèíàìè÷åñêèå ëîòû äëÿ êàæäîãî îðäåðà
fGet_MULTILots (LotsMM, gia_Priority, gia_PartLots, gda_TradeLots, gba_OrderTrade);
for (li_ORD = 0; li_ORD < TradeOrders; li_ORD++)
{
if (gba_OrderTrade[li_ORD])
{
if (!AutoSTOPs_ON)
{
if (gda_TP[li_ORD] == 0) MyTakeProfit = 0; else MyTakeProfit = NDD (Ask + gda_TP[li_ORD]);
if (gda_SL[li_ORD] == 0) MyStopLoss = 0; else MyStopLoss = NDD (Ask - gda_SL[li_ORD]);
}
else
{
MyTakeProfit = NDD (gda_TP[li_ORD]);
MyStopLoss = NDD (gda_SL[li_ORD]);
}
ticket = fOrderSend (Symbol(), OP_BUY, gda_TradeLots[li_ORD], NDD (Ask), Slippage, MyStopLoss, MyTakeProfit, gsa_TradeComment[li_ORD], MagicNumber, 0, Green);
if (ticket > 0)
{
if (AutoSTOPs_ON)
{
OrderSelect (ticket, SELECT_BY_TICKET);
gda_TS[li_ORD] = NDD ((gda_TP[li_ORD] - OrderOpenPrice()) / 2);
gia_TP[li_ORD] = (OrderTakeProfit() - OrderOpenPrice()) / gd_Point;
gia_SL[li_ORD] = (OrderOpenPrice() - OrderStopLoss()) / gd_Point;
}
gi_MyOrders++;
}
Alerts (fl_OpenBuy, fl_OpenSell, 0, 0, Ask, MyStopLoss, MyTakeProfit, ticket);
}
}
return (0);
}
}
}
//---- Ñ÷èòàåì "ñâîè" îðäåðà
gi_MyOrders = fMyOrders (-1, MagicNumber);
//----
return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ïîëó÷àåì îò èíäèêàòîðà ÑÒÎÏû èç ãëîáàëüíûõ ïåðåìåííûõ |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGet_STOPs (int fi_Type)
{
if (!AutoSTOPs_ON)
{return;}
//----
string ls_Name, ls_Line;
//----
//---- Îáíóëÿåì ìàññèâû
ArrayInitialize (gda_SL, 0.0);
ArrayInitialize (gda_TP, 0.0);
ArrayInitialize (gba_OrderTrade, false);
if (!Use_TrailATR)
{gd_ATR_Trailing = ATR_Trailing * iATR (Symbol(), ATR_TF, ATR_Period, 1);}
switch (fi_Type)
{
case 0:
for (int li_GV = 0; li_GV < TradeOrders; li_GV++)
{
//---- Ðåâåðñèðóåì ñòîïû
if (!Reverse) {ls_Line = "HTL_";} else {ls_Line = "LTL_";}
//---- TP äëÿ BUY
ls_Name = StringConcatenate (gs_pref, ls_Line, li_GV);
if (GlobalVariableCheck (ls_Name))
{
gda_TP[li_GV] = GlobalVariableGet (ls_Name);
gda_TP[li_GV] = MathMax (gda_TP[li_GV], Ask + gd_ATR_Trailing);
//---- Ðåâåðñèðóåì ñòîïû
if (!Reverse) {ls_Line = "LTL_";} else {ls_Line = "HTL_";}
//---- SL äëÿ BUY
ls_Name = StringConcatenate (gs_pref, ls_Line, li_GV);
if (GlobalVariableCheck (ls_Name))
{
gda_SL[li_GV] = GlobalVariableGet (ls_Name);
if (Ask - gda_SL[li_GV] <= gd_MIN_Stop)
{
fWrite_Log (StringConcatenate ("BUY: SL íå êîððåêòåí (Ask[", DSD (Ask), "] - SL[", DSD (gda_SL[li_GV]), "])"));
gda_SL[li_GV] = Ask - gd_ATR_Trailing * (li_GV + 1);
}
}
else
{
fWrite_Log (StringConcatenate ("BUY: SL íå çàäàí (Ask[", DSD (Ask), "] - SL[", DSD (gda_SL[li_GV]), "])"));
gda_SL[li_GV] = Ask - gd_ATR_Trailing * (li_GV + 1);
}
//---- Åñëè ÑÒÎÏû åñòü, ðàçðåøàåì îòêðûòèå îðäåðà
gba_OrderTrade[li_GV] = true;
}
}
break;
case 1:
for (li_GV = 0; li_GV < TradeOrders; li_GV++)
{
//---- Ðåâåðñèðóåì ñòîïû
if (!Reverse) {ls_Line = "LTL_";} else {ls_Line = "HTL_";}
//---- TP äëÿ SELL
ls_Name = StringConcatenate (gs_pref, ls_Line, li_GV);
if (GlobalVariableCheck (ls_Name))
{
gda_TP[li_GV] = GlobalVariableGet (ls_Name);
gda_TP[li_GV] = MathMin (gda_TP[li_GV], Bid - gd_ATR_Trailing);
//---- Ðåâåðñèðóåì ñòîïû
if (!Reverse) {ls_Line = "HTL_";} else {ls_Line = "LTL_";}
//---- SL äëÿ SELL
ls_Name = StringConcatenate (gs_pref, ls_Line, li_GV);
if (GlobalVariableCheck (ls_Name))
{
gda_SL[li_GV] = GlobalVariableGet (ls_Name);
if (gda_SL[li_GV] - Bid <= gd_MIN_Stop)
{
fWrite_Log (StringConcatenate ("SELL: SL íå êîððåêòåí (Bid[", DSD (Bid), "] - SL[", DSD (gda_SL[li_GV]), "])"));
gda_SL[li_GV] = Bid + gd_ATR_Trailing * (li_GV + 1);
}
}
else
{
fWrite_Log (StringConcatenate ("SELL: SL íå çàäàí (Bid[", DSD (Bid), "] - SL[", DSD (gda_SL[li_GV]), "])"));
gda_SL[li_GV] = Bid + gd_ATR_Trailing * (li_GV + 1);
}
//---- Åñëè ÑÒÎÏû åñòü, ðàçðåøàåì îòêðûòèå îðäåðà
gba_OrderTrade[li_GV] = true;
}
}
break;
}
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Îáùèå ôóíêöèè |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ïðîâåðÿåì êîììåíòàðèé |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fCheck_MyComment (string fs_Comment, string ar_Comment[])
{
//----
for (int li_int = 0; li_int < ArraySize (ar_Comment); li_int++)
{
if (StringFind (fs_Comment, ar_Comment[li_int]) >= 0)
{return (li_int);}
}
//----
return (-1);
}
//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+
//| Àâòîð : TarasBY |
//+-----------------------------------------------------------------------------------+
//| Âåðñèÿ : 27.10.2009 |
//| Îïèñàíèå: fControlChangeValue_D Ôèêñèðóåò ôàêò èçìåíåíèÿ ïðîâåðÿåìîãî |
//| double ïàðàìåòðà ñ ïîãðåøíîñòüþ (deviation) |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCCV_D (double param, int ix)
{
static double cur_param[10];
static bool lb_first = true;
//----
//---- Ïðè ïåðâîì çàïóñêå èíèöèàëèçèðóåì ìàññèâ
if (lb_first)
{
for (int l_int = 0; l_int < ArraySize (cur_param); l_int++)
{cur_param[l_int] = 0;}
lb_first = false;
}
if (cur_param[ix] != param)
{cur_param[ix] = param; return (true);}
//----
return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+-----------------------------------------------------------------------------------+
//| Âåðñèÿ : 01.02.2008 |
//| Îïèñàíèå : Âîçâðàùàåò îäíî èç äâóõ çíà÷åíèé âçàâèñèìîñòè îò óñëîâèÿ. |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string IIFs (bool condition, string ifTrue, string ifFalse)
{if (condition) {return (ifTrue);} else {return (ifFalse);}}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ, íîðìàëèçàöèè çíà÷åíèÿ double äî Digit |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double NDD (double v)
{return (NormalizeDouble (v, gi_Digits));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ, ïåðåâîäà çíà÷åíèÿ èç double â string c íîðìàëèçàöèåé ïî Digit |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string DSD (double v)
{return (DoubleToStr (v, gi_Digits));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ, ïåðåâîäà çíà÷åíèÿ èç double â string c íîðìàëèçàöèåé ïî |
//| ìèíèìàëüíîé ðàçðÿäíîñòè ëîòà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string DSDig (double v) {return (DoubleToStr (v, gi_dig));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ, ïåðåâîäà çíà÷åíèÿ èç double â string c íîðìàëèçàöèåé ïî 0 |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string DS0 (double v) {return (DoubleToStr (v, 0));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double LotDecimal()
{
double steplot = MarketInfo (Symbol(), MODE_LOTSTEP);
//----
return (MathCeil (MathAbs (MathLog (steplot) / MathLog (10))));
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ñîáèðàåì ñòàòèñòèêó |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGet_Statistic()
{
int err = GetLastError();
//----
gd_Balance = AccountBalance();
gd_Equity = AccountEquity();
gd_FreeMargin = AccountFreeMargin();
gd_Margin = AccountMargin();
if (fCCV_D (OrdersHistoryTotal(), 0))
{
//---- Ñ÷èòàåì ñòàòèñòèêó ïî óäàë¸ííûì îðäåðàì
gd_Pribul = fCalculate_Pribul (gi_HistoryOrders, MagicNumber);
//---- Ïî ðåçóëüòàòàì ðàáîòû êàæäîãî ñåòà, óñòàíàâëèâàåì ïðèîðèòåò èñïîëíåíèÿ
if (Use_Prioritity)
{fRun_Sort (gia_Priority, gda_Pribul);}
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
//fGetLastError (gsa_Comment, "fGet_Statistic()", 4);
//----
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 ("BUYLIMIT");
case OP_SELLLIMIT: return ("SELLLIMIT");
case OP_BUYSTOP : return ("BUYSTOP");
case OP_SELLSTOP : return ("SELLSTOP");
}
return (StringConcatenate ("None (", op, ")"));
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string On (bool On)
//{if (On) return ("on"); else return ("off");}
{if (On) return ("Âêë."); else return ("Âûêë.");}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ñåðâèñíûõ ôóíêöèé |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| PRINT COMMENT FUNCTION |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fCommentInChart()
{
if (gb_VirtualTrade)
{return;}
string ls_Comment = "", ls_Stops,
sp = "\n",
NL = "\n";
int li_IND;
//----
ls_Comment = StringConcatenate (gs_NameGV, NL, gs_Conditions);
ls_Comment = StringConcatenate (ls_Comment, sp);
for (int li_ORD = 0; li_ORD < TradeOrders; li_ORD++)
{
li_IND = gia_Priority[li_ORD];
if (AutoSTOPs_ON)
{ls_Stops = StringConcatenate ("SL = ", gia_SL[li_IND], " | ", "TP = ", gia_TP[li_IND]);}
else
{ls_Stops = StringConcatenate ("SL = ", DS0 (gda_SL[li_IND] / gd_Point), " | ", "TP = ", DS0 (gda_TP[li_IND] / gd_Point));}
ls_Comment = StringConcatenate (ls_Comment, li_IND + 1, ": Lots = ", DSDig (gda_TradeLots[li_IND]), " | ", ls_Stops, " | TS = ", DS0 (gda_TS[li_IND] / gd_Point), " | Profit = ", gs_sign, " ", DS0 (gda_Pribul[li_IND]), " [", gia_HistoryOrders[li_IND], "]\n");
}
sp = " PSI©TarasBY \n";
ls_Comment = StringConcatenate (ls_Comment, sp);
ls_Comment = StringConcatenate (ls_Comment, "PROFIT = ", gs_sign, " ", DS0 (gd_Pribul), " [", gi_HistoryOrders, "]\n");
if (TrailingStop > 0)
{ls_Comment = StringConcatenate (ls_Comment, "TrailingStop = ", DS0 (TrailingStop), NL);}
Comment (ls_Comment);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fPlay_Sound (string fs_Name)
{if (SoundPlay) PlaySound (fs_Name);}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void SetText (int X1, double Y1, string TEXT_NAME, string TEXT_VALUE, int TEXT_COLOR)
{
if (gb_VirtualTrade)
{return;}
//----
if (ObjectFind (TEXT_NAME) != 0)
{
ObjectCreate (TEXT_NAME, OBJ_TEXT, 0, X1, Y1);
ObjectSet (TEXT_NAME, OBJPROP_COLOR, TEXT_COLOR);
ObjectSetText (TEXT_NAME, TEXT_VALUE, 10, "Wingdings", EMPTY);
}
else
{ObjectMove (TEXT_NAME, 0, X1, Y1);}
//----
return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void Alerts (int _buy, int _sell, int _exitbuy, int _exitsell, double _op, double _sl, double _tp, int _ticket)
{
if (gb_VirtualTrade)
{return;}
//----
string AlertStr = "",
CurDate = TimeToStr (TimeCurrent(), TIME_DATE|TIME_MINUTES);
//----
//----Alert system
if (UseAlert)
{
if (_buy == 1)
{
if (Crepeat == Repeat)
{AlertTime = 0;}
if (Crepeat > 0 && (TimeCurrent() - AlertTime) > Periods)
{
if (_buy == 1)
{
AlertStr = StringConcatenate (AlertStr, "Buy @ ", DSD (_op), "; SL: ", DSD (_sl), "; TP: ", DSD (_tp), " at ", CurDate, " Order: ", _ticket, ".");
Alert (Symbol(), " ", Period(), ": ", AlertStr);
if (SendEmail)
{SendMail (StringConcatenate (Symbol(), " ", Period(), ": "), StringConcatenate (Symbol(), " ", Period(), ": ", AlertStr));}
Crepeat = Crepeat - 1;
AlertTime = TimeCurrent();
}
}
}
if (_sell == 1)
{
if (Crepeat == Repeat)
{AlertTime = 0;}
if (Crepeat > 0 && (TimeCurrent() - AlertTime) > Periods)
{
if (_sell == 1)
{
AlertStr = StringConcatenate (AlertStr, "Sell @ ", DSD (_op), "; SL: ", DSD (_sl), "; TP: ", DSD (_tp), " at ", CurDate, " Order: ", _ticket, ".");
Alert (Symbol(), " ", Period(), ": ", AlertStr);
if (SendEmail)
{SendMail (StringConcatenate (Symbol(), " ", Period(), ": "), StringConcatenate (Symbol(), " ", Period(), ": ", AlertStr));}
Crepeat = Crepeat - 1;
AlertTime = TimeCurrent();
}
}
}
if (_exitsell == 1)
{
if (Crepeat == Repeat)
{AlertTime = 0;}
if (Crepeat > 0 && (TimeCurrent() - AlertTime) > Periods)
{
if (_exitsell == 1)
{
AlertStr = StringConcatenate (AlertStr, " Close Sell @ ", DSD (_op), " at ", CurDate, " Order:", _ticket, ".");
Alert (Symbol(), " ", Period(), ": ", AlertStr);
if (SendEmail)
{SendMail (StringConcatenate (Symbol(), " ", Period(), ": "), StringConcatenate (Symbol(), " ", Period(), ": ", AlertStr));}
Crepeat = Crepeat - 1;
AlertTime = TimeCurrent();
}
}
}
if (_exitbuy == 1)
{
if (Crepeat == Repeat)
{AlertTime = 0;}
if (Crepeat > 0 && (TimeCurrent() - AlertTime) > Periods)
{
if (_exitbuy == 1)
{
AlertStr = StringConcatenate (AlertStr, " Close Buy @ ", DSD (_op), " at ", CurDate, " Order:", _ticket, ".");
Alert (Symbol(), " ", Period(), ": ", AlertStr);
if (SendEmail)
{SendMail (StringConcatenate (Symbol(), " ", Period(), ": "), StringConcatenate (Symbol(), " ", Period(), ": ", AlertStr));}
Crepeat = Crepeat - 1;
AlertTime = TimeCurrent();
}
}
}
if (_exitbuy == 0 && _exitsell == 0 && _buy == 0 && _sell == 0)
{
Crepeat = Repeat;
AlertTime = 0;
}
}
//----
return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ïèøåì Log-ôàéë |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fWrite_Log (string fs_Txt)
{
if (gb_VirtualTrade)
{return;}
static datetime ldt_NewDay = 0;
//---- Èìÿ ëîã ôàéëà îïðåäåëÿåì îäèí ðàç â ñóòêè
if (ldt_NewDay != iTime (Symbol(), NULL, PERIOD_D1))
{
filename = StringConcatenate (Symbol(), TradeLog, "-", Month(), "-", Day(), ".log");
ldt_NewDay = iTime (Symbol(), NULL, PERIOD_D1);
}
int handle = FileOpen (filename, FILE_READ|FILE_WRITE|FILE_CSV, "/t");
//----
FileSeek (handle, 0, SEEK_END);
FileWrite (handle, StringConcatenate (" Time ", TimeToStr (TimeCurrent(), TIME_DATE|TIME_SECONDS), ": ", fs_Txt));
FileClose (handle);
Print (fs_Txt);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòà ñ îðäåðàìè |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Return number of orders with specific parameters |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fMyOrders (int Type, int Magic)
{
int _CntOrd = 0;
//----
ArrayInitialize (gia_MyOrders, 0);
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect (i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol())
{
if (OrderType() == Type || Type == -1)
{
if (OrderMagicNumber() == Magic || Magic < 0)
{
_CntOrd++;
gia_MyOrders[OrderType()]++;
}
}
}
}
//----
return (_CntOrd);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ çàêðûòèÿ îðäåðîâ ïî òèïó (OP) è Magic (iMG) |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int CloseOrderAll (int iMG = -1, int OP = -1)
{
color lc_close;
int li_Type, li_orders = 0, err = GetLastError();
double ld_ClosePrice;
bool lb_Close = false;
//----
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (!OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
{continue;}
if (OrderMagicNumber() != iMG && iMG >= 0)
{continue;}
//if (OrderSymbol() != Symbol())
//{continue;}
li_Type = OrderType();
if (OP == li_Type || OP == -1)
{
if (li_Type == OP_BUY) {ld_ClosePrice = Bid;} else {ld_ClosePrice = Ask;}
if (li_Type == OP_BUY) {lc_close = Blue;} else {lc_close = Red;}
lb_Close = fOrderClose (OrderTicket(), OrderLots(), ld_ClosePrice, Slippage, lc_close);
if (lb_Close)
{li_orders++;}
}
}
//fGetLastError (gsa_Comment, "CloseOrderAll()", 4);
//----
return (li_orders);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Send order with retry capabilities and log |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fOrderSend (string _symbol, int _cmd, double _volume, double _price, int _slippage, double _stoploss, double _takeprofit,
string _comment = "", int _magic = 0, datetime _expiration = 0, color _arrow_color = CLR_NONE)
{
int _stoplevel = MarketInfo (_symbol, MODE_STOPLEVEL);
double _priceop = 0;
int ticket, err, tries = 0;
//----
switch (_cmd)
{
case OP_BUY:
if (!IsTradeContextBusy() && IsTradeAllowed())
{
while (tries < NumberOfTries)
{
RefreshRates();
ticket = OrderSend (_symbol, OP_BUY, _volume, NDD (Ask), _slippage, NDD (_stoploss), NDD (_takeprofit), _comment, _magic, _expiration, _arrow_color);
if (ticket <= 0)
{
fWrite_Log (StringConcatenate ("Error Occured : ", ErrorDescription (GetLastError())));
fWrite_Log (StringConcatenate (Symbol(), " Buy @ ", DSD (Ask), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
tries++;
}
else
{
tries = NumberOfTries;
OrderSelect (ticket, SELECT_BY_TICKET);
fWrite_Log (StringConcatenate ("Order opened : ", Symbol(), " Buy @ ", DSD (Ask), " SL[", (OrderOpenPrice() - _stoploss) / gd_Point, "]: ", DSD (_stoploss), " TP[", (_takeprofit - OrderOpenPrice()) / gd_Point, "]: ", DSD (_takeprofit), " ticket = ", ticket));
}
Sleep (RetryTime * 1000);
}
}
err = ticket;
break;
case OP_SELL:
if (!IsTradeContextBusy() && IsTradeAllowed())
{
while (tries < NumberOfTries)
{
RefreshRates();
ticket = OrderSend (_symbol, OP_SELL, _volume, NDD (Bid), _slippage, NDD (_stoploss), NDD (_takeprofit), _comment, _magic, _expiration, _arrow_color);
if (ticket <= 0)
{
fWrite_Log (StringConcatenate ("Error Occured : ", ErrorDescription (GetLastError())));
fWrite_Log (StringConcatenate (Symbol(), " Sell @ ", DSD (Bid), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
tries++;
}
else
{
tries = NumberOfTries;
OrderSelect (ticket, SELECT_BY_TICKET);
fWrite_Log (StringConcatenate ("Order opened : ", Symbol(), " Sell @ ", DSD (Bid), " SL[", (_stoploss - OrderOpenPrice()) / gd_Point, "]: ", DSD (_stoploss), " TP[", (OrderOpenPrice() - _takeprofit) / gd_Point, "]: ", DSD (_takeprofit), " ticket = ", ticket));
}
Sleep (RetryTime * 1000);
}
}
err = ticket;
break;
case OP_BUYSTOP:
if (!IsTradeContextBusy() && IsTradeAllowed())
{
while (tries < NumberOfTries)
{
RefreshRates();
if ((_price - Ask) < _stoplevel * Point) _priceop = Ask + _stoplevel * Point; else _priceop = _price;
ticket = OrderSend (_symbol, OP_BUYSTOP, _volume, NDD (_priceop), _slippage, NDD (_stoploss), NDD (_takeprofit), _comment, _magic, _expiration, _arrow_color);
if (ticket <= 0)
{
fWrite_Log (StringConcatenate ("Error Occured : ", ErrorDescription (GetLastError())));
fWrite_Log (StringConcatenate (Symbol(), " Buy Stop @ ", DSD (_priceop), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
tries++;
}
else
{
tries = NumberOfTries;
fWrite_Log (StringConcatenate ("Order opened : ", Symbol(), " Buy Stop@ ", DSD (_priceop), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
}
Sleep (RetryTime * 1000);
}
}
err = ticket;
break;
case OP_SELLSTOP:
if (!IsTradeContextBusy() && IsTradeAllowed())
{
while (tries < NumberOfTries)
{
RefreshRates();
if ((Bid - _price) < _stoplevel * Point) _priceop = Bid - _stoplevel * Point; else _priceop = _price;
ticket = OrderSend (_symbol, OP_SELLSTOP, _volume, NDD (_priceop), _slippage, NDD (_stoploss), NDD (_takeprofit), _comment, _magic, _expiration, _arrow_color);
if (ticket <= 0)
{
fWrite_Log (StringConcatenate ("Error Occured : ", ErrorDescription (GetLastError())));
fWrite_Log (StringConcatenate (Symbol(), " Sell Stop @ ", DSD (_priceop), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
tries++;
}
else
{
tries = NumberOfTries;
fWrite_Log (StringConcatenate ("Order opened : ", Symbol(), " Sell Stop @ ", DSD (_priceop), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
}
Sleep (RetryTime * 1000);
}
}
err = ticket;
break;
case OP_BUYLIMIT:
if (!IsTradeContextBusy() && IsTradeAllowed())
{
while (tries < NumberOfTries)
{
RefreshRates();
if ((Ask - _price) < _stoplevel * Point) _priceop = Ask - _stoplevel * Point; else _priceop = _price;
ticket = OrderSend (_symbol, OP_BUYLIMIT, _volume, NDD (_priceop), _slippage, NDD (_stoploss), NDD (_takeprofit), _comment, _magic, _expiration, _arrow_color);
if (ticket <= 0)
{
fWrite_Log (StringConcatenate ("Error Occured : ", ErrorDescription (GetLastError())));
fWrite_Log (StringConcatenate (Symbol(), " Buy Limit @ ", DSD (_priceop), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
tries++;
}
else
{
tries = NumberOfTries;
fWrite_Log (StringConcatenate ("Order opened : ", Symbol(), " Buy Limit @ ", DSD (_priceop), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
}
Sleep (RetryTime * 1000);
}
}
err = ticket;
break;
case OP_SELLLIMIT:
if (!IsTradeContextBusy() && IsTradeAllowed())
{
while (tries < NumberOfTries)
{
RefreshRates();
if ((_price - Bid) < _stoplevel * Point) _priceop = Bid + _stoplevel * Point; else _priceop = _price;
ticket = OrderSend (_symbol, OP_BUYLIMIT, _volume, NDD (_priceop), _slippage, NDD (_stoploss), NDD (_takeprofit), _comment, _magic, _expiration, _arrow_color);
if (ticket <= 0)
{
fWrite_Log (StringConcatenate ("Error Occured : ", ErrorDescription (GetLastError())));
fWrite_Log (StringConcatenate (Symbol(), " Sell Limit @ ", DSD (_priceop), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
tries++;
}
else
{
tries = NumberOfTries;
fWrite_Log (StringConcatenate ("Order opened : ", Symbol(), " Sell Limit @ ", DSD (_priceop), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", ticket));
}
Sleep (RetryTime * 1000);
}
}
err = ticket;
break;
default:
fWrite_Log ("No valid type of order found");
err = -1;
break;
}
//----
return (err);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| The function close order with log |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fOrderClose (int _ticket, double _lots, double _price, int _slippage, color _color = CLR_NONE)
{
int tries = 0;
bool lb_result = false;
//----
if (!IsTradeContextBusy() && IsTradeAllowed())
{
while (tries < NumberOfTries)
{
RefreshRates();
lb_result = OrderClose (_ticket,_lots, NDD (_price), _slippage, _color);
if (!lb_result)
{
fWrite_Log (StringConcatenate ("Error Occured : ", ErrorDescription (GetLastError())));
fWrite_Log (StringConcatenate (Symbol(), " Close @ ", DSD (_price), " ticket = ", _ticket));
tries++;
}
else
{
OrderSelect (_ticket, SELECT_BY_TICKET, MODE_HISTORY);
tries = NumberOfTries;
fWrite_Log (StringConcatenate ("Order closed : ", OrderSymbol(), " Close @ ", DSD (_price), " Profit = ", DoubleToStr (OrderProfit() + OrderCommission() + OrderSwap(), 1), " ticket = ", _ticket));
}
Sleep (RetryTime * 1000);
}
}
//----
return (lb_result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| The function modify order with log |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fOrderModify (int _ticket, double _price, double _stoploss, double _takeprofit, datetime _expiration, color _color = CLR_NONE)
{
int tries = 0;
bool lb_result = false;
//----
if (!IsTradeContextBusy() && IsTradeAllowed())
{
while (tries < NumberOfTries)
{
RefreshRates();
lb_result = OrderModify (_ticket, NDD (_price), NDD (_stoploss), NDD (_takeprofit), _expiration, _color);
if (!lb_result)
{
fWrite_Log (StringConcatenate ("Error Occured : ", ErrorDescription (GetLastError())));
fWrite_Log (StringConcatenate (Symbol(), " Modify @ ", DSD (_price), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", _ticket));
tries++;
}
else
{
tries = NumberOfTries;
fWrite_Log (StringConcatenate ("Order modified : ", Symbol(), " Modify @ ", DSD (_price), " SL @ ", DSD (_stoploss), " TP @", DSD (_takeprofit), " ticket = ", _ticket));
}
Sleep (RetryTime * 1000);
}
}
//----
return (lb_result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fTrailing (int fi_IND)
{
double pBid, pAsk, ld_TrailFast, ld_Trail;
bool lb_BU = false;
//----
if (Use_TrailATR)
{gd_TrailingStop = gd_ATR_Trailing;}
if (OrderType() == OP_BUY)
{
pBid = Bid;
//---- BreakEven routine
if (BreakEven > 0)
{
if (AutoSTOPs_ON)
{
gd_BreakEven = MathMax (BreakEven * gd_Point, (gda_TP[fi_IND] - OrderOpenPrice()) / 3);
//---- Ïðè äîñòèæåíèè ïåðâîé öåëè, îñòàâøèåñÿ îðäåðà ïîäòÿãèâàåì â ÁÓ
if (pBid > gda_TP[0] && gda_TP[0] > 0)
{
lb_BU = true;
fWrite_Log (StringConcatenate ("BUY[", OrderTicket(), "]: 1-ÿ öåëü äîñòèãíóòà - SL â ÁÓ"));
}
}
if ((pBid - OrderOpenPrice()) > gd_BreakEven || lb_BU)
{
if ((OrderStopLoss() - OrderOpenPrice()) < 0)
{fModifyStopLoss ("fTrailing", NDD (OrderOpenPrice() + gd_TrailingStep));}
}
}
if (TrailingStop > 0 || Use_TrailATR)
{
if ((pBid - OrderOpenPrice()) > gd_TrailingStop)
{
if (OrderStopLoss() < pBid - (gd_TrailingStop + gd_TrailingStep) || OrderStopLoss() == 0)
{
fModifyStopLoss ("fTrailing", NDD (pBid - gd_TrailingStop));
return;
}
}
}
}
if (OrderType() == OP_SELL)
{
pAsk = Ask;
if (BreakEven > 0)
{
if (AutoSTOPs_ON)
{
gd_BreakEven = MathMax (BreakEven * gd_Point, (OrderOpenPrice() - gda_TP[fi_IND]) / 3);
//---- Ïðè äîñòèæåíèè ïåðâîé öåëè, îñòàâøèåñÿ îðäåðà ïîäòÿãèâàåì â ÁÓ
if (pAsk < gda_TP[0])
{
lb_BU = true;
fWrite_Log (StringConcatenate ("SELL[", OrderTicket(), "]: 1-ÿ öåëü äîñòèãíóòà - SL â ÁÓ"));
}
}
if ((OrderOpenPrice() - pAsk) > gd_BreakEven || lb_BU)
{
if ((OrderOpenPrice() - OrderStopLoss()) < 0)
{fModifyStopLoss ("fTrailing", NDD (OrderOpenPrice() - gd_TrailingStep));}
}
}
if (gd_TrailingStop > 0 || Use_TrailATR)
{
if (OrderOpenPrice() - pAsk > gd_TrailingStop)
{
if (OrderStopLoss() > pAsk + (gd_TrailingStop + gd_TrailingStep) || OrderStopLoss() == 0)
{
fModifyStopLoss ("fTrailing", NDD (pAsk + gd_TrailingStop));
return;
}
}
}
}
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Modify StopLoss |
//| Parameters: |
//| ldStopLoss - StopLoss Leve |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fModifyStopLoss (string fs_Func, double ldStopLoss)
{
//----
fPlay_Sound ("alert.wav");
if (fOrderModify (OrderTicket(), OrderOpenPrice(), ldStopLoss, OrderTakeProfit(), 0, CLR_NONE))
{
if (AutoSTOPs_ON || Use_TrailATR)
{fWrite_Log (StringConcatenate (fs_Func, " - ", GetNameOP (OrderType()), "[", OrderTicket(), "]: äî öåëè ", DS0 (MathAbs (OrderTakeProfit() - OrderStopLoss()) / gd_Point), " ïï. TrailingStop = ", DS0 (gd_TrailingStop / gd_Point), " ïï."));}
}
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fTrailing2 (string com, double fd_Trailing)
{
double pBid, pAsk;
//----
if (OrderType() == OP_BUY)
{
pBid = MarketInfo (OrderSymbol(), MODE_BID);
if (fd_Trailing > 0 && OrderComment() == com)
{
if ((pBid - OrderOpenPrice()) > fd_Trailing)
{
if (OrderStopLoss() < pBid - (fd_Trailing + gd_TrailingStep) || OrderStopLoss() == 0)
{
fModifyStopLoss ("fTrailing2", NormalizeDouble (pBid - fd_Trailing, gi_Digits));
return;
}
}
}
}
if (OrderType() == OP_SELL)
{
pAsk = MarketInfo (OrderSymbol(), MODE_ASK);
if (fd_Trailing > 0 && OrderComment() == com)
{
if (OrderOpenPrice() - pAsk > fd_Trailing)
{
if (OrderStopLoss() > pAsk + (fd_Trailing + gd_TrailingStep) || OrderStopLoss() == 0)
{
fModifyStopLoss ("fTrailing2", NormalizeDouble (pAsk + fd_Trailing, gi_Digits));
return;
}
}
}
}
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Money Management |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ãëàâíàÿ ôóíêöèÿ ïîëó÷åíèÿ ðàçìåðà ëîòà (âûçûâàåòñÿ èç ñîâåòíèêà) |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fGet_SizeLot()
{
//---- Åñëè MM íå èñïîëüçóåòñÿ - âûõîäèì
if (!UseMM)
{return (0);}
double ld_Lots, Money = 0, ld_LastLot;
int err = GetLastError();
//----
switch (MeansType)
{
case 1: Money = gd_Balance; break;
case 2: Money = gd_Equity; break;
case 3: Money = gd_FreeMargin; break;
case 4: Money = RiskDepo; break;
}
if (MeansType == 3)
{ld_Lots = (gd_FreeMargin * LotsPercent) / (MarketInfo (gs_Symbol, MODE_MARGINREQUIRED) * 100.0);}
else
{ld_Lots = Money * MathMin (AccountLeverage(), 100) * LotsPercent / (100000 * 100);}
//---- Íîðìàëèçóåì ëîò
ld_Lots = fLotsNormalize (ld_Lots);
ld_Lots = MathMax (ld_Lots, MinLot);
ld_Lots = MathMin (ld_Lots, MaxLot);
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
//fGetLastError (gsa_Comment, "fGet_SizeLot()", 4);
//----
return (ld_Lots);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ïðîèçâîäèì íîðìàëèçàöèþ ëîòà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fLotsNormalize (double fd_Lots)
{
fd_Lots -= gd_MINLOT;
fd_Lots /= gd_LOTSTEP;
fd_Lots = MathRound (fd_Lots);
fd_Lots *= gd_LOTSTEP;
fd_Lots += gd_MINLOT;
fd_Lots = NormalizeDouble (fd_Lots, gi_dig);
fd_Lots = MathMax (fd_Lots, gd_MINLOT);
fd_Lots = MathMin (fd_Lots, gd_MAXLOT);
//----
return (fd_Lots);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ïîëó÷àåì ìóëüòè-ëîò |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGet_MULTILots (double fd_SUMLots, // Ñóììàðíûé ëîò
int ar_INDPrioritet[], // ìàññèâ èíäåêñîâ ïðèîðèòåòà
int ar_PartLots[], // ìàññèâ ñ ïðîöåíòàìè ëîòîâ
double& ar_TradeLots[], // âîçâðàùàåìûé ìàññèâ ëîòîâ
bool& ar_OrderTrade[]) // ðàçðåøåíèÿ íà òîðãîâëþ
{
//---- Åñëè MM íå èñïîëüçóåòñÿ - âûõîäèì
if (!UseMM)
{return;}
int li_IND, li_TradeOrders = 0, li_cnt = 0;
double ld_SUM = 0.0, ld_plus;
//----
// fGet_MULTILots (LotsMM, gia_Priority, gia_PartLots, gda_TradeLots, gba_OrderTrade);
//---- Ïîäñ÷èòûâàåì êîëè÷åñòâî îðäåðîâ íà ïðåäñòîÿùóþ "ñåññèþ"
for (int li_int = 0; li_int < TradeOrders; li_int++)
{
if (ar_OrderTrade[li_int])
{li_TradeOrders++;}
}
for (li_int = 0; li_int < TradeOrders; li_int++)
{
//---- Èçâëåêàåì èíäåêñ ïðèîðèòåòà
if (Use_Prioritity)
{li_IND = ar_INDPrioritet[li_int];}
else {li_IND = li_int;}
if (ar_OrderTrade[li_IND])
{
//---- Âíîñèì ðàñ÷¸òíûå çíà÷åíèÿ â ñîîòâåòñòâèè ñ ïðèîðèòåòîì
ar_TradeLots[li_IND] = fLotsNormalize (fd_SUMLots / 100 * ar_PartLots[li_int]);
ld_SUM += ar_TradeLots[li_IND];
if (fd_SUMLots >= ld_SUM)
{
li_cnt++;
if (li_cnt == li_TradeOrders)
{
while (fd_SUMLots < ld_SUM)
{
ld_plus = fLotsNormalize ((fd_SUMLots - ld_SUM) / li_TradeOrders);
for (int li_int1 = 0; li_int1 < li_TradeOrders; li_int1++)
{
//---- Èçâëåêàåì èíäåêñ ïðèîðèòåòà
li_IND = ar_INDPrioritet[li_int1];
//---- Äîáàâëÿåì îñòàòîê â ñîîòâåòñòâèè ñ ïðèîðèòåòîì
ar_TradeLots[li_IND] += fLotsNormalize (ld_plus);
ld_SUM += ar_TradeLots[li_IND];
}
}
}
}
else
{
if (li_cnt < TradeOrders)
{
//---- Çàïðåùàåì ýòîò îðäåð â ýòîé "ñåññèè"
ar_OrderTrade[li_IND] = false;
continue;
}
break;
}
}
}
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ñëåäèì çà êðèòè÷åñêèì óìåíüøåíèåì ðàçìåðà äåïî |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fControl_RiskDEPO (string& fs_Info, // âîçâðàùàåìûé êîììåíòàðèé
double fd_RiskDepo, // Ðèñêîâûé êàïèòàë îò ïåðâîíà÷àëüíîãî Äåïî
double fd_MAXLossDepoPercent, // ìàêñèìàëüíûé LOSS Äåïî
double fd_BeginBalance, // íà÷àëüíûé ðàçìåð Äåïî
double fd_Balance, // îò êàêîé âåëè÷èíû âåä¸ì ðàñ÷¸ò
double fd_Profit) // òåêóùèé ðåçóëüòàò ðàáîòû
{
bool lb_STOPRiskBeginDepo, lb_STOPMAXLossDepoPercent, lb_CLOSE = false;
string ls_prichina, ls_fName = "fControl_RiskDEPO()";
double ld_ChangeBalance;
//----
//fRiskDEPOControl (ls_txt, RiskDepo, MAXLossDepoPercent, gd_BeginBalance, AccountBalance(), AccountProfit());
lb_STOPRiskBeginDepo = (fd_BeginBalance - fd_RiskDepo > fd_Balance + fd_Profit);
ld_ChangeBalance = fd_Balance * fd_MAXLossDepoPercent / 100;
lb_STOPMAXLossDepoPercent = (-ld_ChangeBalance > fd_Profit);
lb_CLOSE = (lb_STOPMAXLossDepoPercent || lb_STOPRiskBeginDepo);
if (lb_CLOSE)
{
if (lb_STOPMAXLossDepoPercent) {ls_prichina = StringConcatenate ("MAX Loss[", DS0 (ld_ChangeBalance), "] < cur[|", DS0 (MathAbs (fd_Profit)), "|].");}
else if (lb_STOPRiskBeginDepo) {ls_prichina = StringConcatenate ("RiskDepo[", DS0 (fd_BeginBalance - fd_RiskDepo), "] > cur[", DS0 (fd_Balance + fd_Profit), "].");}
fs_Info = StringConcatenate (ls_fName, ": STOP TRADE - ", ls_prichina);
return (true);
}
//----
return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ñ÷èòàåì çàðàáîòàííóþ ïðèáûëü (åñëè âîîáùå çàðàáîòàëè) |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fCalculate_Pribul (int& fi_HistoryOrders, // âîçâàðùàåìûé ìàññèâ çàêðûòûõ îðäåðîâ ïî òð¸ì òèïàì îðäåðîâ
int fi_Magic = -1, // ìàññèâ Magic
int fi_OP = -1, // òèï (BUY\SELL) ó÷èòûâàåìûõ îðäåðîâ
datetime fdt_TimeBegin = 0) // ìîìåíò âðåìåíè, ñ êîòîðîãî ïðîèçâîäèì ðàñ÷¸ò
{
int li_IND, err = GetLastError(), history_total = OrdersHistoryTotal();
double ld_Pribul = 0.0, ld_ALLPribul = 0.0;
string ls_Name;
static bool lb_first = true;
//----
//fCalculate_Pribul (gi_HistoryOrders, MG);
ArrayInitialize (gda_Pribul, 0.0);
ArrayInitialize (gia_HistoryOrders, 0);
fi_HistoryOrders = 0;
for (int li_int = history_total - 1; li_int >= 0; li_int--)
{
if (OrderSelect (li_int, SELECT_BY_POS, MODE_HISTORY))
{
if (Symbol() == OrderSymbol())
{
if (OrderType() < 2 && (fi_OP < 0 || OrderType() == fi_OP))
{
if (OrderMagicNumber() == fi_Magic || fi_Magic < 0)
{
li_IND = fCheck_MyComment (OrderComment(), gsa_TradeComment);
if (li_IND < 0)
{continue;}
if (fdt_TimeBegin < OrderCloseTime())
{
//---- Ñ÷èòàåì èòîãè ðàáîòû
ld_Pribul = OrderProfit() + OrderSwap() + OrderCommission();
ld_ALLPribul += ld_Pribul;
gda_Pribul[li_IND] += ld_Pribul;
gia_HistoryOrders[li_IND]++;
fi_HistoryOrders++;
}
}
}
}
}
}
//----
return (ld_ALLPribul);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòà ñ ìàññèâàìè |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| UNI: Ñîðòèðóåì èíäåêñû ìàññèâà ïî âîçðàñòàíèþ |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fRun_Sort (int& ar_INDEX[], double fda_Value[])
{
int li_IND, li_int, li_tmp, li_size = ArraySize (fda_Value);
//----
for (li_IND = 0; li_IND < li_size; li_IND++)
{ar_INDEX[li_IND] = li_IND;}
for (li_IND = 0; li_IND < li_size; li_IND++)
{
for (li_int = li_IND + 1; li_int < li_size; li_int++)
{
if (fda_Value[ar_INDEX[li_IND]] < fda_Value[ar_INDEX[li_int]])
{
li_tmp = ar_INDEX[li_int];
ar_INDEX[li_int] = ar_INDEX[li_IND];
ar_INDEX[li_IND] = li_tmp;
}
}
}
//----
return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
Comments