//+------------------------------------------------------------------+
//| GannSwingsVIII.mq5 |
//| Copyright © 2005, Rosh |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
//--- àâòîðñòâî èíäèêàòîðà
#property copyright "Copyright © 2005, Rosh"
//--- ññûëêà íà ñàéò àâòîðà
#property link "http://www.metaquotes.net"
//--- íîìåð âåðñèè èíäèêàòîðà
#property version "1.10"
//--- îòðèñîâêà èíäèêàòîðà â îñíîâíîì îêíå
#property indicator_chart_window
//--- äëÿ ðàñ÷åòà è îòðèñîâêè èíäèêàòîðà èñïîëüçîâàíî øåñòü áóôåðîâ
#property indicator_buffers 6
//--- èñïîëüçîâàíî ïÿòü ãðàôè÷åñêèõ ïîñòðîåíèé
#property indicator_plots 5
//+-----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè èíäèêàòîðà çèãçàãà |
//+-----------------------------------------------+
//--- îòðèñîâêà èíäèêàòîðà â âèäå ñåêöèè
#property indicator_type1 DRAW_SECTION
//--- â êà÷åñòâå öâåòà ëèíèè èíäèêàòîðà èñïîëüçîâàí Gold öâåò
#property indicator_color1 clrGold
//--- ëèíèÿ èíäèêàòîðà - íåïðåðûâíàÿ êðèâàÿ
#property indicator_style1 STYLE_SOLID
//--- òîëùèíà ëèíèè èíäèêàòîðà ðàâíà 2
#property indicator_width1 2
//--- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label1 "BinaryWave"
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè áû÷üåãî èíäèêàòîðà |
//+----------------------------------------------+
//--- îòðèñîâêà èíäèêàòîðà 2 â âèäå çíà÷êà
#property indicator_type2 DRAW_ARROW
//--- â êà÷åñòâå öâåòà ëèíèè èíäèêàòîðà èñïîëüçîâàí Blue öâåò
#property indicator_color2 clrBlue
//--- ëèíèÿ èíäèêàòîðà 2 - øòðèõ-ïóíêòèð
#property indicator_style2 STYLE_DASHDOTDOT
//--- òîëùèíà ëèíèè èíäèêàòîðà 2 ðàâíà 2
#property indicator_width2 2
//--- îòîáðàæåíèå ìåòêè ëèíèè èíäèêàòîðà
#property indicator_label2 "Upper"
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè ìåäâåæüåãî èíäèêàòîðà |
//+----------------------------------------------+
//--- îòðèñîâêà èíäèêàòîðà 3 â âèäå çíà÷êà
#property indicator_type3 DRAW_ARROW
//--- â êà÷åñòâå öâåòà ëèíèè èíäèêàòîðà èñïîëüçîâàí öâåò MediumVioletRed
#property indicator_color3 clrMediumVioletRed
//--- ëèíèÿ èíäèêàòîðà 3 - øòðèõ-ïóíêòèð
#property indicator_style3 STYLE_DASHDOTDOT
//--- òîëùèíà ëèíèè èíäèêàòîðà 3 ðàâíà 2
#property indicator_width3 2
//--- îòîáðàæåíèå ìåòêè ëèíèè èíäèêàòîðà
#property indicator_label3 "Lower"
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè áû÷üåãî èíäèêàòîðà |
//+----------------------------------------------+
//--- îòðèñîâêà èíäèêàòîðà 4 â âèäå çíà÷êà
#property indicator_type4 DRAW_ARROW
//--- â êà÷åñòâå öâåòà èíäèêàòîðà èñïîëüçîâàí öâåò DeepSkyBlue
#property indicator_color4 clrDeepSkyBlue
//--- òîëùèíà èíäèêàòîðà 4 ðàâíà 1
#property indicator_width4 1
//--- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label4 "Buy"
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè ìåäâåæüåãî èíäèêàòîðà |
//+----------------------------------------------+
//--- îòðèñîâêà èíäèêàòîðà 5 â âèäå çíà÷êà
#property indicator_type5 DRAW_ARROW
//--- â êà÷åñòâå öâåòà èíäèêàòîðà èñïîëüçîâàí öâåò Magenta
#property indicator_color5 clrMagenta
//--- òîëùèíà èíäèêàòîðà 5 ðàâíà 1
#property indicator_width5 1
//--- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label5 "Sell"
//+----------------------------------------------+
//| îáúÿâëåíèå ïåðå÷èñëåíèé |
//+----------------------------------------------+
enum Type
{
LITTLE=1, // ìàëàÿ
MIDLE, // ïðîìåæóòî÷íàÿ
MAIN // îñíîâíàÿ
};
//+----------------------------------------------+
//| Âõîäíûå ïàðàìåòðû èíäèêàòîðà |
//+----------------------------------------------+
input Type kind=LITTLE; // Òèï òåíäåíöèè
input bool MoveLastSwing=false; // Ñäâèã õâîñòà çèãçàãà ê íóëåâîìó áàðó äëÿ äâóõ îäèíàêîâûõ áàðîâ ïî High èëè Low
input int Shift=0; // Ñäâèã èíäèêàòîðà ïî ãîðèçîíòàëè â áàðàõ
//+----------------------------------------------+
//--- îáúÿâëåíèå äèíàìè÷åñêèõ ìàññèâîâ, êîòîðûå â äàëüíåéøåì
//--- áóäóò èñïîëüçîâàíû â êà÷åñòâå èíäèêàòîðíûõ áóôåðîâ
double SwingsBuffer[];
double HighsBuffer[];
double LowsBuffer[];
double TrendBuffer[];
double UpCloseOutSideBuffers[];
double DownCloseOutSideBuffers[];
//---
double SwingHigh,SwingLow;
int LastSwing,lowCounter,highCounter;
//--- îáúÿâëåíèå öåëî÷èñëåííûõ ïåðåìåííûõ íà÷àëà îòñ÷åòà äàííûõ
int min_rates_total;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- èíèöèàëèçàöèÿ ïåðåìåííûõ íà÷àëà îòñ÷åòà äàííûõ
min_rates_total=2;
//--- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
SetIndexBuffer(0,SwingsBuffer,INDICATOR_DATA);
//--- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà ïî ãîðèçîíòàëè íà Shift
PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
//--- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷åòà îòðèñîâêè èíäèêàòîðà
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
//--- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðàõ, êàê â òàéìñåðèÿõ
ArraySetAsSeries(SwingsBuffer,true);
//--- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
SetIndexBuffer(1,HighsBuffer,INDICATOR_DATA);
//--- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà ïî ãîðèçîíòàëè íà Shift
PlotIndexSetInteger(1,PLOT_SHIFT,Shift);
//--- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷åòà îòðèñîâêè èíäèêàòîðà
PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
//--- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðàõ, êàê â òàéìñåðèÿõ
ArraySetAsSeries(HighsBuffer,true);
//--- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
//--- ñèìâîë äëÿ èíäèêàòîðà
PlotIndexSetInteger(1,PLOT_ARROW,159);
//--- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
SetIndexBuffer(2,LowsBuffer,INDICATOR_DATA);
//--- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà ïî ãîðèçîíòàëè íà Shift
PlotIndexSetInteger(2,PLOT_SHIFT,Shift);
//--- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷åòà îòðèñîâêè èíäèêàòîðà
PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total);
//--- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðàõ, êàê â òàéìñåðèÿõ
ArraySetAsSeries(LowsBuffer,true);
//--- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
//--- ñèìâîë äëÿ èíäèêàòîðà
PlotIndexSetInteger(2,PLOT_ARROW,159);
//--- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
SetIndexBuffer(3,UpCloseOutSideBuffers,INDICATOR_DATA);
//--- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà ïî ãîðèçîíòàëè íà Shift
PlotIndexSetInteger(3,PLOT_SHIFT,Shift);
//--- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷åòà îòðèñîâêè èíäèêàòîðà
PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,min_rates_total);
//--- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðàõ, êàê â òàéìñåðèÿõ
ArraySetAsSeries(UpCloseOutSideBuffers,true);
//--- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,0);
//--- ñèìâîë äëÿ èíäèêàòîðà
PlotIndexSetInteger(3,PLOT_ARROW,108);
//--- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
SetIndexBuffer(4,DownCloseOutSideBuffers,INDICATOR_DATA);
//--- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà ïî ãîðèçîíòàëè íà Shift
PlotIndexSetInteger(4,PLOT_SHIFT,Shift);
//--- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷åòà îòðèñîâêè èíäèêàòîðà
PlotIndexSetInteger(4,PLOT_DRAW_BEGIN,min_rates_total);
//--- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðàõ, êàê â òàéìñåðèÿõ
ArraySetAsSeries(DownCloseOutSideBuffers,true);
//--- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
PlotIndexSetDouble(4,PLOT_EMPTY_VALUE,0);
//--- ñèìâîë äëÿ èíäèêàòîðà
PlotIndexSetInteger(4,PLOT_ARROW,108);
//--- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â áóôåð äëÿ õðàíåíèÿ äàííûõ
SetIndexBuffer(5,TrendBuffer,INDICATOR_CALCULATIONS);
//--- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðàõ, êàê â òàéìñåðèÿõ
ArraySetAsSeries(TrendBuffer,true);
//--- ñîçäàíèå èìåíè äëÿ îòîáðàæåíèÿ â îòäåëüíîì ïîäîêíå è âî âñïëûâàþùåé ïîäñêàçêå
IndicatorSetString(INDICATOR_SHORTNAME,"GannSwingsVIII");
//--- îïðåäåëåíèå òî÷íîñòè îòîáðàæåíèÿ çíà÷åíèé èíäèêàòîðà
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- çàâåðøåíèå èíèöèàëèçàöèè
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 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<min_rates_total) return(0);
//--- îáúÿâëåíèÿ ëîêàëüíûõ ïåðåìåííûõ
int limit,bar,maxbar;
bool nonOutSide;
//--- èíäåêñàöèÿ ýëåìåíòîâ â ìàññèâàõ, êàê â òàéìñåðèÿõ
ArraySetAsSeries(Close,true);
ArraySetAsSeries(Open,true);
ArraySetAsSeries(High,true);
ArraySetAsSeries(Low,true);
//---
maxbar=rates_total-min_rates_total-1;
//--- ðàñ÷åò ñòàðòîâîãî íîìåðà limit äëÿ öèêëà ïåðåñ÷åòà áàðîâ
if(prev_calculated>rates_total || prev_calculated<=0) // ïðîâåðêà íà ïåðâûé ñòàðò ðàñ÷åòà èíäèêàòîðà
{
limit=maxbar;
lowCounter=0;
highCounter=0; // ñòàðòîâûé íîìåð äëÿ ðàñ÷åòà âñåõ áàðîâ
LowsBuffer[limit]=Low[limit];
SwingsBuffer[limit]=High[limit];
SwingsBuffer[limit]=Low[limit];
SwingHigh=High[limit];
SwingLow=Low[limit];
LastSwing=0;
TrendBuffer[limit+1]=-1.0;
TrendBuffer[limit]=-1.0;
}
else
{
limit=maxbar;
lowCounter=0;
highCounter=0; // ñòàðòîâûé íîìåð äëÿ ðàñ÷åòà âñåõ áàðîâ
LowsBuffer[limit]=Low[limit];
SwingsBuffer[limit]=High[limit];
SwingsBuffer[limit]=Low[limit];
SwingHigh=High[limit];
SwingLow=Low[limit];
LastSwing=0;
TrendBuffer[limit+1]=-1.0;
TrendBuffer[limit]=-1.0;
}
//--- âîññòàíàâëèâàåì çíà÷åíèÿ ïåðåìåííûõ
LastSwing+=limit;
//--- îñíîâíîé öèêë ðàñ÷åòà èíäèêàòîðà
for(bar=limit; bar>=0 && !IsStopped(); bar--)
{
if(bar!=maxbar)
{
UpCloseOutSideBuffers[bar]=0.0;
DownCloseOutSideBuffers[bar]=0.0;
SwingsBuffer[bar]=0.0;
HighsBuffer[bar]=0.0;
LowsBuffer[bar]=0.0;
}
//---
nonOutSide=!((High[bar]>High[bar+1]) && (Low[bar]<Low[bar+1]));
if(!nonOutSide)
{
if(Close[bar]>Open[bar]) UpCloseOutSideBuffers[bar]=(High[bar]+Low[bar])/2.0;
else DownCloseOutSideBuffers[bar]=(High[bar]+Low[bar])/2.0;
}
//---
if(High[bar]>SwingHigh)
{
highCounter++;
SwingHigh=High[bar];
HighsBuffer[bar]=SwingHigh;
}
//---
if(Low[bar]<SwingLow)
{
lowCounter++;
SwingLow=Low[bar];
LowsBuffer[bar]=SwingLow;
}
//---
TrendBuffer[bar]=TrendBuffer[bar+1];// åñëè íå áóäóò èçìåíåíèé - òðåíä ñîõðàíèòñÿ
if(TrendBuffer[bar+1]==-1.0 && lowCounter==1)// && nonOutSide)
{
if(LastSwing!=maxbar) SwingsBuffer[LastSwing]=0.0; // çàòðåì ïðåäûäóùèé ñâèíã
LastSwing=bar;
SwingHigh=High[bar];
SwingLow=Low[bar];
highCounter=0;
lowCounter=0;
SwingsBuffer[bar]=Low[bar];
HighsBuffer[bar]=SwingHigh;
}
else
{
if(TrendBuffer[bar+1]==-1.0 && highCounter==kind)
{
LastSwing=bar;
SwingHigh=High[bar];
SwingLow=Low[bar];
TrendBuffer[bar]=+1.0;
highCounter=0;
lowCounter=0;
SwingsBuffer[bar]=High[bar];
LowsBuffer[bar]=SwingLow;
}
else
{
if(TrendBuffer[bar+1]==-1.0 && Low[bar]==SwingLow && MoveLastSwing)
{
SwingsBuffer[LastSwing]=0.0;
LastSwing=bar;
SwingsBuffer[bar]=Low[bar];
}
}
}
if(TrendBuffer[bar+1]==+1.0 && highCounter==1)// && nonOutSide)
{
if(LastSwing!=maxbar) SwingsBuffer[LastSwing]=0.0; // çàòðåì ïðåäûäóùèé ñâèíã
LastSwing=bar;
SwingHigh=High[bar];
SwingLow=Low[bar];
highCounter=0;
lowCounter=0;
SwingsBuffer[bar]=High[bar];
LowsBuffer[bar]=SwingLow;
// ïðîäîëæåíèå àïòðåíäà
}
else
{
if(TrendBuffer[bar+1]==+1.0 && lowCounter==kind)
{
LastSwing=bar;
SwingHigh=High[bar];
SwingLow=Low[bar];
TrendBuffer[bar]=-1.0;
highCounter=0;
lowCounter=0;
SwingsBuffer[bar]=Low[bar];
HighsBuffer[bar]=SwingHigh;
// ðàçâîðîò àïòðåíäà
}
else
{
if(TrendBuffer[bar+1]==1.0 && High[bar]==SwingHigh && MoveLastSwing)
{
SwingsBuffer[LastSwing]=0.0;
LastSwing=bar;
SwingsBuffer[bar]=High[bar];
}
}
}
}
//---
return(rates_total);
}
//+------------------------------------------------------------------+
Comments