welchcandlesticks_v2

Author: Copyright 2014, Timothy A. Welch
welchcandlesticks_v2
Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
welchcandlesticks_v2
//+------------------------------------------------------------------+
//|                                         WelchCandlesticks_v2.mq4 |
//|                                 Copyright 2013, Timothy A. Welch |
//|                                     http://www.timothy-welch.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Timothy A. Welch"
#property link      "http://www.timwel.ch"

#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 Tomato
#property indicator_color2 White
#property indicator_color3 Tomato
#property indicator_color4 White
#property indicator_color5 Lime
#property indicator_color6 Lime
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 3
#property indicator_width4 3
#property indicator_width5 1
#property indicator_width6 1

//----
extern color color1 = Tomato;
extern color color2 = White;
extern color color3 = Tomato;
extern color color4 = White;
extern color color5 = Lime;
extern color color6 = Lime;

//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];

double tHigh[];
double tLow[];

//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//|------------------------------------------------------------------|
int init()
  {
   IndicatorBuffers(8);
   SetIndexBuffer(6,tHigh);
   SetIndexBuffer(7,tLow);
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM, 0, 1, color1);
   SetIndexBuffer(0, ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM, 0, 1, color2);
   SetIndexBuffer(1, ExtMapBuffer2);
   SetIndexStyle(2,DRAW_HISTOGRAM, 0, 3, color3);
   SetIndexBuffer(2, ExtMapBuffer3);
   SetIndexStyle(3,DRAW_HISTOGRAM, 0, 3, color4);
   SetIndexBuffer(3, ExtMapBuffer4);
   SetIndexStyle(4,DRAW_HISTOGRAM, 0, 1, color5);
   SetIndexBuffer(4, ExtMapBuffer5);
   SetIndexStyle(5,DRAW_HISTOGRAM, 0, 1, color6);
   SetIndexBuffer(5, ExtMapBuffer6);
//----
   SetIndexDrawBegin(0,10);
   SetIndexDrawBegin(1,10);
   SetIndexDrawBegin(2,10);
   SetIndexDrawBegin(3,10);
   SetIndexDrawBegin(4,10);
   SetIndexDrawBegin(5,10);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexBuffer(3,ExtMapBuffer4);
   SetIndexBuffer(4,ExtMapBuffer5);
   SetIndexBuffer(5,ExtMapBuffer6);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: add your code here
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   double haOpen, haHigh, haLow, haClose;
   if(Bars<=10) return(0);
   ExtCountedBars=IndicatorCounted();
//---- check for possible errors
   if (ExtCountedBars<0) return(-1);
//---- last counted bar will be recounted
//   if (ExtCountedBars>0) ExtCountedBars--;
   int pos=Bars-ExtCountedBars-1;
   
   // If we have not counted any bars yet, let's zero out all values of tHigh and tLow
   if (ExtCountedBars<1) {
      for (int i=0; i<Bars; i++) { tHigh[i]=EMPTY_VALUE; tLow[i]=EMPTY_VALUE; }
   }
   
   while(pos>=0)
     {
      
      // Let's add in the spread for the current bar, which should give us a more accurate
      // depiction of the REAL price movement for this candle.  Rather than the averaged
      // price that is sent to MT4 to create the candlestick.  This should eliminate some
      // false stop losses, in theory.
      if (pos == 0) {
         double tSpread = MarketInfo(Symbol(), MODE_SPREAD)*Point;

         if (tHigh[pos]==EMPTY_VALUE) { haHigh = High[pos]; } else { haHigh = tHigh[pos]; }
         if (tLow[pos]==EMPTY_VALUE) { haLow = Low[pos]; } else {haLow = tLow[pos]; }        
         
         if (Ask > haHigh) {
            haHigh=Ask;
         }

         if (Bid < haLow) {
            haLow = Bid;
         } 
         
         // Set our high/low buffers to the current max high of the candle
         // so that we can use them in redrawing (if that's necessary) the
         // rest of the candles down the line. Or at least using these values
         // for other indicators to pull from. ;-)
         tHigh[pos] = haHigh;
         tLow[pos] = haLow;
      } else {
      
         // If our tHigh and tLow buffers have data in them, use them
         // otherwise default to showing the High/Low which do not 
         // contain accurate data...
         if (tHigh[pos]==EMPTY_VALUE) {
            haHigh = High[pos];
         } else {
            haHigh = tHigh[pos];
         }
         
         if (tLow[pos]==EMPTY_VALUE) {
            haLow = Low[pos];
         } else {
            haLow = tLow[pos];
         }
      }

      haOpen=Open[pos];
      haClose=Close[pos];

      if (haOpen<haClose) 
        {
            ExtMapBuffer1[pos]=Low[pos];
            ExtMapBuffer2[pos]=High[pos];
        } 
      else
        {
            ExtMapBuffer1[pos]=High[pos];
            ExtMapBuffer2[pos]=Low[pos];
        } 
      ExtMapBuffer3[pos]=haOpen;
      ExtMapBuffer4[pos]=haClose;
      
      // Show me the spread differential in the High / Ask
      ExtMapBuffer5[pos]=High[pos];
      ExtMapBuffer6[pos]=tHigh[pos];
      
 	   pos--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments