Heiken Ashi Hack

 
Hi

I have seen this question asked many times:

The Heiken Ashi Indicator

//+------------------------------------------------------------------+
//|                                                  Heiken Ashi.mq4 |
//|                      Copyright c 2004, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
//| For Heiken Ashi we recommend next chart settings ( press F8 or   |
//| select on menu 'Charts'->'Properties...'):                       |
//|  - On 'Color' Tab select 'Black' for 'Line Graph'                |
//|  - On 'Common' Tab disable 'Chart on Foreground' checkbox and    |
//|    select 'Line Chart' radiobutton                               |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/"

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Red
#property indicator_color2 White
#property indicator_color3 Red
#property indicator_color4 White
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 3
#property indicator_width4 3

//----
extern color color1 = Red;
extern color color2 = White;
extern color color3 = Red;
extern color color4 = White;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//|------------------------------------------------------------------|
int init()
  {
//---- 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);
//----
   SetIndexDrawBegin(0,10);
   SetIndexDrawBegin(1,10);
   SetIndexDrawBegin(2,10);
   SetIndexDrawBegin(3,10);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexBuffer(3,ExtMapBuffer4);
   SetIndexBuffer(4,ExtMapBuffer5);
//---- 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;
   while(pos>=0)
     {
      haOpen=(ExtMapBuffer3[pos+1]+ExtMapBuffer4[pos+1])/2;
      haClose=(Open[pos]+High[pos]+Low[pos]+Close[pos])/4;
      haHigh=MathMax(High[pos], MathMax(haOpen, haClose));
      haLow=MathMin(Low[pos], MathMin(haOpen, haClose));
      if (haOpen<haClose) 
        {
         ExtMapBuffer1[pos]=haLow;
         ExtMapBuffer2[pos]=haHigh;
         ExtMapBuffer5[pos]=1;
         GlobalVariableSet("heikenh",1);
        } 
      else
        {
         ExtMapBuffer1[pos]=haHigh;
         ExtMapBuffer2[pos]=haLow;
         ExtMapBuffer5[pos]=2;
         GlobalVariableSet("heikenh",2);
        } 
      ExtMapBuffer3[pos]=haOpen;
      ExtMapBuffer4[pos]=haClose;
 	   pos--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+




How on earth do you get a value out of this thing.
As you can see I got it right by making it a Global Variable but I want todo it with Icustom:
double ha1 = iCustom(Symbol(),Period(),"Heiken Ashi",4,0);
I created an indexbuffer 4 and thats what I want to get.
I cant even get value 1,2 or 3?

Anybody got anyidea where I'm going wrong?

L.
 

"I have seen this question asked many times"

What was the answer many times?

There are 4 extern variables in the indicator, but you aren't setting them in your iCustom()

 
Sorry I'm still learning.

Would you please be so generous and give me an example


I dont have a clue what to put there?
ha1 = iCustom(Symbol(),Period(),"Heiken Ashi",?,?,?,?,4,0);
 
double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)
Calculates the specified custom indicator and returns its value. The custom indicator must be compiled (*.EX4 file) and be in the terminal_directory\experts\indicators directory.
Parameters:
symbol - Symbol the data of which should be used to calculate indicator. NULL means current symbol.
timeframe - Timeframe. It can be any of Timeframe enumeration values. 0 means the current chart timeframe.
name - Custom indicator compiled program name.
... - Parameters set (if necessary). The passed parameters and their order must correspond with the desclaration order and the type of extern variables of the custom indicator.
mode - Line index. Can be from 0 to 7 and must correspond with the index used by one of SetIndexBuffer functions.
shift - Index of the value taken from the indicator buffer (shift relative to the current bar the given amount of periods ago).
Sample:
declaration:
... deleted...
#property indicator_width3 3
#property indicator_width4 3

//----
extern color color1 = Red;
extern color color2 = White;
extern color color3 = Red;
extern color color4 = White;
//---- buffers
... deleted...
ha1 = iCustom(Symbol(), Period(), "Heiken Ashi", color1, color2, color3, color4, 4, 0);

 

you can delete

extern color color1 = Red;
extern color color2 = White;
extern color color3 = Red;
extern color color4 = White;

and then use:

double ha1 = iCustom(Symbol(),Period(),"Heiken Ashi",4,0);

 
THanks Guys. I actually tried both these last night and it still didn't work. But now I set the 4 to 0 and started getting numbers. So it must be working.
Now Im trying to get 4 to work, Im still getting 0. I noticed this:
#property indicator_buffers 4
Oops. And YES! I got it working, thank you so much
 

NO.

#property indicator_buffers 4
means form 0 to 3, no 4

so only

double ha1 = iCustom(Symbol(),Period(),"Heiken Ashi",0~3,0);

 
I know, I added a 5th one.
double ExtMapBuffer5[];
But Ive never seen 0~3 , can you use that?
 

Good eye, DxdCn

 

Yes, my code all right!

double ExtMapBuffer5[];

but:

#property indicator_buffers 4

so even you set :

SetIndexBuffer(4,ExtMapBuffer5);

double ha1 = iCustom(Symbol(),Period(),"Heiken Ashi",4,0);

can not work!!!

Since :
#property indicator_buffers 4
means form 0 to 3, no 4

 
I said I know, Just relax!!! I should have been more clear before. I changed it to 5 long before you even mentioned it, how else would I get 4 to work.
I'm new at mql4 scripting but NOT new at programming.

Now I'm sitting with a new problem:

      ha1 = iCustom("EURUSD", "PERIOD_M1", "Heiken", 4, 0); 
      ha2 = iCustom("EURUSD", "PERIOD_H1", "Heiken", 4, 0);

Its on 2 different Periods but it keeps spitting out the same number and changes at the same time. Even if I try 0 to 3, same number.
I have no idea why? Anybody know?