//+------------------------------------------------------------------+
//| FivePattern.mq5 |
//| Copyright 2014, A. Emelyanov |
//| A.Emelyanov2010@yandex.ru |
//+------------------------------------------------------------------+
//| Indicator: Ì & W Wave Patterns by A. Merrill |
//| Ïåðâîèñòî÷íèê: |
//| Ì & W Wave Patterns by Arthur A. Merrill, Chappaqua, |
//| N.Y.: Analysis Press, 1983 |
//+------------------------------------------------------------------+
//| Now version 2.01 - stable, for trade. |
//| Prev. version 1.XX - for test. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, A. Emelyanov"
#property link "A.Emelyanov2010@yandex.ru"
#property version "2.01"
//+------------------------------------------------------------------+
//| Ïîäêëþ÷àåìûå ðåñóðñû (èêîíêà) |
//+------------------------------------------------------------------+
//#property icon "\\Images\\fp.ico"
//+------------------------------------------------------------------+
//| Îïèñàíèå èíäèêàòîðà (èíñòðóêöèÿ ïîëüçîâàòåëÿ) |
//+------------------------------------------------------------------+
#property description "Ì and W Wave Patterns by A. Merrill.\n"
#property description "¹ Name Indicator buffers:"
#property description "0 ExtPointE[] - Point E;"
#property description "1 ExtDeltaDE[] - Delta DE;"
#property description "2 ExtEvolution[] - Point Evolution;"
#property description "3 ExtMutation[] - Point Mutation;"
#property description "4 ExtSumModel[] = Count_Evolution/(Count_Evolution + Count_Mutation)."
//+------------------------------------------------------------------+
//| Îñíîâíûå ñâîéñòâà èíäèêàòîðà |
//+------------------------------------------------------------------+
#property indicator_buffers 5
#property indicator_plots 5
#property indicator_label1 "Point E"
#property indicator_type1 DRAW_NONE
#property indicator_label2 "Delta DE"
#property indicator_type2 DRAW_NONE
#property indicator_label3 "Evolution"
#property indicator_type3 DRAW_NONE
#property indicator_label4 "Mutation"
#property indicator_type4 DRAW_NONE
#property indicator_label5 "Sum Model"
#property indicator_type5 DRAW_NONE
//+------------------------------------------------------------------+
//| Ïîäêëþ÷àåìûå áèáëèîòåêè |
//+------------------------------------------------------------------+
#include <MyMath\Pattern\MyCPatternZigzag.mqh>
#include <MyArrays\MyCListPattern.mqh>
#include <MyObjects\MyCComment.mqh>
//+------------------------------------------------------------------+
//| input parameters |
//+------------------------------------------------------------------+
//--- Main
input int Depth = 24; // Zigzag: Øèðèíà îêíà ïîèñêà(Depth)
input int Deviation = 12; // Zigzag: Èçìåíåíèå öåíû â ïóêòàõ(Deviation)
input int Backstep = 9; // Zigzag: Îòñóòï îò íà÷àëà äàííûõ(Backstep)
sinput int HistSize = 500; // Zigzag: Ðàçìåð èñòîðèè äëÿ ðàñ÷åòîâ
//--- Arrow
sinput color ColorArrow = clrBlue; // Öâåò ïàòòåðíûõ òî÷åê
//--- Trend
sinput color ColorTrend = clrGold; // Öâåò ïàòòåðíîé ëèíèè
sinput int WidthTrend = 2; // Òîëùèíà ïàòòåðíîé ëèíèè
sinput bool BackTrend = true; // Çàäíèé ïëàí äëÿ ïàòòåðíîé ëèíèè
sinput ENUM_LINE_STYLE StyleTrend = STYLE_SOLID;// Ñòèëü ïàòòåðíîé ëèíèè
//--- HLine
sinput color ColorUpHLine = clrBlue;// Öâåò ëèíèè ñîïðîòèâëåíèÿ
sinput color ColorDownHLine = clrRed; // Öâåò ëèíèè ïîääåðæêè
sinput int WidthHLine = 2; // Òîëùèíà ëèíèé óðîâíÿ
sinput bool BackHLine = true; // Çàäíèé ïëàí äëÿ ëèíèé óðîâíÿ
sinput ENUM_LINE_STYLE StyleHLine = STYLE_SOLID;// Ñòèëü ëèíèé óðîâíÿ
//+------------------------------------------------------------------+
//| Ãëîáàëüíûå ïåðåìåííûå |
//+------------------------------------------------------------------+
int Line = 1; // Íîìåð ïåðâîé ñòðîêè êîììåíòàðèÿ
MyCPatternZigzag* MyPatternZigzag; // Êëàññ: ìîäåëè ïàòòåðíîé ñèñòåìû
MyCListPattern* MyListPattern; // Êëàññ: õðàíèëèùå ãðàôè÷åñêèõ îáúåêòîâ
MyCComment* MyComment; // Êëàññ: êîììåíòàðèÿ
//+------------------------------------------------------------------+
//|Áóôåðà äëÿ èíäèêàòîðà(èñïîëüçîâàòü â ãåíåðàòîðå òîðãîâûõ ñèãíàëîâ)|
//+------------------------------------------------------------------+
double ExtPointE[]; // Áóôåð: äëÿ õðàíåíèÿ òî÷êè E
double ExtDeltaDE[]; // Áóôåð: äëÿ õðàíåíèÿ äëèíû âîëíû D-E(â ïóíêòàõ!)
double ExtEvolution[]; // Áóôåð: äëÿ õðàíåíèÿ ýâîëþöèé
double ExtMutation[]; // Áóôåð: äëÿ õðàíåíèÿ ìóòàöèé
double ExtSumModel[]; // Áóôåð: äëÿ õðàíåíèÿ ñ÷åò÷èêà-ìîäåëè
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Ïîäãîòîâêà ãðàôèêà öåí, ãðàôèê äîëæåí áûòü ñìåùåí îò ïðàâîãî óãëà, èíà÷å ïîëüçîâàòåëü íå óâèäèò ïðîãíîçà
if(!ChartShiftGet(0))
{
ChartShiftSet(true, 0);
}
//---
SetIndexBuffer(0,ExtPointE, INDICATOR_DATA);
SetIndexBuffer(1,ExtDeltaDE, INDICATOR_DATA);
SetIndexBuffer(2,ExtEvolution, INDICATOR_DATA);
SetIndexBuffer(3,ExtMutation, INDICATOR_DATA);
SetIndexBuffer(4,ExtSumModel, INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---
MyPatternZigzag= new MyCPatternZigzag;
MyComment = new MyCComment;
MyListPattern = new MyCListPattern;
//--- Main
MyPatternZigzag.SetDepth(Depth);
MyPatternZigzag.SetDeviation(Deviation);
MyPatternZigzag.SetBackstep(Backstep);
MyPatternZigzag.AddPointerCommet(MyComment);
MyPatternZigzag.SetNumberLineComment(Line); // íîìåð ñòðîêè êîììåíòà
MyPatternZigzag.SetSizeBuffers(HistSize);
//--- Arrow, HLine & Trend
MyListPattern.SetColorArrow(ColorArrow);
MyListPattern.SetColorTrend(ColorTrend);
MyListPattern.SetStyleTrend(StyleTrend);
MyListPattern.SetWidthTrend(WidthTrend);
MyListPattern.SetBackTrend(BackTrend);
MyListPattern.SetStyleHLine(StyleHLine);
MyListPattern.SetColorUpHLine(ColorUpHLine);
MyListPattern.SetColorDownHLine(ColorDownHLine);
MyListPattern.SetWidthHLine(WidthHLine);
MyListPattern.SetBackHLine(BackHLine);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Deinit |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
delete MyPatternZigzag;
delete MyListPattern;
delete MyComment;
}
//+------------------------------------------------------------------+
//| 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 > HistSize)
{
//--- åñòü ëè ÷òî ñ÷èòàòü? è áûë ëè ðàñ÷åò äî ýòîãî...
int nHowMush = rates_total-prev_calculated;
//--- Öèêë ïîäñ÷åòà
if(nHowMush > 0)
{
//--- Âðåìåííûå ïåðåìåííûå
double new_high[],new_low[];
datetime new_time[];
//--- Îïðåäåëÿåì ðàçìåð áóôåðîâ
ArrayResize(new_high,HistSize,0);
ArrayResize(new_low,HistSize,0);
ArrayResize(new_time,HistSize,0);
//--- Óçíàåì îò ÊÓÄÀ è ÑÊÎËÜÊÎ ñ÷èòàòü
int nStart = 0; // Èíäåêñ íà÷àëà ðàñ÷åòîâ(îêîí÷àíèå)
int nCopy = 0; // Èíäåêñ ñ êîòîðîãî íà÷èíàåòñÿ êîïèðîâàíèå âî âðåìåííûå áóôåðà
if(prev_calculated == 0)
{//--- Íà÷àëî ðàñ÷åòîâ
nStart = HistSize - 1;
}else
{//--- Ïðîäîëæåíèå ðàñ÷åòîâ
nStart = prev_calculated - 1;
}
//--- Ïîäñ÷åò
for(;nStart<rates_total;nStart++)
{
//--- Ìåñòî îò êóäà íà÷èíàòü êîïèðîâàòü
nCopy = 1+nStart-HistSize;
//--- Êîïèðîâàíèå äàííûõ
ArrayCopy(new_low, low, 0,nCopy,HistSize);
ArrayCopy(new_high,high,0,nCopy,HistSize);
ArrayCopy(new_time,time,0,nCopy,HistSize);
//--- Ðàñ÷åò
MyPatternZigzag.GetNamePattern(new_high,new_low,new_time);
//--- Çàïîìèíàåì äàííûå: Evolution, Mutation, SumModel
double dwDE = MathAbs(MyPatternZigzag.GetE()-MyPatternZigzag.GetD());
dwDE = dwDE/_Point;
ExtDeltaDE[nStart] = dwDE; // Áóôåð äëÿ õðàíåíèÿ äëèíû âîëíû D-E
ExtPointE[nStart] = MyPatternZigzag.GetE(); // Áóôåð äëÿ õðàíåíèÿ òî÷êè E
ExtEvolution[nStart] = MyPatternZigzag.GetPointEvolution();// Áóôåð äëÿ õðàíåíèÿ ýâîëþöèé
ExtMutation[nStart] = MyPatternZigzag.GetPointMutation(); // Áóôåð äëÿ õðàíåíèÿ ìóòàöèé
ExtSumModel[nStart] = MyPatternZigzag.GetSumModel(); // Áóôåð äëÿ õðàíåíèÿ ñ÷åò÷èêà-ìîäåëè
}
//--- Âûâîä ãðàôèêè
DrawPattern();
}
}else
{
return(0);
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| Ôóíêöèÿ äëÿ îòîáðàæåíèÿ ðàñ÷åòîâ íà ãðàôèêå |
//+------------------------------------------------------------------+
void DrawPattern(void)
{
//--- 1. âûâîäèì íà ýêðàí êîììåíò
MyPatternZigzag.PrintComment();
//--- 2. âûâîäèì íà ýêðàí ãðàôèêó
MyListPattern.Insert(MyPatternZigzag.GetA(), MyPatternZigzag.GetTimeA(),
MyPatternZigzag.GetB(), MyPatternZigzag.GetTimeB(),
MyPatternZigzag.GetC(), MyPatternZigzag.GetTimeC(),
MyPatternZigzag.GetD(), MyPatternZigzag.GetTimeD(),
MyPatternZigzag.GetE(), MyPatternZigzag.GetTimeE(),
MyPatternZigzag.GetPointEvolution(),MyPatternZigzag.GetTimeEvolution(),
MyPatternZigzag.GetPointMutation(), MyPatternZigzag.GetTimeMutation());
}
//+------------------------------------------------------------------+
//| Ôóíêöèÿ îïðåäåëÿåò, âêëþ÷åí ëè ðåæèì îòîáðàæåíèÿ öåíîâîãî ãðàôèêà|
//| ñ îòñòóïîì îò ïðàâîãî êðàÿ. |
//+------------------------------------------------------------------+
bool ChartShiftGet(long chart_ID=0)
{
//--- ïîäãîòîâèì ïåðåìåííóþ äëÿ ïîëó÷åíèÿ çíà÷åíèÿ ñâîéñòâà
long value;
//--- ñáðîñèì çíà÷åíèå îøèáêè
ResetLastError();
//--- ïîëó÷èì çíà÷åíèå ñâîéñòâà
if(!ChartGetInteger(chart_ID,CHART_SHIFT,0,value))
{
//--- âûâåäåì ñîîáùåíèå îá îøèáêå â æóðíàë "Ýêñïåðòû"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- ïðîâåðèì value... :-)
if(value <= 0) return(false);
//--- óñïåøíîå âûïîëíåíèå
return(true);
}
//+------------------------------------------------------------------+
//| Ôóíêöèÿ âêëþ÷àåò/âûêëþ÷àåò ðåæèì îòîáðàæåíèÿ öåíîâîãî ãðàôèêà ñ |
//| îòñòóïîì îò ïðàâîãî êðàÿ. |
//+------------------------------------------------------------------+
bool ChartShiftSet(bool value, long chart_ID=0)
{
//--- ñáðîñèì çíà÷åíèå îøèáêè
ResetLastError();
//--- óñòàíîâèì çíà÷åíèå ñâîéñòâà
if(!ChartSetInteger(chart_ID,CHART_SHIFT,0,value))
{
//--- âûâåäåì ñîîáùåíèå îá îøèáêå â æóðíàë "Ýêñïåðòû"
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- óñïåøíîå âûïîëíåíèå
return(true);
}
//+------------------------------------------------------------------+
Comments