Heiken Ashi Open formula

I'm trying to write my own strategy code in Java but an having trouble with the Heiken Ashi "Open" value. The formula is this:

(HAOpen[1]+HAClose[1])/2

But this appears to be recursive. How do you find HAOpen when you need it in your formula?

Thanks!
 
haOpen is the open of the previous bar. If you are on the first bar of the data series, just use the open.

Same goes for the haClose.
 
Here it is in C++

Code:
/***********************************************************************/
extern "C" __declspec( dllexport ) void jPrice(struct s_sg &sg)
{
	sg.GraphName="JPrices";
	sg.Subgraph[0].Name="O";
	sg.Subgraph[1].Name="H";
	sg.Subgraph[2].Name="L";
	sg.Subgraph[3].Name="C";

	sg.FreeDLL=0; if(sg.SetDefaults) {return;}
	if(sg.ArraySize<100) return;
	sg.UsePriceGraphStyle=1;

	sg.Input[2].Name="Print Up & Down Bars (0), Up (1), Dn (-1)";


	int    pos, updn=0;
	float  jO=0, jH, jL, jC=0;
	sg.DataStartIndex=15;
 
	for (pos=15; pos < sg.ArraySize; pos++)
	{

		jO=(jO+jC)/2;
		jC=(sg.BaseDataIn[0][pos]+sg.BaseDataIn[1][pos]+sg.BaseDataIn[2][pos]+sg.BaseDataIn[3][pos])/4;

		if(jO>sg.BaseDataIn[1][pos] && jO>jC) jH=jO; else if(jC>sg.BaseDataIn[1][pos]) jH=jC; else jH=sg.BaseDataIn[1][pos];
		if(jO<sg.BaseDataIn[2][pos] && jO<jC) jL=jO; else if(jC<sg.BaseDataIn[2][pos]) jL=jC; else jL=sg.BaseDataIn[2][pos];

		sg.Subgraph[5].Data[pos]=jH;
		sg.Subgraph[6].Data[pos]=jL;

		if(jH>sg.Subgraph[5].Data[pos-1] && jL>=sg.Subgraph[6].Data[pos-1]) {updn=1;} else
		if(jL < sg.Subgraph[6].Data[pos-1] && jH<=sg.Subgraph[5].Data[pos-1]) {updn=-1;};

		if((sg.Input[2].FloatValue!=1 && sg.Input[2].FloatValue!=-1) || (sg.Input[2].FloatValue==1 && updn==1) || (sg.Input[2].FloatValue==-1 && updn==-1))
		{
			sg.Subgraph[0].Data[pos]=jO;
			sg.Subgraph[1].Data[pos]=jH;
			sg.Subgraph[2].Data[pos]=jL;
			sg.Subgraph[3].Data[pos]=jC;
		};
	}
};
 
One way of getting around your problem is to set an initial condition for the first bar of the sequence.

For example, in tradestation you could write:

If CurrentBar = 1 Then Begin
HA_O = O;
HA_H = H;
HA_L = L;
HA_C = C;
End;

If CurrentBar > 1 Then Begin
HA_C = (O+H+L+C)/4;
HA_O = (HA_O[1] + HA_C[1]) / 2;
HA_H = MaxList(H, HA_O, HA_C);
HA_L = MinList(L, HA_O, HA_C);
End;

Hope this helps,
RoughTrader
 
Great question, simple and clean answers.

BTW, nice logic there Rough Trader, it corrects the thinking as well as showing how to execute the coding.

Thanks,

Jimmy
 
Back
Top