ATR with MA

Post Reply
User avatar
dynel14
Trader
Posts: 37
Joined: Wed Nov 16, 2011 1:38 am
Location: Cologne/Germany

ATR with MA

Post by dynel14 »

Hi community,

hope you all are doing well...!?
I have a request: Is it possible to make a histogram version of this indicator?
ATR > MA = green
ATR = MA = yellow
ATR < MA = red

I would really appreciate your help!!!
Thank you in advance
You do not have the required permissions to view the files attached to this post.
User avatar
dynel14
Trader
Posts: 37
Joined: Wed Nov 16, 2011 1:38 am
Location: Cologne/Germany

Re: ATR with MA

Post by dynel14 »

Hmm.. :(

I tried to do it, but it doesn't work. Maybe someone can fix it?

THANKS!

Code: Select all

//+------------------------------------------------------------------+
//|                                                  ATR with MA.mq4 |
//|                                                       MetaQuotes |
//|                                                                  |
//+------------------------------------------------------------------+


#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 LimeGreen
#property indicator_color2 Crimson
#property indicator_color3 Yellow
#property indicator_width1 4
#property indicator_width2 4
#property indicator_width3 4
//---- input parameters
extern int       ATRper=14;
extern int       MAPeriod=14;
extern string    c="Method: 0=SMA, 1=EMA, 2=SMMA, 3=LWMA";
extern int       MAMethod=1;

//---- buffers
double TrendUP[];
double TrendDown[];
double TrendFlat[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   string type;
   switch(MAMethod)
   {
   case MODE_EMA: type="EMA";break;
   case MODE_SMMA: type="SMMA";break;
   case MODE_LWMA: type="LWMA";break;
   default: type="SMA";MAMethod=0;break; //
   }

   IndicatorBuffers(5);
   IndicatorDigits(Digits);
   SetIndexBuffer(0, TrendUP);
   SetIndexStyle(0, DRAW_HISTOGRAM);
   SetIndexBuffer(1, TrendDown);
   SetIndexStyle(1, DRAW_HISTOGRAM);
   SetIndexBuffer(2, TrendFlat);
   SetIndexStyle(2, DRAW_HISTOGRAM);

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
   int i, iNewBars, iCountedBars;
   double ExtMapBuffer1[];
   double ExtMapBuffer2[];

   // Get unprocessed ticks
   iCountedBars = IndicatorCounted();
   if(iCountedBars < 0) return(-1);
   if(iCountedBars > 0) iCountedBars--;
   iNewBars = Bars - iCountedBars; 

   for(i = 0; i < iNewBars ; i++) {
     ExtMapBuffer1=iATR(NULL,0,ATRper,i);
     ExtMapBuffer2=iMAOnArray(ExtMapBuffer1,0,MAPeriod,0,MAMethod,i);


   if( ExtMapBuffer1 < ExtMapBuffer2 ) {
         TrendUP[i] = 1;
         TrendDown[i] = 0;
         TrendFlat[i] = 0;
     }
     else if( ExtMapBuffer1 > ExtMapBuffer2 ) {
         TrendUP[i] = 0;
         TrendDown[i] = 1;
         TrendFlat[i] = 0;
     }
     else {
         TrendUP[i] = 0;
         TrendDown[i] = 0;
         TrendFlat[i] = 1;
     }
   return(0);
 }
}
//+------------------------------------------------------------------+
garyfritz

Re: ATR with MA

Post by garyfritz »

You have a couple of errors. You declare ExtMapBuffer1/2 as arrays, but not pre-allocated arrays. Display buffers are automagically allocated by Empty4. For your own buffers, you have to allocate the space. You can either allocate a fixed array, e.g. "double ExtMapBuffer1[2048];", or you can resize the array to the size you want: "double ExtMapBuffer1[]; ArrayResize(ExtMapBuffer1, Bars);" or similar.

Then, although you declared them as arrays, you assigned into them like a single value, without an indexer.

It's also not necessary for ExtMapBuffer2 to be an array. You need the ExtMapBuffer1 array because you take the iMAOnArray of it, but the MA result gets used and discarded. So it can be a simple double.

You also made a very understandable mistake -- because Empty4's definition is braindead. In bar data, the [0] bar is the newest, rightmost bar. So if you do an iMA on it, it includes bar i and the bars with indexes GREATER THAN i. (A 3-bar SMA would include bar i, i+1, i+2 -- i+1 is "older" than i.) But normal arrays are indexed "left-to-right," with [0] being the "oldest." So an iMAOnArray SMA includes bar i, i-1, and i-2. You need to SetArrayAsSeries to make Empty4 treat the array like bar data, reversing the order that iMAOnArray access it, AND you need to scan i from oldest to newest (iNewBars to 0) so the older ATR data is in the ExtMapBuffer1 array for iMAOnArray to access.

Finally, your "return(0)" was INSIDE your i loop! Whoops!

So I think the attached does what you wanted. You won't see many (any?) yellow bars, because the two values will almost never be exactly equal. If you really want yellow bars for "equal" values, you'll have to do something like "if (MathAbs(x-y) < 0.00001) then ..." instead of using ==.

I don't guarantee this code is done the "right way." I just figured out some of these mysteries myself last week, thanks to sq!

Gary


Code: Select all

    //+------------------------------------------------------------------+
    //|                                                  ATR with MA.mq4 |
    //|                                                       MetaQuotes |
    //|                                                                  |
    //+------------------------------------------------------------------+


    #property indicator_separate_window
    #property indicator_buffers 3
    #property indicator_color1 LimeGreen
    #property indicator_color2 Crimson
    #property indicator_color3 Yellow
    #property indicator_width1 4
    #property indicator_width2 4
    #property indicator_width3 4
    //---- input parameters
    extern int       ATRper=14;
    extern int       MAPeriod=14;
    extern string    c="Method: 0=SMA, 1=EMA, 2=SMMA, 3=LWMA";
    extern int       MAMethod=1;

    //---- buffers
    double TrendUP[];
    double TrendDown[];
    double TrendFlat[];
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function                         |
    //+------------------------------------------------------------------+
    int init()
      {
    //---- indicators
       string type;
       switch(MAMethod)
       {
       case MODE_EMA: type="EMA";break;
       case MODE_SMMA: type="SMMA";break;
       case MODE_LWMA: type="LWMA";break;
       default: type="SMA";MAMethod=0;break; //
       }

       IndicatorBuffers(5);
       IndicatorDigits(Digits);
       SetIndexBuffer(0, TrendUP);
       SetIndexStyle(0, DRAW_HISTOGRAM);
       SetIndexBuffer(1, TrendDown);
       SetIndexStyle(1, DRAW_HISTOGRAM);
       SetIndexBuffer(2, TrendFlat);
       SetIndexStyle(2, DRAW_HISTOGRAM);

    //----
       return(0);
      }
    //+------------------------------------------------------------------+
    //| Custom indicator deinitialization function                       |
    //+------------------------------------------------------------------+
    int deinit()
      {
    //----
       
    //----
       return(0);
      }
    //+------------------------------------------------------------------+
    //| Custom indicator iteration function                              |
    //+------------------------------------------------------------------+
    int start() {
       int i, iNewBars, iCountedBars;
       double ExtMapBuffer1[];
       double MAval;

       // Get unprocessed ticks
       iCountedBars = IndicatorCounted();
       if(iCountedBars < 0) return(-1);
       if(iCountedBars > 0) iCountedBars--;
       iNewBars = Bars - iCountedBars;

       ArrayResize(ExtMapBuffer1, Bars);
       ArraySetAsSeries(ExtMapBuffer1, true);
       int cnt = 0; Print("iNewBars = ",iNewBars);
       for(i = iNewBars; i >= 0; i--) {
         ExtMapBuffer1[i]=iATR(NULL,0,ATRper,i);
         MAval=iMAOnArray(ExtMapBuffer1,0,MAPeriod,0,MAMethod,i);
cnt++; if (cnt < 15) Print("iNewBars = ",iNewBars,", i = ",i,", buffer = ",ExtMapBuffer1[i],", MAval = ",MAval);

       if( ExtMapBuffer1[i] < MAval ) {
             TrendUP[i] = 1;
             TrendDown[i] = 0;
             TrendFlat[i] = 0;
         }
         else if( ExtMapBuffer1[i] > MAval ) {
             TrendUP[i] = 0;
             TrendDown[i] = 1;
             TrendFlat[i] = 0;
         }
         else {
             TrendUP[i] = 0;
             TrendDown[i] = 0;
             TrendFlat[i] = 1;
         }
       }
       return(0);
    }
    //+------------------------------------------------------------------+
User avatar
dynel14
Trader
Posts: 37
Joined: Wed Nov 16, 2011 1:38 am
Location: Cologne/Germany

Re: ATR with MA

Post by dynel14 »

Thank you very much :!:

Will try to understand all my mistakes. I have no clue about coding. I have just started to learn it.

Thanks again :!:
Post Reply

Return to “Coders Hangout”