Author: Copyright 2016, Roman Korotchenko
0 Views
0 Downloads
0 Favorites
singularma
//+------------------------------------------------------------------+
//|                                                   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