Price Data Components
Orders Execution
0
Views
0
Downloads
0
Favorites
e-PSI8ExtremumsAndChannel
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| e-PSI@Extremums&Channel.mq4 |
//| Copyright © 2011, TarasBY |
//| taras_bulba@tut.by |
//| òîë÷¸ê îò Evgeny I. SHCHERBINA |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
#property copyright "Copyright © 2011, TarasBY WM R418875277808"
#property link "taras_bulba@tut.by"
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
/*Ñîâåòíèê âûïîëíÿåò ñëåäóþùåå:
1. Íàõîäèò ýêñòðåìóìû è îïðåäåëÿåò "ôëýòîâûé êîðèäîð";
2. Îòêðûâàåò ñäåëêè â îáðàòíîì íàïðàâëåíèè îò ýêñòðåìóìîâ è ïðè ïðîáèòèè êîðèäîðà (ôëýòà);
3. Êîìïåíñèðóåò âîçìîæíûå óáûòî÷íûå ñäåëêè îòêðûòèåì êîìïåíñàòîðíîãî îðäåðà â òîì æå
íàïðàâëåíèè c óâåëè÷èâàþùèìñÿ ëîòîì (åñëè ðàçðåøåíî).*/
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| ***** Ïàðàìåòðû ñîâåòíèêà ***** |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
extern string SETUP_Expert = "=========== Îáùèå íàñòðîéêè ñîâåòíèêà ===========";
extern int MG = 123; // Ìàãèê
extern int NewBarInPeriod = 1; // <= 0 - ðàáîòàåì íà íà÷àëå ïåðèîäà íîâîãî áàðà, -1 - ðàáîòàåì íà êàæäîì òèêå
extern int Variant_TradePrice = 1; // Âàðèàíò öåí, ñ êîòîðûìè áóäåò ðàáîòàòü ñîâåòíèê
// 0 - Bid\Ask ("êàê Áîã ïîøë¸ò") - íà ðåçóëüòàòû òåñòåðà ìîæåòå íå îáðàùàòü âíèìàíèÿ
// 1 - Open[0] - ïðåäïî÷òèòåëüíûé âàðèàíò (íà ëþáèòåëÿ)
// 2 - Close[1] - (íà ëþáèòåëÿ)
// 3 - Close[0] - "íà âñÿêèé ñëó÷àé"
extern int Profit_MIN = 10; // Ìèí. ïðîôèò äëÿ çàêðûòèÿ îðäåðà (â ïï.)
extern int MIN_StopLoss = 50; // Ìèí. ñòîï-ëîññ äëÿ âñåõ îðäåðîâ
extern bool Send_base_ON = TRUE; // Îòêðûâàåì base (îñíîâíûå) îðäåðà
extern int MIN_Range = 80; // ìèí. äèàïàçîí ìåæäó ìèí. è ìàêñ.
extern int Trailling_Volume = 20; // Ðàçìåð òðàëà
extern bool Send_comp_ON = TRUE; // Îòêðûâàåì êîìïåíñàòîðíûå (âìåñòå ñ base èëè flat) îðäåðà
extern double K_comp_lot = 2.0; // Êîýôôèöèåíò óâåëè÷èâàþùåãîñÿ ëîòà äëÿ êîìïåíñàòîðíîãî îðäåðà
extern int Comp_Range = 150; // Ìèí. ðàññòîÿíèå â ïï. îò 1-ãî îðäåðà äî íîâîãî ýêñòðåìóìà
extern bool Send_flat_ON = TRUE; // Îòêðûâàåì flat (íà ïðîáîé flat-êàíàëà) îðäåðà
extern int MAX_flat_Range = 30; // ìàêñ. äèàïàçîí "ôëýòîâîãî êîðèäîðà"
extern int Weight_Channel = 20; // Äëèíà "ôëýòîâîãî êîðèäîðà" â ñâå÷àõ
extern int Trailling_Vol_Channel = 7; // òðàë êîðèäîðà
extern bool Dinamic_Trail_ON = TRUE; // Ðàçìåð òðàëà îïðåäåëÿåì ïî MAX ðàçìåðó ñâå÷è ïîñëåäíèõ Counted_Bars áàðîâ
extern int Counted_Bars = 5; // Êîëè÷åñòâî ïîñëåäíèõ ñâå÷åé äëÿ îïðåäåëåíèÿ âåëè÷èíû Trailling
extern int Slippage = 2; // Äîïóñòèìîå îòêëîíåíèå îò çàïðîøåííîé öåíû
extern int CloseTime = 7; // Êîëè÷åñòâî äíåé æèçíè ëîññîâîãî îðäåðà
extern bool SoundAlert = FALSE; // Çâóê
extern string Setup_PartClose = "======== ×àñòè÷íîå çàêðûòèå flat îðäåðîâ ========";
extern bool PartClose_ON = TRUE; // ×àñòè÷íîå çàêðûòèå flat îðäåðîâ
extern string Levels = "20/50/200"; // Óðîâíè çàêðûòèÿ. Íàïðèìåð, ïðè ïàðàìåòðàõ 10/20/5 ïåðâîå çàêðûòèå âûïîëíÿåòñÿ ïðè äîñòèæåíèè îðäåðîì ïðèáûëè â 10 ïóíêòîâ, çàòåì åùå ÷åðåç 20 ïóíêòîâ è åùå ÷åðåç 5 ïóíêòîâ.
extern int DinamicLevels = 1; // Óðîâíè çàêðûòèÿ óñòàíàâëèâàþòñÿ äèíàìè÷åñêè îò Trailling_Vol_Channel, åñëè DinamicLevels > 0
// 1: 1-ûé Trailling_Vol_Channel / 2; 2-îé Trailling_Vol_Channel; 3-èé Trailling_Vol_Channel * 2
// 2: 1-ûé Trailling_Vol_Channel; 2-îé Trailling_Vol_Channel * 2; 3-èé Trailling_Vol_Channel * 3
// 3: 1-ûé Trailling_Vol_Channel * 0.618; 2-îé Trailling_Vol_Channel * 1.236; 3-èé Trailling_Vol_Channel * 2
extern string Percents = "50/25/25"; // Ïðîöåíò çàêðûòèÿ (÷åðåç ðàçäåëèòåëü "/") äëÿ ñîîòâåòñòâóþùåãî óðîâíÿ. Çäåñü îòñ÷åò èäåò îò ëîòà ïåðâîãî îðäåðà. Åñëè èñõîäíûé îðäåð îòêðûò ñ ëîòîì 1.0 ëîò, çàêðûâàåòñÿ 50% - 0.5, çàòåì 25% îò 1.0 - 0.3 è íàêîíåö 0.2
extern string Setup_Lots = "========= Ïàðàìåòðû ìîäóëÿ ðàñ÷¸òà ëîòà =========";
extern bool UseMM = TRUE; // Èñïîëüçîâàòü ðàñøèðÿþùèéñÿ ëîò
extern string Setup_LotsWayChoice = "LotsWayChoice: 0 - ôèêñèð.; 1 - % îò MeansType; 2 - ôðàêöèîííî-ïðîïîðö.; 3 - ôðàêöèîííî-ôèêñèð.";
extern int LotsWayChoice = 1; // Ñïîñîá âûáîðà ðàáî÷åãî ëîòà:
extern string Setup_MeansType = "MeansType: 1 - Balance; 2 - Equity; 3 - FreeMargin; 4 - RiskDepo";
extern int MeansType = 3; // Òèï ñðåäñòâ èñïîëüçóåìûõ ïðè ðàñ÷åòå ðàçìåðà ëîòà:
extern double Order_Lots = 0.1; // Ôèêñèðîâàííûé ðàçìåð ëîòà
extern int LotsPercent = 3; // Ïðîöåíò îò äåïîçèòà
extern int LotsDeltaDepo = 500; // Êîýôôèöèåíò ïðèðàùåíèÿ äåïîçèòà
extern int LotsDepoForOne = 500; // Ðàçìåð äåïîçèòà äëÿ îäíîãî ìèíèëîòà
extern int LotsMax = 1000; // Ìàêñèìàëüíîå êîëè÷åñòâî ìèíèëîòîâ
extern double MinLot = 0.1; // Ìèíèìàëüíûé ëîò ðûíî÷íîãî îðäåðà
extern double MaxLot = 2.0; // Ìàêñèìàëüíûé ëîò ðûíî÷íîãî îðäåðà
extern double RiskDepo = 2000.0; // Ðàçìåð Depo â âàëþòå äåïîçèòà, íà êîòîðûé èãðàåì
extern string Setup_Table = "=============== Ïàðàìåòðû òàáëèöû ===============";
extern bool DrawObject_ON = FALSE; // Ðèñîâàòü ëè íà ãðàôèêå îáúåêòû (äëÿ òåñòèðîâàíèÿ è îïòèìèçàöèè íè ê ÷åìó)
extern color Base_color = Lime; // Îñíîâíîé öâåò òàáëèöû
extern color ADD_color = Gold; // Äîïîëíèòåëüíûé öâåò òàáëèöû
extern color Profit_color = Blue; // Öâåò ïîëîæèòåëüíîé ñòàòèñòèêè
extern color LOSS_color = Red; // Öâåò îòðèöàòåëüíîé ñòàòèñòèêè
extern color Time_color = Aqua; // Öâåò îòîáðàæåíèÿ âðåìåíè ñîáûòèÿ
extern string Font_Table = "Calibri"; // Øðèôò òàáëèöû
extern string Font_Time = "Calibri"; // Øðèôò îòîáðàæåíèÿ âðåìåíè ñîáûòèé
extern string WorkSheduller = "============== Ðàáîòà ïî ðàñïèñàíèþ =============";
extern bool TimeControl = TRUE;
extern int Open_HourTrade = 2;
extern int Close_HourTrade = 16;
extern int AllCloseHour = 0;
//IIIIIIIIIIIIIIIIIII======Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà======IIIIIIIIIIIIIIIIIIIIII+
double gd_HIGH, gd_LOW, gd_flat_MAX, gd_flat_MIN, gda_Pribul[3], gd_MIN_Range,
gd_MAX_flat_Range = 0, gd_Trail, gd_Trail_ch, gda_otkat[2], gd_MinSTOP,
gd_flat_Channel = 0, gd_MaxLOSS, gd_Profit, gd_Point, gd_Channel_base,
gd_Comp_Range, gd_Profit_MIN, gd_min_SL, gda_Price[2];
int gi_MyOrders, gi_Ticket, gi_Decimal = 1, gi_Digits, gi_dig, gi_counted_bars,
gi_HistoryTotal = 0, gi_min = 45,
gia_HistoryOrders[3], gia_MG[2], gia_Levels[], gia_Percents[];
string gs_trade, gs_sign, gsa_NameCom[] = {"base","add","flat"}, gs_Symbol,
gs_NameGV, gs_fName, gs_ComError = "";
bool gb_flat = false, gba_Send[3], RealTrade = true,
gb_moove_UP = False, gb_moove_DW = False;
color gc_base_BUY = Blue, // öâåò BUY base-îðäåðîâ
gc_base_SELL = Red, // öâåò SELL base-îðäåðîâ
gc_add_BUY = LightSeaGreen, // öâåò BUY add-îðäåðîâ
gc_add_SELL = DarkOrchid, // öâåò SELL add-îðäåðîâ
gc_flat_BUY = Aqua, // öâåò BUY flat-îðäåðîâ
gc_flat_SELL = Magenta, // öâåò SELL flat-îðäåðîâ
gc_modify = Yellow, // öâåò ìîäèôèöèðóåìîãî îðäåðà
gc_high, gc_low;
datetime NewBar, dta_CommentTime[10];
//IIIIIIIIIIIIIIIIIII==========Ïîäêëþ÷åííûå áèáëèîòåêè==========IIIIIIIIIIIIIIIIIIIIII+
#import "kernel32.dll"
void GetLocalTime (int& TimeArray[]);
int GetTimeZoneInformation (int& TZInfoArray[]);
#import
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Custom expert initialization function |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int init()
{
int li_size, err = GetLastError();
string lsa_txt[2], tmpArr[];
//----
gs_Symbol = Symbol();
gi_Digits = MarketInfo (gs_Symbol, MODE_DIGITS);
gd_Point = MarketInfo (gs_Symbol, MODE_POINT);
gi_dig = LotDecimal();
gia_MG[0] = MG;
gia_MG[1] = MG + 1;
gba_Send[0] = Send_base_ON;
gba_Send[1] = Send_comp_ON;
gba_Send[2] = Send_flat_ON;
gs_trade = "Ïðîâåä¸ííûå îïåðàöèè îòñòóòñòâóþò !!!";
//---- Îïðåäåëÿåì çíà÷åíèå âàëþòû äåïîçèòà (äëÿ îòîáðàæåíèÿ ñòàòèñòèêè)
gs_sign = "RUB";
if (AccountCurrency() == "USD") {gs_sign = "$";}
if (AccountCurrency() == "EUR") {gs_sign = "";}
//---- Ó÷èòûâàåì ðàáîòó 5-òè çíàêà
if (gi_Digits == 3 || gi_Digits == 5)
{gi_Decimal = 10;}
gd_MIN_Range = MIN_Range * gi_Decimal * gd_Point;
gd_MAX_flat_Range = MAX_flat_Range * gi_Decimal * gd_Point;
gd_Trail = Trailling_Volume * gi_Decimal * gd_Point;
gd_Trail_ch = Trailling_Vol_Channel * gi_Decimal * gd_Point;
gd_Profit_MIN = Profit_MIN * gi_Decimal * gd_Point;
gd_Comp_Range *= Comp_Range * gi_Decimal;
gd_min_SL = MIN_StopLoss * gi_Decimal * gd_Point;
Profit_MIN *= gi_Decimal;
MIN_Range *= gi_Decimal;
Comp_Range *= gi_Decimal;
MAX_flat_Range *= gi_Decimal;
//---- Îïðåäåëÿåì íà÷àëüíûå Extremums
gi_MyOrders = MyPositions (gia_MG);
if (gi_MyOrders == 0)
{
gd_HIGH = 0;
gd_LOW = 0;
fGet_HIGH (gd_MIN_Range);
fGet_LOW (gd_MIN_Range);
//---- Îïðåäåëÿåì øèðèíó ïîëó÷åííîãî êàíàëà
gd_Channel_base = gd_HIGH - gd_LOW;
}
gs_NameGV = "Extremums&Channel";
if (IsTesting())
{gs_NameGV = gs_NameGV + "_t";}
if (IsDemo())
{gs_NameGV = gs_NameGV + "_d";}
//---- Ïîäãîòîâêà êîìïîíåíòîâ ñèñòåìû PartClose
fSplitStrToStr (Levels, tmpArr, "/");
li_size = ArraySize (tmpArr);
ArrayResize (gia_Levels, li_size);
for (int li_int = 0; li_int < li_size; li_int++)
{gia_Levels[li_int] = StrToInteger (tmpArr[li_int]) * gi_Decimal;}
lsa_txt[0] = "Çàêðûâàåì îðäåðà ïî ÷àñòÿì â ";
lsa_txt[1] = "ïðè äîñòèæåíèè îðäåðîì ïðîôèòà â ";
fSplitStrToStr (Percents, tmpArr, "/");
ArrayResize (gia_Percents, li_size);
for (li_int = 0; li_int < li_size; li_int++)
{
gia_Percents[li_int] = StrToInteger (tmpArr[li_int]);
lsa_txt[0] = StringConcatenate (lsa_txt[0], gia_Percents[li_int], IIFs ((li_int == li_size - 1), " ", ", "));
lsa_txt[1] = StringConcatenate (lsa_txt[1], gia_Levels[li_int], IIFs ((li_int == li_size - 1), " ïï.", ", "));
}
lsa_txt[0] = StringConcatenate (lsa_txt[0], " ïðîöåíòàõ îò ëîòà ", lsa_txt[1]);
Print (lsa_txt[0]);
//---- Èäåíòèôèöèðóåì ñòàòóñ ðàáîòû ñîâåòíèêà
if (IsTesting() || IsOptimization())
{RealTrade = False;}
//---- Îòêëþ÷àåì íå èñïîëüçóåìûå ôóíêöèè ïðè òåñòèðîâàíèè è îïòèìèçàöèè
if (!RealTrade)
{SoundAlert = false;}
if (IsOptimization())
{DrawObject_ON = false;}
//---- Ïîä÷èùàåì GV-ïåðåìåííûå
if (!RealTrade)
{GlobalVariablesDeleteAll (gs_NameGV);}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gs_ComError, "init()");
//----
return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Custor expert deinitialization function |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int deinit()
{
//----
//---- Ðèñóåì íà ãðàôèêå êîììåíòû
if (DrawObject_ON)
{
//---- Ïîäñ÷èòûâàåì èòîãè ðàáîòû
fCalculatePribul (gs_Symbol, gda_Pribul, gia_HistoryOrders, gia_MG);
fInfoDraw (5, 15);
}
if (!RealTrade)
{GlobalVariablesDeleteAll (gs_NameGV);}
//----
return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Custom expert iteration function |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int start()
{
//---- Ïî âûõîäíûì "íå ëîõìàòèì áàáóøêó"
if (!ServerWork())
{return (0);}
//----
int li_add_Ticket = 0, err = GetLastError();
//---- Äëÿ èçëèøíåé îïòèìèçàöèè óáèðàåì íå ñóùåñòâåííûå âàðèàíòû
if (IsOptimization())
{
if (MIN_Range <= MAX_flat_Range || Comp_Range <= MIN_Range)
{return (0);}
}
//---- Îïðåäåëÿåì ïåðèîäè÷íîñòü ðàáîòû ñîâåòíèêà
if (NewBarInPeriod >= 0)
{
if (NewBar == iTime (gs_Symbol, NewBarInPeriod, 0))
{return (0);}
NewBar = iTime (gs_Symbol, NewBarInPeriod, 0);
}
//---- Ïîëó÷àåì öåíû, ñ êîòîðûìè áóäåò ðàáîòàòü ñîâåòíèê
fGetTradePrice (Variant_TradePrice, gda_Price);
//---- Ïîëó÷àåì äàííûå î íàøèõ îðäåðàõ
gi_MyOrders = -1;
while (gi_MyOrders < 0)
{
gi_MyOrders = MyPositions (gia_MG);
if (!IsExpertEnabled() || IsStopped())
{break;}
}
//---- Åñëè åñòü îòêðûòûå ñäåëêè, ðàáîòàåò òðàë
if (gi_MyOrders > 0)
{
//---- Ðàññ÷èòûâàåì äèíàìè÷åñêèé òðàë (åñëè ðàçðåøåíî)
fGetDinamicTrail (Counted_Bars, gd_Trail, gd_Trail_ch);
fTrailling (gia_MG);
}
//---- Îðãàíèçîâûâàåì ðàáîòó ïî âðåìåíè
if (IsTradeTime (Open_HourTrade, Close_HourTrade))
{
//---- Åñëè îðäåðîâ íåò
if (gi_MyOrders == 0)
{
gi_Ticket = 0;
if (Send_base_ON // ðàçðåøåíî îòêðûâàòüñÿ
&& (gd_HIGH != 0 && gd_LOW != 0) // íàéäåíû HIGH è LOW
&& !gb_flat) // íå ñôîðìèðîâàí "ôëýòîâûé êîðèäîð"
{
//---- Ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ îñíîâíîãî îðäåðà
gi_Ticket = fBase_Strategy (gia_MG[0]);
if (gi_Ticket > 0)
{
if (OrderSelect (gi_Ticket, SELECT_BY_TICKET)) {OrderPrint();}
gs_trade = StringConcatenate ("Îòêðûëè base-îðäåð[", gi_Ticket, "] ", GetNameOP (OrderType()), " (", OrderMagicNumber(), ") !!!");
Print (gs_trade, "[", OrdersTotal(), "/", gi_MyOrders, "]");
}
}
//---- Åñëè îñíîâíàÿ ñäåëêà íå îòêðûòà
if (Send_flat_ON && gi_Ticket <= 0)
{
//---- Îïðåäåëÿåì øèðèíó ïîëó÷åííîãî êàíàëà
gd_Channel_base = gd_HIGH - gd_LOW;
//---- Ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ flat-îðäåðà
gi_Ticket = fChannel_Strategy (gia_MG[1]);
if (gi_Ticket > 0)
{
gb_flat = false;
if (OrderSelect (gi_Ticket, SELECT_BY_TICKET)) {OrderPrint();}
gs_trade = StringConcatenate ("Îòêðûëè flat-îðäåð[", gi_Ticket, "] ", GetNameOP (OrderType()), " (", OrderMagicNumber(), ") !!!");
Print (gs_trade, "[", OrdersTotal(), "/", gi_MyOrders, "]");
}
}
}
//---- Îòêðûâàåì êîìïåíñàòîðíûé îðäåð (åñëè çàäàíî)
if (gi_MyOrders == 1 && Send_comp_ON && (Send_base_ON || Send_flat_ON))
{
if (!OrderSelect (gi_Ticket, SELECT_BY_TICKET))
{return (0);}
//---- Åñëè îñíîâíàÿ ñäåëêà âûõîäèò â ìèíóñ, îòêðûâàåì êîìïåíñàòîðíóþ ñäåëêó
if (OrderProfit() + OrderCommission() + OrderSwap() < 0)
{
gs_fName = "start()";
//---- Íàõîäèì íîâûå ýêñòðåìóìû
if (OrderType() == OP_BUY)
{
if (fGet_LOW (gd_MIN_Range, gi_Ticket) == 0)
{return (0);}
}
if (OrderType() == OP_SELL)
{
if (fGet_HIGH (gd_MIN_Range, gi_Ticket) == 0)
{return (0);}
}
//---- Îïðåäåëÿåì øèðèíó ïîëó÷åííîãî êàíàëà
gd_Channel_base = gd_HIGH - gd_LOW;
if (gd_Channel_base > gd_MIN_Range)
{Print ("Íîâûé êàíàë äëÿ îòêðûòèÿ êîìïåíñàòîðíîãî îðäåðà ñôîðìèðîâàí = ", gd_Channel_base / gd_Point, " !!!");}
//---- Ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ êîìïåíñàòîðíîãî îðäåðà
li_add_Ticket = fCompensation_Strategy (gi_Ticket, gia_MG[0]);
if (li_add_Ticket > 0)
{
gb_flat = false;
if (OrderSelect (li_add_Ticket, SELECT_BY_TICKET)) {OrderPrint();}
gs_trade = StringConcatenate ("Îòêðûëè add-îðäåð[", li_add_Ticket, "] ", GetNameOP (OrderType()), " (", OrderMagicNumber(), ") !!!");
Print (gs_trade, "[", OrdersTotal(), "]");
}
}
}
}
//---- Ðèñóåì íà ãðàôèêå êîììåíòû
if (DrawObject_ON)
{
//---- Ïîäñ÷èòûâàåì èòîãè ðàáîòû
if (OrdersHistoryTotal() != gi_HistoryTotal)
{
fCalculatePribul (gs_Symbol, gda_Pribul, gia_HistoryOrders, gia_MG);
gi_HistoryTotal = OrdersHistoryTotal();
}
fInfoDraw (5, 15);
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gs_ComError, "start()");
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Óíèêàëüíûå ôóíêöèè |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Íàõîäèì HIGH ýêñòðåìóì |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_HIGH (double fd_Distance, int fi_NewTicket = 0)
{
int i, li_Bar, li_Day, cnt, err = GetLastError();
double lda_PriceBar[10], ld_Extrem;
string ls_High, ls_Name;
static int li_preTicket, li_cnt = 0;
bool lb_break = false;
//----
//---- Îïðåäåëÿåì HIGH äëÿ êàæäîãî îðäåðà â îòäåëüíîñòè
if (li_preTicket == fi_NewTicket && fi_NewTicket != 0)
{return (0);}
//---- Îïðåäåëÿåì êîëè÷åñòâî ïðîñ÷èòûâàåìûõ áàð çà ïîñëåäíèõ 3-îå ñóòîê, íî íå ìåíüøå 100 (áàð)
li_Day = 3;
if (TimeDayOfWeek(Time[0]) == 1) {li_Day = 5;}
if (TimeDayOfWeek(Time[0]) == 2) {li_Day = 4;}
gi_counted_bars = iBarShift (gs_Symbol, Period(), (Time[0] - 1440 * 60 * li_Day));
//---- Èòåðàöèÿ gi_counted_bars ñâå÷åê, ñðåäè íèõ íóæíî íàéòè "¸ëî÷êó" (ïèêîâàÿ ñâå÷êà + ïî 5 ñâå÷åê ïî áîêàì)
for (i = 5; i <= gi_counted_bars; i++)
{
if (Close[i] > Open[i]) {ld_Extrem = Close[i];} else {ld_Extrem = Open[i];}
if (ld_Extrem > gda_Price[1] && ld_Extrem - fd_Distance < gda_Price[1] // "çîíà ñòàðòà" âíèç
//---- Ýòî äîëæíà áûòü âåðøèíà ñðåäè +- Weight_Channel áàðîâ
&& ld_Extrem > iClose (gs_Symbol, Period(), iHighest (gs_Symbol, Period(), MODE_CLOSE, MathMin (i, Weight_Channel), MathMax (0, i - Weight_Channel)))
&& ld_Extrem > iOpen (gs_Symbol, Period(), iHighest (gs_Symbol, Period(), MODE_OPEN, MathMin (i, Weight_Channel), MathMax (0, i - Weight_Channel))))
{
cnt = 0;
for (li_Bar = 0; li_Bar < 11; li_Bar++)
{
if (li_Bar == 5)
{continue;}
if (Close[li_Bar+i-5] > Open[li_Bar+i-5]) {lda_PriceBar[cnt] = Close[li_Bar+i-5];} else {lda_PriceBar[cnt] = Open[li_Bar+i-5];}
cnt++;
}
lb_break = false;
//---- Èùåì "¸ëî÷êó"
for (li_Bar = 0; li_Bar < 10; li_Bar++)
{
if (lda_PriceBar[li_Bar] > ld_Extrem)
{
lb_break = true;
break;
}
}
if (lb_break)
{continue;}
gd_HIGH = ld_Extrem - 4 * gi_Decimal * gd_Point;
//---- HIGH íå ìîæåò áûòü íèæå LOW
if (gd_HIGH >= gd_LOW + fd_Distance)
{
//---- Åñëè HIGH ñòàðøå LOW > 1 ÷àñ èùåì íîâûé HIGH
if (dta_CommentTime[1] + 3600 < dta_CommentTime[0])
{fGet_LOW (fd_Distance);}
else
{continue;}
}
if (fd_Distance < 150 * gi_Decimal * gd_Point) {gda_otkat[0] = 0.236;} else {gda_otkat[0] = 0.118;}
ls_High = DoubleToStr (gd_HIGH, gi_Digits);
//---- Åñëè ìàêñèìóì îáíîâèëñÿ
if (fCCV_S (ls_High, 0))
{
if (!RealTrade) {dta_CommentTime[0] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[0] = TimeCurrent();}
if (DrawObject_ON)
{
gc_high = Base_color;
Print (gs_fName, ": Íàøëè íîâûé ìàêñèìóì[", li_cnt,"] = ", ls_High);
DelObject ("high_add");
ls_Name = fNamedOBJ_cnt ("arrow_high", li_cnt);
SetArrow (218, Base_color, ls_Name, Time[i], High[i] + 3 * gi_Decimal * gd_Point, 1);
ObjectSetText (ls_Name, TimeToStr (Time[i], TIME_DATE|TIME_MINUTES), 10);
SetLabel ("high", StringConcatenate ("HIGH[", li_cnt,"] : ", ls_High), 5, 15, 10, Font_Table, 0, 0, CLR_NONE, Base_color);
SetLabel ("time_high", ": " + TimeToStr (dta_CommentTime[0], TIME_DATE|TIME_MINUTES), 250, 15, 10, Font_Time, 0, 0, CLR_NONE, Time_color);
}
}
li_preTicket = fi_NewTicket;
return (1);
}
}
//---- Åñëè "¸ëî÷êà" íå íàéäåíà, íàçíà÷àåì íîâûé ìàêñèìóì
if (i >= gi_counted_bars)
{
//---- Áåð¸ì HIGH ïîñëåäíèõ ñóòîê
gd_HIGH = iHigh (gs_Symbol, PERIOD_D1, 1);
//---- Íàõîäèì íîìåð áàðà ýòîãî High íà òåêóùåì ãðàôèêå
i = iBarShift (gs_Symbol, Period(), iTime (gs_Symbol, PERIOD_D1, 1));
i = iHighest (gs_Symbol, Period(), MODE_HIGH, i, 0);
gda_otkat[0] = 0.236;
ls_High = DoubleToStr (gd_HIGH, gi_Digits);
//---- Åñëè ìàêñèìóì îáíîâèëñÿ
if (fCCV_S (ls_High, 0))
{
if (!RealTrade) {dta_CommentTime[0] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[0] = TimeCurrent();}
if (DrawObject_ON)
{
gc_high = Blue;
Print (gs_fName, ": Íîâûé ìàêñèìóì íå íàøëè, ÍÎ íàçíà÷èëè[", li_cnt,"] = ", ls_High);
ls_Name = fNamedOBJ_cnt ("arrow_high", li_cnt);
SetArrow (218, ADD_color, ls_Name, Time[i], High[i] + 3 * gi_Decimal * gd_Point, 1);
ObjectSetText (ls_Name, TimeToStr (Time[i], TIME_DATE|TIME_MINUTES), 10);
SetLabel ("high", StringConcatenate ("New HIGH[", li_cnt,"]: "), 5, 15, 10, Font_Table, 0, 0, CLR_NONE, Base_color);
//---- Òàêîé ìàêñèìóì âûäåëÿåòñÿ äðóãèì öâåòîì
SetLabel ("high_add", ls_High, 102, 15, 10, Font_Table, 0, 0, CLR_NONE, ADD_color);
SetLabel ("time_high", ": " + TimeToStr (dta_CommentTime[0], TIME_DATE|TIME_MINUTES), 250, 15, 10, Font_Time, 0, 0, CLR_NONE, Time_color);
}
}
li_preTicket = fi_NewTicket;
return (1);
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gs_ComError, gs_fName);
//----
return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Íàõîäèì LOW ýêñòðåìóì |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_LOW (double fd_Distance, int fi_NewTicket = 0)
{
int i, cnt, err = GetLastError();
double lda_PriceBar[10], ld_Extrem;
string ls_Low, ls_Name;
static int li_preTicket, li_cnt = 0;
bool lb_break = false;
//----
//---- Îïðåäåëÿåì LOW äëÿ êàæäîãî îðäåðà â îòäåëüíîñòè
if (li_preTicket == fi_NewTicket && fi_NewTicket != 0)
{return (0);}
//---- Äëÿ ìèíèìóìà - "¸ëî÷êà" ïåðåâ¸ðíóòà
for (i = 5; i <= gi_counted_bars; i++)
{
if (Close[i] < Open[i]) {ld_Extrem = Close[i];} else {ld_Extrem = Open[i];}
if (ld_Extrem < gda_Price[0] && ld_Extrem + fd_Distance > gda_Price[0] // "çîíà ñòàðòà" ââåðõ
//---- Ýòî äîëæíà áûòü âïàäèíà ñðåäè +- Weight_Channel áàðîâ
&& ld_Extrem < iClose (gs_Symbol, Period(), iLowest (gs_Symbol, Period(), MODE_CLOSE, MathMin (i, Weight_Channel), MathMax (0, i - Weight_Channel)))
&& ld_Extrem < iOpen (gs_Symbol, Period(), iLowest (gs_Symbol, Period(), MODE_OPEN, MathMin (i, Weight_Channel), MathMax (0, i - Weight_Channel))))
{
cnt = 0;
for (int li_Bar = 0; li_Bar < 11; li_Bar++)
{
if (li_Bar == 5)
{continue;}
if (Close[li_Bar+i-5] < Open[li_Bar+i-5]) {lda_PriceBar[cnt] = Close[li_Bar+i-5];} else {lda_PriceBar[cnt] = Open[li_Bar+i-5];}
cnt++;
}
lb_break = false;
//---- Èùåì ïåðåâ¸ðíóòóþ "¸ëî÷êó"
for (li_Bar = 0; li_Bar < 10; li_Bar++)
{
if (lda_PriceBar[li_Bar] < ld_Extrem)
{
lb_break = true;
break;
}
}
if (lb_break)
{continue;}
gd_LOW = ld_Extrem + 4 * gi_Decimal * gd_Point;
//---- LOW íå ìîæåò áûòü âûøå HIGH
if (gd_LOW >= gd_HIGH - fd_Distance)
{
//---- Åñëè HIGH ñòàðøå LOW > 1 ÷àñ èùåì íîâûé HIGH
if (dta_CommentTime[0] + 3600 < dta_CommentTime[1])
{fGet_HIGH (fd_Distance);}
else
{continue;}
}
if (fd_Distance < 150 * gi_Decimal * gd_Point) {gda_otkat[1] = 0.236;} else {gda_otkat[1] = 0.118;}
ls_Low = DoubleToStr (gd_LOW, gi_Digits);
//---- Åñëè ìèíèìóì îáíîâèëñÿ
if (fCCV_S (ls_Low, 1))
{
if (!RealTrade) {dta_CommentTime[1] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[1] = TimeCurrent();}
if (DrawObject_ON)
{
gc_low = Base_color;
Print (gs_fName, ": Íàøëè íîâûé ìèíèìóì[", li_cnt,"] = ", ls_Low);
DelObject ("low_add");
ls_Name = fNamedOBJ_cnt ("arrow_low", li_cnt);
SetArrow (217, Base_color, ls_Name, Time[i], Low[i] - 3 * gi_Decimal * gd_Point, 1);
ObjectSetText (ls_Name, TimeToStr (Time[i], TIME_DATE|TIME_MINUTES), 10);
SetLabel ("low", StringConcatenate ("LOW[", li_cnt,"] : ", ls_Low), 5, 30, 10, Font_Table, 0, 0, CLR_NONE, Base_color);
SetLabel ("time_low", ": " + TimeToStr (dta_CommentTime[1], TIME_DATE|TIME_MINUTES), 250, 30, 10, Font_Time, 0, 0, CLR_NONE, Time_color);
}
}
li_preTicket = fi_NewTicket;
return (1);
}
}
//----Åñëè ïåðåâåðíóòàÿ "¸ëî÷êà" íå íàéäåíà,
if (i >= gi_counted_bars)
{
//---- Áåð¸ì LOW ïîñëåäíèõ ñóòîê
gd_LOW = iLow (gs_Symbol, PERIOD_D1, 1);
//---- Íàõîäèì íîìåð áàðà ýòîãî Low íà òåêóùåì ãðàôèêå
i = iBarShift (gs_Symbol, Period(), iTime (gs_Symbol, PERIOD_D1, 1));
i = iLowest (gs_Symbol, Period(), MODE_LOW, i, 0);
gda_otkat[1] = 0.236;
ls_Low = DoubleToStr (gd_LOW, gi_Digits);
//---- Åñëè ìèíèìóì îáíîâèëñÿ
if (fCCV_S (ls_Low, 1))
{
if (!RealTrade) {dta_CommentTime[1] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[1] = TimeCurrent();}
if (DrawObject_ON)
{
gc_low = Red;
Print (gs_fName, ": Íîâûé ìèíèìóì íå íàøëè, ÍÎ íàçíà÷èëè[", li_cnt,"] = ", ls_Low);
ls_Name = fNamedOBJ_cnt ("arrow_low", li_cnt);
SetArrow (217, ADD_color, ls_Name, Time[i], Low[i] - 3 * gi_Decimal * gd_Point, 1);
ObjectSetText (ls_Name, TimeToStr (Time[i], TIME_DATE|TIME_MINUTES), 10);
SetLabel ("low", StringConcatenate ("New LOW[", li_cnt,"]: "), 5, 30, 10, Font_Table, 0, 0, CLR_NONE, Base_color);
//---- Òàêîé ìèíèìóì âûäåëÿåòñÿ äðóãèì öâåòîì
SetLabel ("low_add", ls_Low, 100, 30, 10, Font_Table, 0, 0, CLR_NONE, ADD_color);
SetLabel ("time_low", ": " + TimeToStr (dta_CommentTime[1], TIME_DATE|TIME_MINUTES), 250, 30, 10, Font_Time, 0, 0, CLR_NONE, Time_color);
}
}
li_preTicket = fi_NewTicket;
return (1);
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gs_ComError, gs_fName);
//----
return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Îòêðûòèå îðäåðîâ ïî îòêàòó îò ìàêñèìóìîâ |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fBase_Strategy (int fi_MG)
{
int li_Ticket = 0, err = GetLastError();
double ld_SL, ld_TP, ld_MIN_Rage = 150 * gi_Decimal * gd_Point;
bool lb_Channel = (gd_Channel_base > gd_MIN_Range);
string ls_err;
gs_fName = "fBase_Strategy()";
gd_MinSTOP = MarketInfo (Symbol(), MODE_STOPLEVEL) * gd_Point;
//---- Îñíîâíàÿ ñäåëêà îòêðûâàåòñÿ åñëè íå ñôîðìèðîâàëñÿ "ôëýòîâûé êîðèäîð" è
if (lb_Channel)
{
//---- Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå âåðøèíû è æä¸ì äàëüíåéøåãî äâèæåíèÿ âíèç
if (gd_HIGH - gd_Channel_base * gda_otkat[0] < gda_Price[0] && gd_HIGH > gda_Price[0])
{gb_moove_UP = true;}
if (gb_moove_UP // áûëè âîçëå âåðøèíû
&& gd_HIGH - gd_Channel_base * gda_otkat[0] <= gda_Price[0] // íåìíîæêî îòêàòèëè îò ìàêñèìóìà
&& gd_HIGH - gd_Channel_base * 0.5 > gda_Price[0]) // íî ìåíüøå, ÷åì 50 %
{
//---- ×òîáû èçáåæàòü î÷åíü ìàëåíüêèõ òåéêîâ
if (gd_Channel_base < ld_MIN_Rage) {ld_TP = gd_LOW;} else {ld_TP = gd_LOW + gd_Channel_base * 0.382;}
ld_TP = NormalizeDouble (MathMin (ld_TP, gda_Price[1] - MathMax (gd_Profit_MIN, gd_MinSTOP)), gi_Digits);
ld_SL = NormalizeDouble (MathMax ((gd_HIGH + gd_Channel_base * gda_otkat[0]), gda_Price[1] + MathMax (gd_MinSTOP, gd_min_SL)), gi_Digits);
RefreshRates();
li_Ticket = OrderSend (gs_Symbol, OP_SELL, GetSizeLot (Order_Lots), Bid, Slippage, ld_SL, ld_TP, "sell_base", fi_MG, 0, gc_base_SELL);
if (IsOptimization())
{return (li_Ticket);}
if (li_Ticket < 0)
{
ls_err = "mistake.wav";
Print (gs_fName, ": Îøèáêà ïðè îòêðûòèè SELL base-îðäåðà: ", ErrorDescription (GetLastError()));
}
else
{
ls_err = "yes.wav";
Print (gs_fName, ": TP = ", (Ask - ld_TP) / gd_Point, "; SL = ", (ld_SL - Ask) / gd_Point);
}
}
}
else
{gb_moove_UP = false;}
//----  ïðîòèâíîì ñëó÷àå - ñäåëêà íå îòêðûâàåòñÿ, è âûïîëíÿåòñÿ ïîèñê íîâîãî ìàêñèìóìà
if (((gd_HIGH >= gda_Price[0] && gd_Channel_base <= gd_MIN_Range) || gd_HIGH < gda_Price[0]) && !gb_flat)
{fGet_HIGH (gd_MIN_Range);}
if (lb_Channel)
{
//---- Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå âïàäèíû è æä¸ì äàëüíåéøåãî äâèæåíèÿ ââåðõ
if (gd_LOW + gd_Channel_base * gda_otkat[0] > gda_Price[1] && gd_LOW < gda_Price[1])
{gb_moove_DW = true;}
if (gb_moove_DW // áûëè âîçëå âïàäèíû
&& gd_LOW + gd_Channel_base * gda_otkat[1] <= gda_Price[1] // Íåìíîæêî îòêàòèëè îò ìèíèìóìà
&& gd_LOW + gd_Channel_base * 0.5 > gda_Price[1]) // íî ìåíüøå, ÷åì 50 %
{
//---- ×òîáû èçáåæàòü î÷åíü ìàëåíüêèõ òåéêîâ
if (gd_Channel_base < ld_MIN_Rage) {ld_TP = gd_HIGH;} else {ld_TP = gd_HIGH - gd_Channel_base * 0.382;}
ld_TP = NormalizeDouble (MathMax (ld_TP, gda_Price[0] + MathMax (gd_Profit_MIN, gd_MinSTOP)), gi_Digits);
ld_SL = NormalizeDouble (MathMin ((gd_LOW - gd_Channel_base * gda_otkat[1]), gda_Price[0] - MathMax (gd_MinSTOP, gd_min_SL)), gi_Digits);
RefreshRates();
li_Ticket = OrderSend (gs_Symbol, OP_BUY, GetSizeLot (Order_Lots), Ask, Slippage, ld_SL, ld_TP, "buy_base", fi_MG, 0, gc_base_BUY);
if (IsOptimization())
{return (li_Ticket);}
if (li_Ticket < 0)
{
ls_err = "mistake.wav";
Print (gs_fName, ": Îøèáêà ïðè îòêðûòèè SELL base-îðäåðà: ", ErrorDescription (GetLastError()));
}
else
{
ls_err = "yes.wav";
Print (gs_fName, ": TP = ", (ld_TP - Bid) / gd_Point, "; SL = ", (Bid - ld_SL) / gd_Point);
}
}
}
else
{gb_moove_DW = false;}
//---- Èëè íîâîãî ìèíèìóìà, ñîîòâåòñòâåííî
if (((gd_LOW <= gda_Price[1] && gd_Channel_base <= gd_MIN_Range) || gd_LOW > gda_Price[1]) && !gb_flat)
{fGet_LOW (gd_MIN_Range);}
//---- Ïîäà¸ì çâóê
if (SoundAlert) {PlaySound (ls_err);}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gs_ComError, gs_fName);
return (li_Ticket);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Îòêðûòèå êîìïåíñàòîðíûõ îðäåðîâ ïî ëîññó (Ìàðòèí) |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fCompensation_Strategy (int fi_Ticket, int fi_MG)
{
int li_Type, li_cmd, li_Ticket = 0, err = GetLastError();
double ld_SL, ld_TP, ld_compensation, ld_Price;
bool lb_modify = false;
//----
gs_fName = "fCompensation_Strategy()";
gd_MinSTOP = MarketInfo (Symbol(), MODE_STOPLEVEL) * gd_Point;
if (!OrderSelect (fi_Ticket, SELECT_BY_TICKET))
{return (0);}
li_Type = OrderType();
if (li_Type == OP_SELL)
{
//---- Âòîðàÿ (êîìïåíñàòîðíàÿ) ñäåëêà îòêðûâàåòñÿ, åñëè íàéäåí íîâûé ìàêñèìóì
//---- Êîòîðûé äîëæåí áûòü âûøå OpenPrice íà Comp_Range
if ((gd_HIGH > OrderOpenPrice()) + gd_Comp_Range)
{
//---- Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå âåðøèíû è æä¸ì äàëüíåéøåãî äâèæåíèÿ âíèç
if (gd_HIGH - gd_Channel_base * gda_otkat[0] < gda_Price[0] && gd_HIGH > gda_Price[0])
{gb_moove_UP = true;}
if (gb_moove_UP // áûëè ó âåðøèíû
&& gd_HIGH - gd_MIN_Range >= gda_Price[0] // îòêàòèëè
&& OrderOpenPrice() + gd_MIN_Range < gda_Price[0]) // ðàññòîÿíèå ì\ó îðäåðàìè íå ìåíåå gd_MIN_Range
{
//---- Ïðè ýòîì òåéê-ïðîôèò âòîðîé ñäåëêè äîëæåí êîìïåíñèðîâàòü ñòîï-ëîññ ïåðâîé.
//---- Êîìïåíñàòîðíàÿ ñäåëêà îòêðûâàåòñÿ ïî óâåëè÷åííîìó îáúåìó â òîì æå íàïðàâëåíèè.
//---- Òàêèì îáðàçîì, îáå ñäåëêè áóäóò çàêðûòû â òîò ìîìåíò, êîãäà ðûíîê ðåàëèçóåò êîððåêöèþ îò âòîðîãî (êîìïåíñàòîðíîãî) ìàêñèìóìà
ld_compensation = (gda_Price[1] - OrderOpenPrice()) * 0.382;
ld_TP = NormalizeDouble (gda_Price[1] - MathMax (ld_compensation, MathMax (gd_Profit_MIN, gd_MinSTOP)), gi_Digits);
ld_SL = NormalizeDouble (MathMax ((gd_HIGH + gd_Channel_base * gda_otkat[0]), gda_Price[1] + MathMax (gd_MinSTOP, gd_min_SL)), gi_Digits);
RefreshRates();
li_Ticket = OrderSend (gs_Symbol, OP_SELL, fLotsNormalize (GetSizeLot (Order_Lots) * K_comp_lot), Bid, Slippage, ld_SL, ld_TP, "sell_add", fi_MG, 0, gc_add_SELL);
}
}
}
//---- Åñëè öåíà ïîäûìàåòñÿ âûøå HIGH - èùåì íîâûé ìàêñèìóì
if (gd_HIGH < gda_Price[0])
{
gb_moove_UP = false;
fGet_HIGH (gd_MIN_Range, fi_Ticket);
}
if (li_Type == OP_BUY)
{
if (gd_LOW < OrderOpenPrice() - gd_Comp_Range)
{
//---- Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå âïàäèíû è æä¸ì äàëüíåéøåãî äâèæåíèÿ ââåðõ
if (gd_LOW + gd_Channel_base * gda_otkat[0] > gda_Price[1] && gd_LOW < gda_Price[1])
{gb_moove_DW = true;}
//---- Èëè ìèíèìóìà, ñîîòâåòñòâåííî
if (gb_moove_DW // áûëè ó âïàäèíû
&& gd_LOW + gd_MIN_Range <= gda_Price[1] // îòêàòèëè
&& OrderOpenPrice() - gd_MIN_Range > gda_Price[1]) // ðàññòîÿíèå ì\ó îðäåðàìè íå ìåíåå gd_MIN_Range
{
ld_compensation = (OrderOpenPrice() - gda_Price[0]) * 0.382;
ld_TP = NormalizeDouble (gda_Price[0] + MathMax (ld_compensation, MathMax (gd_Profit_MIN, gd_MinSTOP)), gi_Digits);
ld_SL = NormalizeDouble (MathMin ((gd_LOW - gd_Channel_base * gda_otkat[1]), gda_Price[0] - MathMax (gd_MinSTOP, gd_min_SL)), gi_Digits);
RefreshRates();
li_Ticket = OrderSend (gs_Symbol, OP_BUY, fLotsNormalize (GetSizeLot (Order_Lots) * K_comp_lot), Ask, Slippage, ld_SL, ld_TP, "buy_add", fi_MG, 0, gc_add_BUY);
}
}
}
//---- Åñëè öåíà îïóñêàåòñÿ íèæå LOW - èùåì íîâûé ìèíèìóì
if (gd_LOW > gda_Price[1])
{
gb_moove_DW = false;
fGet_LOW (gd_MIN_Range, fi_Ticket);
}
//---- Ïî ðåçóëüòàòàì ïðåäûäóùåé îïåðàöèè
if (li_Ticket < 0)
{
if (!IsOptimization())
{
if (SoundAlert) {PlaySound ("mistake.wav");}
Print (gs_fName, ": Îøèáêà ïðè îòêðûòèè ", GetNameOP (li_Type), " add-îðäåðà: ", ErrorDescription (GetLastError()));
}
}
if (li_Ticket > 0)
{
gb_moove_UP = false;
gb_moove_DW = false;
if (li_Type == OP_BUY) {ld_Price = Bid;} else {ld_Price = Ask;}
if (li_Type == OP_BUY) {li_cmd = 1;} else {li_cmd = -1;}
Print (gs_fName, ": TP = ", li_cmd * (ld_TP - ld_Price) / gd_Point, "; SL = ", li_cmd * (ld_Price - ld_SL) / gd_Point);
//---- Ìîäèôèöèðóåì ëîññîâûé-îðäåð
lb_modify = OrderModify (fi_Ticket, OrderOpenPrice(), OrderStopLoss(), ld_TP, 0, gc_modify);
if (IsOptimization())
{return (li_Ticket);}
if (SoundAlert) {PlaySound ("yes.wav");}
if (lb_modify)
{if (SoundAlert) {PlaySound ("modify.wav");}}
else
{
if (SoundAlert) {PlaySound ("mistake.wav");}
Print (gs_fName, ": Îøèáêà ïðè ìîäèôèêàöèè ", GetNameOP (li_Type), " îðäåðà[", fi_Ticket, "]: ", ErrorDescription (GetLastError()));
}
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gs_ComError, gs_fName);
//----
return (li_Ticket);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Îòêðûòèå îðäåðîâ ïî ïðîáèòèþ êàíàëà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fChannel_Strategy (int fi_MG)
{
double ld_SL, ld_MAX, ld_MIN, err = GetLastError();
int li_Ticket = 0, li_Type = -1;
string ls_txt;
//----
gs_fName = "fChannel_Strategy()";
//---- Îïðåäåëÿåì êàíàë
fGetChannel (ld_MAX, ld_MIN);
//---- Ãðàíèöû êàíàëà îáíîâëÿþòñÿ äî ìîìåíòà ôîðìèðîâàíèÿ êàíàëà
if (!gb_flat)
{
gd_flat_MAX = ld_MAX;
gd_flat_MIN = ld_MIN;
gd_flat_Channel = gd_flat_MAX - gd_flat_MIN;
}
if (gd_flat_Channel <= gd_MAX_flat_Range)
{gb_flat = true;}
//---- Åñëè êàíàë ñôîðìèðîâàí ïðîâåðÿåì âîçìîæíîñòü íà îòêðûòèå îðäåðà
if (gb_flat)
{
gd_MinSTOP = MarketInfo (Symbol(), MODE_STOPLEVEL) * gd_Point;
//---- Ïðè ïðîáèòèè êîðèäîðà îòêðûâàåòñÿ ñäåëêà â íàïðàâëåíèè ïðîáèòèÿ
RefreshRates();
if ((gd_flat_MAX + gd_flat_Channel * 0.618) <= gda_Price[1])
{
ld_SL = MathMin ((gd_flat_MIN - gd_flat_Channel * 0.118), gda_Price[0] - MathMax (gd_MinSTOP, gd_min_SL));
li_Type = OP_BUY;
li_Ticket = OrderSend (gs_Symbol, OP_BUY, GetSizeLot (Order_Lots), Ask, Slippage, ld_SL, 0, "", fi_MG, 0, gc_flat_BUY);
}
if ((gd_flat_MIN - gd_flat_Channel * 0.618) >= gda_Price[0])
{
ld_SL = MathMax ((gd_flat_MAX + gd_flat_Channel * 0.118), gda_Price[1] + MathMax (gd_MinSTOP, gd_min_SL));
li_Type = OP_SELL;
li_Ticket = OrderSend (gs_Symbol, OP_SELL, GetSizeLot (Order_Lots), Bid, Slippage, ld_SL, 0, "", fi_MG, 0, gc_flat_SELL);
}
if (IsOptimization())
{return (li_Ticket);}
if (li_Ticket < 0)
{
if (SoundAlert) {PlaySound ("mistake.wav");}
Print (gs_fName, ": Îøèáêà ïðè îòêðûòèè ", GetNameOP (li_Type), " flat-îðäåðà: ", ErrorDescription (GetLastError()));
}
else {if (SoundAlert) {PlaySound ("yes.wav");}}
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gs_ComError, gs_fName);
//----
return (li_Ticket);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| "Ôëýòîâûé êîðèäîð" âêëþ÷àåò Weight_Channel ñâå÷åê, ñîïðîòèâëåíèå è ïîääåðæêà |
//| îïðåäåëÿþòñÿ ïî öåíàì îòêðûòèÿ è çàêðûòèÿ |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGetChannel (double& fd_MAX, double& fd_MIN)
{
double lda_Range_MAX[], lda_Range_MIN[];
int err = GetLastError();
static bool lb_first = true;
//----
//---- Ïðè ïåðâîì çàïóñêå îïðåäåëÿåì ðàçìåðû èñïîëüçóåìûõ ìàññèâîâ
if (lb_first)
{
ArrayResize (lda_Range_MAX, Weight_Channel);
ArrayResize (lda_Range_MIN, Weight_Channel);
lb_first = false;
}
for (int li_Bar = 1; li_Bar <= Weight_Channel; li_Bar++)
{
if (Close[li_Bar] > Open[li_Bar])
{
lda_Range_MAX[li_Bar-1] = Close[li_Bar];
lda_Range_MIN[li_Bar-1] = Open[li_Bar];
}
else
{
lda_Range_MAX[li_Bar-1] = Open[li_Bar];
lda_Range_MIN[li_Bar-1] = Close[li_Bar];
}
}
ArraySort (lda_Range_MAX);
ArraySort (lda_Range_MIN);
fd_MAX = lda_Range_MAX[Weight_Channel-1];
fd_MIN = lda_Range_MIN[0];
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gs_ComError, "fGetChannel()");
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Òðàë îñíîâíîé è êîìïåíñàòîðíîé ñäåëîê |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fTrailling (int ar_MG[])
{
int li_Type, li_Ticket, li_result = -1, err = GetLastError();
bool lb_result = false;
double ld_Profit, ld_new_SL = 0.0, ld_Trail_Value, ld_Price, ld_TickValue,
ld_swap, ld_step_Trail = 2 * gi_Decimal * gd_Point;
string ls_order = "", ls_fName = "fTrailling()";
//----
gd_MinSTOP = MarketInfo (Symbol(), MODE_STOPLEVEL) * gd_Point;
for (int li_int = OrdersTotal() - 1; li_int >= 0; li_int--)
{
if (!OrderSelect (li_int, SELECT_BY_POS))
{return;}
if (!fCheckMyMagic (OrderMagicNumber(), ar_MG) || OrderSymbol() != gs_Symbol)
{continue;}
//---- Íå òðîãàåì êîìïåíñàòîðíûå îðäåðà
if (OrderComment() == "sell_add" || OrderComment() == "buy_add")
{continue;}
if (OrderType() > 1)
{continue;}
li_Type = OrderType();
//---- Îïðåäåëÿåì ñòîèìîñòü ïóíêòà
ld_TickValue = fGetTickValue();
//---- Ïîäñ÷èòàåì ïîòåðè îò Swap
ld_swap = MathAbs (OrderSwap() / ld_TickValue);
ld_Profit = OrderProfit() + OrderCommission() + OrderSwap();
//if (li_Type == OP_BUY) {ld_Price = Bid;} else {ld_Price = Ask;}
ld_Price = gda_Price[li_Type];
li_Ticket = OrderTicket();
if (OrderMagicNumber() == ar_MG[0]) {ls_order = gsa_NameCom[0];} else {ls_order = gsa_NameCom[2];}
if (OrderMagicNumber() == ar_MG[0]) {ld_Trail_Value = gd_Trail;} else {ld_Trail_Value = gd_Trail_ch;}
//---- Êîíòðîëèðóåì ìèíèìàëüíóþ ïðèáûëü
if (ld_Profit < ((Profit_MIN + ld_Trail_Value / gd_Point) / 0.1) * OrderLots() * ld_TickValue + ld_swap)
{continue;}
//Print ("Swap = ", ld_swap, "; Min Profit = ", DoubleToStr ((Profit_MIN / 0.1) * OrderLots() * ld_TickValue + ld_swap, gi_Digits));
//---- Íîðìàëèçóåì ìèíèìàëüíîå ðàññòîÿíèå ì\ó öåíîé è ñòîïîì ïî STOPLEVEL
ld_Trail_Value = MathMax (ld_Trail_Value, gd_MinSTOP);
if (li_Type == OP_SELL)
{
if (OrderOpenPrice() - ld_Trail_Value > ld_Price)
{
//---- Îñíîâàíèå äëÿ äâèæåíèÿ
if (ld_Price + ld_Trail_Value + ld_step_Trail < OrderStopLoss())
{ld_new_SL = NormalizeDouble (Ask + ld_Trail_Value, gi_Digits);}
}
}
if (li_Type == OP_BUY)
{
if (OrderOpenPrice() + ld_Trail_Value < ld_Price)
{
//---- Îñíîâàíèå äëÿ äâèæåíèÿ
if (ld_Price - ld_Trail_Value - ld_step_Trail > OrderStopLoss())
{ld_new_SL = NormalizeDouble (Bid - ld_Trail_Value, gi_Digits);}
}
}
if (ld_new_SL != 0 && ld_new_SL != OrderStopLoss())
{li_result = OrderModify (li_Ticket, OrderOpenPrice(), ld_new_SL, OrderTakeProfit(), 0, gc_modify);}
if (IsOptimization())
{continue;}
if (li_result == 0)
{
if (SoundAlert) {PlaySound ("mistake.wav");}
Print (ls_fName, ": Îøèáêà ïðè ìîäèôèêàöèè ", GetNameOP (li_Type), " ", ls_order, "-îðäåðà[", li_Ticket, "]: ", ErrorDescription (GetLastError()),
"\nSL[", (OrderStopLoss() - ld_new_SL) / gd_Point, "/", (OrderStopLoss() - ld_Price) / gd_Point, "] = ",
DoubleToStr (OrderStopLoss(), gi_Digits), "; new SL[", (ld_new_SL - ld_Price) / gd_Point, "] = ",
DoubleToStr (ld_new_SL, gi_Digits), "; Price = ", DoubleToStr (ld_Price, gi_Digits));
}
if (li_result == 1) {if (SoundAlert) {PlaySound ("modify.wav");}}
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gs_ComError, ls_fName);
//----
}
//+------------------------------------------------------------------+
//| Îïðåäåëåíèå ñòîèìîñòè ïóíêòà |
//+------------------------------------------------------------------+
double fGetTickValue()
{
double ld_Price, ld_TickValue, ld_pips;
//----
//if (OrderType() == OP_BUY) {ld_Price = Bid;} else {ld_Price = Ask;}
ld_Price = gda_Price[OrderType()];
ld_pips = ((OrderOpenPrice() - ld_Price) / gd_Point);
if (ld_pips == 0) {return (1);}
ld_TickValue = MathAbs (OrderProfit() / ld_pips);
ld_TickValue = ld_TickValue / OrderLots() * MarketInfo (gs_Symbol, MODE_MINLOT);
if (ld_TickValue == 0) {return (1);}
//----
return (ld_TickValue);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ðàñ÷èòûâàåì äèíàìè÷åñêèé òðàë ïî ïîñëåäíèì fi_Counted_Bars áàðàì |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGetDinamicTrail (int fi_Counted_Bars, double& fd_Tral1, double& fd_Tral2)
{
if (Dinamic_Trail_ON)
{
fd_Tral1 = 0;
fd_Tral2 = 0;
for (int li_Bar = 0; li_Bar < fi_Counted_Bars; li_Bar++)
{
fd_Tral1 = MathMax (fd_Tral1, High[li_Bar] - Low[li_Bar]);
fd_Tral2 = MathMax (fd_Tral2, MathAbs (Open[li_Bar] - Close[li_Bar]));
}
}
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ïîëó÷àåì äèíàìè÷åñêèå óðîâíè ÷àñòè÷íîãî çàêðûòèÿ îðäåðà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGetDinamicLevels (int fi_Part, double fd_BeginLevel, int& ar_Levels[])
{
int li_BeginLevel = fd_BeginLevel / gd_Point;
//----
for (int li_LVL = fi_Part; li_LVL < ArraySize (ar_Levels); li_LVL++)
{
switch (DinamicLevels)
{
case 1:
ar_Levels[0] = MathCeil (li_BeginLevel / 2);
ar_Levels[1] = MathMax (ar_Levels[0], li_BeginLevel);
ar_Levels[2] = MathMax (ar_Levels[1], li_BeginLevel * 2);
break;
case 2:
ar_Levels[0] = li_BeginLevel;
ar_Levels[1] = MathMax (ar_Levels[0], li_BeginLevel * 2);
ar_Levels[2] = MathMax (ar_Levels[1], li_BeginLevel * 3);
break;
case 3:
ar_Levels[0] = MathCeil (li_BeginLevel * 0.618);
ar_Levels[1] = MathMax (ar_Levels[0], MathCeil (li_BeginLevel * 1.236));
ar_Levels[2] = MathMax (ar_Levels[1], li_BeginLevel * 2);
break;
}
}
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ðèñóåì êîðèäîð è âûâîäèì äðóãóþ àêòóàëüíóþ èíôîðìàöèþ íà ãðàôèê |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fInfoDraw (int fi_X, int fi_Y)
{
double ld_Pribul = 0;
int cnt = 0, li_row = 3, li_row_result = 0, li_HistoryOrders = 0, err = GetLastError();
string ls_Name = "", ls_txt = "", ls_Range;
color lc_color;
static double lsd_LOSS_Percent = 0;
//----
//---- 3-ÿ ñòðîêà
ls_Range = StringConcatenate ("RANGE: ", (gd_Channel_base / gd_Point), " (", MIN_Range, " default)");
SetLabel ("current_range", ls_Range, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, CLR_NONE, Base_color);
if (fCCV_S (ls_Range, 2))
{
if (!RealTrade) {dta_CommentTime[2] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[2] = TimeCurrent();}
SetLabel ("time_range", ": " + TimeToStr (dta_CommentTime[2], TIME_DATE|TIME_MINUTES), 250, li_row * fi_Y, 10, Font_Time, 0, 0, CLR_NONE, Time_color);
}
//---- 4-ÿ ñòðîêà
li_row++;
ls_txt = StringConcatenate ("Channel ", Weight_Channel, " candles: ", (gd_flat_Channel / gd_Point), " (", MAX_flat_Range, " default)");
if (gb_flat) {lc_color = ADD_color;} else {lc_color = Base_color;}
SetLabel ("fl_channel", ls_txt, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, CLR_NONE, lc_color);
if (fCCV_S (ls_txt, 3))
{
if (!RealTrade) {dta_CommentTime[3] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[3] = TimeCurrent();}
SetLabel ("time_channel", ": " + TimeToStr (dta_CommentTime[3], TIME_DATE|TIME_MINUTES), 250, li_row * fi_Y, 10, Font_Time, 0, 0, CLR_NONE, Time_color);
}
//---- 5-ÿ ñòðîêà
li_row++;
ls_txt = StringConcatenate ("Trailling[", Counted_Bars, "]: ", (gd_Trail / gd_Point));
SetLabel ("trail", ls_txt, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, CLR_NONE, Base_color);
if (fCCV_S (ls_txt, 4))
{
if (!RealTrade) {dta_CommentTime[4] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[4] = TimeCurrent();}
SetLabel ("time_trail", ": " + TimeToStr (dta_CommentTime[4], TIME_DATE|TIME_MINUTES), 250, li_row * fi_Y, 10, Font_Time, 0, 0, CLR_NONE, Time_color);
}
//---- 6-ÿ ñòðîêà
li_row++;
ls_txt = StringConcatenate ("Trailling flat[", Counted_Bars, "]: ", (gd_Trail_ch / gd_Point));
SetLabel ("trail_ch", ls_txt, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, CLR_NONE, Base_color);
if (fCCV_S (ls_txt, 5))
{
if (!RealTrade) {dta_CommentTime[5] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[5] = TimeCurrent();}
SetLabel ("time_trail_ch", ": " + TimeToStr (dta_CommentTime[5], TIME_DATE|TIME_MINUTES), 250, li_row * fi_Y, 10, Font_Time, 0, 0, CLR_NONE, Time_color);
}
//---- 7-ÿ ñòðîêà
li_row++;
ls_txt = StringConcatenate ("Part Close Levels[", DinamicLevels, "]: ", gia_Levels[0], " / ", gia_Levels[1], " / ", gia_Levels[2]);
SetLabel ("part_close", ls_txt, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, CLR_NONE, Base_color);
if (fCCV_S (ls_txt, 6))
{
if (!RealTrade) {dta_CommentTime[6] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[6] = TimeCurrent();}
SetLabel ("time_part_close", ": " + TimeToStr (dta_CommentTime[6], TIME_DATE|TIME_MINUTES), 250, li_row * fi_Y, 10, Font_Time, 0, 0, CLR_NONE, Time_color);
}
//---- 8-ÿ ñòðîêà
li_row++;
ls_txt = "****************************************";
SetLabel ("row", ls_txt, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, CLR_NONE, Base_color);
//---- 9-ÿ ñòðîêà
li_row++;
SetLabel ("send", gs_trade, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, CLR_NONE, ADD_color);
if (fCCV_S (ls_txt, 7))
{
if (!RealTrade) {dta_CommentTime[7] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[7] = TimeCurrent();}
SetLabel ("time_send", ": " + TimeToStr (dta_CommentTime[7], TIME_DATE|TIME_MINUTES), 250, li_row * fi_Y, 10, Font_Time, 0, 0, CLR_NONE, Time_color);
}
//---- 10-ÿ ñòðîêà
li_row++;
lsd_LOSS_Percent = MathMax (lsd_LOSS_Percent, MathAbs (gd_MaxLOSS / AccountBalance() * 100));
ls_txt = StringConcatenate ("Max LOSS = ", gs_sign, " ", DoubleToStr (gd_MaxLOSS, 0), " (% ", DoubleToStr (lsd_LOSS_Percent, 1), ")");
SetLabel ("max_Loss", ls_txt, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, CLR_NONE, Base_color);
if (fCCV_S (ls_txt, 8))
{
if (!RealTrade) {dta_CommentTime[8] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[8] = TimeCurrent();}
SetLabel ("time_loss", ": " + TimeToStr (dta_CommentTime[8], TIME_DATE|TIME_MINUTES), 250, li_row * fi_Y, 10, Font_Time, 0, 0, CLR_NONE, Time_color);
}
//---- 11-ÿ ñòðîêà
li_row++;
ls_txt = "Îáùèé PROFIT:";
SetLabel ("result", ls_txt, fi_X, li_row * fi_Y, 12, Font_Table, 0, 0, CLR_NONE, Base_color);
//---- Âû÷èñëÿåì íà÷àëüíóþ ñòðîêó ïî âûâîäó ðåçóëüòàòîâ
li_row_result = li_row * fi_Y + 20;
for (int li_int = 0; li_int < 3; li_int++)
{
//---- Åñëè ñòðàòåãèÿ íå çàäåéñòâîâàíà
if (!gba_Send[li_int])
{continue;}
SetLabel ("orders_" + cnt, gsa_NameCom[li_int], 45, li_row_result + fi_Y * cnt, 10, Font_Table, 0, 0, CLR_NONE, Base_color);
SetLabel ("ordersS_" + cnt, ":", 75, li_row_result + fi_Y * cnt, 10, Font_Table, 0, 0, CLR_NONE, Base_color);
ls_txt = StringConcatenate (gs_sign, " ", DoubleToStr (gda_Pribul[li_int], 0), " [", gia_HistoryOrders[li_int], "]");
if (gda_Pribul[li_int] >= 0) {lc_color = Profit_color;} else {lc_color = LOSS_color;}
SetLabel ("ordersC_" + cnt, ls_txt, 85, li_row_result + fi_Y * cnt, 10, Font_Table, 0, 0, CLR_NONE, lc_color);
li_HistoryOrders += gia_HistoryOrders[li_int];
ld_Pribul += gda_Pribul[li_int];
cnt++;
}
ls_txt = StringConcatenate (gs_sign, " ", DoubleToStr (ld_Pribul, 0), " [", li_HistoryOrders, "]");
if (ld_Pribul >= 0) {lc_color = Profit_color;} else {lc_color = LOSS_color;}
SetLabel ("profit", ls_txt, 145, li_row * fi_Y, 13, Font_Table, 0, 0, CLR_NONE, lc_color);
//---- 15-ÿ ñòðîêà
li_row += cnt + 1;
ls_txt = "****************************************";
SetLabel ("row1", ls_txt, fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, CLR_NONE, Base_color);
//---- 16-ÿ ñòðîêà
li_row++;
ls_txt = "ERROR:";
SetLabel ("error", ls_txt, fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, CLR_NONE, Base_color);
if (fCCV_S (gs_ComError, 9))
{
if (!RealTrade) {dta_CommentTime[9] = iTime (gs_Symbol, 1, 0);} else {dta_CommentTime[9] = TimeCurrent();}
SetLabel ("time_err", ": " + TimeToStr (dta_CommentTime[9], TIME_DATE|TIME_MINUTES), 250, li_row * fi_Y, 10, Font_Time, 0, 0, CLR_NONE, Time_color);
}
//---- 17-ÿ ñòðîêà
li_row++;
if (StringLen (gs_ComError) > 0)
{SetLabel ("error_txt", gs_ComError, fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, CLR_NONE, Gray);}
//---- Ðèñóåì íà ãðàôèêå êîðèäîð "ôëåòà"
if (gb_flat)
{
ls_txt = StringConcatenate ("Íàðèñîâàë ôëýòîâûé êàíàë: MAX = ", DoubleToStr (gd_flat_MAX, gi_Digits), "; MIN = ", DoubleToStr (gd_flat_MIN, gi_Digits));
//---- ×òîáû íå ïîâòîðÿòüñÿ, ââîäèì ñðàâíåíèå ñ ïðåäûäóùèì êîììåíòîì
if (fCCV_S (ls_txt, 10))
{Print (ls_txt);}
DelObject ("ray_high");
DelObject ("ray_low");
ls_Name = "flat_MAX";
if (ObjectFind (ls_Name) == -1)
{ObjectCreate (ls_Name, OBJ_TREND, 0, Time[20], gd_flat_MAX, Time[1], gd_flat_MAX);}
ObjectSet (ls_Name, OBJPROP_COLOR, Base_color);
ObjectSet (ls_Name, OBJPROP_STYLE, STYLE_DASH);
ls_Name = "flat_MIN";
if (ObjectFind (ls_Name) == -1)
{ObjectCreate (ls_Name, OBJ_TREND, 0, Time[20], gd_flat_MIN, Time[1], gd_flat_MIN);}
ObjectSet (ls_Name, OBJPROP_COLOR, Base_color);
ObjectSet (ls_Name, OBJPROP_STYLE, STYLE_DASH);
}
//---- Èëè ðèñóåì îñíîâíîé êàíàë
else
{
if (fCCV_S (ls_Range, 11))
{
DelObject ("flat_MAX");
DelObject ("flat_MIN");
//ls_txt = StringConcatenate ("Íàðèñîâàëè îñíîâíîé êàíàë: HIGH = ", DoubleToStr (gd_HIGH, gi_Digits), "; LOW = ", DoubleToStr (gd_LOW, gi_Digits));
//Print (ls_txt);
}
if (fCCV_D (gd_HIGH, 0))
{
DelObject ("ray_high");
//ls_txt = StringConcatenate ("Íàðèñîâàëè HIGH = ", DoubleToStr (gd_HIGH, gi_Digits));
//Print (ls_txt);
ls_Name = "ray_high";
if (gd_Channel_base > gd_MIN_Range) {lc_color = gc_high;} else {lc_color = Time_color;}
if (ObjectFind (ls_Name) == -1)
{ObjectCreate (ls_Name, OBJ_TREND, 0, Time[20], gd_HIGH, Time[1], gd_HIGH);}
ObjectSet (ls_Name, OBJPROP_COLOR, lc_color);
ObjectSet (ls_Name, OBJPROP_STYLE, STYLE_DASHDOT);
}
if (fCCV_D (gd_LOW, 1))
{
DelObject ("ray_low");
//ls_txt = StringConcatenate ("Íàðèñîâàëè LOW = ", DoubleToStr (gd_LOW, gi_Digits));
//Print (ls_txt);
ls_Name = "ray_low";
if (gd_Channel_base > gd_MIN_Range) {lc_color = gc_low;} else {lc_color = Time_color;}
if (ObjectFind (ls_Name) == -1)
{ObjectCreate (ls_Name, OBJ_TREND, 0, Time[20], gd_LOW, Time[1], gd_LOW);}
ObjectSet (ls_Name, OBJPROP_COLOR, lc_color);
ObjectSet (ls_Name, OBJPROP_STYLE, STYLE_DASHDOT);
}
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gs_ComError, "fInfoDraw()");
//----
return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòà ñ îðäåðàìè |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ðàáîòàåì (ñëåäèì) çà "ñâîèìè" îðäåðàìè |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int MyPositions (int ar_MG[])
{
int order = 0, li_Ticket = 0, li_Part, total = OrdersTotal();
if (total == 0)
{return (0);}
double ld_Profit, ld_Price, ld_TickValue, ld_swap;
//----
gd_Profit = 0;
for (int i = total - 1; i >= 0; i--)
{
if (!OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
{return (0);}
if (OrderSymbol() == gs_Symbol && fCheckMyMagic (OrderMagicNumber(), ar_MG))
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
//---- Åñëè óñòàíîâëåíî, çàêðûâàåì âñå îðäåðà â êîíöå äíÿ
fCloseHour (AllCloseHour, OrderTicket());
ld_Profit = OrderProfit() + OrderCommission() + OrderSwap();
gd_Profit += ld_Profit;
//---- Çàêðûâàåì ëîññîâûé îðäåð ïî èñòå÷åíèþ "ñðîêà æèçíè"
if (ld_Profit < 0 && CloseTime > 0)
{
if (fLossControl (CloseTime))
{continue;}
}
li_Ticket = OrderTicket();
//if (OrderType() == OP_BUY) {ld_Price = Ask;} else {ld_Price = Bid;}
ld_Price = gda_Price[OrderType()];
//---- Êîíòðîëèðóåì ìèíèìàëüíóþ ïðèáûëü ïðè ÷àñòè÷íîì çàêðûòèè
if (OrderMagicNumber() == ar_MG[1])
{
if (PartClose_ON && ld_Profit > 0)
{
//---- Îïðåäåëÿåì ñòîèìîñòü ïóíêòà
ld_TickValue = fGetTickValue();
//---- Ïîäñ÷èòàåì ïîòåðè îò Swap
ld_swap = MathAbs (OrderSwap() / ld_TickValue);
ld_Profit = OrderProfit() + OrderCommission() + OrderSwap();
//---- Êîíòðîëèðóåì ìèíèìàëüíóþ ïðèáûëü
if (ld_Profit > (Profit_MIN / 0.1) * OrderLots() * ld_TickValue + ld_swap)
{
//Print ("Swap = ", ld_swap, "; Min Profit = ", DoubleToStr ((Profit_MIN / 0.1) * OrderLots() * ld_TickValue + ld_swap, gi_Digits));
//---- Êîíòðîëèðóåì ÷àñòè÷íîå çàêðûòèå flat-îðäåðîâ
li_Part = fPartClose (li_Ticket);
if (li_Part > 0)
{
gs_trade = StringConcatenate ("×àñòè÷íî çàêðûëè flat-îðäåð[", li_Ticket, "] !!!");
Print (gs_trade);
//---- Âîçâðàùàåì íà "ïåðåó÷¸ò"
if (li_Part == 2)
return (-1);
}
}
}
}
order++;
}
}
}
gd_MaxLOSS = MathMin (gd_MaxLOSS, gd_Profit);
if (order == 1)
{gi_Ticket = li_Ticket;}
//----
return (order);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Àâòîð : TarasBY |
//+-----------------------------------------------------------------------------------+
//| Îïèñàíèå : Ïîëó÷àåì öåíû, ñ êîòîðûìè áóäåò ðàáîòàòü ñîâåòíèê |
//+-----------------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| iPrice : 0 - Bid; 1 - Ask |
//| fi_VariantPrice : 0 - Bid\Ask; 1 - Open[0]; 2 - Close [1]; 3 - Close[0] |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGetTradePrice (int fi_VariantPrice, double& ar_Price[])
{
switch (fi_VariantPrice)
{
case 0:
RefreshRates();
ar_Price[0] = Bid;
ar_Price[1] = Ask;
break;
case 1: double ld_Price = Open[0]; break;
case 2: ld_Price = Close[1]; break;
case 3: ld_Price = Close[0]; break;
}
double ld_spread = MarketInfo (gs_Symbol, MODE_SPREAD) * gd_Point;
ar_Price[0] = ld_Price;
ar_Price[1] = ld_Price + ld_spread;
//----
return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Óäàëÿåì ëîññîâûé îðäåð ïî èñòå÷åíèþ "ñðîêà æèçíè" â fi_Period äíåé |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fLossControl (int fi_Period)
{
datetime ldt_OpenTime = OrderOpenTime();
double ld_Price;
int err = GetLastError();
bool lb_result = false;
//----
if (PERIOD_D1 * 60 * fi_Period + ldt_OpenTime < TimeCurrent())
{
//if (OrderType() == OP_BUY) {ld_Price = Bid;} else {ld_Price = Ask;}
ld_Price = gda_Price[OrderType()];
lb_result = OrderClose (OrderTicket(), OrderLots(), ld_Price, Slippage, White);
if (IsOptimization())
{return (lb_result);}
if (lb_result)
{
if (SoundAlert) {PlaySound ("delete_loss.wav");}
Print ("fLossControl(): Óäàëèëè ëîññîâûé îðäåð[", OrderTicket(), "] ïî ïðîøåñòâèè ", fi_Period, " äíåé !!!");
}
else {if (SoundAlert) {PlaySound ("mistake.wav");}}
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gs_ComError, "fLossControl()");
//----
return (lb_result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ñ÷èòàåì çàðàáîòàííóþ ïðèáûëü (åñëè âîîáùå çàðàáîòàëè) |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fCalculatePribul (string fs_Symbol, // ðàáî÷èé ñèìâîë
double& ar_Pribul[], // âîâðàùàåìûé ìàññèâ ðåçóëüòàòîâ ðàáîòû ïî òð¸ì òèïàì îðäåðîâ
int& ar_HistoryOrders[], // âîçâàðùàåìûé ìàññèâ çàêðûòûõ îðäåðîâ ïî òð¸ì òèïàì îðäåðîâ
int ar_Magic[], // ìàññèâ Magic
int op = -1, // òèï (BUY\SELL) ó÷èòûâàåìûõ îðäåðîâ
datetime dt = 0) // ìîìåíò âðåìåíè, ñ êîòîðîãî ïðîèçâîäèì ðàñ÷¸ò
{
int li_int, err = GetLastError(), li_NUM, history_total = OrdersHistoryTotal();
double ld_Pribul = 0;
string ls_Comment;
//----
ArrayInitialize (ar_Pribul, 0.0);
ArrayInitialize (ar_HistoryOrders, 0);
for (li_int = history_total - 1; li_int >= 0; li_int--)
{
if (OrderSelect (li_int, SELECT_BY_POS, MODE_HISTORY))
{
if (fCheckMyMagic (OrderMagicNumber(), ar_Magic) && OrderSymbol() == fs_Symbol)
{
if (OrderType() < 2 && (op < 0 || OrderType() == op))
{
if (dt < OrderCloseTime())
{
ld_Pribul = OrderProfit() + OrderSwap() + OrderCommission();
ls_Comment = OrderComment();
if (StringFind (ls_Comment, "sell_base") == 0 || StringFind (ls_Comment, "buy_base") == 0)
{
ar_Pribul[0] += ld_Pribul;
ar_HistoryOrders[0]++;
continue;
}
if (StringFind (ls_Comment, "sell_add") == 0 || StringFind (ls_Comment, "buy_add") == 0)
{
ar_Pribul[1] += ld_Pribul;
ar_HistoryOrders[1]++;
continue;
}
if (OrderMagicNumber() == ar_Magic[1])
{
ar_Pribul[2] += ld_Pribul;
ar_HistoryOrders[2]++;
continue;
}
}
}
}
}
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gs_ComError, "fCalculatePribul()");
//----
return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ïðîèçâîäèì ÷àñòè÷íîå çàêðûòèå îðäåðà ïî Ticket |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fPartClose (int fi_Ticket)
{
int li_ParentTicket, li_Part, err = GetLastError();
double ld_Lots, ld_LotsClose, ld_Price;
bool lb_result = false;
string ls_close, ls_Profit;
//----
li_ParentTicket = 0;
li_Part = 0;
ld_Lots = OrderLots();
li_ParentTicket = fGetParentTicket (OrderComment());
if (li_ParentTicket != 0)
{
if (GlobalVariableCheck (StringConcatenate (gs_NameGV, "_", li_ParentTicket, "_Num")))
{li_Part = GlobalVariableGet (StringConcatenate (gs_NameGV, "_", li_ParentTicket, "_Num")) + 1;}
if (GlobalVariableCheck (StringConcatenate (gs_NameGV, "_", li_ParentTicket, "_Lots")))
{ld_Lots = GlobalVariableGet (StringConcatenate (gs_NameGV, "_", li_ParentTicket, "_Lots"));}
}
GlobalVariableSet (StringConcatenate (gs_NameGV, "_", fi_Ticket, "_Num"), li_Part);
GlobalVariableSet (StringConcatenate (gs_NameGV, "_", fi_Ticket, "_Lots"), ld_Lots);
if (li_Part >= ArraySize (gia_Levels))
{li_Part = ArraySize (gia_Levels) - 1;}
RefreshRates();
//---- Óñòàíàâëèâàåì äèíàìè÷åñêèå óðîâíè çàêðûòèÿ
if (DinamicLevels > 0)
{fGetDinamicLevels (li_Part, gd_Trail_ch, gia_Levels);}
ld_Price = gda_Price[OrderType()];
if (OrderType() == OP_BUY)
{
//ld_Price = Bid;
if (ld_Price - OrderOpenPrice() >= gd_Point * gia_Levels[li_Part])
{
ld_LotsClose = fLotsNormalize ((gia_Percents[li_Part] * ld_Lots / 100.0), fi_Ticket);
if (ld_LotsClose > 0)
{
ld_LotsClose = MathMin (ld_LotsClose, OrderLots());
//if (li_Part == 2)
//{ld_LotsClose = OrderLots();}
RefreshRates();
lb_result = OrderClose (fi_Ticket, ld_LotsClose, Bid, Slippage, White);
}
}
}
if (OrderType() == OP_SELL)
{
//ld_Price = Ask;
if (OrderOpenPrice() - ld_Price >= gd_Point * gia_Levels[li_Part])
{
ld_LotsClose = fLotsNormalize ((gia_Percents[li_Part] * ld_Lots / 100.0), fi_Ticket);
if (ld_LotsClose > 0)
{
ld_LotsClose = MathMin (ld_LotsClose, OrderLots());
//if (li_Part == 2)
//{ld_LotsClose = OrderLots();}
RefreshRates();
lb_result = OrderClose (fi_Ticket, ld_LotsClose, Ask, Slippage, White);
}
}
}
if (IsOptimization())
{return (lb_result);}
if (lb_result)
{
if (SoundAlert) {PlaySound ("part_close.wav");}
OrderSelect (fi_Ticket, SELECT_BY_TICKET, MODE_HISTORY);
ls_Profit = DoubleToStr ((OrderProfit() + OrderCommission() + OrderSwap()), 1);
if (li_Part == 2) {ls_close = StringConcatenate ("îêîí÷àòåëüíîå (", li_Part, " / ", gia_Levels[li_Part], ")");} else {ls_close = StringConcatenate ("÷àñòè÷íîå (", li_Part, " / ", gia_Levels[li_Part], ")");}
Print ("fPartClose(): Ïðîèçâåëè ", ls_close, " çàêðûòèå ", GetNameOP (OrderType()), " îðäåðà[", fi_Ticket, "/P-", li_ParentTicket, "] Profit = ", ls_Profit, " !!!");
return (li_Part);
}
else
{
if (ld_LotsClose > 0)
{
if (SoundAlert) {PlaySound ("mistake.wav");}
if (li_Part == 2) {ls_close = "îêîí÷àòåëüíîì";} else {ls_close = StringConcatenate ("÷àñòè÷íîì (", li_Part, ")");}
Print ("fPartClose(): Îøèáêà ïðè ", ls_close, " çàêðûòèè ", GetNameOP (OrderType()), " îðäåðà[", fi_Ticket,
"/P-", li_ParentTicket, "]: ", ErrorDescription (GetLastError()),
"\nLot = ", DoubleToStr (OrderLots(), gi_dig), "; LotClose = ", DoubleToStr (ld_LotsClose, gi_dig)," !!!");
}
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gs_ComError, "fPartClose()");
//----
return (-1);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ïîëó÷àåì Ticket ðîäèòåëüñêîãî îðäåðà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGetParentTicket (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+
//| Ïðîâåðÿåì Magic |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCheckMyMagic (int fi_Magic, int ar_Magic[2])
{
//----
for (int li_int = 0; li_int < 2; li_int++)
{
if (fi_Magic == ar_Magic[li_int])
{return (true);}
}
//----
return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Çàêðûâàåì îðäåð ïî âðåìåíè |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCloseHour (int fi_HourClose, int fi_Ticket)
{
double ld_Price;
string ls_txt;
//----
if (!TimeControl)
{return (true);}
if (fi_HourClose < 24 && fi_HourClose > 0)
{
if (TimeHour (GetTime()) >= fi_HourClose)
{
RefreshRates();
if (OrderType() == OP_BUY) {ld_Price = Bid;} else {ld_Price = Ask;}
if (OrderClose (fi_Ticket, OrderLots(), ld_Price, Slippage, Yellow))
{
if (IsOptimization())
{return (true);}
gs_trade = StringConcatenate ("fCloseHour(): Çàêðûëè îðäåð[", fi_Ticket, "] â êîíöå äíÿ! (", OrderMagicNumber(), ").");
Print (gs_trade);
return (true);
}
else
{
if (SoundAlert) {PlaySound ("mistake.wav");}
Print ("fCloseHour(): Îøèáêà ïðè çàêðûòèè ", GetNameOP (OrderType()), " îðäåðà[", fi_Ticket, "] â êîíöå äíÿ: ", ErrorDescription (GetLastError()));
}
}
}
return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Îáùèå ôóíêöèè |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Àâòîð : TarasBY |
//+-----------------------------------------------------------------------------------+
//| Âåðñèÿ : 27.10.2009 |
//| Îïèñàíèå: fControlChangeValue_I Ôèêñèðóåò ôàêò èçìåíåíèÿ ïðîâåðÿåìîãî |
//| int ïàðàìåòðà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//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_S Ôèêñèðóåò ôàêò èçìåíåíèÿ ïðîâåðÿåìîãî |
//| string ïàðàìåòðà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCCV_S (string param, int ix)
{
static string cur_param[20];
static bool lb_first = true;
//----
//---- Ïðè ïåðâîì çàïóñêå èíèöèàëèçèðóåì ìàññèâ
if (lb_first)
{
for (int l_int = 0; l_int < 20; l_int++)
{cur_param[l_int] = "";}
lb_first = false;
}
if (cur_param[ix] != param)
{
cur_param[ix] = param;
return (true);
}
//----
return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Àâòîð : TarasBY |
//+-----------------------------------------------------------------------------------+
//| Âåðñèÿ : 27.10.2009 |
//| Îïèñàíèå: fControlChangeValue_D Ôèêñèðóåò ôàêò èçìåíåíèÿ ïðîâåðÿåìîãî |
//| double ïàðàìåòðà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCCV_D (double param, int ix)
{
static double cur_param[20];
static bool lb_first = true;
//----
//---- Ïðè ïåðâîì çàïóñêå èíèöèàëèçèðóåì ìàññèâ
if (lb_first)
{
for (int l_int = 0; l_int < 20; 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.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+
//| Ôîðìèðóåì íàçâàíèå îáúåêòà ñ ïðèìåíåíèåì ñóôôèêñà N (ñ÷¸ò÷èê) |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string fNamedOBJ_cnt (string fs_Name, int& fi_cnt)
{
string ls_Name = fs_Name + fi_cnt;
//----
fi_cnt++;
//----
return (ls_Name);
}
//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+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòà ñ ãðàôè÷åñêèìè îáúåêòàìè |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Îïèñàíèå : Óñòàíîâêà çíà÷êà íà ãðàôèêå, îáúåêò OBJ_ARROW. |
//+-----------------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| fi_Code - êîä çíà÷êà |
//| fc_color - öâåò çíà÷êà |
//| fs_Name - èìÿ |
//| fdt_Time - âðåìÿ îòêðûòèÿ áàðà (0 - òåêóùèé áàð) |
//| fd_Price - öåíîâîé óðîâåíü (0 - Bid) |
//| fi_size - ðàçìåð çíà÷êà (0 - ïî óìîë÷àíèþ) |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool SetArrow (int fi_Code, color fc_color, string fs_Name = "", datetime fdt_Time = 0, double fd_Price = 0, int fi_size = 0)
{
bool lb_res_Draw_Arrow = false;
//----
if (fdt_Time == 0) {fdt_Time = Time[0];}
if (fd_Price == 0) {fd_Price = Bid;}
if (ObjectFind (fs_Name) == -1)
{
lb_res_Draw_Arrow = ObjectCreate (fs_Name, OBJ_ARROW, 0, 0, 0);
if (!lb_res_Draw_Arrow)
{Print ("Error[", GetLastError(), "] - ObjectCreate()");}
}
if (!ObjectSet (fs_Name, OBJPROP_TIME1, fdt_Time))
{Print ("Error[", GetLastError(), "] - ObjectSet (OBJPROP_TIME1)");}
if (!ObjectSet (fs_Name, OBJPROP_PRICE1, fd_Price))
{Print ("Error[", GetLastError(), "] - ObjectSet (OBJPROP_PRICE1)");}
ObjectSet (fs_Name, OBJPROP_ARROWCODE, fi_Code);
ObjectSet (fs_Name, OBJPROP_COLOR, fc_color);
if (!ObjectSet (fs_Name, OBJPROP_WIDTH, fi_size))
{Print ("Error[", GetLastError(), "] - ObjectSet (OBJPROP_WIDTH)");}
//----
return (lb_res_Draw_Arrow);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Îïèñàíèå : Óñòàíîâêà îáúåêòà OBJ_LABEL |
//+-----------------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| name - íàèìåíîâàíèå îáúåêòà |
//| text - ñàì îáúåêò |
//| X - êîîðäèíàòà X |
//| Y - êîîðäèíàòà Y |
//| size - ðàçìåð îáúåêòà |
//| Font - øðèôò îáúåêòà |
//| Angle - óãîë (0 - ïî óìîë÷àíèþ) |
//| iWindow - îêíî â êîòîðîì ðàñïîëîæåí îáúåêò (0 - ïî óìîë÷àíèþ) |
//| CL1 - öâåò (CLR_NONE - ïî óìîë÷àíèþ) |
//| CL2 - öâåò (CLR_NONE - ïî óìîë÷àíèþ) |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void SetLabel (string name, string text, int X, int Y, int size, string Font,
int Angle = 0, int iWindow = 0, color CL1 = CLR_NONE, color CL2 = CLR_NONE)
{
if (ObjectFind (name) == -1)
{ObjectCreate (name, OBJ_LABEL, iWindow, 0, 0);}
ObjectSet (name, OBJPROP_COLOR, CL2);
ObjectSet (name, OBJPROP_XDISTANCE, X);
ObjectSet (name, OBJPROP_YDISTANCE, Y);
if (Angle > 0)
{ObjectSet (name, OBJPROP_ANGLE, Angle);}
if (text != "")
{ObjectSetText (name, text, size, Font, CL1);}
//----
return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
// ÓÄÀËÅÍÈÅ ÃÐÀÔÈ×ÅÑÊÎÃÎ ÎÁÚÅÊÒÀ |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool DelObject (string txtPart)
{
string lbl;
//----
if (ObjectFind (txtPart) != -1)
{
if (ObjectDelete (txtPart))
{return (true);}
}
for (int i = ObjectsTotal() - 1; i >= 0; i--)
{
lbl = ObjectName (i);
if (StringFind (lbl, txtPart, 0) > -1)
{
if (ObjectDelete (lbl))
{return (true);}
}
}
//----
return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Money Management |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ãëàâíàÿ ôóíêöèÿ ïîëó÷åíèÿ ðàçìåðà ëîòà (âûçûâàåòñÿ èç ñîâåòíèêà) |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double GetSizeLot (double fd_Lot)
{
if (!UseMM)
{return (fd_Lot);}
double dLot, koef = 1, Money = 0;
//----
switch (MeansType)
{
case 1: Money = AccountBalance(); break;
case 2: Money = AccountEquity(); break;
case 3: Money = AccountFreeMargin(); break;
case 4: Money = RiskDepo; break;
}
switch (LotsWayChoice)
{
case 0: dLot = fd_Lot; break;
case 1: // ôèêñèðîâàííûé ïðîöåíò îò äåïîçèòà
koef = Money * AccountLeverage() * LotsPercent / (100000 * 10);
dLot = fd_Lot * koef;
break;
case 2: // ôðàêöèîííî-ïðîïîðöèîíàëüíûé
int k = LotsDepoForOne;
for (double i = 2; i <= LotsMax; i++)
{
k += i * LotsDeltaDepo;
if (k > Money)
{
dLot = (i - 1) / 10;
break;
}
}
break;
case 3: // ôðàêöèîííî-ôèêñèðîâàííûé
dLot = MathCeil ((Money - LotsDepoForOne) / LotsDeltaDepo) / 10;
break;
}
dLot = NormalizeDouble (dLot, LotDecimal());
dLot = MathMax (MinLot, dLot);
dLot = MathMin (MaxLot, dLot);
//----
return (dLot);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ïðîèçâîäèì íîðìàëèçàöèþ ëîòà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fLotsNormalize (double fd_Lots, int fi_Ticket = 0)
{
fd_Lots -= MarketInfo (Symbol(), MODE_MINLOT);
fd_Lots /= MarketInfo (Symbol(), MODE_LOTSTEP);
fd_Lots = MathRound (fd_Lots);
fd_Lots *= MarketInfo (Symbol(), MODE_LOTSTEP);
fd_Lots += MarketInfo (Symbol(), MODE_MINLOT);
fd_Lots = NormalizeDouble (fd_Lots, LotDecimal());
fd_Lots = MathMax (fd_Lots, MarketInfo (Symbol(), MODE_MINLOT));
fd_Lots = MathMin (fd_Lots, MarketInfo (Symbol(), MODE_MAXLOT));
//---- Ïðè ÷àñòè÷íîì çàêðûòèè ëîòà íóæíà òàêàÿ ïðîâåðêà íà ïîñëåäíåé ÷àñòè çàêðûòèÿ
if (fi_Ticket > 0 && OrderLots() > 0)
{fd_Lots = MathMin (fd_Lots, OrderLots());}
//----
return (fd_Lots);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ, îïðåäåëåíèÿ ìèíèìàëüíîé ðàçðÿäíîñòè ëîòà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int LotDecimal()
{return (MathCeil (MathAbs (MathLog (MarketInfo (gs_Symbol, MODE_LOTSTEP)) / MathLog (10))));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòà ñ îøèáêàìè |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ ErrorDescription() âîçâðàùàåò íå êîä îøèáêè à å¸ ñëîâåñòíîå îïèñàíèå |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string ErrorDescription (int error_code)
{
string error_string;
//----
switch (error_code)
{
//---- codes returned from trade server
case 0: return ("ÍÅÒ !!!");
case 1: error_string = "Ïîïûòêà èçìåíèòü óæå óñòàíîâëåííûå çíà÷åíèÿ òàêèìè æå çíà÷åíèÿìè."; break;
case 2: error_string = "Îáùàÿ îøèáêà. Ïðåêðàòèòü âñå ïîïûòêè òîðãîâûõ îïåðàöèé äî âûÿñíåíèÿ îáñòîÿòåëüñòâ."; break;
case 3: error_string = "Â òîðãîâóþ ôóíêöèþ ïåðåäàíû íåïðàâèëüíûå ïàðàìåòðû."; break;
case 4: error_string = "Òîðãîâûé ñåðâåð çàíÿò."; break;
case 5: error_string = "Ñòàðàÿ âåðñèÿ êëèåíòñêîãî òåðìèíàëà."; break;
case 6: error_string = "Íåò ñâÿçè ñ òîðãîâûì ñåðâåðîì."; break;
case 7: error_string = "Íåäîñòàòî÷íî ïðàâ."; break;
case 8: error_string = "Ñëèøêîì ÷àñòûå çàïðîñû."; break;
case 9: error_string = "Íåäîïóñòèìàÿ îïåðàöèÿ íàðóøàþùàÿ ôóíêöèîíèðîâàíèå ñåðâåðà."; break;
case 64: error_string = "Ñ÷åò çàáëîêèðîâàí. Íåîáõîäèìî ïðåêðàòèòü âñå ïîïûòêè òîðãîâûõ îïåðàöèé."; break;
case 65: error_string = "Íåïðàâèëüíûé íîìåð ñ÷åòà."; break;
case 128: error_string = "Èñòåê ñðîê îæèäàíèÿ ñîâåðøåíèÿ ñäåëêè."; break;
case 129: error_string = "Íåïðàâèëüíàÿ öåíà bid èëè ask, âîçìîæíî, íåíîðìàëèçîâàííàÿ öåíà."; break;
case 130: error_string = "Ñëèøêîì áëèçêèå ñòîïû èëè íåïðàâèëüíî ðàññ÷èòàííûå èëè íåíîðìàëèçîâàííûå öåíû â ñòîïàõ (èëè â öåíå îòêðûòèÿ îòëîæåííîãî îðäåðà)."; break;
case 131: error_string = "Íåïðàâèëüíûé îáúåì, îøèáêà â ãðàíóëÿöèè îáúåìà."; break;
case 132: error_string = "Ðûíîê çàêðûò."; break;
case 133: error_string = "Òîðãîâëÿ çàïðåùåíà."; break;
case 134: error_string = "Íåäîñòàòî÷íî äåíåã äëÿ ñîâåðøåíèÿ îïåðàöèè."; break;
case 135: error_string = "Öåíà èçìåíèëàñü."; break;
case 136: error_string = "Íåò öåí."; break;
case 137: error_string = "Áðîêåð çàíÿò."; break;
case 138: error_string = "Çàïðîøåííàÿ öåíà óñòàðåëà, ëèáî ïåðåïóòàíû bid è ask."; break;
case 139: error_string = "Îðäåð çàáëîêèðîâàí è óæå îáðàáàòûâàåòñÿ."; break;
case 140: error_string = "Ðàçðåøåíà òîëüêî ïîêóïêà. Ïîâòîðÿòü îïåðàöèþ SELL íåëüçÿ."; break;
case 141: error_string = "Ñëèøêîì ìíîãî çàïðîñîâ."; break;
case 142: error_string = "Îðäåð ïîñòàâëåí â î÷åðåäü."; break;
case 143: error_string = "Îðäåð ïðèíÿò äèëåðîì ê èñïîëíåíèþ."; break;
case 144: error_string = "Îðäåð àííóëèðîâàí ñàìèì êëèåíòîì ïðè ðó÷íîì ïîäòâåðæäåíèè ñäåëêè."; break;
case 145: error_string = "Ìîäèôèêàöèÿ çàïðåùåíà, òàê êàê îðäåð ñëèøêîì áëèçîê ê ðûíêó è çàáëîêèðîâàí èç-çà âîçìîæíîãî ñêîðîãî èñïîëíåíèÿ."; break;
case 146: error_string = "Ïîäñèñòåìà òîðãîâëè çàíÿòà."; break;
case 147: error_string = "Èñïîëüçîâàíèå äàòû èñòå÷åíèÿ îðäåðà çàïðåùåíî áðîêåðîì."; break;
case 148: error_string = "Êîëè÷åñòâî îòêðûòûõ è îòëîæåííûõ îðäåðîâ äîñòèãëî ïðåäåëà, óñòàíîâëåííîãî áðîêåðîì."; break;
case 149: error_string = "Ïîïûòêà îòêðûòü ïðîòèâîïîëîæíóþ ïîçèöèþ ê óæå ñóùåñòâóþùåé â ñëó÷àå, åñëè õåäæèðîâàíèå çàïðåùåíî."; break;
case 4000: return ("");
case 4001: error_string = "Íåïðàâèëüíûé óêàçàòåëü ôóíêöèè."; break;
case 4002: error_string = "Èíäåêñ ìàññèâà - âíå äèàïàçîíà."; break;
case 4003: error_string = "Íåò ïàìÿòè äëÿ ñòåêà ôóíêöèé."; break;
case 4004: error_string = "Ïåðåïîëíåíèå ñòåêà ïîñëå ðåêóðñèâíîãî âûçîâà."; break;
case 4005: error_string = "Íà ñòåêå íåò ïàìÿòè äëÿ ïåðåäà÷è ïàðàìåòðîâ."; break;
case 4006: error_string = "Íåò ïàìÿòè äëÿ ñòðîêîâîãî ïàðàìåòðà."; break;
case 4007: error_string = "Íåò ïàìÿòè äëÿ âðåìåííîé ñòðîêè."; break;
case 4008: error_string = "Íåèíèöèàëèçèðîâàííàÿ ñòðîêà."; break;
case 4009: error_string = "Íåèíèöèàëèçèðîâàííàÿ ñòðîêà â ìàññèâå."; break;
case 4010: error_string = "Íåò ïàìÿòè äëÿ ñòðîêîâîãî ìàññèâà."; break;
case 4011: error_string = "Ñëèøêîì äëèííàÿ ñòðîêà."; break;
case 4012: error_string = "Îñòàòîê îò äåëåíèÿ íà íîëü."; break;
case 4013: error_string = "Äåëåíèå íà íîëü."; break;
case 4014: error_string = "Íåèçâåñòíàÿ êîìàíäà."; break;
case 4015: error_string = "Íåïðàâèëüíûé ïåðåõîä."; break;
case 4016: error_string = "Íåèíèöèàëèçèðîâàííûé ìàññèâ."; break;
case 4017: error_string = "Âûçîâû DLL íå ðàçðåøåíû."; break;
case 4018: error_string = "Íåâîçìîæíî çàãðóçèòü áèáëèîòåêó."; break;
case 4019: error_string = "Íåâîçìîæíî âûçâàòü ôóíêöèþ."; break;
case 4020: error_string = "Âûçîâû âíåøíèõ áèáëèîòå÷íûõ ôóíêöèé íå ðàçðåøåíû."; break;
case 4021: error_string = "Íåäîñòàòî÷íî ïàìÿòè äëÿ ñòðîêè, âîçâðàùàåìîé èç ôóíêöèè."; break;
case 4022: error_string = "Ñèñòåìà çàíÿòà."; break;
case 4050: error_string = "Íåïðàâèëüíîå êîëè÷åñòâî ïàðàìåòðîâ ôóíêöèè."; break;
case 4051: error_string = "Íåäîïóñòèìîå çíà÷åíèå ïàðàìåòðà ôóíêöèè."; break;
case 4052: error_string = "Âíóòðåííÿÿ îøèáêà ñòðîêîâîé ôóíêöèè."; break;
case 4053: error_string = "Îøèáêà ìàññèâà."; break;
case 4054: error_string = "Íåïðàâèëüíîå èñïîëüçîâàíèå ìàññèâà-òàéìñåðèè."; break;
case 4055: error_string = "Îøèáêà ïîëüçîâàòåëüñêîãî èíäèêàòîðà."; break;
case 4056: error_string = "Ìàññèâû íåñîâìåñòèìû."; break;
case 4057: error_string = "Îøèáêà îáðàáîòêè ãëîáàëüíûåõ ïåðåìåííûõ."; break;
case 4058: error_string = "Ãëîáàëüíàÿ ïåðåìåííàÿ íå îáíàðóæåíà."; break;
case 4059: error_string = "Ôóíêöèÿ íå ðàçðåøåíà â òåñòîâîì ðåæèìå."; break;
case 4060: error_string = "Ôóíêöèÿ íå ïîäòâåðæäåíà."; break;
case 4061: error_string = "Îøèáêà îòïðàâêè ïî÷òû."; break;
case 4062: error_string = "Îæèäàåòñÿ ïàðàìåòð òèïà string."; break;
case 4063: error_string = "Îæèäàåòñÿ ïàðàìåòð òèïà integer."; break;
case 4064: error_string = "Îæèäàåòñÿ ïàðàìåòð òèïà double."; break;
case 4065: error_string = " êà÷åñòâå ïàðàìåòðà îæèäàåòñÿ ìàññèâ."; break;
case 4066: error_string = "Çàïðîøåííûå èñòîðè÷åñêèå äàííûå â ñîñòîÿíèè îáíîâëåíèÿ."; break;
case 4067: error_string = "Îøèáêà ïðè âûïîëíåíèè òîðãîâîé îïåðàöèè."; break;
case 4099: error_string = "Êîíåö ôàéëà."; break;
case 4100: error_string = "Îøèáêà ïðè ðàáîòå ñ ôàéëîì."; break;
case 4101: error_string = "Íåïðàâèëüíîå èìÿ ôàéëà."; break;
case 4102: error_string = "Ñëèøêîì ìíîãî îòêðûòûõ ôàéëîâ."; break;
case 4103: error_string = "Íåâîçìîæíî îòêðûòü ôàéë."; break;
case 4104: error_string = "Íåñîâìåñòèìûé ðåæèì äîñòóïà ê ôàéëó."; break;
case 4105: error_string = "Íè îäèí îðäåð íå âûáðàí."; break;
case 4106: error_string = "Íåèçâåñòíûé ñèìâîë."; break;
case 4107: error_string = "Íåïðàâèëüíûé ïàðàìåòð öåíû äëÿ òîðãîâîé ôóíêöèè."; break;
case 4108: error_string = "Íåâåðíûé íîìåð òèêåòà."; break;
case 4109: error_string = "Òîðãîâëÿ íå ðàçðåøåíà. Íåîáõîäèìî âêëþ÷èòü îïöèþ Ðàçðåøèòü ñîâåòíèêó òîðãîâàòü â ñâîéñòâàõ ýêñïåðòà."; break;
case 4110: error_string = "Äëèííûå ïîçèöèè íå ðàçðåøåíû. Íåîáõîäèìî ïðîâåðèòü ñâîéñòâà ýêñïåðòà."; break;
case 4111: error_string = "Êîðîòêèå ïîçèöèè íå ðàçðåøåíû. Íåîáõîäèìî ïðîâåðèòü ñâîéñòâà ýêñïåðòà."; break;
case 4200: error_string = "Îáúåêò óæå ñóùåñòâóåò."; break;
case 4201: error_string = "Çàïðîøåíî íåèçâåñòíîå ñâîéñòâî îáúåêòà."; break;
case 4202: error_string = "Îáúåêò íå ñóùåñòâóåò."; break;
case 4203: error_string = "Íåèçâåñòíûé òèï îáúåêòà."; break;
case 4204: error_string = "Íåò èìåíè îáúåêòà."; break;
case 4205: error_string = "Îøèáêà êîîðäèíàò îáúåêòà."; break;
case 4206: error_string = "Íå íàéäåíî óêàçàííîå ïîäîêíî."; break;
case 4207: error_string = "Îøèáêà ïðè ðàáîòå ñ îáúåêòîì."; break;
}
//----
return (error_string);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ïîëó÷àåì íîìåð è îïèñàíèå ïîñëåäíåé îøèáêè è âûâîäèì â ìàññèâ êîììåíòîâ |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGetLastError (string& Comm_Error, string Com = "")
{
int err = GetLastError();
string ls_err;
//----
if (err > 0 && err != 4202)
{
ls_err = StringConcatenate (Com, ": Îøèáêà ¹ ", err, ": ", ErrorDescription (err));
Print (ls_err);
Comm_Error = ls_err;
}
//----
return (err);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòà ïî âðåìåíè |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ, êîíòðîëèðóþùàÿ âðåìÿ ðàáîòû ñîâåòíèêà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool IsTradeTime (int OpenHour, int CloseHour)
{
if (!TimeControl)
{return (true);}
if (OpenHour < CloseHour && (TimeHour (GetTime()) < OpenHour || TimeHour (GetTime()) >= CloseHour))
{return (FALSE);}
if (OpenHour > CloseHour && (TimeHour (GetTime()) < OpenHour && TimeHour (GetTime()) >= CloseHour))
{return (FALSE);}
if (OpenHour == 0)
{CloseHour = 24;}
if (TimeHour (GetTime()) == CloseHour - 1 && Minute() >= gi_min)
{return (FALSE);}
//----
return (TRUE);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Â âûõîäíûå íå çàïðàøèâàåì êîòèðîâêè ó ñåðâåðà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool ServerWork()
{
if (DayOfWeek() == 0 || DayOfWeek() == 6)
{return (false);}
else
{return (true);}
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
datetime GetTime()
{
datetime ldt_Time;
if (IsOptimization() || IsTesting())
{ldt_Time = iTime (Symbol(), PERIOD_M1, 0);}
else
{ldt_Time = GetTimeGMT();}
//----
return (ldt_Time);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string FormatDateTime (int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec)
{
string sMonth, sDay, sHour, sMin, sSec;
//----
sMonth = 100 + nMonth;
sMonth = StringSubstr (sMonth, 1);
sDay = 100 + nDay;
sDay = StringSubstr (sDay, 1);
sHour = 100 + nHour;
sHour = StringSubstr (sHour, 1);
sMin = 100 + nMin;
sMin = StringSubstr (sMin, 1);
sSec = 100 + nSec;
sSec = StringSubstr (sSec, 1);
//----
return (StringConcatenate (nYear, ".", sMonth, ".", sDay, " ", sHour, ":", sMin, ":", sSec));
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
datetime GetTimeGMT()
{
int TimeArray[4];
int nYear, nMonth, nDay, nHour, nMin, nSec;
int TZInfoArray[43];
//----
GetLocalTime (TimeArray);
nYear = TimeArray[0]&0x0000FFFF;
nMonth = TimeArray[0]>>16;
nDay = TimeArray[1]>>16;
nHour = TimeArray[2]&0x0000FFFF;
nMin = TimeArray[2]>>16;
nSec = TimeArray[3]&0x0000FFFF;
string st = FormatDateTime (nYear, nMonth, nDay, nHour, nMin, nSec);
datetime d = StrToTime (st);
int gmt_shift = 0;
int ret = GetTimeZoneInformation (TZInfoArray);
if (ret != 0)
{gmt_shift = TZInfoArray[0];}
if (ret == 2)
{gmt_shift += TZInfoArray[42];}
//----
return (d + gmt_shift * 60);
}
//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
---