MS_PentagonS

Author: *
MS_PentagonS
0 Views
0 Downloads
0 Favorites
MS_PentagonS
//+------------------------------------------------------------------+
//|   PentagonS                                                      |
//+------------------------------------------------------------------+
#property copyright "*"
#property link      "*"

#property indicator_chart_window
#property indicator_buffers 0
#property indicator_color1 Red

extern string EX_P_Bpoint="2008.03.17 00:00";
extern string EX_P_Dpoint="2008.08.15 00:00";
extern double EX_P_Epips=14000;
extern int    EX_P_max=20;
extern int    EX_P_Fwidth=3;
extern double EX_P_Fheight=0.03;
extern int    EX_P_RSline=1; // Resistance support line
extern color EX_color1=Blue;
extern color EX_color2=Blue;
extern color EX_color3=Blue;
extern bool EX_show_astrology=true;
double h5;
datetime Tb,Td; int Xb,Xd;
int    xsa,xsb,xsc,xsd,xse,xsf;
double ysa,ysb,ysc,ysd,yse,ysf;
datetime px; double py; int pd;
double pi=3.1415926535;
int pno=0,max_pno=20;
datetime ST_X[101]; int ST_D[101];
double fh;
string solareclipse01="2005.04.09 00:00"; // The South Pacific
string solareclipse02="2005.10.03 00:00"; // Europe
string solareclipse03="2006.03.29 00:00"; // Africa
string solareclipse04="2006.09.22 00:00"; // Africa
string solareclipse05="2007.03.19 00:00"; // Alaska
string solareclipse06="2007.09.11 00:00"; // South America
string solareclipse07="2008.02.07 00:00"; // The South Pacific
string solareclipse08="2008.08.01 00:00"; // Russia
string solareclipse09="2009.01.26 00:00"; // India
string solareclipse10="2009.07.22 00:00"; // The South Pacific
string solareclipse11="2010.01.15 00:00"; // Africa
string solareclipse12="2010.07.11 00:00"; // Polynesia
string solareclipse13="2011.01.04 00:00"; // Europe
string solareclipse14="2011.06.02 00:00"; // Iceland
string solareclipse15="2011.11.25 00:00"; // Antarctica
string solareclipse16="2012.05.21 00:00"; // “ú–{
string solareclipse17="2012.11.14 00:00"; // Australia
string solareclipse18="2013.05.10 00:00"; //
string lunareclipse01="2005.10.17 00:00"; // 
string lunareclipse02="2006.09.08 00:00"; // 
string lunareclipse03="2007.03.04 00:00"; // 
string lunareclipse04="2007.08.28 00:00"; // 
string lunareclipse05="2008.08.17 00:00"; // 
string lunareclipse06="2010.01.01 00:00"; // 
string lunareclipse07="2010.06.26 00:00"; // 
string lunareclipse08="2010.12.21 00:00"; // 
string lunareclipse09="2011.06.11 00:00"; // 
string lunareclipse10="2011.12.10 00:00"; // 
string lunareclipse11="2012.06.04 00:00"; // 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {IndicatorShortName("PentagonS");
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {DelObject();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
{  int i,ic=IndicatorCounted(),fr,ix;
   double ph;
   if(ic==0)
     {max_pno=EX_P_max; if(EX_P_max>100) max_pno=100;
      Tb=StrToTime(EX_P_Bpoint);
      Td=StrToTime(EX_P_Dpoint);
      Xb=iBarShift(NULL,0,Tb);
      Xd=iBarShift(NULL,0,Td);
      if(EX_P_Epips==0.0) h5=MathAbs((Close[Xb]-Close[Xd])*1.5); else h5=EX_P_Epips*Point;
      SetSize(Tb,Xb,Td,Xd);
      px=Time[Xb+xsb];
      if(Close[Xb]<Close[Xd]) {py=Close[Xb]+ysb; pd=1;} else {py=Close[Xb]-ysb; pd=-1;}
      DrawPentagon(px,py,pd); PushST(px,pd);
      if(Close[Xb]<Close[Xd]) ph=py-ysb; else ph=py+ysb;
      DrawText("P00",Time[Xb-(xsc-xsb)/2],"High:"+DoubleToStr(h5,Digits)+","+DoubleToStr(xsc-xsb+1,0),ph,White); 
     }

   if(ic==0) fr=Xb-1; else fr=Bars-ic;
   for(i=fr; i>=0; i--)
     {ix=iBarShift(NULL,0,px);
      if(pd==1)
        {if(ix-xsb>=i && i>ix-xsc && Close[i]<py-ysb) // BC break
           {px=Time[ix]; py=py-ysb*2; pd=-1;
            if(SearchST(px,pd)!=0) {DrawPentagon(px,py,pd); PushST(px,pd);}
           }
         else if(ix-xse>=i && i>=ix-xsc && Close[i]>py+yse-(yse+ysc)*((ix-xse)-i)/(xsc-xse)) // CE break
           {px=Time[ix-xse]; py=py+yse; pd=1; SetSize1618();
            if(SearchST(px,pd)!=0) {DrawPentagon(px,py,pd); PushST(px,pd);}
           }
        }
      else
        {if(ix-xsb>=i && i>ix-xsc && Close[i]>py+ysb) // BC break
           {px=Time[ix]; py=py+ysb*2; pd=1;
            if(SearchST(px,pd)!=0) {DrawPentagon(px,py,pd); PushST(px,pd);}
           }
         else if(ix-xse>=i && i>=ix-xsc && Close[i]>py-yse+(yse+ysc)*((ix-xse)-i)/(xsc-xse)) // CE break
           {px=Time[ix-xse]; py=py-yse; pd=-1; SetSize1618();
            if(SearchST(px,pd)!=0) {DrawPentagon(px,py,pd); PushST(px,pd);}
           }
        }
     }
   if(Period()==PERIOD_D1 && EX_show_astrology) ProcEclipse();

   return(0);
}
//+------------------------------------------------------------------+
//|  SetSize                                                         |
//+------------------------------------------------------------------+
void SetSize(datetime tb,int xb,datetime td,int xd)
  {
   int x1=(xb-xd)*1.0/(0.618+(1-0.618)*1.0/2.0);
   xsa=0;
   xsb=x1*(1.0-0.618)*1.0/2.0;
   xsc=x1-xsb;
   xsd=x1;
   xse=x1*1.0/2.0;
   xsf=xse;
   ysa=0.0;
   ysb=h5*(1.0-(1.0-0.618)*1.0/2.0)*MathTan((pi/2.0)*36.0/90.0)/(0.618*1.0/2.0*MathTan((pi/2.0)*72.0/90.0));
   ysc=ysb;
   ysd=0.0;
   yse=h5-ysb;
   ysf=ysb-h5*(0.618*1.0/2.0*MathTan((pi/2.0)*(36.0+18.0)/90.0))/(0.618*1.0/2.0*MathTan((pi/2.0)*72.0/90.0));
   fh=h5*EX_P_Fheight;
  }
//+------------------------------------------------------------------+
//|  SetSize1618                                                     |
//+------------------------------------------------------------------+
void SetSize1618()
  {
   int wxa=0;
   int wxb=xsc-xse;
   int wxc=xsd-xse+xsc;
   int wxd=xsd+xsc-xsb;
   int wxe=xsc;
   int wxf=xsc;
   double wya=0.0;
   double wyb=ysc+yse;
   double wyc=wyb;
   double wyd=0.0;
   double wye=ysc;
   double wyf=wyb-(ysb*2.0+yse)*(0.618*1.0/2.0*MathTan((pi/2.0)*(36.0+18.0)/90.0))/(0.618*1.0/2.0*MathTan((pi/2.0)*72.0/90.0));
   xsa=wxa; xsb=wxb; xsc=wxc; xsd=wxd; xse=wxe; xsf=wxf;
   ysa=wya; ysb=wyb; ysc=wyc; ysd=wyd; yse=wye; ysf=wyf;
   h5=ysb*2.0+yse;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int DrawPentagon(datetime x,double y,int direction)
  {int wx=iBarShift(NULL,0,x);
   datetime ta=x;
   datetime tb=SiftXTime(wx,xsb);
   datetime tc=SiftXTime(wx,xsc);
   datetime td=SiftXTime(wx,xsd);
   datetime te=SiftXTime(wx,xse);
   datetime tf=te;
   datetime tf1=SiftXTime(wx,xse-EX_P_Fwidth),tf2=SiftXTime(wx,xse+EX_P_Fwidth);
   double pa=y;
   double pb=y-ysb; if(direction==-1) pb=y+ysb;
   double pc=y-ysc; if(direction==-1) pc=y+ysc;
   double pd=y;
   double pe=y+yse; if(direction==-1) pe=y-yse;
   double pf=y-ysf; if(direction==-1) pf=y+ysf;
   double pf1=pf+fh,pf2=pf-fh;
   DrawTLine("P01"+pno,ta,pa,tb,pb,EX_color1,STYLE_SOLID,EX_P_RSline);
   DrawTLine("P02"+pno,tb,pb,tc,pc,EX_color1,STYLE_SOLID,1);
   DrawTLine("P03"+pno,tc,pc,td,pd,EX_color1,STYLE_SOLID,1);
   DrawTLine("P04"+pno,td,pd,te,pe,EX_color1,STYLE_SOLID,1);
   DrawTLine("P05"+pno,te,pe,ta,pa,EX_color1,STYLE_SOLID,EX_P_RSline);
   DrawTLine("P06"+pno,ta,pa,tc,pc,EX_color2,STYLE_DOT,1);
   DrawTLine("P07"+pno,tb,pb,td,pd,EX_color2,STYLE_DOT,1);
   DrawTLine("P08"+pno,tc,pc,te,pe,EX_color2,STYLE_DOT,1);
   DrawTLine("P09"+pno,td,pd,ta,pa,EX_color2,STYLE_DOT,1);
   DrawTLine("P10"+pno,te,pe,tb,pb,EX_color2,STYLE_DOT,1);
   DrawF(tf,pf1,tf1,pf,tf,pf2,tf2,pf,EX_color3);
   pno++; pno=MathMod(pno,max_pno);
  }
//+------------------------------------------------------------------+
//|   DrawF                                                          |
//+------------------------------------------------------------------+
void DrawF(datetime t1,double p1,datetime t2,double p2,datetime t3,double p3,datetime t4,double p4,color cl) {
   ObjectCreate("P11"+pno,OBJ_TRIANGLE,0,0,0,0,0,0,0);
   ObjectSet("P11"+pno,OBJPROP_STYLE ,STYLE_SOLID);
   ObjectSet("P11"+pno,OBJPROP_COLOR ,cl);
   ObjectSet("P11"+pno,OBJPROP_WIDTH ,1);
   ObjectSet("P11"+pno,OBJPROP_TIME1 ,t1);
   ObjectSet("P11"+pno,OBJPROP_PRICE1,p1);
   ObjectSet("P11"+pno,OBJPROP_TIME2 ,t2);
   ObjectSet("P11"+pno,OBJPROP_PRICE2,p2);
   ObjectSet("P11"+pno,OBJPROP_TIME3 ,t3);
   ObjectSet("P11"+pno,OBJPROP_PRICE3,p3);
   ObjectSet("P11"+pno,OBJPROP_RAY,false);
   ObjectSet("P11"+pno,OBJPROP_BACK,true);

   ObjectCreate("P12"+pno,OBJ_TRIANGLE,0,0,0,0,0,0,0);
   ObjectSet("P12"+pno,OBJPROP_STYLE ,STYLE_SOLID);
   ObjectSet("P12"+pno,OBJPROP_COLOR ,cl);
   ObjectSet("P12"+pno,OBJPROP_WIDTH ,1);
   ObjectSet("P12"+pno,OBJPROP_TIME1 ,t3);
   ObjectSet("P12"+pno,OBJPROP_PRICE1,p3);
   ObjectSet("P12"+pno,OBJPROP_TIME2 ,t4);
   ObjectSet("P12"+pno,OBJPROP_PRICE2,p4);
   ObjectSet("P12"+pno,OBJPROP_TIME3 ,t1);
   ObjectSet("P12"+pno,OBJPROP_PRICE3,p1);
   ObjectSet("P12"+pno,OBJPROP_RAY,false);
   ObjectSet("P12"+pno,OBJPROP_BACK,true);
}
//+------------------------------------------------------------------+
//| PushSTACK                                                        |
//+------------------------------------------------------------------+
int PushST(datetime x,int d)
{  int i;
   for(i=max_pno-1-1; i>=0; i--)
     {ST_X[i+1]=ST_X[i]; ST_D[i+1]=ST_D[i];}
   ST_X[0]=x; ST_D[0]=d;
   return(0);
}
//+------------------------------------------------------------------+
//| SearchSTACK                                                      |
//+------------------------------------------------------------------+
int SearchST(datetime x,int d)
{  int rc,i;
   rc=-1;
   for(i=0; i<=max_pno-1 ;i++)
      if(ST_X[i]==x && ST_D[i]==d) {rc=0; break;}
   return(rc);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int DelObject()
{  int i;
   ObjectDelete("P00");
   for(i=0; i<=max_pno; i++)
     {ObjectDelete("P01"+i); ObjectDelete("P02"+i); ObjectDelete("P03"+i); 
      ObjectDelete("P04"+i); ObjectDelete("P05"+i); ObjectDelete("P06"+i); 
      ObjectDelete("P07"+i); ObjectDelete("P08"+i); ObjectDelete("P09"+i); 
      ObjectDelete("P10"+i); ObjectDelete("P11"+i); ObjectDelete("P12"+i);
     }
   ObjectDelete("PS"+solareclipse01); ObjectDelete("PS"+solareclipse02); ObjectDelete("PS"+solareclipse03);
   ObjectDelete("PS"+solareclipse04); ObjectDelete("PS"+solareclipse05); ObjectDelete("PS"+solareclipse06);
   ObjectDelete("PS"+solareclipse07); ObjectDelete("PS"+solareclipse08); ObjectDelete("PS"+solareclipse09);
   ObjectDelete("PS"+solareclipse10); ObjectDelete("PS"+solareclipse11); ObjectDelete("PS"+solareclipse12);
   ObjectDelete("PS"+solareclipse13); ObjectDelete("PS"+solareclipse14); ObjectDelete("PS"+solareclipse15);
   ObjectDelete("PS"+solareclipse16); ObjectDelete("PS"+solareclipse17); ObjectDelete("PS"+solareclipse18);
   ObjectDelete("PL"+lunareclipse01); ObjectDelete("PL"+lunareclipse02); ObjectDelete("PL"+lunareclipse03);
   ObjectDelete("PL"+lunareclipse04); ObjectDelete("PL"+lunareclipse05); ObjectDelete("PL"+lunareclipse06);
   ObjectDelete("PL"+lunareclipse07); ObjectDelete("PL"+lunareclipse08); ObjectDelete("PL"+lunareclipse09);
   ObjectDelete("PL"+lunareclipse10); ObjectDelete("PL"+lunareclipse11);
}
//+------------------------------------------------------------------+
//| ProcEclipse                                                      |
//+------------------------------------------------------------------+
void ProcEclipse()
{  
   SolarEclipse(solareclipse01);
   SolarEclipse(solareclipse02);
   SolarEclipse(solareclipse03);
   SolarEclipse(solareclipse04);
   SolarEclipse(solareclipse05);
   SolarEclipse(solareclipse06);
   SolarEclipse(solareclipse07);
   SolarEclipse(solareclipse08);
   SolarEclipse(solareclipse09);
   SolarEclipse(solareclipse10);
   SolarEclipse(solareclipse11);
   SolarEclipse(solareclipse12);
   SolarEclipse(solareclipse13);
   SolarEclipse(solareclipse14);
   SolarEclipse(solareclipse15);
   SolarEclipse(solareclipse16);
   SolarEclipse(solareclipse17);
   SolarEclipse(solareclipse18);
   LunarEclipse(lunareclipse01);
   LunarEclipse(lunareclipse02);
   LunarEclipse(lunareclipse03);
   LunarEclipse(lunareclipse04);
   LunarEclipse(lunareclipse05);
   LunarEclipse(lunareclipse06);
   LunarEclipse(lunareclipse07);
   LunarEclipse(lunareclipse08);
   LunarEclipse(lunareclipse09);
   LunarEclipse(lunareclipse10);
   LunarEclipse(lunareclipse11);
}
//+------------------------------------------------------------------+
//| SolarEclipse                                                     |
//+------------------------------------------------------------------+
int SolarEclipse(string tt)
{  int ib;
   datetime dt=StrToTime(tt);
   datetime bf=Time[Bars-1]; datetime bt=Time[0];
   if(bf<=dt && dt<=bt)
     {ib=iBarShift(NULL,0,dt);
      DrawText("PS"+tt,dt,"S",High[ib]+(High[ib]-Low[ib])*1.5,HotPink);
     } 
   else if(dt>Time[0])  DrawText("PS"+tt,dt,"S",Close[0],HotPink); 
}
//+------------------------------------------------------------------+
//| LunarEclipse                                                     |
//+------------------------------------------------------------------+
int LunarEclipse(string tt)
{  int ib;
   datetime dt=StrToTime(tt);
   datetime bf=Time[Bars-1]; datetime bt=Time[0];
   if(bf<=dt && dt<=bt)
     {ib=iBarShift(NULL,0,dt);
      DrawText("PL"+tt,dt,"L",Low[ib]-(High[ib]-Low[ib]),Aqua);
     } 
   else if(dt>Time[0])  DrawText("PL"+tt,dt,"L",Close[0],Aqua); 
}
//+------------------------------------------------------------------+
//|   DrawTLine                                                      |
//+------------------------------------------------------------------+
void DrawTLine(string no,datetime t1,double p1,datetime t2,double p2,color cl,int st,int w)
{
   if(ObjectFind(no)<0) ObjectCreate(no,OBJ_TREND,0,0,0,0,0);
   ObjectSet(no,OBJPROP_STYLE ,st);
   ObjectSet(no,OBJPROP_COLOR ,cl);
   ObjectSet(no,OBJPROP_WIDTH ,w);
   ObjectSet(no,OBJPROP_TIME1 ,t1);
   ObjectSet(no,OBJPROP_PRICE1,p1);
   ObjectSet(no,OBJPROP_TIME2 ,t2);
   ObjectSet(no,OBJPROP_PRICE2,p2);
   ObjectSet(no,OBJPROP_RAY,false);
   ObjectSet(no,OBJPROP_BACK,false);
}
//+------------------------------------------------------------------+
//|   DrawText                                                       |
//+------------------------------------------------------------------+
void DrawText(string no,datetime tb,string tx,double p,color cl) 
{  ObjectCreate(no,OBJ_TEXT,0,0,0);
   ObjectSet(no,OBJPROP_TIME1   ,tb);
   ObjectSet(no,OBJPROP_PRICE1  ,p);
   ObjectSet(no,OBJPROP_COLOR   ,cl);
   ObjectSet(no,OBJPROP_FONTSIZE,9);
   ObjectSetText(no,tx);
}
//+------------------------------------------------------------------+
//   SiftXTime                                                       |
//+------------------------------------------------------------------+
datetime SiftXTime(int x,int sf)
{  datetime dt;
   if(x-sf>=0)
     {dt=Time[x-sf];}
   else
     {dt=Timeshift(Time[0],sf-x);}
   return(dt);
}
//+------------------------------------------------------------------+
//   Timeshift                                                       |
//+------------------------------------------------------------------+
datetime Timeshift (datetime dt,int sf) {
   int ty=TimeYear(dt);
   int tm=TimeMonth(dt);
   int td=TimeDay(dt);
   int th=TimeHour(dt);
   int ti=TimeMinute(dt);
   int i;
   
   for(i=1; i<=sf; i++)
     {if     (Period()==PERIOD_M1 ) ti=ti+1;
      else if(Period()==PERIOD_M5 ) ti=ti+5;
      else if(Period()==PERIOD_M15) ti=ti+15;
      else if(Period()==PERIOD_M30) ti=ti+30;
      else if(Period()==PERIOD_H1 ) th=th+1;
      else if(Period()==PERIOD_H4 ) th=th+4;
      else if(Period()==PERIOD_D1 ) td=td+1;
      else if(Period()==PERIOD_W1 ) td=td+7;
      else if(Period()==PERIOD_MN1) tm=tm+1;

      if(ti>=60) {ti=ti-60; th++;}
      if(th>=24) {th=th-24; td++;}
      if(tm==1 || tm==3 || tm==5 || tm==7 || tm==8 || tm==10 || tm==12) {if(td>31) {tm++; td=td-31;}}
      else if(tm==2) {
                      if(MathMod(ty,4)==0)           //    09.11.03 update
                        {if(td>29) {tm++; td=td-29;}} 
                      else 
                        {if(td>28) {tm++; td=td-28;}}
                     }
      else if(tm==4 || tm==6 || tm==9 || tm==11) if(td>30) {tm++; td=td-30;}
      if(tm>12) {tm=1; ty++;}
     }
   return(StrToTime(ty+"."+tm+"."+td+" "+th+":"+ti));
}

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 ---