//+------------------------------------------------------------------+
//|                                           EGEN Power Painter.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#define  D1 0
#define  H4 1
#define  H1 2

int POWER[PERIOD_D1],MAX[3],MIN[3];

bool EQ(int value1,int value2)
{
   return(value1==value2);
}

bool ZERO(int value)
{
   return(value==0);
}

bool MR(int value1,int value2)
{
   return(value1>value2);
}

bool BARS(int shift)
{
   return(shift<iBars(NULL,PERIOD_M1));
}

int SUM(double price)
{
   string P=DoubleToStr(price,Digits);
   int S=0;
   for(int i=0; i<StringLen(P); i++) S+=StrToInteger(StringSubstr(P,i,1));
   return(S);
}

double O(int shift)
{
   return(iOpen(NULL,PERIOD_M1,shift));
}

double H(int shift)
{
   return(iHigh(NULL,PERIOD_M1,shift));
}

double L(int shift)
{
   return(iLow(NULL,PERIOD_M1,shift));
}

double C(int shift)
{
   return(iClose(NULL,PERIOD_M1,shift));
}

datetime T(int shift)
{
   return(iTime(NULL,PERIOD_M1,shift));
}

int POWER(int shift)
{
   return(SUM(O(shift))+SUM(H(shift))+SUM(L(shift))+SUM(C(shift)));
}

void INIT(int shift)
{
   for(int i=0; i<PERIOD_D1; i++) POWER[i]=POWER(shift+i);
}
   
int MAX(int period)
{
   int S=0;
   for(int i=0; i<period; i++) if(POWER[i]>POWER[S]) S=i;
   return(S);
}

int MIN(int period)
{
   int S=0;
   for(int i=0; i<period; i++) if(POWER[i]<POWER[S]) S=i;
   return(S);
}

void COMMENT(int S1,int S2)
{ 
   string str1="\nPOWER (D1) max: "+POWER(S1);
   string str2="\nPOWER (D1) min: "+POWER(S2);   
   Comment(str1,str2);
}
   
void DRAW.D1()
{
   int S1=MAX[D1];
   int S2=MIN[D1];   
   COMMENT(S1,S2);
   double P1=C(S1);
   double P2=C(S2);
   datetime T1=T(S1);
   datetime T2=T(S2);
   string VL1="VLINE1.D1";
   ObjectCreate(VL1,OBJ_VLINE,0,T1,0);
   ObjectSet(VL1,OBJPROP_COLOR,Lime);   
   string VL2="VLINE2.D1";
   ObjectCreate(VL2,OBJ_VLINE,0,T2,0);
   ObjectSet(VL2,OBJPROP_COLOR,Red);      
   string HL1="HLINE1.D1";
   ObjectCreate(HL1,OBJ_HLINE,0,0,P1);
   ObjectSet(HL1,OBJPROP_COLOR,Lime);      
   string HL2="HLINE2.D1";
   ObjectCreate(HL2,OBJ_HLINE,0,0,P2);
   ObjectSet(HL2,OBJPROP_COLOR,Red);      
   string TR1="TREND1.D1";
   ObjectCreate(TR1,OBJ_TREND,0,T1,P1,T2,P2);
   ObjectSet(TR1,OBJPROP_COLOR,Yellow);      
   string TR2="TREND2.D1";
   ObjectCreate(TR2,OBJ_TREND,0,T2,P2,T1,P1);
   ObjectSet(TR2,OBJPROP_COLOR,Yellow);      
   string REC="RECTANGLE.D1";     
   ObjectCreate(REC,OBJ_RECTANGLE,0,T1,P1,T2,P2);   
   double F0=MathAbs(P1-P2);
   double F1=P1+F0*0.618;
   double F2=P2-F0*0.618;
   string FL1="FLINE1.D1";
   ObjectCreate(FL1,OBJ_HLINE,0,0,F1);
   ObjectSet(FL1,OBJPROP_COLOR,Yellow);      
   string FL2="FLINE2.D1";
   ObjectCreate(FL2,OBJ_HLINE,0,0,F2);
   ObjectSet(FL2,OBJPROP_COLOR,Yellow); 
   double F3=P1+F0;
   double F4=P2-F0;          
   string FL3="FLINE3.D1";
   ObjectCreate(FL3,OBJ_HLINE,0,0,F3);
   ObjectSet(FL3,OBJPROP_COLOR,Yellow);      
   string FL4="FLINE4.D1";
   ObjectCreate(FL4,OBJ_HLINE,0,0,F4);
   ObjectSet(FL4,OBJPROP_COLOR,Yellow);    
   double F5=P1+F0*1.618;
   double F6=P2-F0*1.618;          
   string FL5="FLINE5.D1";
   ObjectCreate(FL5,OBJ_HLINE,0,0,F5);
   ObjectSet(FL5,OBJPROP_COLOR,Yellow);      
   string FL6="FLINE6.D1";
   ObjectCreate(FL6,OBJ_HLINE,0,0,F6);
   ObjectSet(FL6,OBJPROP_COLOR,Yellow);    
}

void DRAW.H4()
{
   int S1=MAX[H4];
   int S2=MIN[H4];
   double P1=C(S1);
   double P2=C(S2);
   datetime T1=T(S1);
   datetime T2=T(S2);
   string VL1="VLINE1.H4";
   ObjectCreate(VL1,OBJ_VLINE,0,T1,0);
   ObjectSet(VL1,OBJPROP_COLOR,Lime);   
   ObjectSet(VL1,OBJPROP_STYLE,STYLE_DASH);      
   string VL2="VLINE2.H4";
   ObjectCreate(VL2,OBJ_VLINE,0,T2,0);
   ObjectSet(VL2,OBJPROP_COLOR,Red);      
   ObjectSet(VL2,OBJPROP_STYLE,STYLE_DASH);         
   string HL1="HLINE1.H4";
   ObjectCreate(HL1,OBJ_HLINE,0,0,P1);
   ObjectSet(HL1,OBJPROP_COLOR,Lime);      
   ObjectSet(HL1,OBJPROP_STYLE,STYLE_DASH);         
   string HL2="HLINE2.H4";
   ObjectCreate(HL2,OBJ_HLINE,0,0,P2);
   ObjectSet(HL2,OBJPROP_COLOR,Red);      
   ObjectSet(HL2,OBJPROP_STYLE,STYLE_DASH);         
   string TR1="TREND1.H4";
   ObjectCreate(TR1,OBJ_TREND,0,T1,P1,T2,P2);
   ObjectSet(TR1,OBJPROP_COLOR,Yellow);      
   ObjectSet(TR1,OBJPROP_STYLE,STYLE_DASH);           
   string TR2="TREND2.H4";
   ObjectCreate(TR2,OBJ_TREND,0,T2,P2,T1,P1);
   ObjectSet(TR2,OBJPROP_COLOR,Yellow);        
   ObjectSet(TR2,OBJPROP_STYLE,STYLE_DASH);              
   string REC="RECTANGLE.H4";     
   ObjectCreate(REC,OBJ_RECTANGLE,0,T1,P1,T2,P2);   
}

void DRAW.H1()
{
   int S1=MAX[H1];
   int S2=MIN[H1];  
   double P1=C(S1);
   double P2=C(S2);
   datetime T1=T(S1);
   datetime T2=T(S2);
   string VL1="VLINE1.H1";
   ObjectCreate(VL1,OBJ_VLINE,0,T1,0);
   ObjectSet(VL1,OBJPROP_COLOR,Lime);   
   ObjectSet(VL1,OBJPROP_STYLE,STYLE_DOT);      
   string VL2="VLINE2.H1";
   ObjectCreate(VL2,OBJ_VLINE,0,T2,0);
   ObjectSet(VL2,OBJPROP_COLOR,Red);      
   ObjectSet(VL2,OBJPROP_STYLE,STYLE_DOT);         
   string HL1="HLINE1.H1";
   ObjectCreate(HL1,OBJ_HLINE,0,0,P1);
   ObjectSet(HL1,OBJPROP_COLOR,Lime);      
   ObjectSet(HL1,OBJPROP_STYLE,STYLE_DOT);         
   string HL2="HLINE2.H1";
   ObjectCreate(HL2,OBJ_HLINE,0,0,P2);
   ObjectSet(HL2,OBJPROP_COLOR,Red);      
   ObjectSet(HL2,OBJPROP_STYLE,STYLE_DOT);         
   string TR1="TREND1.H1";
   ObjectCreate(TR1,OBJ_TREND,0,T1,P1,T2,P2);
   ObjectSet(TR1,OBJPROP_COLOR,Yellow); 
   ObjectSet(TR1,OBJPROP_STYLE,STYLE_DOT);                   
   string TR2="TREND2.H1";
   ObjectCreate(TR2,OBJ_TREND,0,T2,P2,T1,P1);
   ObjectSet(TR2,OBJPROP_COLOR,Yellow);        
   ObjectSet(TR2,OBJPROP_STYLE,STYLE_DOT);                      
   string REC="RECTANGLE.H1";     
   ObjectCreate(REC,OBJ_RECTANGLE,0,T1,P1,T2,P2);   
}

int GAP(int index)
{
   int S1=MAX[index];
   int S2=MIN[index];
   double P1=C(S1);
   double P2=C(S2);
   if(S1<S2)
   if(P1>P2) return(+1);
   if(S1<S2)
   if(P1<P2) return(-2);
   if(S2<S1)
   if(P2<P1) return(-1);
   if(S2<S1)
   if(P2>P1) return(+2);   
   return(0);
}

bool INCREASE()
{
   int S1=MIN[D1];
   int S2=MIN[H4];
   int S3=MIN[H1];
   if(C(S1)<C(S2))
   if(C(S2)<C(S3)) return(true);
   return(false);
}

bool DECREASE()
{
   int S1=MAX[D1];
   int S2=MAX[H4];
   int S3=MAX[H1];
   if(C(S1)>C(S2))
   if(C(S2)>C(S3)) return(true);
   return(false);
}

int WAVE(int shift)
{
   Comment(shift);
   INIT(shift);  
   MAX[D1]=MAX(PERIOD_D1)+shift;
   MIN[D1]=MIN(PERIOD_D1)+shift;
   MAX[H4]=MAX(PERIOD_H4)+shift;
   MIN[H4]=MIN(PERIOD_H4)+shift;
   MAX[H1]=MAX(PERIOD_H1)+shift;
   MIN[H1]=MIN(PERIOD_H1)+shift;
   if(EQ(MAX[D1],MAX[H4]))
   if(EQ(MAX[H4],MAX[H1]))
   if(MR(MIN[D1],MIN[H4]))
   if(MR(MIN[H4],MIN[H1]))    
   if(EQ(GAP(D1),GAP(H4)))
   if(EQ(GAP(H4),GAP(H1))) if(INCREASE()) return(+1);
   if(EQ(MIN[D1],MIN[H4]))
   if(EQ(MIN[H4],MIN[H1]))
   if(MR(MAX[D1],MAX[H4]))
   if(MR(MAX[H4],MAX[H1]))       
   if(EQ(GAP(D1),GAP(H4)))
   if(EQ(GAP(H4),GAP(H1))) if(DECREASE()) return(-1);
   return(0);
}

bool DRAW(int shift)
{
   if(ZERO(WAVE(shift))) return(false);
   ObjectsDeleteAll();   
   DRAW.D1(); 
   DRAW.H4(); 
   DRAW.H1();
   return(true);
}

void PAINT()
{
   for(int i=1; BARS(i); i++) if(DRAW(i)) break;
}

void start()
{
   PAINT();
}


