LSMA_ind_12xxx





//+-----------+
//| LSMA      |
//+-----------+
#property  copyright "Copyright 2005 Ron Thompson"
#property  link      "http://www.forexmt4.com/"

/*
This indicator uses LSMA and colors it 
red when falling and green when rising.

There is some buffer magic that makes this work.
The order of the buffers and colors is important.

Removing green exposes red
removing red exposes green
removing neither shows yellow (!?!)
*/

//---- indicator settings
#property  indicator_chart_window

#property indicator_buffers   8
#property indicator_color1  Yellow      
#property indicator_color2  Green
#property indicator_color3  Red
#property indicator_color4  Green
#property indicator_color5  Red
#property indicator_color6  LawnGreen
#property indicator_color7  Red
#property indicator_color8  Yellow


//---- buffers
double ExtMapBuffer1[];  //Yellow
double ExtMapBuffer2[];  //Green
double ExtMapBuffer3[];  //Red
double XBuffer[];        //White
double ZBuffer[];        //White
double ExtMapBuffer6[];  //Green
double ExtMapBuffer7[];  //Red
double ExtMapBuffer8[];  //Yellow

extern int extRperiod = 14;
extern double extSlope = 0.0;
extern int extDraw4HowLong = 200;
extern bool showarrows=false;
extern int open1_close2=1;
extern bool showarrowvalues=false;

// bar open handling
int    bartime;

//Objects
int    uniq=0;


//+-----------+
//| Init      |
//+-----------+
int init()
  {
   ObjectsDeleteAll();

   SetIndexBuffer(0,ExtMapBuffer1);   //Yellow
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);

   SetIndexBuffer(1,ExtMapBuffer2);  //Green
   SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 2);

   SetIndexBuffer(2,ExtMapBuffer3);  //Red
   SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 2);


   // 233 up arrow
   // 234 down arrow
   // 158 little dot
   // 159 big dot
   // 168 open square
   // 120 box with X
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexBuffer(3, XBuffer);     //Green
   SetIndexArrow(3,233);

   SetIndexStyle(4,DRAW_ARROW);
   SetIndexBuffer(4, ZBuffer);     //Red
   SetIndexArrow(4,234);

   SetIndexBuffer(5,ExtMapBuffer6);  //Green
   SetIndexStyle(5, DRAW_ARROW);
   SetIndexArrow(5,233);

   SetIndexBuffer(6,ExtMapBuffer7);  //Red
   SetIndexStyle(6, DRAW_ARROW);
   SetIndexArrow(6,234);

   SetIndexBuffer(7,ExtMapBuffer8);  //Yellow
   SetIndexStyle(7, DRAW_ARROW);
   SetIndexArrow(7,120);

   Print("Init complete");
  }

//+-----------+
//| DE-Init   |
//+-----------+
int deinit()
  {
   int i;
   
   for( i=0; i<Bars; i++ )
     {
      ExtMapBuffer1[i]=0;
      ExtMapBuffer2[i]=0;
      ExtMapBuffer3[i]=0;
      XBuffer[i]=0;
      ZBuffer[i]=0;
      ExtMapBuffer6[i]=0;
      ExtMapBuffer7[i]=0;
      ExtMapBuffer8[i]=0;
     }
   ObjectsDeleteAll();
   Print("DE-Init complete");
  }


//+-----------+
//| Each Tick |
//+-----------+
int start()
  {   
   int    pos;

   double wtp; //LSMA previous value
   double wt;  //LSMA current value
   double wd;  //difference

   string sColor;
   
   double pSlope=extSlope*Point;

   // draw once at open of bar 
   if(bartime==Time[0]) return(0);
   bartime=Time[0];

   for(pos = extDraw4HowLong; pos >= 0; pos--)
     { 
      //save previous value
      wtp = wt;
      //get next bar LSMA
      wt  = LSMA(pos);
      //calculate difference
      wd = (wt-wtp)/Point;

      // draw actual LSMA line
      ExtMapBuffer1[pos] = wt;   //yellow
      ExtMapBuffer2[pos] = wt;   //green
      ExtMapBuffer3[pos] = wt;   //red 
      if (wtp < wt+(pSlope))  //rising, remove RED
        {
         ExtMapBuffer3[pos] = EMPTY_VALUE;
        }

      if (wtp > wt-(pSlope)) //falling, remove GREEN
        {
         ExtMapBuffer2[pos] = EMPTY_VALUE;
        }

      if(showarrows)
        {
         // Draw arrows that reflect the REAL difference levels
         sColor="YELLOW";

         if (wd > 0.0 && wd > extSlope )         //rising
           {
            sColor="GREEN";
            ExtMapBuffer6[pos]=wt;//+(10*Point);
           }
         if (wd < 0.0 && wd < (extSlope*(-1)) )  //falling
           {
            sColor="RED";
            ExtMapBuffer7[pos]=wt;//+(10*Point);
           }
         if (sColor=="YELLOW")  //static - within slope
           { 
            ExtMapBuffer8[pos]=wt;//+(10*Point);
           }
        }   

      if(showarrowvalues)
        {
         ObjectCreate("myx"+DoubleToStr(uniq,0), OBJ_TEXT, 0, Time[pos], wt );
         ObjectSetText("myx"+DoubleToStr(uniq,0),DoubleToStr(wd,0),15,"Arial",White);
         uniq++;
        }
      
     }//for 

  }//start

double LSMA(int mybar)
  {
   int    i;
   double sum=0;
   double lengthvar = ( extRperiod + 1.0 ) / 3.0;
   
   for(i = extRperiod; i >= 1  ; i--)
     {
      //open
      if(open1_close2==1) sum += ( i - lengthvar)*Open[extRperiod - i + mybar];
      //close 
      if(open1_close2==2) sum += ( i - lengthvar)*Close[extRperiod - i + mybar];
     }
   return(sum * 6 / (extRperiod*(extRperiod + 1)) );
  }         


 





Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
Series array that contains open prices of each bar
Series array that contains close prices for each bar


Indicator Curves created:


Implements a curve of type DRAW_LINE
Implements a curve of type DRAW_ARROW
Implements a curve of type DRAW_ARROW

Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features: