Price Data Components
Orders Execution
0
Views
0
Downloads
0
Favorites
e-PSIzVTEC
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| e-PSI@VTEC.mq4 |
//| Copyright © 2011, TarasBY |
//| taras_bulba@tut.by |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
#property copyright "Copyright © 2011, TarasBY WM R418875277808"
#property link "taras_bulba@tut.by"
//IIIIIIIIIIIIIIIIIII==================CONSTANS=================IIIIIIIIIIIIIIIIIIIIII+
#define Line_BUY 0
#define Line_SELL 1
//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 = 30; // Ìèí. ïðîôèò äëÿ çàêðûòèÿ îðäåðà (â ïï.)
extern int MIN_StopLoss = 50; // Ìèí. ñòîï-ëîññ äëÿ âñåõ îðäåðîâ
extern string Setup_baseStrategy = "================= Base STRATEGY =================";
extern bool Send_base_ON = TRUE; // Îòêðûâàåì base (îñíîâíûå) îðäåðà
extern int MIN_Range = 100; // ìèí. äèàïàçîí ìåæäó ìèí. è ìàêñ.
extern int Trailling_Volume = 40; // Ðàçìåð òðàëà
extern string Setup_flatStrategy = "================= Flat STRATEGY =================";
extern bool Send_flat_ON = TRUE; // Îòêðûâàåì flat (íà ïðîáîé flat-êàíàëà) îðäåðà
extern int MAX_flat_Range = 30; // ìàêñ. äèàïàçîí "ôëýòîâîãî êîðèäîðà"
extern int Weight_Channel = 30; // Äëèíà "ôëýòîâîãî êîðèäîðà" â ñâå÷àõ
extern int Trailling_Vol_Channel = 30; // òðàë êîðèäîðà
extern string Setup_PartClose = "======== ×àñòè÷íîå çàêðûòèå flat îðäåðîâ ========";
extern bool PartClose_ON = TRUE; // ×àñòè÷íîå çàêðûòèå flat îðäåðîâ
extern string Levels = "20/50/100"; // Óðîâíè çàêðûòèÿ. Íàïðèìåð, ïðè ïàðàìåòðàõ 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 = "40/20/20"; // Ïðîöåíò çàêðûòèÿ (÷åðåç ðàçäåëèòåëü "/") äëÿ ñîîòâåòñòâóþùåãî óðîâíÿ. Çäåñü îòñ÷åò èäåò îò ëîòà ïåðâîãî îðäåðà. Åñëè èñõîäíûé îðäåð îòêðûò ñ ëîòîì 1.0 ëîò, çàêðûâàåòñÿ 50% - 0.5, çàòåì 25% îò 1.0 - 0.3 è íàêîíåö 0.2
extern string Setup_compStrategy = "============= Compensation STRATEGY =============";
extern bool Send_comp_ON = TRUE; // Îòêðûâàåì êîìïåíñàòîðíûå (âìåñòå ñ base èëè flat) îðäåðà
extern double K_comp_lot = 2.0; // Êîýôôèöèåíò óâåëè÷èâàþùåãîñÿ ëîòà äëÿ êîìïåíñàòîðíîãî îðäåðà
extern int Comp_Range = 200; // Ìèí. ðàññòîÿíèå â ïï. îò 1-ãî îðäåðà äî íîâîãî ýêñòðåìóìà
extern string Setup_Services = "==================== SERVICES ===================";
extern bool PrintCom = TRUE; // Ïå÷àòàòü êîììåíòàðèé.
extern bool Dinamic_Trail_ON = TRUE; // Ðàçìåð òðàëà îïðåäåëÿåì ïî MAX ðàçìåðó ñâå÷è ïîñëåäíèõ Counted_Bars áàðîâ
extern int Counted_Bars = 5; // Êîëè÷åñòâî ïîñëåäíèõ ñâå÷åé äëÿ îïðåäåëåíèÿ âåëè÷èíû Trailling
extern int Slippage = 2; // Äîïóñòèìîå îòêëîíåíèå îò çàïðîøåííîé öåíû
extern int CloseTime = 5; // Êîëè÷åñòâî äíåé æèçíè ëîññîâîãî îðäåðà
extern bool SoundAlert = FALSE; // Çâóê
extern string Setup_Lots = "========= Ïàðàìåòðû ìîäóëÿ ðàñ÷¸òà ëîòà =========";
extern bool UseMM = FALSE; // Èñïîëüçîâàòü ðàñøèðÿþùèéñÿ ëîò
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.3; // Ôèêñèðîâàííûé ðàçìåð ëîòà
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 int StopMarginPercent = 50; // Ïðîöåíò ñâîáîäíîé ìàðæè îò Áàëàíñà ïðè êîòîðîì íîâûå îðäåðà íå âûñòàâëÿþòñÿ
extern int RiskDepoPercent = 30; // Ïðè êàêîì ëîññå îò 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; // Âî ñêîëüêî êàæäûé äåíü çàêðûâàåì âñå îðäåðà (åñëè 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, cur_MG = 0, gi_chart_Period,
gia_Periods[] = {1,5,15,30,60,240,1440,10080,43200}, gi_Bar_High, gi_Bar_Low,
gia_HistoryOrders[3], gia_MG[3], gia_Levels[], gia_Percents[];
string gs_trade, gs_sign, gsa_NameCom[] = {"base","flat","add"}, gs_Symbol,
gs_NameGV, gs_fName, gs_ComError = "";
bool gb_flat = false, gba_Send[3], RealTrade = true, gba_IsLine[2],
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, gdt_curTime, dta_CommentTime[13];
//IIIIIIIIIIIIIIIIIII==========Ïîäêëþ÷åííûå áèáëèîòåêè==========IIIIIIIIIIIIIIIIIIIIII+
#import "kernel32.dll"
void GetLocalTime (int& TimeArray[]);
int GetTimeZoneInformation (int& TZInfoArray[]);
#import
extern string SETUP_VirtualTrade = "============= Setup Virtual Trade =============";
extern bool VirtualOrders_ON = TRUE; // Âêëþ÷åíèå îòêðûòèÿ îðäåðîâ ïî ëèíèÿì íà ãðàôèêå
extern int Variant_Send = 0;
// 0 - ïðè ïåðåñå÷åíèè óðîâíÿ - îòêðûâàåì ïî òåêóùåé öåíå îðäåð ïî íàçâàíèþ ëèíèè
// 1 - ïðè ïåðåñå÷åíèè óðîâíÿ: STOP-îðäåðà îòêðûâàåì ïî òåêóùåé öåíå, LIMIT îòêðûâàåì ïîñëå òîãî, êàê öåíà ðàçâåðí¸òñÿ è âûéäåò çà ïðåäåëû "âèäèìîñòè" óðîâíÿ (OpenPrice+-Reliable_Area)
extern bool TrailPrice_ON = TRUE; // Òðàëèòü PriceOpen çà öåíîé
extern bool DeleteInActiveLine = TRUE; // Óäàëåíèå "îòðàáîòàííîé" ëèíèè
extern int Reliable_Area = 20; // Çîíà â ïï. (äëÿ 4-¸õ çíàêîâ) çà ïðåäåëàõ êîòîðîé (ïîñëå ïåðåñå÷åíèÿ) äîëæíà âûéòè öåíà, ÷òîáû ñîâåòíèê îòêðûë îðäåð - ðàçìåð "âèäèìîñòè" óðîâíÿ
extern string Name_BUY_Line = "OpenPrice_BUY"; // Èìÿ ëèíèè äëÿ îðäåðà BUY
extern string Name_SELL_Line = "OpenPrice_SELL"; // Èìÿ ëèíèè äëÿ îðäåðà SELL
//IIIIIIIIIIIIIIIIIII========Ãëîáàëüíûå ïåðåìåííûå ìîäóëÿ=======IIIIIIIIIIIIIIIIIIIIII+
double gd_area, gda_SendLevel[4], gd_Value_draw, gda_TimeOfLine[2];
int cur_Line, pre_Type, gia_Line[] = {0,1}, Variant_Line = 0;
string gs_pre_Name = "", gs_Info, gsa_Name_Line[2], gsa_Comment[5],
gsa_Name_ORD[] = {"BUY","SELL"};
bool gb_NewLine = true, gb_Virtual_Trade, gb_InfoPrint = false,
gb_Pause = false, gb_Control = TRUE;
color gca_color[] = {Blue,Red,Blue,Red,DeepSkyBlue,Magenta}, gc_color;
//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;
gia_MG[2] = MG + 2;
gba_Send[0] = Send_base_ON;
gba_Send[1] = Send_comp_ON;
gba_Send[2] = Send_flat_ON;
gs_trade = "Ïðîâåä¸ííûå îïåðàöèè îòñòóòñòâóþò !!!";
gs_fName = "init()";
//---- Îïðåäåëÿåì çíà÷åíèå âàëþòû äåïîçèòà (äëÿ îòîáðàæåíèÿ ñòàòèñòèêè)
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_Point;
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 (IsOptimization())
{
DrawObject_ON = false;
PrintCom = false;
}
SoundAlert = false;
//---- Ïîä÷èùàåì GV-ïåðåìåííûå
GlobalVariablesDeleteAll (gs_NameGV);
}
if (!IsOptimization())
{
//---- Îðãàíèçóåì ïîäãîòîâêó êîììåíòàðèåâ
if (PrintCom || DrawObject_ON)
{gb_InfoPrint = true;}
}
//---- Îïðåäåëÿåì èíäåêñ ïåðèîäà ÷àðòà
gi_chart_Period = fGetNumPeriods (gia_Periods, Period());
if (VirtualOrders_ON)
{
fInitVirtualTrade();
ArrayInitialize (gba_IsLine, 0);
}
//---- Åñëè çàäàíî ÷àñòè÷íîå çàêðûòèå îðäåðîâ - îïðåäåëÿåì ìèíèìàëüíûé ðàçìåð ëîòà
if (Send_flat_ON && PartClose_ON)
{Order_Lots = MathMax (Order_Lots, 0.3);}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
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);}
//---- Äëÿ èçëèøíåé îïòèìèçàöèè óáèðàåì íå ñóùåñòâåííûå âàðèàíòû
if (IsOptimization())
{
if (MIN_Range <= MAX_flat_Range * 2 || Profit_MIN * 2 < MIN_StopLoss)
{return (0);}
}
//---- Îïðåäåëÿåì ïåðèîäè÷íîñòü ðàáîòû ñîâåòíèêà
if (NewBarInPeriod >= 0)
{
if (NewBar == iTime (gs_Symbol, NewBarInPeriod, 0))
{return (0);}
NewBar = iTime (gs_Symbol, NewBarInPeriod, 0);
}
//----
int li_add_Ticket = 0, err = GetLastError();
string ls_txt = "";
static bool lb_new_first = false;
//----
//---- Åñëè ëîññ ïðåâûñèë äîïóñòèìîå çíà÷åíèå îò áàëàíñà, çàêðûâàåì âñå îðäåðà
if (fRiskPercentControl (ls_txt, AccountBalance(), AccountProfit()))
{
if (PrintCom) Print (ls_txt);
CloseOrderAll();
}
//---- Ïîëó÷àåì öåíû, ñ êîòîðûìè áóäåò ðàáîòàòü ñîâåòíèê
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, gia_Periods[gi_chart_Period+2]);
fTrailling (gia_MG);
lb_new_first = true;
}
else
{
//---- Ïðèâîäèì çíà÷èìûå ïåðåìåííûå â ïåðâîíà÷àëüíîå ñîñòîÿíèå
if (lb_new_first)
{
fGet_HIGH (gd_MIN_Range);
fGet_LOW (gd_MIN_Range);
lb_new_first = false;
gb_flat = false;
}
}
//---- Îðãàíèçîâûâàåì ðàáîòó ïî âðåìåíè
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) // íå ñôîðìèðîâàí "ôëýòîâûé êîðèäîð"
{
gs_fName = "start()";
//---- Îïðåäåëÿåì øèðèíó ïîëó÷åííîãî êàíàëà
gd_Channel_base = gd_HIGH - gd_LOW;
//---- Ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ îñíîâíîãî îðäåðà
gi_Ticket = fBase_Strategy (gia_MG[0]);
if (gi_Ticket > 0 && !IsOptimization())
{
if (OrderSelect (gi_Ticket, SELECT_BY_TICKET)) {OrderPrint();}
gs_trade = fPrepareComment (StringConcatenate ("Îòêðûëè base-îðäåð[", gi_Ticket, "] ", GetNameOP (OrderType()), " (", OrderMagicNumber(), ") !!!"), gb_InfoPrint);
if (PrintCom) Print (gs_trade, "[", OrdersTotal(), "/", gi_MyOrders, "]");
}
}
//---- Åñëè îñíîâíàÿ ñäåëêà íå îòêðûòà
if (Send_flat_ON && gi_Ticket <= 0)
{
//---- Ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ flat-îðäåðà
gi_Ticket = fChannel_Strategy (gia_MG[1]);
if (gi_Ticket > 0)
{
gb_flat = false;
if (!IsOptimization())
{
if (OrderSelect (gi_Ticket, SELECT_BY_TICKET)) {OrderPrint();}
gs_trade = fPrepareComment (StringConcatenate ("Îòêðûëè flat-îðäåð[", gi_Ticket, "] ", GetNameOP (OrderType()), " (", OrderMagicNumber(), ") !!!"), gb_InfoPrint);
if (PrintCom) 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 (MathMin (gd_MIN_Range, gd_Comp_Range), gi_Ticket) == 0)
{return (0);}
}
if (OrderType() == OP_SELL)
{
if (fGet_HIGH (MathMin (gd_MIN_Range, gd_Comp_Range), gi_Ticket) == 0)
{return (0);}
}
//---- Îïðåäåëÿåì øèðèíó ïîëó÷åííîãî êàíàëà
gd_Channel_base = gd_HIGH - gd_LOW;
if (!IsOptimization() && gd_Channel_base > gd_MIN_Range + gd_Comp_Range)
{if (PrintCom) Print ("Íîâûé êàíàë äëÿ îòêðûòèÿ êîìïåíñàòîðíîãî îðäåðà ñôîðìèðîâàí = ", gd_Channel_base / gd_Point, " !!!");}
//---- Ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ êîìïåíñàòîðíîãî îðäåðà
li_add_Ticket = fCompensation_Strategy (gi_Ticket, gia_MG[2]);
if (li_add_Ticket > 0)
{
gb_flat = false;
if (!IsOptimization())
{
if (OrderSelect (li_add_Ticket, SELECT_BY_TICKET)) {OrderPrint();}
gs_trade = fPrepareComment (StringConcatenate ("Îòêðûëè add-îðäåð[", li_add_Ticket, "] ", GetNameOP (OrderType()), " (", OrderMagicNumber(), ") !!!"), gb_InfoPrint);
if (PrintCom) Print (gs_trade, "[", OrdersTotal(), "]");
}
}
}
}
}
fVirtualTrade (gda_Price, cur_MG, RealTrade);
//---- Ðàáîòàåì ñî ñòàòèñòèêîé
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, li_pos, 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));
gb_moove_UP = false;
//---- Èòåðàöèÿ 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)
{
gi_Bar_High = i;
gc_high = Base_color;
if (PrintCom) 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, Base_color);
SetLabel ("time_high", ": " + TimeToStr (dta_CommentTime[0], TIME_DATE|TIME_MINUTES), 270, 15, 10, Font_Time, 0, 0, Time_color);
}
}
li_preTicket = fi_NewTicket;
return (1);
}
}
//---- Åñëè "¸ëî÷êà" íå íàéäåíà, íàçíà÷àåì íîâûé ìàêñèìóì
if (i >= gi_counted_bars)
{
//---- Åñëè â÷åðàøíèé ìàêñèìóì íèæå öåí òåêóùåãî äíÿ, áåð¸ì ìàêñèìóì òåêóùåãî äíÿ
if (iHigh (gs_Symbol, PERIOD_D1, 1) >= gda_Price[1]) {li_pos = 1;} else {li_pos = 0;}
//---- Áåð¸ì HIGH ïîñëåäíèõ ñóòîê
gd_HIGH = iHigh (gs_Symbol, PERIOD_D1, li_pos);
//---- Íàõîäèì íîìåð áàðà ýòîãî High íà òåêóùåì ãðàôèêå
i = iBarShift (gs_Symbol, Period(), iTime (gs_Symbol, PERIOD_D1, 1));
gi_Bar_High = 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;
if (PrintCom) Print (gs_fName, ": Íîâûé ìàêñèìóì íå íàøëè, ÍÎ íàçíà÷èëè[", li_cnt,"] = ", ls_High);
ls_Name = fNamedOBJ_cnt ("arrow_high", li_cnt);
SetArrow (218, ADD_color, ls_Name, Time[gi_Bar_High], High[gi_Bar_High] + 3 * gi_Decimal * gd_Point, 1);
ObjectSetText (ls_Name, TimeToStr (Time[gi_Bar_High], TIME_DATE|TIME_MINUTES), 10);
SetLabel ("high", StringConcatenate ("New HIGH[", li_cnt,"]: "), 5, 15, 10, Font_Table, 0, 0, Base_color);
//---- Òàêîé ìàêñèìóì âûäåëÿåòñÿ äðóãèì öâåòîì
SetLabel ("high_add", ls_High, 102, 15, 10, Font_Table, 0, 0, ADD_color);
SetLabel ("time_high", ": " + TimeToStr (dta_CommentTime[0], TIME_DATE|TIME_MINUTES), 270, 15, 10, Font_Time, 0, 0, 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, li_pos, 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);}
gb_moove_DW = false;
//---- Äëÿ ìèíèìóìà - "¸ëî÷êà" ïåðåâ¸ðíóòà
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)
{
gi_Bar_Low = i;
gc_low = Base_color;
if (PrintCom) 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, Base_color);
SetLabel ("time_low", ": " + TimeToStr (dta_CommentTime[1], TIME_DATE|TIME_MINUTES), 270, 30, 10, Font_Time, 0, 0, Time_color);
}
}
li_preTicket = fi_NewTicket;
return (1);
}
}
//----Åñëè ïåðåâåðíóòàÿ "¸ëî÷êà" íå íàéäåíà,
if (i >= gi_counted_bars)
{
//---- Åñëè â÷åðàøíèé ìèíèìóì âûøå öåí òåêóùåãî äíÿ, áåð¸ì ìèíèìóì òåêóùåãî äíÿ
if (iLow (gs_Symbol, PERIOD_D1, 1) <= gda_Price[0]) {li_pos = 1;} else {li_pos = 0;}
//---- Áåð¸ì LOW ïîñëåäíèõ ñóòîê
gd_LOW = iLow (gs_Symbol, PERIOD_D1, li_pos);
//---- Íàõîäèì íîìåð áàðà ýòîãî Low íà òåêóùåì ãðàôèêå
i = iBarShift (gs_Symbol, Period(), iTime (gs_Symbol, PERIOD_D1, 1));
gi_Bar_Low = iLowest (gs_Symbol, Period(), MODE_LOW, i, 1);
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;
if (PrintCom) Print (gs_fName, ": Íîâûé ìèíèìóì íå íàøëè, ÍÎ íàçíà÷èëè[", li_cnt,"] = ", ls_Low);
ls_Name = fNamedOBJ_cnt ("arrow_low", li_cnt);
SetArrow (217, ADD_color, ls_Name, Time[gi_Bar_Low], Low[gi_Bar_Low] - 3 * gi_Decimal * gd_Point, 1);
ObjectSetText (ls_Name, TimeToStr (Time[gi_Bar_Low], TIME_DATE|TIME_MINUTES), 10);
SetLabel ("low", StringConcatenate ("New LOW[", li_cnt,"]: "), 5, 30, 10, Font_Table, 0, 0, Base_color);
//---- Òàêîé ìèíèìóì âûäåëÿåòñÿ äðóãèì öâåòîì
SetLabel ("low_add", ls_Low, 100, 30, 10, Font_Table, 0, 0, ADD_color);
SetLabel ("time_low", ": " + TimeToStr (dta_CommentTime[1], TIME_DATE|TIME_MINUTES), 270, 30, 10, Font_Time, 0, 0, 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_Range = 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) // åù¸ çäåñü íå áûëè
{
gb_moove_UP = true;
if (PrintCom) Print (gs_fName, ": Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå ìàêñèìóìà: ", DoubleToStr (gd_HIGH, gi_Digits));
}
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 (!VirtualOrders_ON)
{
//---- ×òîáû èçáåæàòü î÷åíü ìàëåíüêèõ òåéêîâ
if (gd_Channel_base < ld_MIN_Range) {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";
gs_ComError = fPrepareComment (StringConcatenate (gs_fName, ": Îøèáêà ïðè îòêðûòèè SELL base-îðäåðà: ", ErrorDescription (GetLastError())), gb_InfoPrint);
if (PrintCom) Print (gs_ComError);
}
else
{
ls_err = "yes.wav";
if (PrintCom) Print (gs_fName, ": TP = ", (Ask - ld_TP) / gd_Point, "; SL = ", (ld_SL - Ask) / gd_Point);
}
}
//---- Îðãàíèçóåì âèðòóàëüíóþ ðàáîòó
else
{
//---- Óäàëÿåì "íå ñâîè" ëèíèè
//if (cur_MG != fi_MG)
//{fDeleteHLine();}
if (!gba_IsLine[1])
{
gba_IsLine[1] = true;
cur_MG = fi_MG;
//DelObject (gsa_Name_Line[0]);
fDeleteHLine();
if (fCreat_OBJ (gsa_Name_Line[1], OBJ_HLINE, 0, "", 0, Time[0], gda_Price[0] + gd_area, false, Red))
{
gs_trade = fPrepareComment (StringConcatenate ("Base: Ñîçäàëè ëèíèþ ", gsa_Name_Line[1], " !!!"), gb_InfoPrint);
if (PrintCom) Print (gs_trade);
}
}
}
}
}
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[1] > gda_Price[1] // âåðõíÿÿ ãðàíèöà êîðèäîðà
&& gd_LOW < gda_Price[1] // íèæíÿÿ ãðàíèöà êîðèäîðà
&& !gb_moove_DW) // åù¸ çäåñü íå áûëè
{
gb_moove_DW = true;
if (PrintCom) Print (gs_fName, ": Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå ìèíèìóìà: ", DoubleToStr (gd_LOW, gi_Digits));
}
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 (!VirtualOrders_ON)
{
//---- ×òîáû èçáåæàòü î÷åíü ìàëåíüêèõ òåéêîâ
if (gd_Channel_base < ld_MIN_Range) {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";
gs_ComError = fPrepareComment (StringConcatenate (gs_fName, ": Îøèáêà ïðè îòêðûòèè SELL base-îðäåðà: ", ErrorDescription (GetLastError())), gb_InfoPrint);
if (PrintCom) Print (gs_ComError);
}
else
{
ls_err = "yes.wav";
if (PrintCom) Print (gs_fName, ": TP = ", (ld_TP - Bid) / gd_Point, "; SL = ", (Bid - ld_SL) / gd_Point);
}
}
//---- Îðãàíèçóåì âèðòóàëüíóþ ðàáîòó
else
{
//---- Óäàëÿåì "íå ñâîè" ëèíèè
//if (cur_MG != fi_MG)
//{fDeleteHLine();}
if (!gba_IsLine[0])
{
gba_IsLine[0] = true;
cur_MG = fi_MG;
//DelObject (gsa_Name_Line[1]);
fDeleteHLine();
if (fCreat_OBJ (gsa_Name_Line[0], OBJ_HLINE, 0, "", 0, Time[0], gda_Price[1] - gd_area, false, Blue))
{
gs_trade = fPrepareComment (StringConcatenate ("Base: Ñîçäàëè ëèíèþ ", gsa_Name_Line[0], " !!!"), gb_InfoPrint);
if (PrintCom) Print (gs_trade);
}
}
}
}
}
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()) + MathMax (gd_MIN_Range, gd_Comp_Range))
{
//---- Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå âåðøèíû è æä¸ì äàëüíåéøåãî äâèæåíèÿ âíèç
if (gd_HIGH - gd_Channel_base * gda_otkat[0] < gda_Price[0] // íèæíÿÿ ãðàíèöà êîðèäîðà
&& gd_HIGH > gda_Price[0] // âåðõíÿÿ ãðàíèöà êîðèäîðà
&& !gb_moove_UP) // åù¸ çäåñü íå áûëè
{
gb_moove_UP = true;
if (PrintCom) Print (gs_fName, ": Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå ìàêñèìóìà: ", DoubleToStr (gd_HIGH, gi_Digits));
}
if (gb_moove_UP // áûëè ó âåðøèíû
&& gd_HIGH - MathMin (gd_MIN_Range, gd_Comp_Range) >= gda_Price[0] // îòêàòèëè
&& OrderOpenPrice() + MathMin (gd_MIN_Range, gd_Comp_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() - MathMax (gd_MIN_Range, gd_Comp_Range))
{
//---- Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå âïàäèíû è æä¸ì äàëüíåéøåãî äâèæåíèÿ ââåðõ
if (gd_LOW + gd_Channel_base * gda_otkat[0] > gda_Price[1] // âåðõíÿÿ ãðàíèöà êîðèäîðà
&& gd_LOW < gda_Price[1] // íèæíÿÿ ãðàíèöà êîðèäîðà
&& !gb_moove_DW) // åù¸ çäåñü íå áûëè
{
gb_moove_DW = true;
if (PrintCom) Print (gs_fName, ": Ôèêñèðóåì íàõîæäåíèå öåíû âîçëå ìèíèìóìà: ", DoubleToStr (gd_LOW, gi_Digits));
}
//---- Èëè ìèíèìóìà, ñîîòâåòñòâåííî
if (gb_moove_DW // áûëè ó âïàäèíû
&& gd_LOW + MathMin (gd_MIN_Range, gd_Comp_Range) <= gda_Price[1] // îòêàòèëè
&& OrderOpenPrice() - MathMin (gd_MIN_Range, gd_Comp_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");}
gs_ComError = fPrepareComment (StringConcatenate (gs_fName, ": Îøèáêà ïðè îòêðûòèè ", GetNameOP (li_Type), " add-îðäåðà: ", ErrorDescription (GetLastError())), gb_InfoPrint);
if (PrintCom) Print (gs_ComError);
}
}
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;}
if (PrintCom) 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");}
gs_ComError = fPrepareComment (StringConcatenate (gs_fName, ": Îøèáêà ïðè ìîäèôèêàöèè ", GetNameOP (li_Type), " îðäåðà[", fi_Ticket, "]: ", ErrorDescription (GetLastError())), gb_InfoPrint);
if (PrintCom) Print (gs_ComError);
}
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
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()";
//---- Ãðàíèöû êàíàëà îáíîâëÿþòñÿ äî ìîìåíòà ôîðìèðîâàíèÿ êàíàëà
if (!gb_flat)
{
//---- Îïðåäåëÿåì êàíàë
fGetChannel (ld_MAX, ld_MIN);
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 (PrintCom) Print (gs_fName, ": Ñôîðìèðîâàí ôëýòîâûé êàíàë !!!");
}
}
//---- Åñëè êàíàë ñôîðìèðîâàí ïðîâåðÿåì âîçìîæíîñòü íà îòêðûòèå îðäåðà
if (gb_flat)
{
if (!VirtualOrders_ON)
{
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");}
gs_ComError = fPrepareComment (StringConcatenate (gs_fName, ": Îøèáêà ïðè îòêðûòèè ", GetNameOP (li_Type), " flat-îðäåðà: ", ErrorDescription (GetLastError())), gb_InfoPrint);
if (PrintCom) Print (gs_ComError);
}
if (li_Ticket > 0) {if (SoundAlert) {PlaySound ("yes.wav");}}
}
//---- Îðãàíèçóåì âèðòóàëüíóþ ðàáîòó
else
{
//---- Óäàëÿåì "íå ñâîè" ëèíèè
//if (cur_MG != fi_MG)
//{fDeleteHLine();}
if ((gd_flat_MAX + gd_flat_Channel * 0.5) <= gda_Price[1])
{
if (!gba_IsLine[0])
{
gba_IsLine[0] = true;
cur_MG = fi_MG;
//DelObject (gsa_Name_Line[1]);
fDeleteHLine();
fCreat_OBJ (gsa_Name_Line[0], OBJ_HLINE, 0, "", 0, Time[0], gda_Price[1] + gd_area, false, Blue);
gs_trade = fPrepareComment (StringConcatenate ("Flat: Ñîçäàëè ëèíèþ ", gsa_Name_Line[0], " !!!"), gb_InfoPrint);
if (PrintCom) Print (gs_trade);
return (0);
}
}
else
{
if (gd_flat_MIN >= gda_Price[1] && gba_IsLine[0])
{
DelObject (gsa_Name_Line[0]);
gba_IsLine[0] = false;
}
}
if ((gd_flat_MIN - gd_flat_Channel * 0.5) >= gda_Price[0])
{
if (!gba_IsLine[1])
{
gba_IsLine[1] = true;
cur_MG = fi_MG;
//DelObject (gsa_Name_Line[0]);
fDeleteHLine();
fCreat_OBJ (gsa_Name_Line[1], OBJ_HLINE, 0, "", 0, Time[0], gda_Price[0] - gd_area, false, Red);
gs_trade = fPrepareComment (StringConcatenate ("Flat: Ñîçäàëè ëèíèþ ", gsa_Name_Line[1], " !!!"), gb_InfoPrint);
if (PrintCom) Print (gs_trade);
return (0);
}
}
else
{
if (gd_flat_MAX <= gda_Price[0] && gba_IsLine[1])
{
DelObject (gsa_Name_Line[1]);
gba_IsLine[1] = false;
}
}
}
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gs_ComError, gs_fName);
//----
return (li_Ticket);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ðàñ÷èòûâàåì ÑÒÎÏû |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGetSTOPs (double& ar_STOPs[], int fi_Type, int fi_Var_STOPs)
{
int li_cmd, cmd, err = GetLastError();
double ld_Extr[2], ld_SL, ld_TP, ld_Price, ld_MIN_Range = 150 * gi_Decimal * gd_Point;
//----
if (fi_Type == OP_BUY) {li_cmd = 1;} else {li_cmd = -1;}
if (fi_Type == OP_BUY) {cmd = 1;} else {cmd = 0;}
ld_Extr[0] = gd_LOW;
ld_Extr[1] = gd_HIGH;
if (fi_Type == OP_BUY) {ld_Price = Bid;} else {ld_Price = Ask;}
gd_MinSTOP = MarketInfo (Symbol(), MODE_STOPLEVEL) * gd_Point;
switch (fi_Var_STOPs)
{
case 0:
if (gd_Channel_base < ld_MIN_Range) {ld_TP = ld_Extr[cmd];} else {ld_TP = ld_Extr[cmd] - li_cmd * gd_Channel_base * 0.382;}
switch (fi_Type)
{
case 0:
ar_STOPs[0] = NormalizeDouble (MathMin ((gd_LOW - gd_Channel_base * gda_otkat[1]), ld_Price - MathMax (gd_MinSTOP, gd_min_SL)), gi_Digits);
ar_STOPs[1] = NormalizeDouble (MathMax (ld_TP, ld_Price + MathMax (gd_Profit_MIN, gd_MinSTOP)), gi_Digits);
break;
case 1:
ar_STOPs[0] = NormalizeDouble (MathMax ((gd_HIGH + gd_Channel_base * gda_otkat[0]), ld_Price + MathMax (gd_MinSTOP, gd_min_SL)), gi_Digits);
ar_STOPs[1] = NormalizeDouble (MathMin (ld_TP, ld_Price - MathMax (gd_Profit_MIN, gd_MinSTOP)), gi_Digits);
break;
}
break;
case 1:
if (fi_Type == OP_BUY)
{ar_STOPs[0] = NormalizeDouble (MathMin ((gd_flat_MIN - gd_flat_Channel * 0.118), ld_Price - MathMax (gd_MinSTOP, gd_min_SL)), gi_Digits);}
else
{ar_STOPs[0] = NormalizeDouble (MathMax ((gd_flat_MAX + gd_flat_Channel * 0.118), gda_Price[1] + MathMax (gd_MinSTOP, gd_min_SL)), gi_Digits);}
ar_STOPs[1] = 0.0;
break;
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gs_ComError, "fGetSTOPs()");
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| "Ôëýòîâûé êîðèäîð" âêëþ÷àåò Weight_Channel ñâå÷åê, ñîïðîòèâëåíèå è ïîääåðæêà |
//| îïðåäåëÿþòñÿ ïî öåíàì îòêðûòèÿ è çàêðûòèÿ |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGetChannel (double& fd_MAX, double& fd_MIN)
{
int err = GetLastError();
//----
fd_MAX = 0;
fd_MIN = 1000;
for (int li_Bar = 1; li_Bar <= Weight_Channel; li_Bar++)
{
fd_MAX = MathMax (fd_MAX, MathMax (Close[li_Bar], Open[li_Bar]));
fd_MIN = MathMin (fd_MIN, MathMin (Open[li_Bar], Close[li_Bar]));
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gs_ComError, "fGetChannel()");
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Òðàë îñíîâíîé è êîìïåíñàòîðíîé ñäåëîê |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fTrailling (int ar_MG[])
{
int li_Type, li_Ticket, li_ind_MG, 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;}
li_ind_MG = fCheckMyMagic (OrderMagicNumber(), ar_MG);
if (li_ind_MG < 0 || OrderSymbol() != gs_Symbol)
{continue;}
//---- Íå òðîãàåì êîìïåíñàòîðíûå îðäåðà
if (li_ind_MG == 2)
{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 (li_ind_MG == 0) {ls_order = gsa_NameCom[0];} else {ls_order = gsa_NameCom[2];}
if (li_ind_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");}
gs_ComError = fPrepareComment (StringConcatenate (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)), gb_InfoPrint);
if (PrintCom) Print (gs_ComError);
}
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, int fi_Period = 0)
{
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, iHigh (gs_Symbol, fi_Period, li_Bar) - iLow (gs_Symbol, fi_Period, li_Bar));
fd_Tral2 = MathMax (fd_Tral2, MathAbs (iOpen (gs_Symbol, fi_Period, li_Bar) - iClose (gs_Symbol, fi_Period, 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,
li_X_time = 270, err = GetLastError();
string ls_Name = "", ls_txt = "", ls_Range, ls_row;
color lc_color;
static double lsd_LOSS_Percent = 0;
datetime ldt_cur_Time;
//----
//---- Ôèêñèðóåì âðåìÿ â "íàñòîÿùèé ìîìåíò"
if (!RealTrade) {ldt_cur_Time = iTime (gs_Symbol, 1, 0);} else {ldt_cur_Time = TimeCurrent();}
//---- 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, Base_color);
if (fCCV_S (ls_Range, 2))
{
dta_CommentTime[2] = ldt_cur_Time;
SetLabel ("time_range", ": " + TimeToStr (dta_CommentTime[2], TIME_DATE|TIME_MINUTES), li_X_time, li_row * fi_Y, 10, Font_Time, 0, 0, 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, lc_color);
if (fCCV_S (ls_txt, 3))
{
dta_CommentTime[3] = ldt_cur_Time;
SetLabel ("time_channel", ": " + TimeToStr (dta_CommentTime[3], TIME_DATE|TIME_MINUTES), li_X_time, li_row * fi_Y, 10, Font_Time, 0, 0, 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, Base_color);
if (fCCV_S (ls_txt, 4))
{
dta_CommentTime[4] = ldt_cur_Time;
SetLabel ("time_trail", ": " + TimeToStr (dta_CommentTime[4], TIME_DATE|TIME_MINUTES), li_X_time, li_row * fi_Y, 10, Font_Time, 0, 0, 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, Base_color);
if (fCCV_S (ls_txt, 5))
{
dta_CommentTime[5] = ldt_cur_Time;
SetLabel ("time_trail_ch", ": " + TimeToStr (dta_CommentTime[5], TIME_DATE|TIME_MINUTES), li_X_time, li_row * fi_Y, 10, Font_Time, 0, 0, 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, Base_color);
if (fCCV_S (ls_txt, 6))
{
dta_CommentTime[6] = ldt_cur_Time;
SetLabel ("time_part_close", ": " + TimeToStr (dta_CommentTime[6], TIME_DATE|TIME_MINUTES), li_X_time, li_row * fi_Y, 10, Font_Time, 0, 0, Time_color);
}
//---- 8-ÿ ñòðîêà
li_row++;
ls_row = "*********************************************";
SetLabel ("row", ls_row, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, Base_color);
//---- 9-ÿ ñòðîêà
li_row++;
SetLabel ("send", gs_trade, fi_X, li_row * fi_Y, 10, Font_Table, 0, 0, ADD_color);
if (fCCV_S (ls_txt, 7))
{
dta_CommentTime[7] = ldt_cur_Time;
SetLabel ("time_send", ": " + TimeToStr (dta_CommentTime[7], TIME_DATE|TIME_MINUTES), li_X_time, li_row * fi_Y, 10, Font_Time, 0, 0, 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, Base_color);
if (fCCV_S (ls_txt, 8))
{
dta_CommentTime[8] = ldt_cur_Time;
SetLabel ("time_loss", ": " + TimeToStr (dta_CommentTime[8], TIME_DATE|TIME_MINUTES), li_X_time, li_row * fi_Y, 10, Font_Time, 0, 0, Time_color);
}
//---- 11-ÿ ñòðîêà
li_row++;
ls_txt = "Îáùèé PROFIT:";
SetLabel ("result", ls_txt, fi_X, li_row * fi_Y, 12, Font_Table, 0, 0, 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, Base_color);
SetLabel ("ordersS_" + cnt, ":", 75, li_row_result + fi_Y * cnt, 10, Font_Table, 0, 0, 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, 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, lc_color);
//---- 15-ÿ ñòðîêà
li_row += cnt + 1;
//ls_txt = "****************************************";
SetLabel ("row1", ls_row, fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, Base_color);
//---- 16-ÿ ñòðîêà
li_row++;
ls_txt = "ERROR:";
SetLabel ("error", ls_txt, fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, Base_color);
if (fCCV_S (gs_ComError, 9))
{
dta_CommentTime[9] = ldt_cur_Time;
SetLabel ("time_err", ": " + TimeToStr (dta_CommentTime[9], TIME_DATE|TIME_MINUTES), li_X_time, li_row * fi_Y, 10, Font_Time, 0, 0, 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, Gray);}
if (VirtualOrders_ON)
{
//---- 18-ÿ ñòðîêà
li_row++;
//ls_txt = "****************************************";
SetLabel ("row2", ls_row, fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, Base_color);
//---- 19-21-ÿ ñòðîêè
for (int li_com = 0; li_com <= 2; li_com++)
{
//---- Âûâîäèì íà ãðàôèê äåéñòâèÿ VirtualTrader
if (StringLen (gsa_Comment[li_com]) > 0)
{
li_row++;
ls_txt = StringSubstr (gsa_Comment[li_com], StringFind (gsa_Comment[li_com], ":") + 1);
if (StringLen (ls_txt) > 40)
{ls_txt = StringSubstr (ls_txt, 0, StringFind (ls_txt, "!") + 3);}
SetLabel ("com" + li_com, ls_txt, fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, Base_color);
if (fCCV_S (ls_txt, 12 + li_com))
{
dta_CommentTime[10+li_com] = ldt_cur_Time;
SetLabel ("time_ñom" + li_com, ": " + TimeToStr (dta_CommentTime[10+li_com], TIME_DATE|TIME_MINUTES), li_X_time, li_row * fi_Y + 5, 10, Font_Time, 0, 0, Time_color);
}
}
}
//---- Ðèñóåì êîíòðîëüíûå çíà÷åíèÿ ïåðåìåííûõ
if (gb_Control)
{
//---- 22-ÿ ñòðîêà
li_row++;
//ls_txt = "****************************************";
SetLabel ("row3", ls_row, fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, Base_color);
//---- 23-ÿ ñòðîêà
li_row++;
ls_txt = "CONTROL:";
SetLabel ("control", ls_txt, fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, Base_color);
//---- 24-ÿ ñòðîêà
if (StringLen (gsa_Comment[4]) > 0)
{
li_row++;
SetLabel ("ctrl_txt", gsa_Comment[4], fi_X, li_row * fi_Y + 5, 10, Font_Table, 0, 0, ADD_color);
}
}
}
//---- Ðèñóåì íà ãðàôèêå êîðèäîð "ôëåòà"
if (gb_flat)
{
ls_txt = fPrepareComment (StringConcatenate ("Íàðèñîâàë ôëýòîâûé êàíàë: MAX = ", DoubleToStr (gd_flat_MAX, gi_Digits), "; MIN = ", DoubleToStr (gd_flat_MIN, gi_Digits)), PrintCom);
//---- ×òîáû íå ïîâòîðÿòüñÿ, ââîäèì ñðàâíåíèå ñ ïðåäûäóùèì êîììåíòîì
if (fCCV_S (ls_txt, 10))
{if (PrintCom) 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[Weight_Channel], 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[Weight_Channel], 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 = fPrepareComment (StringConcatenate ("Íàðèñîâàëè îñíîâíîé êàíàë: HIGH = ", DoubleToStr (gd_HIGH, gi_Digits), "; LOW = ", DoubleToStr (gd_LOW, gi_Digits)), PrintCom);
//if (PrintCom) Print (ls_txt);
}
if (fCCV_D (gd_HIGH, 0))
{
DelObject ("ray_high");
//ls_txt = fPrepareComment (StringConcatenate ("Íàðèñîâàëè HIGH = ", DoubleToStr (gd_HIGH, gi_Digits)), PrintCom);
//if (PrintCom) 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[gi_Bar_High], 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 = fPrepareComment (StringConcatenate ("Íàðèñîâàëè LOW = ", DoubleToStr (gd_LOW, gi_Digits)), PrintCom);
//if (PrintCom) 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[gi_Bar_Low], 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, li_ind_MG, 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);}
li_ind_MG = fCheckMyMagic (OrderMagicNumber(), ar_MG);
if (OrderSymbol() == gs_Symbol && li_ind_MG >= 0)
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
//---- Åñëè óñòàíîâëåíî, çàêðûâàåì âñå îðäåðà â êîíöå äíÿ
if (fCloseHour (AllCloseHour, OrderTicket()))
{continue;}
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 (li_ind_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 = fPrepareComment (StringConcatenate ("×àñòè÷íî çàêðûëè flat-îðäåð[", li_Ticket, "] !!!"), gb_InfoPrint);
if (PrintCom) 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+
//| Ôóíêöèÿ çàêðûòèÿ îðäåðîâ ïî òèïó (OP) è Magic (iMG) |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool CloseOrderAll (int iMG = -1, int OP = -1)
{
color lc_close;
int li_Type, 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)
{
ld_ClosePrice = MarketInfo (Symbol(), IIFi ((li_Type == OP_BUY), MODE_BID, MODE_ASK));
lc_close = IIFc (li_Type == OP_BUY, Blue, Red);
lb_Close = OrderClose (OrderTicket(), OrderLots(), ld_ClosePrice, Slippage, lc_close);
}
}
fGetLastError (gs_ComError, "CloseOrderAll()");
//----
return (lb_Close);
}
//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(), ldt_curTime;
double ld_Price;
int err = GetLastError();
bool lb_result = false;
//----
if (IsOptimization() || IsTesting()) {ldt_curTime = iTime (gs_Symbol, 1, 0);} else {ldt_curTime = TimeCurrent();}
if (PERIOD_D1 * 60 * fi_Period + ldt_OpenTime < ldt_curTime)
{
//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");}
gs_trade = fPrepareComment (StringConcatenate ("fLossControl(): Óäàëèëè ëîññîâûé îðäåð[", OrderTicket(), "] ïî ïðîøåñòâèè ", fi_Period, " äíåé !!!"), gb_InfoPrint);
if (PrintCom) Print (gs_trade);
}
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, li_ind_MG, 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))
{
li_ind_MG = fCheckMyMagic (OrderMagicNumber(), ar_Magic);
if (li_ind_MG >= 0 && OrderSymbol() == fs_Symbol)
{
if (OrderType() < 2 && (op < 0 || OrderType() == op))
{
if (dt < OrderCloseTime())
{
ld_Pribul = OrderProfit() + OrderSwap() + OrderCommission();
ar_Pribul[li_ind_MG] += ld_Pribul;
ar_HistoryOrders[li_ind_MG]++;
}
}
}
}
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
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], ")");}
if (PrintCom) 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, ")");}
gs_ComError = fPrepareComment (StringConcatenate ("fPartClose(): Îøèáêà ïðè ", ls_close, " çàêðûòèè ", GetNameOP (OrderType()), " îðäåðà[", fi_Ticket,
"/P-", li_ParentTicket, "]: ", ErrorDescription (GetLastError()),
"\nLot = ", DoubleToStr (OrderLots(), gi_dig), "; LotClose = ", DoubleToStr (ld_LotsClose, gi_dig)," !!!"), gb_InfoPrint);
if (PrintCom) Print (gs_ComError);
}
}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
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+
int fCheckMyMagic (int fi_Magic, int ar_Magic[])
{
//----
for (int li_int = 0; li_int < ArraySize (ar_Magic); li_int++)
{
if (fi_Magic == ar_Magic[li_int])
{return (li_int);}
}
//----
return (-1);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Çàêðûâàåì îðäåð ïî âðåìåíè |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCloseHour (int fi_HourClose, int fi_Ticket)
{
double ld_Price;
int li_result = -1;
string ls_txt;
//----
if (!TimeControl)
{return (false);}
if (fi_HourClose < 24 && fi_HourClose > 0)
{
if (TimeHour (GetTime()) >= fi_HourClose)
{
RefreshRates();
if (OrderType() == OP_BUY) {ld_Price = Bid;} else {ld_Price = Ask;}
li_result = OrderClose (fi_Ticket, OrderLots(), ld_Price, Slippage, Yellow);
if (IsOptimization())
{return (true);}
if (li_result == 1)
{
gs_trade = fPrepareComment (StringConcatenate ("fCloseHour(): Çàêðûëè îðäåð[", fi_Ticket, "] â êîíöå äíÿ! (", OrderMagicNumber(), ")."), gb_InfoPrint);
if (PrintCom) Print (gs_trade);
return (true);
}
if (li_result == 0)
{
if (SoundAlert) {PlaySound ("mistake.wav");}
gs_ComError = fPrepareComment (StringConcatenate ("fCloseHour(): Îøèáêà ïðè çàêðûòèè ", GetNameOP (OrderType()), " îðäåðà[", fi_Ticket, "] â êîíöå äíÿ: ", ErrorDescription (GetLastError())), gb_InfoPrint);
if (PrintCom) Print (gs_ComError);
}
}
}
return (false);
}
//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_I Ôèêñèðóåò ôàêò èçìåíåíèÿ ïðîâåðÿåìîãî |
//| int ïàðàìåòðà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCCV_I (int param, int ix)
{
static int cur_param[20];
if (cur_param[ix] != param)
{
cur_param[ix] = param;
return (true);
}
//----
return (false);
}
//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);}}
//+-----------------------------------------------------------------------------------+
double IIFd (bool condition, double ifTrue, double ifFalse)
{if (condition) {return (ifTrue);} else {return (ifFalse);}}
//+-----------------------------------------------------------------------------------+
bool IIFb (bool condition, bool ifTrue, bool ifFalse)
{if (condition) {return (ifTrue);} else {return (ifFalse);}}
//+-----------------------------------------------------------------------------------+
int IIFi (bool condition, int ifTrue, int ifFalse)
{if (condition) {return (ifTrue);} else {return (ifFalse);}}
//+-----------------------------------------------------------------------------------+
color IIFc (bool condition, color ifTrue, color ifFalse)
{if (condition) {return (ifTrue);} else {return (ifFalse);}}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ, ïåðåâîäà int â double ïî Point |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double NDP (int v) {return (v * Point);}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ, íîðìàëèçàöèè çíà÷åíèÿ double äî Digit |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double NDD (double v) {return (NormalizeDouble (v, gi_Digits));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ, íîðìàëèçàöèè çíà÷åíèÿ double äî Digit-1 (äëÿ 5-ãî çíàêà) |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double NDDl (double v)
{
int li_digit = IIFi ((gi_Digits == 5 || gi_Digits == 3), gi_Digits - 1, gi_Digits);
return (NormalizeDouble (v, li_digit));
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ, íîðìàëèçàöèè çíà÷åíèÿ double äî ìèíèìàëüíîé ðàçðÿäíîñòè ëîòà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double NDDig (double v) {return (NormalizeDouble (v, LotDecimal()));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ, ïåðåâîäà çíà÷åíèÿ èç double â string c íîðìàëèçàöèåé ïî Digit |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string DSD (double v) {return (DoubleToStr (v, gi_Digits));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ, ïåðåâîäà âðåìåíè â ñåê. â ñòðîêó ôîðìàòà "yyyy.mm.dd hh:mi" |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string TS_DM (datetime v) {return (TimeToStr (v, TIME_DATE|TIME_MINUTES));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ôóíêöèÿ, ïåðåâîäà çíà÷åíèÿ èç double â string c íîðìàëèçàöèåé ïî 0 |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string DS0 (double v) {return (DoubleToStr (v, 0));}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| UNI: Ïîëó÷àåì íîìåð ïåðèîäà ãðàôèêà |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGetNumPeriods (int aPeriod[], int iPeriod)
{
for (int l_int = 0; l_int < ArraySize (aPeriod); l_int++)
{
if (aPeriod[l_int] == iPeriod)
{return (l_int);}
}
//----
return (-1);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| UNI: ÈÍÈÖÈÀËÈÇÈÐÓÅÌ ÌÀÑÑÈÂ STRING |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int InitializeArray_STR (string& PrepareArray[], string Value = "")
{
int l_int, size = ArraySize (PrepareArray);
//----
for (l_int = 0; l_int < size; l_int++)
{PrepareArray[l_int] = Value;}
//----
return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| ÎÐÃÀÍÈÇÓÅÌ ÌÈÃÀÅÍÈÅ ÂÛÂÎÄÈÌÛÕ ÍÀ ÃÐÀÔÈÊ ÎÁÚÅÊÒÎÂ |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fMigalka (double sec = 0.5)
{
static bool li_migalka = true;
//----
Sleep (sec * 1000);
li_migalka = IIFb (li_migalka == true, false, true);
//----
return (li_migalka);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Âîçâðàùàåò íàèìåíîâàíèå ñîñòîÿíèÿ (ÄÀ\ÍÅÒ) |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string CheckBOOL (int M)
{
//----
switch (M)
{
case 0: {return ("Íåò");}
case 1: {return ("Äà");}
}
//----
return ("Íå çíàþ...");
}
//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_TREND, OBJ_ARROW, OBJ_HLINE |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCreat_OBJ (string fs_Name, int fi_OBJ, int fi_ArrowCode, string fs_Text, int fi_FontSize,
datetime fdt_Time1, double fd_Price1, bool fb_Ray = true, color fc_Color = Gold,
datetime fdt_Time2 = 0, double fd_Price2 = 0)
{
int err = GetLastError();
bool lb_result = false;
//----
if (ObjectFind (fs_Name) == -1)
{lb_result = ObjectCreate (fs_Name, fi_OBJ, 0, 0, 0);}
ObjectSet (fs_Name, OBJPROP_TIME1, fdt_Time1);
ObjectSet (fs_Name, OBJPROP_PRICE1, fd_Price1);
if (fdt_Time2 != 0 || fd_Price2 != 0)
{
ObjectSet (fs_Name, OBJPROP_TIME2, fdt_Time2);
ObjectSet (fs_Name, OBJPROP_PRICE2, fd_Price2);
}
ObjectSet (fs_Name, OBJPROP_COLOR, fc_Color);
if (fi_OBJ == OBJ_TREND)
{ObjectSet (fs_Name, OBJPROP_RAY, fb_Ray);}
if (fi_OBJ == OBJ_ARROW)
{ObjectSet (fs_Name, OBJPROP_ARROWCODE, fi_ArrowCode);}
if (StringLen (fs_Text) > 0)
{ObjectSetText (fs_Name, fs_Text, fi_FontSize, "Calibri", fc_Color);}
fGetLastError (gs_ComError, "fCreat_OBJ()");
//----
return (lb_result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Îïèñàíèå : Óñòàíîâêà îáúåêòà OBJ_LABEL |
//+-----------------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| name - íàèìåíîâàíèå îáúåêòà |
//| text - ñàì îáúåêò |
//| X - êîîðäèíàòà X |
//| Y - êîîðäèíàòà Y |
//| size - ðàçìåð îáúåêòà |
//| Font - øðèôò îáúåêòà |
//| Corner - óãîë (0 - ïî óìîë÷àíèþ) |
//| Angle - óãîë (0 - ïî óìîë÷àíèþ) |
//| CL - öâåò (CLR_NONE - ïî óìîë÷àíèþ) |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void SetLabel (string name, string text, int X, int Y, int size = 10, string Font = "Calibri",
int Corner = 0, int Angle = 0, color CL = CLR_NONE)
{
if (ObjectFind (name) == -1)
{ObjectCreate (name, OBJ_LABEL, 0, 0, 0);}
ObjectSet (name, OBJPROP_COLOR, CL);
ObjectSet (name, OBJPROP_XDISTANCE, X);
ObjectSet (name, OBJPROP_YDISTANCE, Y);
ObjectSet (name, OBJPROP_CORNER, Corner);
if (Angle > 0)
{ObjectSet (name, OBJPROP_ANGLE, Angle);}
if (text != "")
{ObjectSetText (name, text, size, Font, CL);}
//----
return;
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
// ÓÄÀËÅÍÈÅ ÃÐÀÔÈ×ÅÑÊÎÃÎ ÎÁÚÅÊÒÀ |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool DelObject (string fs_partTXT)
{
string ls_Name;
bool lb_result = false;
//----
if (ObjectFind (fs_partTXT) != -1)
{
if (ObjectDelete (fs_partTXT))
{return (true);}
}
//---- Óäàëÿåì âñå îáúåêòû ñ çàäàííûì ïðåôèêñîì fs_partTXT
for (int i = ObjectsTotal() - 1; i >= 0; i--)
{
ls_Name = ObjectName (i);
if (StringFind (ls_Name, fs_partTXT, 0) > -1)
{
if (ObjectDelete (ls_Name))
{lb_result = true;}
}
}
fGetLastError (gs_ComError, StringConcatenate ("DelObject()[", fs_partTXT, "]"));
//----
return (lb_result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Óäàëÿåì OBJ_HLINE |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fDeleteHLine()
{
string ls_Name;
bool li_result = false;
//----
for (int li_int = 0; li_int < 2; li_int++)
{
ls_Name = gsa_Name_Line[li_int];
if (DelObject (ls_Name))
{li_result = true;}
}
//----
return (li_result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ïîëó÷àåì çíà÷åíèå öåíû äëÿ óêàçàííîãî áàðà ñ ïîïðàâêîé |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fObjectGetValue_ByCurrent (string fs_Name, int fi_Shift = 0)
{
double ld_Price = ObjectGetValueByShift (fs_Name, fi_Shift);
//----
if (ld_Price != 0)
{return (NDDl (ld_Price + fObjectGetDelta_ByCurrent (fs_Name)));}
else {return (0);}
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Âû÷èñëÿåì ïîïðàâêó â "áàðàõ" |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fObjectGetDelta_PerBar (string fs_Name)
{
double ld_Price1 = ObjectGet (fs_Name, OBJPROP_PRICE1),
ld_Price2 = ObjectGet (fs_Name, OBJPROP_PRICE2);
int li_shift1 = ObjectGetShiftByValue (fs_Name, ld_Price1),
li_shift2 = ObjectGetShiftByValue (fs_Name, ld_Price2),
li_minus = li_shift1 - li_shift2;
//---- Åñëè íå ãîðèçîíòàëüíàÿ ëèíèÿ
if (li_minus != 0)
{double delta = (ld_Price2 - ld_Price1) / li_minus;}
return (NDDl (delta));
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Âû÷èñëÿåì ïîïðàâêó â çíà÷åíèÿõ öåíû |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fObjectGetDelta_ByCurrent (string fs_Name)
{
double ld_deltaTime = TimeCurrent() - iTime (Symbol(), 0, 0),
ld_TF = 60 * Period(),
delta = fObjectGetDelta_PerBar (fs_Name),
delta_ByCurrent = delta * (ld_deltaTime / ld_TF);
return (NDDl (delta_ByCurrent));
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ñåðâèñíûõ ôóíêöèé |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ãîòîâèì ê âûâîäó íà ïå÷àòü è íà ãðàôèê êîììåíòàðèè |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string fPrepareComment (string sText = "", bool bConditions = false)
{if (bConditions && StringLen (sText) > 0) {return (sText);}}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Âûâîäèì íà ïå÷àòü è íà ãðàôèê êîììåíòàðèè |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fPrintAndShowComment (string Text, bool Show_Conditions, bool Print_Conditions, string& s_Show[], int ind = -1)
{
if ((Show_Conditions || Print_Conditions) && StringLen (Text) > 0)
{
if (ind >= 0 && Show_Conditions)
{s_Show[ind] = Text;}
if (Print_Conditions)
{Print (Text);}
}
//----
return;
}
//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 (int 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+
//| Îïðåäåëÿåì âîçìîæíîñòü äàëüíåéøåãî âûñòàâëåíèÿ îðäåðîâ |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCheckMargin (string& fs_Info, // âîçâðàùàåìûé êîììåíòàðèé
double fd_BeginBalance, // íà÷àëüíûé ðàçìåð äåïî
int fi_StopMarginPercent, // äîïóñòèìûé ðàçìåð çàëîãà â %
int fi_RiskDepoPercent) // ìàêñèìàëüíûé ðàçìåð ëîññà â %
{
bool Zapret, StopMargin, StopBalance, lb_Pause = False;
string ls_prichina, ls_fName = "CheckMargin()";
//----
StopMargin = AccountFreeMargin() / AccountEquity() * 100 <= fi_StopMarginPercent;
StopBalance = AccountBalance() / fd_BeginBalance * 100 <= fi_RiskDepoPercent;
Zapret = (StopMargin || StopBalance);
if (IsOptimization())
{return (Zapret);}
if (Zapret == true)
{
if (!lb_Pause)
{
ls_prichina = fPrepareComment ("Äîñòèãëè îãðàíè÷åíèÿ ðàçìåðà ñâîáîäíîé ìàðæè - ïðèîñòàíàâëèâàåì âûñòàâëåíèå îðäåðîâ", StopMargin);
ls_prichina = fPrepareComment ("Äîñòèãëè äîïóñòèìîãî çíà÷åíèÿ óìåíüøåíèÿ áàëàíñà - ïðèîñòàíàâëèâàåì òîðãîâëþ", StopBalance);
fs_Info = StringConcatenate (ls_fName, ": ", ls_prichina, " (FreeMargin = $", DS0 (AccountFreeMargin()), "; Equity = $", DS0 (AccountEquity()), ")", "; Balance = $", DS0 (AccountBalance()), "; BeginBalance = $", DS0 (fd_BeginBalance), " (", WindowExpertName(), ").");
}
lb_Pause = True;
}
else
{
if (lb_Pause)
{fs_Info = StringConcatenate (ls_fName, ": Îãðàíè÷åíèÿ ðàçìåðà ñâîáîäíîé ìàðæè íåò, áàëàíñ â íîðìå - òîðãóåì (FreeMargin = $", DS0 (AccountFreeMargin()), "; Equity = $", DS0 (AccountEquity()), ")", "; Balance = $", DS0 (AccountBalance()), " (", WindowExpertName(), ").");}
lb_Pause = False;
}
//----
return (lb_Pause);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ñëåäèì çà êðèòè÷åñêèì óìåíüøåíèåì ðàçìåðà äåïî |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fRiskPercentControl (string& sInfo, // âîçâðàùàåìûé êîììåíòàðèé
double dBalance, // îò êàêîé âåëè÷èíû âåä¸ì ðàñ÷¸ò
double dProfit) // ñîñòîÿíèå ñ÷¸òà
{
if (dBalance * RiskDepoPercent / 100 < MathAbs (dProfit))
{
sInfo = StringConcatenate ("fRiskPercentControl(): Çàêðûâàåì âñå îðäåðà ïî ïðåâûøåíèþ ëîññà çàäàííîìó çàí÷åíèþ RiskDepoPercent! (", WindowExpertName(), ").");
return (true);
}
//----
return (false);
}
//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+
//+===================================================================================+
//|***********************************************************************************|
//| ÐÀÇÄÅË: Ðàáîòà ñ OBJECT_HLINE (Virtual Trader) |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Îñíîâíîé êîä áèáëèîòåêè |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fVirtualTrade (double ar_Price[], int fi_MG, bool fb_RealTrade)
{
if (!VirtualOrders_ON)
{return (0);}
int err = GetLastError();
string ls_txt = "";
//----
//---- Ïðîâåðÿåì íàëè÷èå óïðàâëÿþùèõ ëèíèé
gb_NewLine = fCheckMyLine (gsa_Name_Line);
if (!gb_NewLine)
{
ArrayInitialize (gba_IsLine, 0);
return (0);
}
//---- Ïðè íåäîñòàòêå ñâîáîäíîé ìàðæè - áîëüøå îðäåðîâ íå âûñòàâëÿåì !!!
gb_Pause = fCheckMargin (ls_txt, AccountBalance(), StopMarginPercent, RiskDepoPercent);
fPrintAndShowComment (ls_txt, DrawObject_ON, PrintCom && fCCV_I (gb_Pause, 2), gsa_Comment, 2);
//---- Íåïîñðåäñòâåííî ñàì Virtual Trading
if (!gb_Pause && gi_MyOrders == 0)
{fSendOrdersFromLine (gs_Symbol, gda_SendLevel, ar_Price, fi_MG, fb_RealTrade);}
//---- Êîíòðîëèðóåì âîçìîæíûå îøèáêè
fGetLastError (gs_ComError, "fVirtualTrade()");
return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ïðîâåðÿåì íàëè÷èå íà ãðàôèêå óïðàâëÿþùèõ ëèíèé |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCheckMyLine (string ar_MyLine[])
{
int li_Total = ObjectsTotal();
string ls_Name;
for (int li_OBJ = li_Total - 1; li_OBJ >= 0; li_OBJ--)
{
ls_Name = ObjectName (li_OBJ);
for (int li_LN = 0; li_LN < ArraySize (ar_MyLine); li_LN++)
{
//---- Èùåì íóæíóþ ëèíèþ
if (ls_Name == ar_MyLine[li_LN])
{return (true);}
}
}
return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ïðîâåðÿåì íà òðàíñôîðìàöèþ îòðàáîòàííîé ëèíèè |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCheckChangeLine (string fs_Name, int fi_type_OBJ, double& ar_TimeLine[])
{
string ls_txt, ls_fName = "fCheckChangeLine()";
double lda_TimeLine[2];
//----
lda_TimeLine[0] = ObjectGet (fs_Name, IIFd ((fi_type_OBJ == 0), OBJPROP_PRICE1, OBJPROP_TIME1));
lda_TimeLine[1] = ObjectGet (fs_Name, IIFd ((fi_type_OBJ == 0), OBJPROP_PRICE1, OBJPROP_TIME2));
if (lda_TimeLine[0] != ar_TimeLine[0] || lda_TimeLine[1] != ar_TimeLine[1])
{
ls_txt = fPrepareComment (StringConcatenate (ls_fName, ": Ëèíèÿ ", fs_Name, " â ðàáîòå."), gb_InfoPrint);
fPrintAndShowComment (ls_txt, DrawObject_ON, PrintCom, gsa_Comment, 1);
ar_TimeLine[0] = lda_TimeLine[0];
ar_TimeLine[1] = lda_TimeLine[1];
return (true);
}
//----
return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Èíèöèàëèçàöèÿ áèáëèîòåêè |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fInitVirtualTrade()
{
//---- ïîãðåøíîñòü ðèñîâàíèÿ îáúåêòîâ íà ãðàôèêå ñ ðàçíûìè TF
int lia_Value_draw[] = {8,12,16,20,26,50,80,100,140};
//----
gd_area = NDP (Reliable_Area * gi_Decimal);
//---- Çàïîëíÿåì ìàññèâ èì¸í ëèíèé
gsa_Name_Line[0] = Name_BUY_Line;
gsa_Name_Line[1] = Name_SELL_Line;
ArrayInitialize (gda_SendLevel, -1.0);
gd_Value_draw = NDP (lia_Value_draw[gi_chart_Period] * gi_Decimal);
gb_Virtual_Trade = VirtualOrders_ON;
InitializeArray_STR (gsa_Comment);
//----
return (0);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Îòêðûâàåì îðäåðà ïî Line íà ãðàôèêàõ |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fSendOrdersFromLine (string fs_Symbol, // ðàáî÷èé ñèìâîë
double& ar_curLevel[], // ìàññèâ ïàðàìåòðîâ óïðàâëÿþùåãî óðîâíÿ
double ar_Price[2], // ìàññèâ öåí ïî ðàáî÷åìó èíñòðóìåíòó
int fi_MG, // ìàãèê
bool fb_RealTrade) // ôëàã ðåàëüíîé òîðãîâëè
{
int cmd, li_Ticket, cur_Type, li_NUM, err = GetLastError();
double ld_PriceOpen, ld_Price, ld_SL, ld_TP, ld_deltaPrice, lda_STOPs[2];
bool lb_Send;
static int cnt;
string ls_txt, ls_txt1 = "", ls_Name, ls_fName = "fSendOrdersFromLine()";
//----
//---- Ñ÷èòûâàåì óðîâåíü îòêðûòèÿ îðäåðà
fGetLevelFromLine (ar_curLevel, ar_Price, fb_RealTrade);
cur_Type = -1;
lb_Send = false;
//---- Ïðîâåðÿåì óñëîâèÿ íà îòêðûòèå îðäåðà
if (ar_curLevel[0] > 0)
{
ld_PriceOpen = ar_curLevel[0];
cur_Type = ar_curLevel[1];
cmd = IIFi ((cur_Line == Line_BUY), 1, 0);
ld_Price = ar_Price[cmd];
gc_color = gca_color[cur_Type];
switch (Variant_Send)
{
case 0:
switch (cur_Type)
{
case OP_BUYSTOP:
case OP_SELLLIMIT:
if (ld_Price > ld_PriceOpen)
{lb_Send = true;}
break;
case OP_BUYLIMIT:
case OP_SELLSTOP:
if (ld_Price < ld_PriceOpen)
{lb_Send = true;}
break;
}
break;
case 1:
switch (cur_Type)
{
case OP_BUYSTOP:
if (ld_Price > ld_PriceOpen)
{
if (ld_Price > ld_PriceOpen + gd_area)
{lb_Send = true;}
else
{ar_curLevel[2] = cur_Type;}
}
break;
case OP_BUYLIMIT:
if (ld_Price < ld_PriceOpen)
{
if (fCCV_I (cur_Type, 0))
{
ar_curLevel[2] = cur_Type;
ls_txt1 = fPrepareComment (StringConcatenate (ls_fName, ": Åñòü óñëîâèÿ äëÿ îòêðûòèÿ ", GetNameOP (cur_Type), " îðäåðà. Æä¸ì ðàçâîðîòà ðûíêà. PriceOpen = ", DSD (ld_PriceOpen)), gb_InfoPrint);
//---- Ðèñóåì íà ÷àðòå ñòðåëî÷êó
ls_Name = "ar" + cnt;
fCreat_OBJ (ls_Name, OBJ_ARROW, 233, (GetNameOP (cur_Type) + "/" + cur_Line), 0, Time[0], ld_Price, false, gc_color);
cnt++;
}
//---- Äâèãàåì ëèíèþ çà öåíîé (åñëè çàäàíî)
if (TrailPrice_ON && ld_Price < ld_PriceOpen - gd_area)
{
ld_deltaPrice = NDD (ld_PriceOpen - gd_area - ld_Price);
if (fMooveLineByPrice (gsa_Name_Line[cur_Line], ld_deltaPrice, ar_curLevel, ld_PriceOpen, ld_Price))
{ls_txt1 = fPrepareComment (StringConcatenate (ls_fName, ": Òðàëèì óðîâåíü ", GetNameOP (cur_Type), " îðäåðà çà öåíîé. Æä¸ì ðàçâîðîòà ðûíêà. PriceOpen = ", DSD (ld_PriceOpen), "; Price = ", DSD (ld_Price)), gb_InfoPrint);}
}
}
if (ar_curLevel[2] == cur_Type && ld_Price > ld_PriceOpen + gd_area)
{lb_Send = true;}
break;
case OP_SELLSTOP:
if (ld_Price < ld_PriceOpen)
{
if (ld_Price < ld_PriceOpen - gd_area)
{lb_Send = true;}
else
{ar_curLevel[2] = cur_Type;}
}
break;
case OP_SELLLIMIT:
if (ld_Price > ld_PriceOpen)
{
if (fCCV_I (cur_Type, 0))
{
ar_curLevel[2] = cur_Type;
ls_txt1 = fPrepareComment (StringConcatenate (ls_fName, ": Åñòü óñëîâèÿ äëÿ îòêðûòèÿ ", GetNameOP (cur_Type), " îðäåðà. Æä¸ì ðàçâîðîòà ðûíêà. PriceOpen = ", DSD (ld_PriceOpen)), gb_InfoPrint);
//---- Ðèñóåì íà ÷àðòå ñòðåëî÷êó
ls_Name = "ar" + cnt;
fCreat_OBJ (ls_Name, OBJ_ARROW, 234, (GetNameOP (cur_Type) + "/" + cur_Line), 0, Time[0], ld_Price, false, gc_color);
cnt++;
}
//---- Äâèãàåì ëèíèþ çà öåíîé (åñëè çàäàíî)
if (TrailPrice_ON && ld_Price > ld_PriceOpen + gd_area)
{
ld_deltaPrice = NDD (ld_Price - ld_PriceOpen - gd_area);
if (fMooveLineByPrice (gsa_Name_Line[cur_Line], ld_deltaPrice, ar_curLevel, ld_PriceOpen, ld_Price)) // öåíà
{ls_txt1 = fPrepareComment (StringConcatenate (ls_fName, ": Òðàëèì óðîâåíü ", GetNameOP (cur_Type), " îðäåðà çà öåíîé. Æä¸ì ðàçâîðîòà ðûíêà. PriceOpen = ", DSD (ld_PriceOpen), "; Price = ", DSD (ld_Price)), gb_InfoPrint);}
}
}
if (ar_curLevel[2] == cur_Type && ld_Price < ld_PriceOpen - gd_area)
{lb_Send = true;}
break;
}
break;
}
}
//---- Âûâîäèì êîììåíòàðèè
fPrintAndShowComment (ls_txt1, DrawObject_ON, PrintCom, gsa_Comment, 1);
//---- Âûâîäèì îòëàäî÷íóþ èíôîðìàöèþ
gsa_Comment[4] = fPrepareComment (StringConcatenate ("PriceOpen = ", DSD (ld_PriceOpen), "; Type = ", GetNameOP (ar_curLevel[1]), "; flag = ", IIFs ((ar_curLevel[2] == 0), "NO", GetNameOP (ar_curLevel[2]))), gb_Control);
if (lb_Send)
{
if (cur_Type > 0)
{cur_Type = IIFi ((cur_Type == OP_BUYSTOP || cur_Type == OP_BUYLIMIT), OP_BUY, OP_SELL);}
//---- Ôîðìèðóåì ÑÒÎÏÛ
cmd = IIFi ((cur_Type == 0), 1, -1);
li_NUM = fCheckMyMagic (fi_MG, gia_MG);
fGetSTOPs (lda_STOPs, cur_Type, li_NUM);
ld_SL = lda_STOPs[0];
ld_TP = lda_STOPs[1];
RefreshRates();
if (cur_Type == OP_BUY) {ld_Price = Ask;} else {ld_Price = Bid;}
li_Ticket = OrderSend (fs_Symbol, cur_Type, NDDig (GetSizeLot (Order_Lots)), ld_Price, Slippage, ld_SL, ld_TP, "", fi_MG, 0, gc_color);
if (li_Ticket > 0)
{
//---- Ñáðàñûâàåì ñîñòîÿíèå "flat"
if (li_NUM == 1)
{gb_flat = false;}
pre_Type = ar_curLevel[1];
gb_NewLine = false;
ArrayInitialize (ar_curLevel, -1.0);
fCCV_I (cur_Type, 0);
if (!IsOptimization())
{
gsa_Comment[2] = fPrepareComment (StringConcatenate ("Îòêðûëè ", GetNameOP (cur_Type), "-îðäåð[", li_Ticket, "] (", fi_MG, ")."), DrawObject_ON);
ls_txt = fPrepareComment (StringConcatenate (ls_fName, ": Îòêðûëè ", GetNameOP (cur_Type), "-îðäåð[", li_Ticket, "] SL[", MathAbs (ld_Price - ld_SL) / gd_Point, "] = ", DSD (ld_SL), "; TP[", IIFs ((ld_TP == 0), 0, DS0 (MathAbs (ld_Price - ld_TP) / gd_Point)), "] = ", DSD (ld_TP), "; LevelPrice = ", DSD (ld_PriceOpen), "; Price = ", DSD (ld_Price), " (", fi_MG, ")"), PrintCom);
if (PrintCom) {Print (ls_txt);}
//---- Àííóëèðóåì îòðàáîòàííóþ ëèíèþ
ls_Name = gsa_Name_Line[cur_Line];
//---- Óäàëÿåì "îòðàáîòàííóþ" ëèíèþ (åñëè çàäàíî)
if (DeleteInActiveLine)
{
if (DelObject (ls_Name))
{ls_txt1 = "Óäàëèëè îòðàáîòàííóþ ëèíèþ !!!";}
}
else
{
ObjectSet (ls_Name, OBJPROP_COLOR, White);
gda_TimeOfLine[0] = ObjectGet (ls_Name, IIFd ((Variant_Line == 0), OBJPROP_PRICE1, OBJPROP_TIME1));
gda_TimeOfLine[1] = ObjectGet (ls_Name, IIFd ((Variant_Line == 0), OBJPROP_PRICE1, OBJPROP_TIME2));
}
ls_Name = "RAY_Price";
DelObject (ls_Name);
fGetLastError (gs_ComError, ls_fName + 1);
ls_txt1 = fPrepareComment (StringConcatenate (ls_fName, ": ", ls_txt1, " Óäàëèëè ëèíèþ ", ls_Name, "."), gb_InfoPrint);
fPrintAndShowComment (ls_txt1, DrawObject_ON, PrintCom, gsa_Comment, 1);
if (OrderSelect (li_Ticket, SELECT_BY_TICKET))
{OrderPrint();}
}
cur_Line = -1;
}
else
{
gs_ComError = fPrepareComment (StringConcatenate (ls_fName, ": Îøèáêà ïðè îòêðûòèè ", GetNameOP (cur_Type), "-îðäåðà. SL[", MathAbs (ld_Price - ld_SL) / gd_Point, "] = ", DSD (ld_SL), "; TP[", IIFs ((ld_TP == 0), 0, DS0 (MathAbs (ld_Price - ld_TP) / gd_Point)), "] = ", DSD (ld_TP), "; LevelPrice = ", DSD (ld_PriceOpen), "; Price = ", DSD (ld_Price), "; flat = ", CheckBOOL (gb_flat), " (", fi_MG, ")"), gb_InfoPrint);
if (PrintCom) {Print (gs_ComError);}
}
}
fGetLastError (gs_ComError, ls_fName);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Äâèãàåì ëèíèþ çà öåíîé |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fMooveLineByPrice (string fs_Name, // èìÿ ïåðåäâèãàåìîé ëèíèè
double fd_Distance, // ðàññòîÿíèå ïåðåäâèæåíèÿ
double& ar_cur_Level[], // ìàññèâ çíà÷åíèé ïåðåäâèãàåìîãî óðîâíÿ
double& fd_OpenPrice, // OpenPrice
double fd_Price) // öåíà
{
double lda_Price[2];
string ls_fName = "fMooveLineByPrice()";
int li_cmd, err = GetLastError();
bool lb_result = false;
//----
li_cmd = IIFi ((fd_Price < fd_OpenPrice), 1, -1);
switch (Variant_Line)
{
case 0: lb_result = ObjectSet (fs_Name, OBJPROP_PRICE1, fd_Price + gd_area * li_cmd); break;
case 1:
lda_Price[0] = ObjectGet (fs_Name, OBJPROP_PRICE1);
lda_Price[1] = ObjectGet (fs_Name, OBJPROP_PRICE2);
ObjectSet (fs_Name, OBJPROP_PRICE1, lda_Price[0] - fd_Distance * li_cmd);
lb_result = ObjectSet (fs_Name, OBJPROP_PRICE2, lda_Price[1] - fd_Distance * li_cmd);
break;
}
if (Variant_Line == 0) {fd_OpenPrice = ObjectGet (fs_Name, OBJPROP_PRICE1);} else {fd_OpenPrice = fObjectGetValue_ByCurrent (fs_Name);}
ar_cur_Level[0] = fd_OpenPrice;
if (!lb_result)
{if (PrintCom) Print ("Ïåðåìåñòèòü ëèíèþ ", fs_Name, " íå óäàëîñü. Price = ", DSD (fd_Price), " -> ", DSD (fd_Price + gd_area * li_cmd));}
fGetLastError (gs_ComError, ls_fName);
return (lb_result);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//| Ïðîâåðÿåì íàëè÷èå óïðàâëÿþùåé ëèíèè è ôèêñèðóåì çàäàííûé óðîâåíü |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fGetLevelFromLine (double& ar_Level[], // âîçâðàùàåìûé ìàññèâ ïàðàìåòðîâ óïðàâëÿþùåãî óðîâíÿ
double ar_Price[], // àêòóàëüíûé ìàññèâ öåí ïî èíñòðóìåíòó
bool fb_RealTrade) // ôëàã ðåàëüíîé òîðãîâëè
{
int cmd, li_cmd, li_Type = -1, li_Total = ObjectsTotal(), err = GetLastError();
double ld_PriceOpen, ld_PriceOP_area;
string ls_Name, ls_Type, ls_delta_Price, ls_txt = "", ls_txt1, ls_fName;
color lca_color[] = {Blue,Red}, lc_color;
bool lb_break = false;
datetime ldt_curTime;
ls_fName = "fGetLevelFromLine()";
//----
if (cur_Line < 0)
{ls_txt = "Íåò àêòèâíîé ëèíèè !!!";}
ls_txt1 = ls_fName + ": Íàøëè óðîâåíü äëÿ îòêðûòèÿ îðäåðà-";
for (int li_OBJ = li_Total - 1; li_OBJ >= 0; li_OBJ--)
{
ls_Name = ObjectName (li_OBJ);
for (int li_LN = 0; li_LN < 2; li_LN++)
{
cmd = IIFi ((li_LN == 0), 1, 0);
//---- Èùåì íóæíóþ ëèíèþ
if (ls_Name == gsa_Name_Line[li_LN])
{
//---- Èñêëþ÷àåì ïîâòîðíîå ñðàáàòûâàíèå ëèíèè
if (!gb_NewLine && !DeleteInActiveLine)
{
if (fCheckChangeLine (ls_Name, Variant_Line, gda_TimeOfLine))
{gb_NewLine = true;}
}
if (!gb_NewLine)
{continue;}
ld_PriceOpen = IIFd ((Variant_Line == 0), ObjectGet (ls_Name, OBJPROP_PRICE1), fObjectGetValue_ByCurrent (ls_Name));
cur_Line = gia_Line[li_LN];
ar_Level[0] = ld_PriceOpen;
//---- Ðèñóåì ëó÷ äëÿ îòîáðàæåíèÿ óðîâíÿ OpenPrice
fCreat_OBJ ("RAY_Price", OBJ_TREND, 0, "", 0, Time[0], ld_PriceOpen, true, Yellow, Time[0] + Period() * 60, ld_PriceOpen);
//---- Ðèñóåì íàçâàíèå îòêðûâàåìîãî îðäåðà
ls_txt = gsa_Name_ORD[cur_Line];
fCreat_OBJ ("Name_ORD", OBJ_TEXT, 0, ls_txt, 10, Time[0] + Period() * 300, ld_PriceOpen + gd_Value_draw, false, gca_color[cur_Line]);
//---- Ðèñóåì òåêóùóþ öåíó îòêðûòèÿ îðäåðà
li_cmd = IIFi ((ar_Level[1] >= 0), IIFi ((ar_Level[1] == OP_BUYLIMIT || ar_Level[1] == OP_SELLSTOP), 1, -1), 0);
ls_delta_Price = DS0 ((ar_Price[cmd] - ld_PriceOpen) / gd_Point * li_cmd);
ls_txt = StringConcatenate (DSD (ld_PriceOpen), " (", ls_delta_Price, ")");
//---- Îðãàíèçóåì ìèãàíèå öâåòà ïðè íàõîæäåíèè öåíû â "çîíå âèäèìîñòè" óðîâíÿ
lc_color = IIFc ((ar_Price[cmd] > ld_PriceOpen + gd_area || ar_Price[cmd] < ld_PriceOpen - gd_area), Gold, IIFc (fMigalka(), Gold, Gray));
fCreat_OBJ ("Value_Price", OBJ_TEXT, 0, ls_txt, 12, Time[0] + Period() * 900, ld_PriceOpen - gd_Value_draw, false, lc_color);
//---- Ðèñóåì ãðàíèöû "âèäèìîñòè" óðîâíÿ
for (int li_int = 0; li_int < 2; li_int++)
{
li_cmd = IIFi ((li_int == 1), 1, -1);
ld_PriceOP_area = ld_PriceOpen + gd_area * li_cmd;
fCreat_OBJ ("RAY_Price_area_" + li_int, OBJ_TREND, 0, "", 0, Time[0], ld_PriceOP_area, false, lc_color, Time[4], ld_PriceOP_area);
}
ls_txt = StringConcatenate (GetNameOP (ar_Level[1]), " ", IIFs ((ar_Price[cmd] <= ld_PriceOpen), "UP", "DW"), "#", DSD (ld_PriceOpen), " !!! ");
fPrintAndShowComment (StringConcatenate ("Æä¸ì îòêðûòü îðäåð-", ls_txt), DrawObject_ON, False, gsa_Comment, 0);
//---- Ïîäêðàøèâàåì ëèíèþ â íóæíûé öâåò
ObjectSet (ls_Name, OBJPROP_COLOR, lca_color[li_LN]);
//---- Ôèêñèðóåì âðåìÿ æèçíè ëèíèè (åñëè çàäàíî)
ls_txt = ObjectDescription (ls_Name);
if (StringLen (ls_txt) > 0)
{
ar_Level[3] = StrToTime (ls_txt);
//---- Ïðîâåðÿåì ëèíèþ íà "ïðàâî æèçíè"
if (ar_Level[3] > 0)
{
ldt_curTime = IIFi (fb_RealTrade, TimeCurrent(), iTime (gs_Symbol, 1, 0));
if (ldt_curTime > ar_Level[3])
{
//---- Óäàëÿåì ëèíèþ ïî èñòå÷åíèþ "âðåìåíè æèçíè"
if (ObjectDelete (ls_Name))
{
ls_txt = fPrepareComment (StringConcatenate (ls_fName, ": Óäàëèëè ëèíèþ ", ls_Name, " ïî èñòå÷åíèþ ñðîêà æèçíè !!! Expiration = ", TS_DM (ar_Level[3]), "; Time = ", TS_DM (ldt_curTime), "."), gb_InfoPrint);
fPrintAndShowComment (ls_txt, DrawObject_ON, PrintCom, gsa_Comment, 1);
return (false);
}
}
}
}
if (gs_pre_Name != ls_Name || ar_Level[1] <= 0)
{
if (ar_Price[cmd] > ld_PriceOpen)
{ar_Level[1] = IIFi ((li_LN == 0), OP_BUYLIMIT, OP_SELLSTOP);}
if (ar_Price[cmd] < ld_PriceOpen)
{ar_Level[1] = IIFi ((li_LN == 0), OP_BUYSTOP, OP_SELLLIMIT);}
ls_txt = StringConcatenate (GetNameOP (ar_Level[1]), " ", IIFs ((ar_Price[cmd] <= ld_PriceOpen), "UP", "DW"), "#", DSD (ld_PriceOpen), " !!! ");
fPrintAndShowComment (StringConcatenate ("Æä¸ì îòêðûòü îðäåð-", ls_txt), DrawObject_ON, False, gsa_Comment, 0);
gs_pre_Name = ls_Name;
}
lb_break = true;
break;
}
}
if (lb_break)
{break;}
}
if (ls_txt != "" && PrintCom)
{
ls_txt1 = StringConcatenate (ls_txt1, ls_txt);
if (fCCV_I (ar_Level[1], 1))
{Print (IIFs ((cur_Line < 0), ls_txt, ls_txt1));}
}
if (DrawObject_ON && !lb_break)
{gsa_Comment[0] = ls_txt;}
fGetLastError (gs_ComError, ls_fName);
return (lb_break);
//----
}
//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
---