//+------------------------------------------------------------------+
//|                                               QuarterChannel.mq4 |
//|       Daniel Varrin, Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Daniel Varrin, Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern string  Note = "Styles: STYLE_SOLID=0, STYLE_DASH=1, STYLE_DOT=2, STYLE_DASHDOT=3, STYLE_DASHDOTDOT=4";
extern color midLineColor = Black;
extern int   midLineStyle = STYLE_SOLID;
extern int   midLineWidth = 1;

extern color quarterLinesColor = Black;
extern int   quarterLinesStyle = STYLE_DOT;
extern int   quarterLinesWidth = 1;

extern bool  affectChannelProps = True;
extern color channelColor = Black;
extern int   channelBorderLinesWidth = 2;

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
      CleanChannelLines();
      CleanChannelLines();
      FindChannel();
//----
   return(0);
  }
//+------------------------------------------------------------------+


void CleanChannelLines() {
   int obj_total = ObjectsTotal();
   
   string name;
   
   for (int i = 0; i < obj_total; i++) {
      name = ObjectName(i);
      if (ObjectType(name) == OBJ_TREND && StringFind(name, "-q") != -1) {
         ObjectDelete(name);
      } 
   }      
}

void FindChannel() {
   int obj_total = ObjectsTotal();
   
   string name;
   
   for (int i = 0; i < obj_total; i++) {
      name = ObjectName(i);
      if (ObjectType(name) == OBJ_CHANNEL) {
         DrawQuarterLines(name);
      } 
   }   
}

void DrawQuarterLines(string name) {
   datetime time1, time2, time3;
   double price1, price2, price3;
   bool isRay;
   
   time1 = ObjectGet(name, OBJPROP_TIME1);
   price1 = ObjectGet(name, OBJPROP_PRICE1);
   
   time2 = ObjectGet(name, OBJPROP_TIME2);
   price2 = ObjectGet(name, OBJPROP_PRICE2);
   
   time3 = ObjectGet(name, OBJPROP_TIME3);
   price3 = ObjectGet(name, OBJPROP_PRICE3);
   
   isRay = ObjectGet(name, OBJPROP_RAY);
   
   
   double dy = price2 - price1;
   
   int shift1 = iBarShift(Symbol(), NULL, time1, true);
   int shift2 = iBarShift(Symbol(), NULL, time2, true);
   int shift3 = iBarShift(Symbol(), NULL, time3, true);
   
   double dx = shift2 - shift1;
   
   double slope = dy/dx;
   
   double projectedPoint = (slope * (shift3-shift1)) + price1;
   
   double verticalDistance = price3 - projectedPoint;
   
   if (ObjectFind(name + "-q2") == -1) {
      ObjectCreate(name + "-q2", OBJ_TREND, 0, time1, price1 + (verticalDistance * 0.5), time2, price2 + (verticalDistance * 0.5));
      ObjectSet(name + "-q2", OBJPROP_COLOR, midLineColor);
      ObjectSet(name + "-q2", OBJPROP_WIDTH, midLineWidth);
      ObjectSet(name + "-q2", OBJPROP_STYLE, midLineStyle);
      ObjectSet(name + "-q2", OBJPROP_RAY, isRay);
      
      if (affectChannelProps) {
         ObjectSet(name, OBJPROP_WIDTH, channelBorderLinesWidth);
         ObjectSet(name, OBJPROP_COLOR, channelColor);
      }
   }
   
   if (ObjectFind(name + "-q1") == -1) {
      ObjectCreate(name + "-q1", OBJ_TREND, 0, time1, price1 + (verticalDistance * 0.25), time2, price2 + (verticalDistance * 0.25));
      ObjectSet(name + "-q1", OBJPROP_COLOR, quarterLinesColor);
      ObjectSet(name + "-q1", OBJPROP_WIDTH, quarterLinesWidth);
      ObjectSet(name + "-q1", OBJPROP_STYLE, quarterLinesStyle);
      ObjectSet(name + "-q1", OBJPROP_RAY, isRay);
   }
   
   if (ObjectFind(name + "-q3") == -1) {
      ObjectCreate(name + "-q3", OBJ_TREND, 0, time1, price1 + (verticalDistance * 0.75), time2, price2 + (verticalDistance * 0.75));
      ObjectSet(name + "-q3", OBJPROP_COLOR, quarterLinesColor);
      ObjectSet(name + "-q3", OBJPROP_WIDTH, quarterLinesWidth);
      ObjectSet(name + "-q3", OBJPROP_STYLE, quarterLinesStyle);
      ObjectSet(name + "-q3", OBJPROP_RAY, isRay);
   }
}