//+------------------------------------------------------------------+
//| SingularMA.mq5 |
//| Copyright 2016, Roman Korotchenko |
//| https://login.mql5.comru/users/Solitonic |
//| Revision 26 Jun 2016 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Roman Korotchenko"
#property link "https://login.mql5.com/ru/users/Solitonic"
#property version "1.00"
#property indicator_chart_window //---- îòðèñîâêà èíäèêàòîðà â îñíîâíîì îêíå
#property indicator_buffers 1 //---- äëÿ ðàñ÷¸òà è îòðèñîâêè èíäèêàòîðà
#property indicator_plots 1 //---- èñïîëüçîâàíî âñåãî îäíî ãðàôè÷åñêîå ïîñòðîåíèå
//--- plot Trend
#property indicator_label1 "Trend SSA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 3 //---- òîëùèíà ëèíèè èíäèêàòîðà ðàâíà
#include <SSA\CCaterpillar.mqh>
//--- input parameters
input ENUM_TIMEFRAMES period= PERIOD_CURRENT; // Calculation period to build the chart
input ENUM_TIMEFRAMES period_to_redraw=PERIOD_M3; // Refresh period chart
input int SegmentLength=120; // Ôðàãìåíò èñòîðèè
input int SegmentLag=50; // Îêíî (â ïðåäåëàõ îò 1/4 äî 1/2 äëèíû ñåãìåíòà)
input int EigMax=10; // ×èñëî ìîä (ðàçìåðíîñòü ïîäïðîñòðàíñòâà ñèãíàëà. "Âíå" - îøèáêè)
input double EigNoiseLevel=2.0; // Äîïóñêàåìûé ïðîöåíò âêëàäà øóìà â ñóììàðíóþ "ýíåðãèþ êîëåáàíèé" ðÿäà
input int EigNoiseFlag =0; // Ìåòîä îãðàíè÷åíèÿ ÷èñëà ìîä
// 0 - óêàçàíà ðàçìåðíîñòü ïðîñòðàíñòâà ñèãíàëà [EigMin,EigMax]. EigNoiseLevel èãíîðèðóåòñÿ.
// 1 - ïîäáèðàåòñÿ èñõîäÿ èç çàäàííîé îøèáêè EigNoiseLevel äëÿ îòäåëüíîé ôóíêöèè â ñîñòàâå ñèãíàëà.
// 2 - ïîäáèðàåòñÿ èñõîäÿ èç çàäàííîé îøèáêè EigNoiseLevel äëÿ íàáîðà ôóíêöèé â ñîñòàâå ñèãíàëà.
//--- indicator buffers
double TrendBuffer[];
double ResultBuffer[];
//-- êëàññ ðàñ÷åòà SSA - òðåíäà
CCaterpillar Caterpillar;
//--- âñïîìîãàòåëüíûå ïåðåìåííûå
int EigMin=1;
double wrkData[];
int OldSegmentLength;
int OldSegmentLag;
//
datetime start_data; // Start time to build the chart
datetime stop_data; // Òåêóùåå âðåìÿ
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,TrendBuffer,INDICATOR_DATA);
//ArraySetAsSeries(TrendBuffer,true);
//--- äîáàâëÿåì áóôåð äëÿ êîïèðîâàíèÿ äàííûõ î öåíàõ, äëà ðàñ÷åòà
// SetIndexBuffer(1,ResultBuffer,INDICATOR_CALCULATIONS);
OldSegmentLength = 0;
OldSegmentLag = 0;
ArrayResize(wrkData ,SegmentLength, SERIA_DFLT_LENGTH);
ArrayResize(ResultBuffer,SegmentLength, SERIA_DFLT_LENGTH);
//--- ãðàôèêà
string shortname;
StringConcatenate(shortname, "SSA(", SegmentLength, ",", SegmentLag, ")", "C.Ô. 1-", EigMax);
//--- ñîçäàíèå ìåòêè äëÿ îòîáðàæåíèÿ â DataWindow
PlotIndexSetString(0, PLOT_LABEL, shortname);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
static int reCalcOn = 0, curCalcFinish = 1;
static int ReCalcLim = 7;
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[])
{
int idx, nshift, ntime;
int fEigMin = 1; // Äëÿ òðåíäà äîëæíà áûòü = 1
int fEigMax = EigMax; // îãðàíè÷åíèå âåêòîðîâ. Ãëàäêîñòü
//--- ïîëó÷èì êîëè÷åñòâî äîñòóïíûõ áàðîâ äëÿ òåêóùèõ ñèìâîëà è ïåðèîäà íà ãðàôèêå
// int nbars=Bars(Symbol(),0);
if( rates_total < SegmentLength ) {
PrintFormat("×èñëî äàííûõ ìåíüøå äëèíû èíäèêàòîðà. Áåç ðàñ÷åòà.");
return(0);
}
reCalcOn++;
//if(reCalcOn != 1 ) curCalcFinish = 0; else curCalcFinish = 1;
curCalcFinish = (reCalcOn != 1 )? 0:1; // Áóäåì ñ÷èòàòü òðåíä íå êàæäûé ïðèõîä äàííûõ, à ñ ïåðèîäîì
reCalcOn = MathMod(reCalcOn, ReCalcLim); // êàæäûå 7 íîâûõ îòñ÷åòîâ
if (!curCalcFinish) // ïðåäûäóùèé ðàñ÷åò íå çàêîí÷åí
{
if(prev_calculated != 0) {
ArrayCopy(TrendBuffer,ResultBuffer,rates_total-SegmentLength,0,SegmentLength);
}
else { // èñòîðè÷åñêèå äàííûå áûëè èçìåíåíû
ArrayFill (TrendBuffer,0, rates_total, EMPTY_VALUE); // Çà÷èñòêà
}
return(rates_total); // Íîâûå äàííûå ïîñòóïàþò áûñòðåå ðàñ÷åòà
}
//---------------------------------------------------------------------------
//---- Èçìåíèëàñü äëèíà òðåíäà
if(ArraySize(wrkData)< SegmentLength)
{
ArrayResize(wrkData ,SegmentLength, SERIA_DFLT_LENGTH);
reCalcOn = 1;
}
if(OldSegmentLength != SegmentLength || OldSegmentLag != SegmentLag)
{
Caterpillar.TrendSize(SegmentLength, SegmentLag);
OldSegmentLength = SegmentLength;
OldSegmentLag = SegmentLag;
reCalcOn = 1;
if(ArraySize(ResultBuffer)< SegmentLength) {
ArrayResize(ResultBuffer,2*SegmentLength, SERIA_DFLT_LENGTH);
}
ArrayFill(ResultBuffer,0, SegmentLength, EMPTY_VALUE); // Çà÷èñòêà
ArrayFill(TrendBuffer, 0, rates_total, EMPTY_VALUE); // Çà÷èñòêà
}
curCalcFinish = 0; // áëîêèðóåì çàïðîñ íîâîãî ðà÷åòà, ïîêà íå âûïîëíåí òåêóùèé
ntime = ArraySize(time); // ýêâèâàëåíòíî rates_total
nshift = ntime - SegmentLength; // íà÷àëüíûé èíäåêñ äëÿ êîíå÷íîãî îòðåçêà äàííûõ
for( int i=0; i<SegmentLength; i++)
{
idx = i+nshift;
wrkData[i] = (high[idx] + low[idx] + close[idx])/3;
}
// EigNoiseFlag: 0 (óêàçàíà ðàçìåðíîñòü ïðîñòðàíñòâà ñèãíàëà) èëè 1,2 (ïîäáèðàåòñÿ èñõîäÿ èç äîïóñêàåìîãî øóìà EigNoiseLevel)
// åñëè EigNoiseFlag = 1,2 EigNoiseLevel äîëæíà áûòü â ïðîöåíòàõ! Èíà÷å ýòèì ïàðàìåòðîì ïðåíåáðåãàåòñÿ.
Caterpillar.SetNoiseRegime(EigNoiseFlag, EigNoiseLevel);
// Ðàçëîæåíèå è âîññòàíîâëåíèå â îãðàíè÷åíîì ïîäïðîñòðàíñòâå
Caterpillar.DoAnalyse(wrkData, SegmentLength, SegmentLag, fEigMin, fEigMax);
start_data = time[nshift];
stop_data = time[nshift+SegmentLength-1];
ArrayFill(ResultBuffer,0, SegmentLength, EMPTY_VALUE);
for( int i= 0; i<SegmentLength; i++)
{
ResultBuffer[i] = Caterpillar.Trend[i];//(high[i] + close[i])/2;//
}
ArrayCopy(TrendBuffer,ResultBuffer,rates_total-SegmentLength,0,SegmentLength);
ChartRedraw(0); //--- ïåðèðåñîâêà ãðàôèêà
curCalcFinish = 1; // âîçìîæåí íîâûé ðàñ÷åò
return(rates_total);
}
//+------------------------------------------------------------------+
Comments