Price Data Components
Indicators Used
Miscellaneous
1
Views
0
Downloads
0
Favorites
iMTF_DivergencesSearchForDifferentIndicators
//+------------------------------------------------------------------+
//| MTF Divergences search for different Indicators.mq4 |
//| Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//| https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link "https://login.mql5.com/ru/users/artmedia70"
#property version "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots 4
//--- plot AoUP
#property indicator_label1 "AO Sell Signal"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plot AoDN
#property indicator_label2 "AO Buy Signal"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrDodgerBlue
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- plot MacdUP
#property indicator_label3 "MACD Sell Signal"
#property indicator_type3 DRAW_ARROW
#property indicator_color3 clrRed
#property indicator_style3 STYLE_SOLID
#property indicator_width3 1
//--- plot MacdDN
#property indicator_label4 "MACD Buy Signal"
#property indicator_type4 DRAW_ARROW
#property indicator_color4 clrDodgerBlue
#property indicator_style4 STYLE_SOLID
#property indicator_width4 1
//--- indicator buffers
double BufferAoUP[];
double BufferAoDN[];
double BufferMacdUP[];
double BufferMacdDN[];
//+------------------------------------------------------------------+
//| Enums |
//+------------------------------------------------------------------+
enum enumYN
{
enYes=1, // Äà
enNo=0, // Íåò
};
enum enumModeLINE
{
enMdMain=MODE_MAIN, // Main
enMdSign=MODE_SIGNAL,// Signal
};
enum enumCoincidence
{
enCoinAccurate=1, // Òî÷íûé
enCoinApproximate=0, // Ïðèáëèæåííûé
};
//+------------------------------------------------------------------+
//| Input Variables |
//+------------------------------------------------------------------+
extern string Div_Params = "-- Ïàðàìåòðû ïîèñêà äèâåðãåíöèé --";//======================================
sinput ENUM_TIMEFRAMES PeriodForWork=PERIOD_H4; // Òàéìôðåéì, íà êîòîðîì èñêàòü äèâåðãåíöèè
ENUM_TIMEFRAMES periodForWork; // Òàéìôðåéì, íà êîòîðîì èñêàòü äèâåðãåíèöèè
sinput enumCoincidence SearchAccuracy=enCoinApproximate; // Ðåæèì ïîèñêà ñîâïàäåíèé ýêñòðåìóìîâ èíäèêàòîðà è öåíû
input int NumBarAccuracy=3; // Äèàïàçîí áàðîâ ïîèñêà ýêñòðåìóìîâ èíäèêàòîðà è öåíû
int numBarAccuracy; // Êîëè÷åñòâî áàðîâ íåòî÷íîñòè ïîèñêà ïèêîâ
input int KoeffDistanceBetween=5; // Êîýôôèöèåíò "ðàçíèöû" ìåæäó ýêñòðåìóìàìè
double koeffForDistanceBetween; // Êîýôôèöèåíò "ðàçíèöû" ìåæäó ýêñòðåìóìàìè
sinput int WidthChartLine=1; // Òîëùèíà ëèíèé íà ãðàôèêå öåíû
int widthChartLine; // Òîëùèíà ëèíèé íà ãðàôèêå öåíû
sinput ENUM_LINE_STYLE StyleChartLine=STYLE_SOLID; // Ñòèëü ëèíèé íà ãðàôèêå öåíû
sinput int WidthIndicatorsLine=1; // Òîëùèíà ëèíèé â îêíå èíäèêàòîðîâ
int widthIndicatorsLine; // Òîëùèíà ëèíèé â îêíå èíäèêàòîðîâ
sinput ENUM_LINE_STYLE StyleIndicatorsLine=STYLE_SOLID; // Ñòèëü ëèíèé â îêíå èíäèêàòîðîâ
//--- èñïîëüçóåìûå èíäèêàòîðû
extern string AO_Params = "-- Ïàðàìåòðû AO --";//======================================
sinput enumYN UseAO=enYes; // Èñêàòü äèâåðãåíöèè íà AO
sinput color ColorUpperAO=clrRed; // Öâåò âåðõíèõ ëèíèé äèâåðãåíöèé AO
sinput color ColorLowerAO=clrBlue; // Öâåò íèæíèõ ëèíèé äèâåðãåíöèé AO
extern string MACD_Params = "-- Ïàðàìåòðû MACD --"; //======================================
sinput enumYN UseMACD=enNo; // Èñêàòü äèâåðãåíöèè íà MACD
input enumModeLINE ModeLineMACD=enMdMain; // Èñêàòü äèâåðãåíöèè ïî ëèíèè MACD:
input int FastEMA_MACD=12; // Áûñòðàÿ EMA MACD
int fastEMA_MACD; // Áûñòðîå EMA MACD
input int SlowEMA_MACD=26; // Ìåäëåííàÿ EMA MACD
int slowEMA_MACD; // Ìåäëåííîå EMA MACD
input int PeriodSignalMACD=9; // Ïåðèîä ñèãíàëüíîé SMA MACD
int periodSignalMACD; // Ïåðèîä ñèãíàëüíîé SMA MACD
input ENUM_APPLIED_PRICE AppledPriceMACD=PRICE_CLOSE; // Ïðèìåíèòü ê:
sinput color ColorUpperMACD=clrRed; // Öâåò âåðõíèõ ëèíèé äèâåðãåíöèé MACD
sinput color ColorLowerMACD=clrBlue; // Öâåò íèæíèõ ëèíèé äèâåðãåíöèé MACD
//+------------------------------------------------------------------+
//| Global Variables |
//+------------------------------------------------------------------+
string Prefix, symbol;
int number_ao; // íîìåð îêíà AO
int number_macd; // íîìåð îêíà MACD
string name_ao="";
string name_macd="";
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,BufferAoUP); // Áóôåð òî÷åê ýêñòðåìóìîâ "Âåðõ" AO
SetIndexBuffer(1,BufferAoDN); // Áóôåð òî÷åê ýêñòðåìóìîâ "Íèç" AO
SetIndexBuffer(2,BufferMacdUP); // Áóôåð òî÷åê ýêñòðåìóìîâ "Âåðõ" MACD
SetIndexBuffer(3,BufferMacdDN); // Áóôåð òî÷åê ýêñòðåìóìîâ "Íèç" MACD
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
//--- mql5
PlotIndexSetInteger(0,PLOT_ARROW,234); // Ñòðåëêà "Âíèç" äëÿ ñèãíàëà äèâ. AO
PlotIndexSetInteger(1,PLOT_ARROW,233); // Ñòðåëêà "Ââåðõ" äëÿ ñèãíàëà äèâ. AO
PlotIndexSetInteger(2,PLOT_ARROW,234); // Ñòðåëêà "Âíèç" äëÿ ñèãíàëà äèâ. MACD
PlotIndexSetInteger(3,PLOT_ARROW,233); // Ñòðåëêà "Ââåðõ" äëÿ ñèãíàëà äèâ. MACD
//--- mql4
SetIndexArrow(0,242); // Ñòðåëêà "Âíèçõ" äëÿ ñèãíàëà äèâ. AO
SetIndexArrow(1,241); // Ñòðåëêà "Ââåðõ" äëÿ ñèãíàëà äèâ. AO
SetIndexArrow(2,248); // Ñòðåëêà "Âíèç" äëÿ ñèãíàëà äèâ. MACD
SetIndexArrow(3,246); // Ñòðåëêà "Ââåðõ" äëÿ ñèãíàëà äèâ. MACD
//--- èíèöèàëèçàöèÿ áóôåðîâ
ArrayInitialize(BufferAoDN,EMPTY_VALUE);
ArrayInitialize(BufferAoUP,EMPTY_VALUE);
ArrayInitialize(BufferMacdDN,EMPTY_VALUE);
ArrayInitialize(BufferMacdUP,EMPTY_VALUE);
//--- èìåíà
symbol=Symbol();
Prefix="MTFdiv"; // Ïðåôèêñ èì¸í îáúåêòîâ
IndicatorSetString(INDICATOR_SHORTNAME,Prefix); // Êîðîòêîå èìÿ èíäèêàòîðà
//--- êîððåêòèðîâêà ââåä¸ííûõ çíà÷åíèé MACD
fastEMA_MACD=(FastEMA_MACD<1)?1:FastEMA_MACD; // åñëè áûñòðîå ÅÌÀ ìåíüøå 1, òî 1, èíà÷å ïðèíÿòü ââåä¸ííîå
slowEMA_MACD=(SlowEMA_MACD<=fastEMA_MACD)?fastEMA_MACD+1:SlowEMA_MACD; // åñëè ìåäëåííîå ÅÌÀ ìåíüøå, ëèáî ðàâíî áûñòðîìó ÅÌÀ (÷åãî áûòü íå äîëæíî), òî ñäåëàòü ÁûñòðîåÅÌÀ+1, èíà÷å ïðèíÿòü ââåä¸ííîå
periodSignalMACD=(PeriodSignalMACD<1)?1:PeriodSignalMACD;
//--- ïðèáëèæ¸ííîñòü ïîèñêà
numBarAccuracy=(NumBarAccuracy<0)?0:NumBarAccuracy;
if(SearchAccuracy) numBarAccuracy=1;
// Êîððåêòèðîâêà êîýôôèöèåíòà "ðàçíèöû" ìåæäó ýêñòðåìóìàìè
koeffForDistanceBetween=(KoeffDistanceBetween<0)?0:KoeffDistanceBetween*Point();
//--- ïðîâåðêà ðàáî÷åãî ïåðèîäà è åãî ñìåíà, åñëè âûáðàí ðàáî÷èé ïåðèîä ìåíüøå òåêóùåãî
periodForWork=PeriodForWork;
if(Period()>periodForWork) {
Alert("Âûáðàí íå êîððåêòíûé ïåðèîä: ",GetNameTF(PeriodForWork),"\nÌåíÿþ ðàáî÷èé ïåðèîä íà ",GetNameTF(Period()));
periodForWork=PERIOD_CURRENT;//GetTFasEnum(Period());
}
//--- ïàðàìåòðû ëèíèé
widthChartLine=(WidthChartLine<1)?1:WidthChartLine;
widthIndicatorsLine=(WidthIndicatorsLine<1)?1:WidthIndicatorsLine;
//--- íîìåðà èíäèêàòîðîâ
number_ao=0;
number_macd=1;
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- delete graphics
ObjectsDeleteAll(0,Prefix);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
if(rates_total<koeffForDistanceBetween*2) return(0);
//---
double ao_a, ao_b, ao_c;
double macd_a, macd_b, macd_c;
int limit=rates_total-prev_calculated;
if(limit>1) {
limit=rates_total-4;
}
name_ao="AO";
name_macd="MACD("+(string)fastEMA_MACD+","+(string)slowEMA_MACD+","+(string)periodSignalMACD+")";
int wnd_ao=GetWindowNumber(name_ao); // Íîìåð ïîäîêíà èíäèêàòîðà AO
int wnd_macd=GetWindowNumber(name_macd); // Íîìåð ïîäîêíà èíäèêàòîðà MACD
int periodSeconds=PeriodSeconds(periodForWork); // Êîëè÷åñòâî ñåêóíä â ðàáî÷åì ïåðèîäå
static datetime lastTime=0;
//--- îñíîâíîé öèêë èíäèêàòîðà
for(int i=limit; i>=0; i--) {
datetime timePeriod=GetTimeOpen(symbol,periodForWork,i); // âðåìÿ îòêðûòèÿ áàðà íà ðàáî÷åì ïåðèîäå, ñîîòâåòñòâóþùåå âðåìåíè áàðà i íà òåêóùåì ïåðèîäå
if(timePeriod>0 && timePeriod>lastTime) { // åñëè íàøëè îòêðûòèå íîâîãî áàðà íà ðàáî÷åì òàéìôðåéìå (òåêóùåå âðåìÿ áîëüøå ïðîøëîãî)
//---
int bar_a=GetBarShift(symbol,periodForWork,timePeriod-2*periodSeconds); // áàð îòêðûòèÿ ëåâîé òî÷êè ýêñòðåìóìà íà ðàáî÷åì òàéìôðåéìå
int bar_b=GetBarShift(symbol,periodForWork,timePeriod-periodSeconds); // áàð îòêðûòèÿ öåíòðàëüíîé òî÷êè ýêñòðåìóìà íà ðàáî÷åì òàéìôðåéìå
int bar_c=GetBarShift(symbol,periodForWork,timePeriod); // áàð îòêðûòèÿ ïðàâîé òî÷êè ýêñòðåìóìà íà ðàáî÷åì òàéìôðåéìå
datetime time_a=GetTimeOpen(symbol,periodForWork,i+2); // âðåìÿ îòêðûòèÿ ëåâîé òî÷êè ýêñòðåìóìà íà ðàáî÷åì òàéìôðåéìå
datetime time_b=GetTimeOpen(symbol,periodForWork,i+1); // âðåìÿ îòêðûòèÿ öåíòðàëüíîé òî÷êè ýêñòðåìóìà íà ðàáî÷åì òàéìôðåéìå
datetime time_c=GetTimeOpen(symbol,periodForWork,i); // âðåìÿ îòêðûòèÿ ïðàâîé òî÷êè ýêñòðåìóìà íà ðàáî÷åì òàéìôðåéìå
//+------------------------------------------------------------------+
//| - Áëîê ðàáîòû ñ èíäèêàòîðîì AO |
//+------------------------------------------------------------------+
if(UseAO) {
ao_a=GetDataAO(symbol,periodForWork,bar_a); // çíà÷åíèå ÀÎ íà áàðå À
ao_b=GetDataAO(symbol,periodForWork,bar_b); // çíà÷åíèå ÀÎ íà áàðå B
ao_c=GetDataAO(symbol,periodForWork,bar_c); // çíà÷åíèå ÀÎ íà áàðå C
//--- ïðîâåðêà ÀÎ íà íàëè÷èå ýêñòðåìóìà íà òð¸õ áàðàõ ðàáî÷åãî ïåðèîäà
int extrAO=GetDirectionExtremum(ao_a,ao_b,ao_c);
//--- ïåðåìåííûå äëÿ ïîèñêà ýêñòðåìóìîâ è äèâåðãåíöèé AO è öåíû
static double lastUpAO_extrValue=0; // çíà÷åíèå ïðîøëîãî âåðõíåãî ýêñòðåìóìà AO (äëÿ ïîèñêà íóæíûõ ýêñòðåìóìîâ)
static double lastDnAO_extrValue=0; // çíà÷åíèå ïðîøëîãî íèæíåãî ýêñòðåìóìà AO (äëÿ ïîèñêà íóæíûõ ýêñòðåìóìîâ)
//---
static double leftAO_UP=0; // çíà÷åíèå ëåâîãî âåðõíåãî ýêñòðåìóìà AO â ïàòòåðíå äèâåðãåíöèè
static double leftAO_DN=0; // çíà÷åíèå ëåâîãî íèæíåãî ýêñòðåìóìà AO â ïàòòåðíå äèâåðãåíöèè
static datetime leftAO_tUP=0; // âðåìÿ ëåâîãî âåðõíåãî ýêñòðåìóìà AO â ïàòòåðíå äèâåðãåíöèè
static datetime leftAO_tDN=0; // âðåìÿ ëåâîãî íèæíåãî ýêñòðåìóìà AO â ïàòòåðíå äèâåðãåíöèè
//---
static double lastUpPrcAO_extrValue=0; // çíà÷åíèå ïðîøëîãî âåðõíåãî ýêñòðåìóìà öåíû äëÿ AO
static datetime lastUpPrcAO_extrTime=0; // âðåìÿ ïðîøëîãî âåðõíåãî ýêñòðåìóìà öåíû äëÿ AO
static double lastDnPrcAO_extrValue=0; // çíà÷åíèå ïðîøëîãî íèæíåãî ýêñòðåìóìà öåíû äëÿ AO
static datetime lastDnPrcAO_extrTime=0; // âðåìÿ ïðîøëîãî íèæíåãî ýêñòðåìóìà öåíû äëÿ AO
//--- åñëè âíèçó åñòü ýêñòðåìóì AO (íà ïîêóïêó)
if(extrAO==OP_BUY) {
//--- åñëè öåíòðàëüíàÿ òî÷êà ýêñòðåìóìà AO íèæå íîëÿ, íàéä¸ì ýêñòðåìóìû è äèâåðãåíöèè
if(ao_b<0) {
FindAndSetDivergence(symbol,periodForWork,OP_BUY,ao_b,bar_b,wnd_ao,time_b,time,i,leftAO_tUP,leftAO_UP,leftAO_tDN,leftAO_DN,lastUpAO_extrValue,lastDnAO_extrValue,lastUpPrcAO_extrValue,lastUpPrcAO_extrTime,lastDnPrcAO_extrValue,lastDnPrcAO_extrTime,rates_total,BufferAoUP,BufferAoDN);
}
lastDnAO_extrValue=ao_b; // ñîõðàíèì çíà÷åíèå "ïîñëåäíåãî" íèæíåãî ýêñòðåìóìà AO äëÿ ïîñëåäóþùåãî ñðàâíåíèÿ ñ âåðõíèì ýêñòðåìóìîì AO (òîëüêî äëÿ ïîèñêà ýêñòðåìóìîâ)
}
//--- åñëè ñâåðõó åñòü ýêñòðåìóì AO (íà ïðîäàæó)
if(extrAO==OP_SELL) {
//--- åñëè öåíòðàëüíàÿ òî÷êà ýêñòðåìóìà AO âûøå íîëÿ, íàéä¸ì ýêñòðåìóìû è äèâåðãåíöèè
if(ao_b>0) {
FindAndSetDivergence(symbol,periodForWork,OP_SELL,ao_b,bar_b,wnd_ao,time_b,time,i,leftAO_tUP,leftAO_UP,leftAO_tDN,leftAO_DN,lastUpAO_extrValue,lastDnAO_extrValue,lastUpPrcAO_extrValue,lastUpPrcAO_extrTime,lastDnPrcAO_extrValue,lastDnPrcAO_extrTime,rates_total,BufferAoUP,BufferAoDN);
}
lastUpAO_extrValue=ao_b; // ñîõðàíèì çíà÷åíèå "ïîñëåäíåãî" âåðõíåãî ýêñòðåìóìà AO äëÿ ïîñëåäóþùåãî ñðàâíåíèÿ ñ íèæíèì ýêñòðåìóìîì AO (òîëüêî äëÿ ïîèñêà ýêñòðåìóìîâ)
}
} //--- êîíåö áëîêà AO
//+------------------------------------------------------------------+
//| - Áëîê ðàáîòû ñ èíäèêàòîðîì MACD |
//+------------------------------------------------------------------+
if(UseMACD) {
macd_a=GetDataMACD(symbol,periodForWork,ModeLineMACD,bar_a); // çíà÷åíèå MACD íà áàðå À
macd_b=GetDataMACD(symbol,periodForWork,ModeLineMACD,bar_b); // çíà÷åíèå MACD íà áàðå B
macd_c=GetDataMACD(symbol,periodForWork,ModeLineMACD,bar_c); // çíà÷åíèå MACD íà áàðå C
//--- ïðîâåðêà MACD íà íàëè÷èå ýêñòðåìóìà íà òð¸õ áàðàõ ðàáî÷åãî ïåðèîäà
int extrMACD=GetDirectionExtremum(macd_a,macd_b,macd_c);
//--- ïåðåìåííûå äëÿ ïîèñêà ýêñòðåìóìîâ è äèâåðãåíöèé MACD è öåíû
static double lastUpMACD_extrValue=0; // çíà÷åíèå ïðîøëîãî âåðõíåãî ýêñòðåìóìà MACD (äëÿ ïîèñêà íóæíûõ ýêñòðåìóìîâ)
static double lastDnMACD_extrValue=0; // çíà÷åíèå ïðîøëîãî íèæíåãî ýêñòðåìóìà MACD (äëÿ ïîèñêà íóæíûõ ýêñòðåìóìîâ)
//---
static double leftMACD_UP=0; // çíà÷åíèå ëåâîãî âåðõíåãî ýêñòðåìóìà MACD â ïàòòåðíå äèâåðãåíöèè
static double leftMACD_DN=0; // çíà÷åíèå ëåâîãî íèæíåãî ýêñòðåìóìà MACD â ïàòòåðíå äèâåðãåíöèè
static datetime leftMACD_tUP=0; // âðåìÿ ëåâîãî âåðõíåãî ýêñòðåìóìà MACD â ïàòòåðíå äèâåðãåíöèè
static datetime leftMACD_tDN=0; // âðåìÿ ëåâîãî íèæíåãî ýêñòðåìóìà MACD â ïàòòåðíå äèâåðãåíöèè
//---
static double lastUpPrcMACD_extrValue=0; // çíà÷åíèå ïðîøëîãî âåðõíåãî ýêñòðåìóìà öåíû äëÿ MACD
static datetime lastUpPrcMACD_extrTime=0; // âðåìÿ ïðîøëîãî âåðõíåãî ýêñòðåìóìà öåíû äëÿ MACD
static double lastDnPrcMACD_extrValue=0; // çíà÷åíèå ïðîøëîãî íèæíåãî ýêñòðåìóìà öåíû äëÿ MACD
static datetime lastDnPrcMACD_extrTime=0; // âðåìÿ ïðîøëîãî íèæíåãî ýêñòðåìóìà öåíû äëÿ MACD
//--- åñëè âíèçó åñòü ýêñòðåìóì MACD (íà ïîêóïêó)
if(extrMACD==OP_BUY) {
//--- åñëè öåíòðàëüíàÿ òî÷êà ýêñòðåìóìà MACD íèæå íîëÿ, íàéä¸ì ýêñòðåìóìû è äèâåðãåíöèè
if(macd_b<0) {
FindAndSetDivergence(symbol,periodForWork,OP_BUY,macd_b,bar_b,wnd_macd,time_b,time,i,leftMACD_tUP,leftMACD_UP,leftMACD_tDN,leftMACD_DN,lastUpMACD_extrValue,lastDnMACD_extrValue,lastUpPrcMACD_extrValue,lastUpPrcMACD_extrTime,lastDnPrcMACD_extrValue,lastDnPrcMACD_extrTime,rates_total,BufferMacdUP,BufferMacdDN);
}
lastDnMACD_extrValue=macd_b; // ñîõðàíèì çíà÷åíèå "ïîñëåäíåãî" íèæíåãî ýêñòðåìóìà MACD äëÿ ïîñëåäóþùåãî ñðàâíåíèÿ ñ âåðõíèì ýêñòðåìóìîì MACD (òîëüêî äëÿ ïîèñêà ýêñòðåìóìîâ)
}
//--- åñëè ñâåðõó åñòü ýêñòðåìóì MACD (íà ïðîäàæó)
if(extrMACD==OP_SELL) {
//--- åñëè öåíòðàëüíàÿ òî÷êà ýêñòðåìóìà MACD âûøå íîëÿ, íàéä¸ì ýêñòðåìóìû è äèâåðãåíöèè
if(macd_b>0) {
FindAndSetDivergence(symbol,periodForWork,OP_SELL,macd_b,bar_b,wnd_macd,time_b,time,i,leftMACD_tUP,leftMACD_UP,leftMACD_tDN,leftMACD_DN,lastUpMACD_extrValue,lastDnMACD_extrValue,lastUpPrcMACD_extrValue,lastUpPrcMACD_extrTime,lastDnPrcMACD_extrValue,lastDnPrcMACD_extrTime,rates_total,BufferMacdUP,BufferMacdDN);
}
lastUpMACD_extrValue=macd_b; // ñîõðàíèì çíà÷åíèå "ïîñëåäíåãî" âåðõíåãî ýêñòðåìóìà MACD äëÿ ïîñëåäóþùåãî ñðàâíåíèÿ ñ íèæíèì ýêñòðåìóìîì MACD (òîëüêî äëÿ ïîèñêà ýêñòðåìóìîâ)
}
} //--- êîíåö áëîêà MACD
//--- êîíåö îáðàáîòêè òåêóùåãî áàðà
lastTime=timePeriod; // çàïîìíèì ïðîøëîå âðåìÿ äëÿ äàëüíåéøåãî ñðàâíåíèÿ ñ âðåìåíåì ñëåäóþùåãî áàðà
}
//--- êîíåö öèêëà èíäèêàòîðà
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| Functions |
//+------------------------------------------------------------------+
void FindAndSetDivergence(string symbol_name, ENUM_TIMEFRAMES work_period, int direct_extr,
double ind_b, int bar_b, int wnd, datetime time_b, const datetime &time[], int index,
datetime &left_time_up, double &left_point_up, datetime &left_time_dn, double &left_point_dn,
double &last_up_ind, double &last_dn_ind, double &last_up_prc_val, datetime &last_up_prc_tm, double &last_dn_prc_val, datetime &last_dn_prc_tm,
const int &rates_total, double &BufferUP[], double &BufferDN[]) {
string name_ind=(wnd==GetWindowNumber(name_ao)?"AO":"MACD");
if(direct_extr==OP_BUY) {
//--- ïîñ÷èòàåì äèñòàíöèþ ìåæäó ïðîøëûì âåðõíèì ýêñòðåìóìîì è òåêóùèì íèæíèì
double distance=fabs(last_up_ind-ind_b);
//--- åñëè äèñòàíöèÿ ìåæäó ýêñòðåìóìàìè áîëüøå êîýôôèöèåíòà ðàçíèöû
if(NormalizeDouble(distance-koeffForDistanceBetween,Digits()+1)>0) {
//--- íàéä¸ì ýêñòðåìóì öåíû
int bar_extr=EMPTY; // áàð íàéäåííîãî ýêñòðåìóìà öåíû
datetime time_extr=0;// âðåìÿ íàéäåííîãî ýêñòðåìóìà öåíû
double price_extr=0; // öåíà íàéäåííîãî ýêñòðåìóìà öåíû
MqlRates array[]; // ìàññèâ äëÿ õðàíåíèÿ öåí è âðåìåíè ýêñòðåìóìîâ
int num_extr=GetExtremumsLower(symbol_name,work_period,rates_total,bar_b,array);
//--- åñëè ýêñòðåìóìû íàéäåíû
if(num_extr>0) {
price_extr=array[0].low;
time_extr=array[0].time;
//--- íàéä¸ì ìèíèìàëüíóþ öåíó èç âñåõ íàéäåííûõ ýêñòðåìóìîâ
for(int k=1; k<num_extr; k++) {
if(array[k].low<price_extr && array[k].low>0) {
price_extr=array[k].low;
time_extr=array[k].time;
}
}
}
//--- åñëè íàéäåí ýêñòðåìóì öåíû
if(price_extr>0) {
//--- åñëè ïåðèîä ãðàôèêà íå ðàâåí ðàáî÷åìó ïåðèîäó, íàéä¸ì íóæíóþ ñâå÷ó
if(work_period!=Period()) {
datetime timeStart=time_extr; // âðåìÿ íà÷àëà áàðà ðàáî÷åãî òàéìôðåéìà
//--- ïðåäïîëîæèòåëüíîå âðåìÿ ïîñëåäíåãî áàðà íà òåêóùåì òàéìôðåéìå
datetime timeStop=timeStart+PeriodSeconds(work_period)-PeriodSeconds(PERIOD_CURRENT);
MqlRates rt[];
int sz=CopyRates(symbol_name,PERIOD_CURRENT,timeStart,timeStop,rt);
//--- ïîèñê âðåìåíè ýêñòðåìóìà
for(int k=0; k<sz; k++) {
if(NormalizeDouble(rt[k].low-price_extr,8)==0) {
time_extr=rt[k].time;
break;
}
}
}
//--- åñëè åñòü ðàñõîæäåíèå âçàèìíîãî ðàñïîëîæåíèÿ òî÷åê èíäèêàòîðà è öåíû (äèâåðãåíöèÿ)
if(last_dn_prc_val<price_extr && left_point_dn>ind_b) {
SetDivergenceDN(symbol_name,work_period,wnd,name_ind,"Äèâåðãåíöèÿ",time,index,left_time_dn,left_point_dn,time_b,ind_b,last_dn_prc_tm,last_dn_prc_val,time_extr,price_extr,BufferDN);
}
//--- åñëè åñòü ñõîæäåíèå âçàèìíîãî ðàñïîëîæåíèÿ òî÷åê èíäèêàòîðà è öåíû (êîíâåðãåíöèÿ)
if(last_dn_prc_val>price_extr && left_point_dn<ind_b) {
SetDivergenceDN(symbol_name,work_period,wnd,name_ind,"Êîíâåðãåíöèÿ",time,index,left_time_dn,left_point_dn,time_b,ind_b,last_dn_prc_tm,last_dn_prc_val,time_extr,price_extr,BufferDN);
}
last_dn_prc_val=price_extr; // ñîõðàíèì çíà÷åíèå ïðîøëîãî ýêñòðåìóìà öåíû
last_dn_prc_tm=time_extr; // ñîõðàíèì âðåìÿ ïðîøëîãî ýêñòðåìóìà öåíû
}
//--- çàïîìíèì íîâóþ ëåâóþ íèæíþþ òî÷êó èíäèêàòîðà
left_point_dn=ind_b;
left_time_dn=time_b;
}
}
//--- åñëè ñâåðõó åñòü ýêñòðåìóì (íà ïðîäàæó)
if(direct_extr==OP_SELL) {
//--- ïîñ÷èòàåì äèñòàíöèþ ìåæäó ïðîøëûì íèæíèì ýêñòðåìóìîì è òåêóùèì âåðõíèì
double distance=fabs(last_dn_ind-ind_b);
//--- åñëè äèñòàíöèÿ ìåæäó ýêñòðåìóìàìè áîëüøå êîýôôèöèåíòà ðàçíèöû
if(NormalizeDouble(distance-koeffForDistanceBetween,Digits()+1)>0) {
//--- íàéä¸ì ýêñòðåìóì öåíû
int bar_extr=EMPTY; // áàð íàéäåííîãî ýêñòðåìóìà
datetime time_extr=0;// âðåìÿ íàéäåííîãî ýêñòðåìóìà
double price_extr=0; // öåíà íàéäåííîãî ýêñòðåìóìà
MqlRates array[];
int num_extr=GetExtremumsUpper(symbol_name,work_period,rates_total,bar_b,array);
if(num_extr>0) {
price_extr=array[0].high;
time_extr=array[0].time;
for(int k=1; k<num_extr; k++) {
if(array[k].high>price_extr) {
price_extr=array[k].high;
time_extr=array[k].time;
}
}
}
//--- åñëè íàéäåí ýêñòðåìóì öåíû
if(price_extr>0) {
//--- åñëè ïåðèîä ãðàôèêà íå ðàâåí ðàáî÷åìó ïåðèîäó, íàéä¸ì íóæíóþ ñâå÷ó
if(work_period!=Period()) {
datetime timeStart=time_extr; // âðåìÿ íà÷àëà áàðà ðàáî÷åãî òàéìôðåéìà
//--- ïðåäïîëîæèòåëüíîå âðåìÿ ïîñëåäíåãî áàðà íà òåêóùåì òàéìôðåéìå
datetime timeStop=timeStart+PeriodSeconds(work_period)-PeriodSeconds(PERIOD_CURRENT);
MqlRates rt[];
int sz=CopyRates(symbol_name,PERIOD_CURRENT,timeStart,timeStop,rt);
ArraySetAsSeries(rt,true);
//--- ïîèñê âðåìåíè ýêñòðåìóìà
for(int k=0; k<sz; k++) {
if(NormalizeDouble(rt[k].high-price_extr,8)==0) {
time_extr=rt[k].time;
break;
}
}
}
//--- åñëè åñòü ðàñõîæäåíèå âçàèìíîãî ðàñïîëîæåíèÿ òî÷åê èíäèêàòîðà è öåíû (äèâåðãåíöèÿ)
if(last_up_prc_val<price_extr && left_point_up>ind_b) {
SetDivergenceUP(symbol_name,work_period,wnd,name_ind,"Äèâåðãåíöèÿ",time,index,left_time_up,left_point_up,time_b,ind_b,last_up_prc_tm,last_up_prc_val,time_extr,price_extr,BufferUP);
}
if(last_up_prc_val>price_extr && left_point_up<ind_b) {
SetDivergenceUP(symbol_name,work_period,wnd,name_ind,"Êîíâåðãåíöèÿ",time,index,left_time_up,left_point_up,time_b,ind_b,last_up_prc_tm,last_up_prc_val,time_extr,price_extr,BufferUP);
}
last_up_prc_val=price_extr; // ñîõðàíèì çíà÷åíèå ïðîøëîãî ýêñòðåìóìà öåíû
last_up_prc_tm=time_extr; // ñîõðàíèì âðåìÿ ïðîøëîãî ýêñòðåìóìà öåíû
}
//--- çàïîìíèì íîâóþ ëåâóþ âåðõíþþ òî÷êó èíäèêàòîðà
left_point_up=ind_b;
left_time_up=time_b;
}
}
}
//+------------------------------------------------------------------+
void SetDivergenceDN(string symbol_name, int work_period, int wnd, string name_ind, string pattern, const datetime &time[], int index,
datetime left_time, double left_point, datetime time_b, double ind_b,
datetime last_prc_tm, double last_prc_val, datetime time_extr, double price_extr, double &Buffer[]) {
color line_color=clrNONE;
string nm="", gv_name="";
line_color=(name_ind=="AO"?ColorLowerAO:ColorLowerMACD);
//--- ïîñòàâèì ñèãíàëüíóþ ñòðåëêó íà ãðàôèê öåíû
int bar_extr=GetBarShift(symbol_name,PERIOD_CURRENT,time_extr);
Buffer[bar_extr]=GetPriceLow(symbol_name,PERIOD_CURRENT,bar_extr);
//--- ñîåäèíèì ëèíèåé áëèæàéøèå òî÷êè ýêñòðåìóìîâ öåíû
int last_bar_extr=GetBarShift(symbol_name,PERIOD_CURRENT,last_prc_tm);
nm=Prefix+"P"+name_ind+"divLower"+TimeToString(time_b);
SetTLine(0,nm,line_color,0,last_prc_tm,last_prc_val,time_extr,price_extr,widthChartLine,pattern+" "+name_ind+(work_period==Period()?"":"\níà ïåðèîäå "+GetNameTF(work_period)),StyleChartLine);
//--- åñëè åñòü îêíî èíäèêàòîðà, ñîåäèíèì ëèíèåé áëèæàéøèå òî÷êè ýêñòðåìóìîâ èíäèêàòîðà
if(wnd>0) {
nm=Prefix+name_ind+"divLower"+TimeToString(time_b);
SetTLine(0,nm,line_color,wnd,left_time,left_point,time_b,ind_b,widthIndicatorsLine,pattern+" "+(work_period==Period()?"":"\níà ïåðèîäå "+GetNameTF(work_period)),StyleIndicatorsLine);
}
}
//+------------------------------------------------------------------+
void SetDivergenceUP(string symbol_name, int work_period, int wnd, string name_ind, string pattern, const datetime &time[], int index,
datetime left_time, double left_point, datetime time_b, double ind_b,
datetime last_prc_tm, double last_prc_val, datetime time_extr, double price_extr, double &Buffer[]) {
color line_color=clrNONE;
string nm="", gv_name="";
line_color=(name_ind=="AO"?ColorUpperAO:ColorUpperMACD);
//--- ïîñòàâèì ñèãíàëüíóþ ñòðåëêó íà ãðàôèê öåíû
int bar_extr=GetBarShift(symbol_name,PERIOD_CURRENT,time_extr);
Buffer[bar_extr]=GetPriceHigh(symbol_name,PERIOD_CURRENT,bar_extr);
//--- ñîåäèíèì ëèíèåé áëèæàéøèå òî÷êè ýêñòðåìóìîâ öåíû
int last_bar_extr=GetBarShift(symbol_name,PERIOD_CURRENT,last_prc_tm);
nm=Prefix+"P"+name_ind+"divUpper"+TimeToString(time_b);
SetTLine(0,nm,line_color,0,last_prc_tm,last_prc_val,time_extr,price_extr,widthChartLine,pattern+" "+name_ind+(work_period==Period()?"":"\níà ïåðèîäå "+GetNameTF(work_period)),StyleChartLine);
//--- åñëè åñòü îêíî èíäèêàòîðà, ñîåäèíèì ëèíèåé áëèæàéøèå òî÷êè ýêñòðåìóìîâ èíäèêàòîðà
if(wnd>0) {
nm=Prefix+name_ind+"divUpper"+TimeToString(time_b);
SetTLine(0,nm,line_color,wnd,left_time,left_point,time_b,ind_b,widthIndicatorsLine,pattern+" "+(work_period==Period()?"":"\níà ïåðèîäå "+GetNameTF(work_period)),StyleIndicatorsLine);
}
}
//+------------------------------------------------------------------+
double GetDataAO(string symbol_name, int timeframe, int shift) {
return(iAO(symbol_name,timeframe,shift));
}
//+------------------------------------------------------------------+
double GetDataMACD(string symbol_name, int timeframe, int mode, int shift) {
return(iMACD(symbol_name,timeframe,fastEMA_MACD,slowEMA_MACD,periodSignalMACD,AppledPriceMACD,mode,shift));
}
//+------------------------------------------------------------------+
int GetExtremumsUpper(string symbol_name, ENUM_TIMEFRAMES timeframe, const int &total, int bar_b, MqlRates &array[]) {
int bars=Bars(symbol_name,timeframe);
int total_tf=fmin(total,bars);
int begin=bar_b-numBarAccuracy; // íîìåð áàðà, ñ êîòîðîãî íà÷èíàåì ïîèñê ýêñòðåìóìà öåíû
if(begin<1) begin=1; // êîððåêòèðóåì çíà÷åíèå begin äëÿ ïðåäîòâðàùåíèÿ âûõîäà çà ïðåäåëû èñòîðè÷åñêèõ äàííûõ
int end=begin+numBarAccuracy*2; // íîìåð áàðà, íà êîòîðîì çàêàí÷èâàåì ïîèñê ýêñòðåìóìà öåíû
if(end>total_tf-2) end=total_tf-2; // êîððåêòèðóåì çíà÷åíèå end äëÿ ïðåäîòâðàùåíèÿ âûõîäà çà ïðåäåëû èñòîðè÷åñêèõ äàííûõ
int count=end-begin; // êîëè÷åñòâî áàðîâ, íà êîòîðûõ èñêàòü ýêñòðåìóì öåíû
//---
int n=0;
ArrayResize(array,n,numBarAccuracy*2);
//--- ïîèùåì ýêñòðåìóìû è çàïîëíèì íàéäåííûìè ìàññèâ array
for(int j=begin; j<=end; j++) {
if(j>total_tf-2) break;
double a=GetPriceHigh(symbol_name,timeframe,j+1);
double b=GetPriceHigh(symbol_name,timeframe,j);
double c=GetPriceHigh(symbol_name,timeframe,j-1);
int extr=GetDirectionExtremum(a,b,c);
if(extr==OP_SELL) {
n++; ArrayResize(array,n);
array[n-1].high=b;
array[n-1].close=GetPriceClose(symbol_name,timeframe,j);
array[n-1].time=GetTimeOpen(symbol_name,timeframe,j);
}
}
//--- åñëè íè îäèí ýêñòðåìóì öåíû íå íàéäåí, íàéä¸ì ïðîñòî ìàêñèìàëüíóþ öåíó íà èñêîìîì ïðîìåæóòêå count
if(ArraySize(array)==0) {
ArrayResize(array,1); // ñäåëàåì ðàçìåð ìàññèâà array ðàâíûì 1
MqlRates data[]; // ñþäà áóäåì çàïèñûâàòü âñå äàííûå çà èñêîìûé ïðîìåæóòîê áàðîâ count
if(CopyRates(symbol_name,timeframe,begin,count,data)>0) {
double max=data[0].high;
datetime t=data[0].time;
for(int j=1; j<ArraySize(data); j++) {
if(data[j].high>max) {
max=data[j].high;
t=data[j].time;
}
}
array[0].high=max;
array[0].time=t;
}
}
return(ArraySize(array));
}
//+------------------------------------------------------------------+
int GetExtremumsLower(string symbol_name, ENUM_TIMEFRAMES timeframe, const int &total, int bar_b, MqlRates &array[]) {
int bars=Bars(symbol_name,timeframe);
int total_tf=fmin(total,bars);
int begin=bar_b-numBarAccuracy; // íîìåð áàðà, ñ êîòîðîãî íà÷èíàåì ïîèñê ýêñòðåìóìà öåíû
if(begin<1) begin=1; // êîððåêòèðóåì çíà÷åíèå begin äëÿ ïðåäîòâðàùåíèÿ âûõîäà çà ïðåäåëû èñòîðè÷åñêèõ äàííûõ
int end=begin+numBarAccuracy*2; // íîìåð áàðà, íà êîòîðîì çàêàí÷èâàåì ïîèñê ýêñòðåìóìà öåíû
if(end>total_tf-2) end=total_tf-2; // êîððåêòèðóåì çíà÷åíèå end äëÿ ïðåäîòâðàùåíèÿ âûõîäà çà ïðåäåëû èñòîðè÷åñêèõ äàííûõ
int count=(end-begin)+1; // êîëè÷åñòâî áàðîâ, íà êîòîðûõ èñêàòü ýêñòðåìóì öåíû
//---
int n=0;
ArrayResize(array,n,numBarAccuracy*2);
for(int j=begin; j<=end; j++) {
if(j>total_tf-2) break;
double a=GetPriceLow(symbol_name,timeframe,j+1);
double b=GetPriceLow(symbol_name,timeframe,j);
double c=GetPriceLow(symbol_name,timeframe,j-1);
int extr=GetDirectionExtremum(a,b,c);
if(extr==OP_BUY) {
n++; ArrayResize(array,n);
array[n-1].low=b;
array[n-1].close=GetPriceClose(symbol_name,timeframe,j);
array[n-1].time=GetTimeOpen(symbol_name,timeframe,j);
}
}
//--- åñëè íè îäèí ýêñòðåìóì öåíû íå íàéäåí, íàéä¸ì ïðîñòî ìèíèìàëüíóþ öåíó íà èñêîìîì ïðîìåæóòêå count
if(ArraySize(array)==0) {
ArrayResize(array,1); // ñäåëàåì ðàçìåð ìàññèâà array ðàâíûì 1
MqlRates data[]; // ñþäà áóäåì çàïèñûâàòü âñå äàííûå çà èñêîìûé ïðîìåæóòîê áàðîâ count
if(CopyRates(symbol_name,timeframe,begin,count,data)>0) {
double min=data[0].low;
datetime t=data[0].time;
for(int j=1; j<ArraySize(data); j++) {
if(data[j].low<min) {
min=data[j].low;
t=data[j].time;
}
}
array[0].low=min;
array[0].time=t;
}
}
return(ArraySize(array));
}
//+------------------------------------------------------------------+
int GetDirectionExtremum(double a, double b, double c, bool null_flag=true) {
//--- åñëè åñòü íóëåâàÿ ëèíèÿ â èíäèêàòîðå
if(null_flag) {
if((a-b)*(b-c)<0) {
if(c>b) return(OP_BUY);
if(c<b) return(OP_SELL);
}
}
//--- åñëè íåò íóëåâîé ëèíèè â èíäèêàòîðå
else {
if((a>b && b<=c)/* || (a>=b && b<c)*/) return(OP_BUY);
if((a<b && b>=c)/* || (a<=b && b>c)*/) return(OP_SELL);
}
return(EMPTY);
}
//+------------------------------------------------------------------+
int GetWindowNumber(string name="") {
return(WindowFind(name));
}
//+------------------------------------------------------------------+
void SetTLine(const long chart_id, const string name, color line_color, const int sub_window,
datetime line_time1, double line_price1, datetime line_time2, double line_price2, int line_width=1,
string tooltip="\n", int line_style=STYLE_SOLID, bool line_ray_right=false, bool line_ray_left=false,
string line_text="", bool selection=false, bool hidden=true) {
if(ObjectFind(chart_id,name)<0) ObjectCreate(chart_id, name, OBJ_TREND, sub_window, 0, 0, 0, 0);
ObjectSetInteger(chart_id,name,OBJPROP_TIME1,line_time1);
ObjectSetDouble(chart_id,name,OBJPROP_PRICE1,line_price1);
ObjectSetInteger(chart_id,name,OBJPROP_TIME2,line_time2);
ObjectSetDouble(chart_id,name,OBJPROP_PRICE2,line_price2);
ObjectSetInteger(chart_id,name,OBJPROP_COLOR,line_color);
ObjectSetInteger(chart_id,name,OBJPROP_RAY_RIGHT,line_ray_right);
ObjectSetInteger(chart_id,name,OBJPROP_RAY_LEFT,line_ray_left);
ObjectSetInteger(chart_id,name,OBJPROP_STYLE,line_style);
ObjectSetInteger(chart_id,name,OBJPROP_WIDTH,line_width);
ObjectSetString(chart_id,name,OBJPROP_TEXT,line_text);
ObjectSetString(chart_id,name,OBJPROP_FONT,"Tahoma");
ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,selection);
ObjectSetInteger(chart_id,name,OBJPROP_HIDDEN,hidden);
ObjectSetString(chart_id,name,OBJPROP_TOOLTIP,tooltip);
}
//+------------------------------------------------------------------+
datetime GetTimeOpen(string symbol_name, ENUM_TIMEFRAMES timeframe, int index) {
datetime array[1]={-1};
ResetLastError();
if(CopyTime(symbol_name,timeframe,index,1,array)==1) return(array[0]);
Print(__FUNCTION__," > Îøèáêà ïîëó÷åíèÿ âðåìåíè áàðà ",GetLastError());
return(-1);
}
//+------------------------------------------------------------------+
double GetPriceOpen(string symbol_name, ENUM_TIMEFRAMES timeframe, int index) {
double array[1]={-1};
ResetLastError();
if(CopyOpen(symbol_name,timeframe,index,1,array)==1) return(array[0]);
Print(__FUNCTION__," > Îøèáêà ïîëó÷åíèÿ öåíû Open ",GetLastError());
return(-1);
}
//+------------------------------------------------------------------+
double GetPriceHigh(string symbol_name, ENUM_TIMEFRAMES timeframe, int index) {
double array[1]={-1};
ResetLastError();
if(CopyHigh(symbol_name,timeframe,index,1,array)==1) return(array[0]);
Print(__FUNCTION__," > Îøèáêà ïîëó÷åíèÿ öåíû High ",GetLastError());
return(-1);
}
//+------------------------------------------------------------------+
double GetPriceLow(string symbol_name, ENUM_TIMEFRAMES timeframe, int index) {
double array[1]={-1};
ResetLastError();
if(CopyLow(symbol_name,timeframe,index,1,array)==1) return(array[0]);
Print(__FUNCTION__," > Îøèáêà ïîëó÷åíèÿ öåíû Low ",GetLastError());
return(-1);
}
//+------------------------------------------------------------------+
double GetPriceClose(string symbol_name, ENUM_TIMEFRAMES timeframe, int index) {
double array[1]={-1};
ResetLastError();
if(CopyClose(symbol_name,timeframe,index,1,array)==1) return(array[0]);
Print(__FUNCTION__," > Îøèáêà ïîëó÷åíèÿ öåíû Close ",GetLastError());
return(-1);
}
//+------------------------------------------------------------------+
int GetBarShift(const string symbol_name, const ENUM_TIMEFRAMES timeframe, const datetime time) {
int res=-1;
datetime last_bar;
if(SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE,last_bar)) {
if(time>last_bar) res=0;
else {
const int shift=Bars(symbol_name,timeframe,time,last_bar);
if(shift>0) res=shift-1;
}
}
return(res);
}
//+------------------------------------------------------------------+
string GetNameTF(int timeframe=PERIOD_CURRENT) {
if(timeframe==PERIOD_CURRENT) timeframe=Period();
switch(timeframe) {
//--- MQL4
case 1: return("M1");
case 5: return("M5");
case 15: return("M15");
case 30: return("M30");
case 60: return("H1");
case 240: return("H4");
case 1440: return("D1");
case 10080: return("W1");
case 43200: return("MN");
//--- MQL5
case 2: return("M2");
case 3: return("M3");
case 4: return("M4");
case 6: return("M6");
case 10: return("M10");
case 12: return("M12");
case 16385: return("H1");
case 16386: return("H2");
case 16387: return("H3");
case 16388: return("H4");
case 16390: return("H6");
case 16392: return("H8");
case 16396: return("H12");
case 16408: return("D1");
case 32769: return("W1");
case 49153: return("MN");
default: return("UnknownPeriod");
}
}
//+------------------------------------------------------------------+
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
---