//+------------------------------------------------------------------+
//|                                                  Today Trend.mq4 |
//|                                   Copyright © 2006, Jason Rivera |
//|                                      http://www.jasonerivera.com |
//+------------------------------------------------------------------+
//|   
//|   Based on an excel spreadsheet posted by toro55 @
//|   http://www.strategybuilderfx.com/forums/showthread.php?s=&threadid=16130
//|   
//|   Posted for the benefit of those at the StrategyBuilder
//|   community.
//|   
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Jason Rivera"
#property link      "http://www.jasonerivera.com"

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 YellowGreen
#property indicator_color4 Red

//----External Variables
extern int PROFIT_TARGET = 30;
extern bool SHOW_TARGET = true;
extern bool SHOW_REVERSAL = true;

//---- buffers
double UpBuffer[];
double DownBuffer[];
double TargetBuffer[];
double ReversalBuffer[];

//----variables
double H=0, L=0, O=0, C=0, R=0, S=0, Pivot=0, Spread=0, RevRate=0, MaxLoss=0, max=0, draw=0;
double S2,R2;
int action=0, action1=0, action2=0, action3=0;
int Under_Resistance=0;
string res="";
   
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexLabel(0,"Go Long");
   SetIndexLabel(1,"Go Short");
   SetIndexLabel(2,"Profit Target Line");
   SetIndexLabel(3,"Stop/Reversal Line");
   SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1);
   SetIndexBuffer(0,UpBuffer);
   SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1);
   SetIndexBuffer(1,DownBuffer);
   SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,1);
   SetIndexBuffer(2,TargetBuffer);
   SetIndexStyle(3,DRAW_LINE,STYLE_SOLID,1);
   SetIndexBuffer(3,ReversalBuffer);
   
   SetIndexEmptyValue(0,0);
   SetIndexEmptyValue(1,0);
   SetIndexEmptyValue(2,0);
   SetIndexEmptyValue(3,0);
   
   SetIndexArrow(0,236);
   SetIndexArrow(1,238);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int pos =0;
   
   int m = 0;
   int d = 0;
   int y = 0;
   string dt = "";
   datetime some_time = 0;
   int shift = 0;
   int tc = 1440;
   int min = 0;
   int hr = 0;
   
   int thour=0, tmin=0;
//---- 
   //script can only be run on daily chart or lower timeframe
   if(Period() > 1440)
   {
      Print("Indicator must be run on Daily chart or lesser timeframe"); 
      return(0);
   }
   
   //---- check for possible errors
   if(counted_bars<0) return(-1);
   //---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   
   pos = Bars-counted_bars;
   
   while(pos>=0)
   {
      m=TimeMonth(Time[pos]);
      d=TimeDay(Time[pos]);
      y=TimeYear(Time[pos]);
      min = TimeMinute(Time[pos]);
      hr = TimeHour(Time[pos]);
      dt = y + "." + m + "." + d + " " + hr + ":" + min;
      some_time = StrToTime(dt);
      
      //find the proper shift of the daily bar having the same date as this timeframe's bar having the current shift
      //we must do this in order to be able to run the indicator on smaller time frames in light of a bigger one
      shift = iBarShift(NULL,tc,some_time); //returns the correct shift of the current daily bar
      
      thour = TimeHour(iTime(NULL,60,iBarShift(NULL,60,some_time)));
      tmin = TimeMinute(iTime(NULL,Period(),pos));
      
      //create price reference lines
      if(SHOW_REVERSAL == true) {ReversalBuffer[pos] = ReversalBuffer[pos+1];}
      if(SHOW_TARGET == true) {TargetBuffer[pos] = TargetBuffer[pos+1];}
         
      //only trade on Open of Day; check for hour 0 && minute 0 for intraday timeframes
      if(thour == 0 && tmin == 0)
      {
         H = iHigh(NULL,tc,shift+1);   //previous daily bar's high
         L = iLow(NULL,tc,shift+1);    //previous daily bar's low
         C = iClose(NULL,tc,shift+1);  //previous daily bar's close
         O = Open[pos];                //current Period() bar's open
      
         Spread = H - L;
/*         
         Pivot = (Spread*2)/5;
         R = H - Pivot;
         S = L + Pivot;
*/ 

         Pivot = (H + L + C)/3;
         R = 2*Pivot - L;
         S = 2*Pivot - H;
         S2 = Pivot - (R - S);
         R2 = Pivot + (R-S);
         //reset Buy/Sell actions
         action1 = 0;
         action2 = 0;
         action3 = 0;
         Under_Resistance = 0;
      
         if(O < R) 
         {
            Under_Resistance = 1;
         }else{
            Under_Resistance = -1;
         }
      
         //Calculate the 1st action
         if(O < H && O > R) action1 = -1;  //"Sell"
         if(O > L && O < S) action1 = 1;   //"Buy"
      
         //Calculate the 2nd action
         if(Under_Resistance == 1 && (R-O) < (O-S)) action2 = -1;   //"Sell"
         if(Under_Resistance == 1 && (R-O) >= (O-S)) action2 = 1;   //"Buy"
      
         //Calculate the 3rd action
         if(O <= L) action3 = -1;  //"Sell"
         if(O >= H) action3 = 1;   //"Buy"            
      
         //Calculate the Reversal Rate
/*         
         if(action2 == 1) RevRate = L;
         if(action2 == -1) RevRate = H;
         if(action1 == -1) RevRate = H;
         if(action1 == 1) RevRate = L;
         if(action3 == 1) RevRate = H;
         if(action3 == -1) RevRate = L;
*/         
         if(action2 == 1) RevRate = S;
         if(action2 == -1) RevRate = R;
         if(action1 == -1) RevRate = R2;
         if(action1 == 1) RevRate = S2;
         if(action3 == 1) 
         {
            if(O <= R2) RevRate = H;
            if(O > R2) RevRate = R2;
         }   
         if(action3 == -1)
         {
            if(O >= S2) RevRate = L;
            if(O < S2) RevRate = S2;
         } 
      
         //Calculate the Max Loss
         if(action2 == 1) MaxLoss = O - S;
         if(action2 == -1) MaxLoss = R - O;
         if(action1 == -1) MaxLoss = R2 - O;
         if(action1 == 1) MaxLoss = O - S2;
         if(action3 == 1) 
         {
            if(O <= R2) MaxLoss = O - H;
            if(O > R2) MaxLoss = O - R2;
            
         }   
         if(action3 == -1)
         {
            if(O <= R2) MaxLoss = L - O;
            if(O > R2) MaxLoss = S2 - O;
            
         }   
/*         
         if(action2 == 1) MaxLoss = O - L;
         if(action2 == -1) MaxLoss = H - O;
         if(action1 == -1) MaxLoss = H - O;
         if(action1 == 1) MaxLoss = O - L;
         if(action3 == 1) MaxLoss = O - H;
         if(action3 == -1) MaxLoss = L - O;
*/      
         if(action1 != 0)  action = action1;
         if(action2 != 0)  action = action2;
         if(action3 != 0)  action = action3;
                   
      
         if(action == 1)//buy
         {
            UpBuffer[pos] = O;
            
            if(SHOW_TARGET == true)
            {
               TargetBuffer[pos+1] = 0;  //keep line from warping to next value; comment line to see on daily timeframe
               TargetBuffer[pos] = O + (PROFIT_TARGET*Point);
            }
            
            if(SHOW_REVERSAL == true)
            {
               ReversalBuffer[pos+1] = 0;   //keep line from warping to next value; comment line to see on daily timeframe
               ReversalBuffer[pos] = RevRate;
            }
         }
         
         if(action == -1)//sell
         {
            DownBuffer[pos] = O;
            
            if(SHOW_TARGET == true)
            {
               TargetBuffer[pos+1] = 0;  //keep line from warping to next value; comment line to see on daily timeframe
               TargetBuffer[pos] = O - (PROFIT_TARGET*Point);
            }
            
            if(SHOW_REVERSAL == true)
            {
               ReversalBuffer[pos+1] = 0;   //keep line from warping to next value; comment line to see on daily timeframe
               ReversalBuffer[pos] = RevRate;
            }
         }
      }
      
      pos--;
   }
   
   Comment(ToString(action), " @ ", O);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

string ToString(int action)
{
   if(action == 1) return("Buy");
   if(action == -1) return("Sell");
   if(action == 0) return("No Action");
}

