sPPZ_levels_v1

Author: midorum, 2012
Indicators Used
Fractals
Miscellaneous
It opens Message Boxes to the user
0 Views
0 Downloads
0 Favorites
sPPZ_levels_v1
//-----------------------------------------------------------------------------------------------------
//sPPZ_levels_v1.mq4
//Ñêðèïò ðàñ÷åòà óðîâíåé PPZ ïî ôðàêòàëàì
//Àâòîð èäåè ðàñ÷åòà óðîâíåé: Dserg (http://www.mql4.com/ru/users/Dserg)
//-----------------------------------------------------------------------------------------------------
/*
Èäåÿ Dserg-à ïðàêòè÷åñêè ïîëíîñòüþ ñîõðàíåíà, îäíàêî àëãîðèòì íàïèñàí ñ íóëÿ, è ïîçâîëÿåò ìãíîâåííî ñòðîèòü ëþáîå êîëè÷åñòâî óðîâíåé íà ëþáîì ÷èñëå ôðàêòàëîâ.
Ñêðèïò çàïóñêàåòñÿ íà ãðàôèêå îäèí ðàç äëÿ ïîëó÷åíèÿ çàäàííîãî êîëè÷åñòâà PPZ óðîâíåé äëÿ òàéìôðåéìîâ D1, W1, MN1. Åñòü âîçìîæíîñòü ïîñòðîåíèÿ óðîâíåé òàêæå è äëÿ ïåðèîäîâ H1, H4.
 îïèñàíèè óðîâíåé óêàçûâàåòñÿ òàéìôðåéì, íà êîòîðîì îíè áûëè ñîçäàíû (ýòî îòðàæàåò âàæíîñòü óðîâíÿ), à òàêæå çíà÷åíèå êðèòåðèÿ îòáîðà - äèñïåðñèÿ (äëÿ îöåíêè êà÷åñòâà óðîâíÿ). ×åì ìåíüøå äèñïåðñèÿ óðîâíÿ, òåì êà÷åñòâåíåå îí.
Êðîìå òîãî, óêàçûâàåòñÿ íà ñêîëüêèõ ôðàêòàëàõ áûë ïîñòðîåí óðîâåíü, äëÿ âîçìîæíîñòè ñðàâíåíèÿ ðàçëè÷íûõ âàðèàíòîâ ïîñòðîåíèÿ.
Ïðè ïåðåêëþ÷åíèè íà ñòàðøèé ïåðèîä, óðîâíè ñ áîëåå ìåëêèõ ïåðèîäîâ ñêðûâàþòñÿ, ÷òîáû íå ìåøàëè âîñïðèÿòèþ.
Ïàðàìåòðû çàïóñêà ñêðèïòà:
num_levels - êîëè÷åñòâî óðîâíåé äëÿ îäíîãî òàéìôðåéìà; óâåëè÷åíèå ïàðàìåòðà äàåò âîçìîæíîñòü íàéòè äîïîëíèòåëüíûå óðîâíè, îäíàêî êà÷åñòâî êàæäîãî ïîñëåäóþùåãî áóäåò õóæå; ïàðàìåòð ñëåäóåò óâåëè÷èâàòü, êîãäà öåíà äâèæåòñÿ â "ïóñòîòó", äëÿ òîãî, ÷òîáû õîòÿ áû ïðèìåðíî îïðåäåëèòü öåëè
common_fractals - îáùåå êîëè÷åñòâî ðàññìàòðèâàåìûõ ôðàêòàëîâ; óâåëè÷åíèå ïàðàìåòðà äàåò ïîëó÷åíèå óðîâíåé ñ ìåíüøåé äèñïåðñèåé, ò.å. áîëåå êà÷åñòâåííûõ; ïðè ýòîì ìîãóò ïðîïàñòü "ñòàðûå" óðîâíè, ÷òîáû íàéòè è èõ ñëåäóåò óâåëè÷èòü num_levels
num_fractals - êîëè÷åñòâî ôðàêòàëîâ äëÿ ïîñòðîåíèÿ îäíîãî óðîâíÿ; òåîðåòè÷åñêè, ÷åì áîëüøå ôðàêòàëîâ ó÷àâñòâóåò â ïîñòðîåíèè óðîâíÿ, òåì êà÷åñòâåííåå óðîâåíü, îäíàêî äèñïåðñèÿ ïðè ýòîì ÷àñòî ñíèæàåòñÿ
fr_space - ìèíèìàëüíîå ðàññòîÿíèå ìåæäó ôðàêòàëàìè, èñïîëüçóåìûìè äëÿ ïîñòðîåíèÿ óðîâíÿ, â áàðàõ
start_bar - èíäåêñ áàðà, ñ êîòîðîãî íà÷èíàòü ïîäñ÷åò
start_period - ïåðèîä, ñ êîòîðîãî íàäî íà÷èíàòü èñêàòü óðîâíè: 0(÷àñû), 1(4 ÷àñà), 2(äíè, ïî-óìîë÷àíèþ), 3(íåäåëüêè), 4(ìåñÿöû)
DeleteAll - óñòàíîâèòå â true, åñëè âàì íå íðàâèòñÿ ðàáîòà ñêðèïòà è âû õîòèòå óäàëèòü âñå ýòî áåçîáðàçèå
 êîììåíòàðèé âûâîäÿòñÿ çíà÷åíèÿ âñåõ íàéäåííûõ óðîâíåé, ÷òîáû óáðàòü åãî, ïðîñòî ïåðåêëþ÷èòå òàéìôðåéì. Åñëè âû óâèäèòå â ðåçóëüòàòàõ ñëîâî "empty", çíà÷èò äëÿ ïîñòðîåíèÿ óðîâíÿ íå õâàòèëî ôðàêòàëîâ, óâåëè÷üòå ïàðàìåòð common_fractals.
Ïîìíèòå, ðàçóìíûå ïàðàìåòðû äàþò ðàçóìíûå ðåçóëüòàòû. ß, íàïðèìåð, íå îñîáî äîâåðÿþ óðîâíÿì ñ äèñïåðñèåé âûøå 0,00010000. Õîòÿ ó öåíû ñâîè ïðàâèëà.
*/
//-----------------------------------------------------------------------------------------------------

#property copyright "midorum, 2012"
#property link      "midorum@gmail.com"
#property show_inputs

#define @initial_disp 999999999

//êîëè÷åñòâî óðîâíåé - óâåëè÷åíèå ïàðàìåòðà äàåò âîçìîæíîñòü íàéòè äîïîëíèòåëüíûå óðîâíè, îäíàêî êà÷åñòâî êàæäîãî ïîñëåäóþùåãî áóäåò õóæå
//ïàðàìåòð ñëåäóåò óâåëè÷èâàòü, êîãäà öåíà äâèæåòñÿ â "ïóñòîòó", äëÿ òîãî, ÷òîáû õîòÿ áû ïðèìåðíî îïðåäåëèòü öåëè
//óâåëè÷åíèå ýòîãî ïàðàìåòðà íå âëèÿåò íà îïðåäåëåíèå "ñòàðûõ" óðîâíåé (óðîâíåé, îïðåäåëÿåìûõ ïðè ñòàðîì çíà÷åíèè ïàðàìåòðà)
extern string a0="Êîëè÷åñòâî ðàññ÷èòûâàåìûõ óðîâíåé";
extern int num_levels=10;
//êà÷åñòâî óðîâíåé - óâåëè÷åíèå ïàðàìåòðà äàåò ïîëó÷åíèå óðîâíåé ñ ìåíüøåé äèñïåðñèåé, ò.å. áîëåå êà÷åñòâåííûõ
//óâåëè÷åíèå ýòîãî ïàðàìåòðà ìîæåò ïîâëèÿòü íà îïðåäåëåíèå "ñòàðûõ" óðîâíåé, ââèäó íàõîæäåíèÿ äðóãèõ, áîëåå êà÷åñòâåííûõ óðîâíåé
//äëÿ òîãî, ÷òîáû íàéòè è "ñòàðûå" óðîâíè, íåîáõîäèìî óâåëè÷èòü êîëè÷åñòâî ðàññ÷èòûâàåìûõ óðîâíåé
extern string a1="Êîëè÷åñòâî ôðàêòàëîâ äëÿ ðàññìîòðåíèÿ";
extern int common_fractals=100;
//âëèÿíèå íà êà÷åñòâî óðîâíåé íå îïðåäåëåíî
//òåîðåòè÷åñêè, ÷åì áîëüøå ôðàêòàëîâ ó÷àâñòâóåò â ïîñòðîåíèè óðîâíÿ, òåì êà÷åñòâåííåå óðîâåíü, îäíàêî äèñïåðñèÿ ïðè ýòîì ÷àñòî ñíèæàåòñÿ
//èçìåíåíèå ýòîãî ïàðàìåòðà âëèÿåò íà îðåäåëåíèå "ñòàðûõ" óðîâíåé, ò.å. óðîâíè ðèñóþòñÿ â íîâûõ ìåñòàõ
extern string a2="Êîëè÷åñòâî ôðàêòàëîâ äëÿ ïîñòðîåíèÿ óðîâíÿ";
extern int num_fractals=4;
//èçìåíåíèå ýòîãî ïàðàìåòðà âëèÿåò íà îðåäåëåíèå "ñòàðûõ" óðîâíåé, ò.å. óðîâíè ðèñóþòñÿ â íîâûõ ìåñòàõ
extern string a3="Ìèíèìàëüíîå ðàññòîÿíèå ìåæäó ôðàêòàëàìè â áàðàõ";
extern int fr_space=5;
//
extern string a4="Ñìåùåíèå ïðàâîãî (íà÷àëüíîãî) áàðà";
extern int start_bar=0;
//
extern string a5="Íà÷àëüíûé ïåðèîä: 0(÷àñû)-4(ìåñÿöû)";
extern int start_period=2;
//
extern string a6="Óäàëèòü âñå ëèíèè ñêðèïòà ñ ãðàôèêà";
extern bool DeleteAll=false;

double fr[];
int fr_bar[];
double level[];
double disp[];
int sel_bar[];
int sel_fr[];
int cur_fr[];
double average,cur_disp;
int found,leftside;
bool exit=false;
int period[5]={PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
string str_period[5]={"hour","4hour","day","week","month"};
int visibility[5]={0x001f,0x003f,0x007f,0x00ff,0x01ff};
color period_color[5]={PaleGreen,PaleGreen,Coral,CornflowerBlue,DarkSlateBlue};
int period_width[5]={1,1,1,2,3};
int period_style[5]={1,1,0,0,0};
//-----------------------------------------------------------------------------------------------------
int start()
{
   int p;
   int l;
   int i,j,k;
   string _name,_report;

   if(DeleteAll)
   {
      ClearChart();
      Comment("");
      return(0);
   }
   i=MessageBox("Delete old ppz-levels?\nÓäàëèòü ñòàðûå ppz-óðîâíè?",NULL,0x00000024);
   if(i==6) ClearChart();

   if(ArrayResize(fr,common_fractals)==-1) exit=true;
   if(ArrayResize(fr_bar,common_fractals)==-1) exit=true;
   if(ArrayResize(level,num_levels)==-1) exit=true;
   if(ArrayResize(disp,num_levels)==-1) exit=true;
   if(ArrayResize(sel_bar,num_fractals)==-1) exit=true;
   if(ArrayResize(sel_fr,num_fractals)==-1) exit=true;
   if(ArrayResize(cur_fr,num_fractals)==-1) exit=true;
   if(exit)
   {
      MessageBox("Memory allocation error\nÎøèáêà ïðè âûäåëåíèè ïàìÿòè",NULL,0x00000030);
      return(-1);
   }

   for(p=start_period; p<5; p++)
   {
      _report=StringConcatenate(_report,str_period[p]," -");
      ArrayInitialize(disp,@initial_disp);
      j=iBars(NULL,period[p])-1;
      for(i=start_bar,found=0; i<j && found<common_fractals; i++)
      {
         fr[found]=iFractals(NULL,period[p],MODE_UPPER,i);
         if (fr[found]!=0)
         {
            fr_bar[found]=i;
            found++;
         }
         fr[found]=iFractals(NULL,period[p],MODE_LOWER,i);
         if (fr[found]!=0)
         {
            fr_bar[found]=i;
            found++;
         }
      }
      leftside=fr_bar[found-1];
      CombValue(fr,fr_bar,found);

      for(l=0; l<num_levels; l++)
      {
         if(l>0) CompressValue(fr,fr_bar,found);
         for(i=0; i<=found-num_fractals; i++)
         {
            average=0; cur_disp=0; ArrayInitialize(sel_bar,0);
            for(j=i,k=0; j<found && k<num_fractals; j++)
            {
               if(CheckIndex(fr_bar[j]))
               {
                  cur_fr[k]=j;
                  k++;
               }
            }
            if(j==found) break;
            for(j=0;j<num_fractals;j++) average+=fr[cur_fr[j]];
            average/=num_fractals;
            for(j=0;j<num_fractals;j++) cur_disp+=MathPow(fr[cur_fr[j]]-average,2);
            if(cur_disp<disp[l])
            {
               disp[l]=cur_disp;
               level[l]=average;
               for(j=0;j<num_fractals;j++) sel_fr[j]=cur_fr[j];
            }
         }
         for(i=0;i<num_fractals;i++) fr[sel_fr[i]]=0;
         if(disp[l]!=@initial_disp)
         {
            _name=StringConcatenate(str_period[p],"_ppz_",l,"_(",num_fractals,"fr)");
            ObjectCreate(_name,OBJ_HLINE,0,0,NormalizeDouble(level[l],Digits));
            ObjectSet(_name,OBJPROP_COLOR,period_color[p]);
            ObjectSet(_name,OBJPROP_WIDTH,period_width[p]);
            ObjectSet(_name,OBJPROP_STYLE,period_style[p]);
            ObjectSet(_name,OBJPROP_TIMEFRAMES,visibility[p]);
            ObjectSetText(_name,"disp:"+DoubleToStr(disp[l],8));
            _report=StringConcatenate(_report," ppz",l,"-",DoubleToStr(level[l],5));
         }
         else _report=StringConcatenate(_report," ppz",l,"-empty");
      }
      _report=StringConcatenate(_report,"\n");
      _name=str_period[p]+"_END";
      ObjectCreate(_name,OBJ_VLINE,0,iTime(NULL,period[p],leftside),0);
      ObjectSet(_name,OBJPROP_COLOR,DarkKhaki);
      ObjectSet(_name,OBJPROP_STYLE,STYLE_DOT);
      ObjectSet(_name,OBJPROP_TIMEFRAMES,visibility[p]);
   }
   Comment(_report);
   return(0);
}
//-----------------------------------------------------------------------------------------------------
void ClearChart()
{
   int i;
   string _name;
   for(i=ObjectsTotal()-1;i>=0;i--)
   {
      _name="_ppz_";
      if(StringFind(ObjectName(i),_name)!=-1) ObjectDelete(ObjectName(i));
      _name="_END";
      if(StringFind(ObjectName(i),_name)!=-1) ObjectDelete(ObjectName(i));
   }
   return;
}
//-----------------------------------------------------------------------------------------------------
void CombValue(double& _paramount[], int& _secondary[], int _size)
{
   int _jump=_size, i;
   bool _swapped=true;
   double _double;
   while (_jump>1 || _swapped)
   {
      if (_jump>1) _jump=_jump/1.25;
      _swapped=false;
      for(i=0; (i+_jump)<_size; i++)
      if(_paramount[i]>_paramount[i+_jump])
      {
         _double=_paramount[i]; _paramount[i]=_paramount[i+_jump]; _paramount[i+_jump]=_double;
         _double=_secondary[i]; _secondary[i]=_secondary[i+_jump]; _secondary[i+_jump]=_double;
         _swapped = true;
      }
   }
   return;
}
//-----------------------------------------------------------------------------------------------------
void CompressValue(double& _paramount[], int& _secondary[], int& _size)
{
   int i,j;
   double _double;
   for(i=_size-1; i>=0; i--)
   {
      if(_paramount[i]==0)
      {
         _size--;
         for(j=i; j<_size; j++)
         {
            _paramount[j]=_paramount[j+1];
            _secondary[j]=_secondary[j+1];
         }
      }
   }
   return;
}
//-----------------------------------------------------------------------------------------------------
bool CheckIndex(int _index)
{
   int i;
   for(i=0; i<num_fractals; i++)
   {
      if(sel_bar[i]!=0)
      {
         if(MathAbs(sel_bar[i]-_index)<fr_space) return(false);
      }
      else
      {
         sel_bar[i]=_index;
         return(true);
      }
   }
}
//-----------------------------------------------------------------------------------------------------

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---