I am relatively new to programming and trying to learn by deciding what I want to do and then researching and investigating how to do that one thing. I learn a lot and find it easier to learn with real world application.
I want the ADR(20) in the buffer for each candle, for a defined session. In my thinking right now session and day are interchangeable, because my intention in the way I think I am writing this indicator is so I could easily modify it to be for market sessions, not only days, in the future. Also, I don't want to use Period_D1, because then it will not work in backtesting, which is the main reason I need it at this time (otherwise I just use an existing ADR indicator, or use iATR with Period_D1). But I can easily see the need (or maybe it is just nice to have) this indicator to see the average range for a particular session (e.g. first 2 hours of the London open) and compare that to other periods of time.
I have looked at many examples of ADR indicator code on internet, but almost every one of them uses Period_D1 (which by using that makes the job easy, but does not meet my requirements).
Where I have gotten is I have calculated the previous day's range (a session length and the session end hour are defined in the indicator).
The difficulty I am having is getting the 20 session periods' ranges summed and then averaging them by 20.
I have used a loop, but it just does not compare to when I use Period_D1 as a sanity check. So I figured there is a bug in my code.
How can I fix what I have? Any suggestions?
Here is a piece of my code:
[Note: below is a little explanation of the above code, so can know what I was trying to do with each line. Note2: there might be typo errors in the above, because I had to delete out all the color codes. So I might have deleted a something important by mistake. But it is all solid in the attached.]
This piece of code is used when the current candle is after the end of the last session hour.
At the first 'if' statement, i find out where the current candle is compared to the session close hour. If the current candle time is after the session's close, then it goes here.
First I calculate the number bars away the beginning of the session is from the current candle. This then gives me the shift I need to get to the sessions' close.
Then I can calculate how many bars are in the session by dividing the number of hours of the session length by the chart period.
Then I use the shift and the session length for the ihighest and ilowest, within a loop. The loop continues 20 times. I then take that and sum at the end of the loop and divide by 20. Then I place that in the buffer and it goes on to the next candle in the orignal loop.
So as I said, the ADR does not appear to be correct.
I appreciate any guidance, explanations, example code, etc.
I am first to admit that my method of code might not be the best, cleanest, nor the quickest way. But it is how my thought process was and the extent of my understanding so far to this point. If I may be so bold to presume to ask, but could you focus your guidance and advice to help me fix my current way of doing it. If it is completely wrong and there is no way for me to accomplish my goal, then sure, I am ready to hear that and learn the proper way. But if I can do it with making some changes with what I have, I would like that more.
I thank you in advance.
-Stearno
I want the ADR(20) in the buffer for each candle, for a defined session. In my thinking right now session and day are interchangeable, because my intention in the way I think I am writing this indicator is so I could easily modify it to be for market sessions, not only days, in the future. Also, I don't want to use Period_D1, because then it will not work in backtesting, which is the main reason I need it at this time (otherwise I just use an existing ADR indicator, or use iATR with Period_D1). But I can easily see the need (or maybe it is just nice to have) this indicator to see the average range for a particular session (e.g. first 2 hours of the London open) and compare that to other periods of time.
I have looked at many examples of ADR indicator code on internet, but almost every one of them uses Period_D1 (which by using that makes the job easy, but does not meet my requirements).
Where I have gotten is I have calculated the previous day's range (a session length and the session end hour are defined in the indicator).
The difficulty I am having is getting the 20 session periods' ranges summed and then averaging them by 20.
I have used a loop, but it just does not compare to when I use Period_D1 as a sanity check. So I figured there is a bug in my code.
How can I fix what I have? Any suggestions?
Here is a piece of my code:
Inserted Code
int mVcnt, ADR2, ADR1,ADR0, aVcnt, BarCnt,NumForSessionCloseBar, ShiftToDayClosebar, BarsForthePeriod,i; datetime aTime; int SesionLength = LengthofSessioninHours * 60; if(Time[0] > aTime) // update only once per bar { for(mVcnt=0; mVcnt<=NumBarsBack; mVcnt++) { if(TimeHour(Time[mVcnt]) > SessionHourClosed) { NumForSessionCloseBar = (((TimeHour(Time[mVcnt])- SessionHourClosed)*60) + TimeMinute(Time[mVcnt]))/ ChartPeriod1; //calculate how many bars away is the close of the session. ShiftToDayClosebar = (NumForSessionCloseBar + mVcnt); // adds the current candle's bar to the number of bars so can shift to the session close bar BarsForthePeriod = (SesionLength / ChartPeriod1); // Number of bars from the beginning of the session to the end of the seesion if 24 hours //Using this below two lines as it shows the ADR for the previous session ADR0 = ((iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,BarsForthePeriod,ShiftToDayClosebar)) - iLow(NULL,0,iLowest(NULL,0,MODE_LOW,BarsForthePeriod,ShiftToDayClosebar)))/point/10); PreviousSessionRange[mVcnt] = ADR0; for(i=1;i<=ADRAvg;i++,ShiftToDayClosebar += BarsForthePeriod ) ADR1 += ((iHigh(NULL[/color],0,iHighest(NULL,0,MODE_HIGH,BarsForthePeriod,ShiftToDayClosebar)) - iLow(NULL,0,iLowest(NULL,0,MODE_LOW,BarsForthePeriod,ShiftToDayClosebar)))/point); ADR1 = ADR1/ADRAvg; AvgDayRange[mVcnt] = ADR1;
[Note: below is a little explanation of the above code, so can know what I was trying to do with each line. Note2: there might be typo errors in the above, because I had to delete out all the color codes. So I might have deleted a something important by mistake. But it is all solid in the attached.]
This piece of code is used when the current candle is after the end of the last session hour.
At the first 'if' statement, i find out where the current candle is compared to the session close hour. If the current candle time is after the session's close, then it goes here.
First I calculate the number bars away the beginning of the session is from the current candle. This then gives me the shift I need to get to the sessions' close.
Then I can calculate how many bars are in the session by dividing the number of hours of the session length by the chart period.
Then I use the shift and the session length for the ihighest and ilowest, within a loop. The loop continues 20 times. I then take that and sum at the end of the loop and divide by 20. Then I place that in the buffer and it goes on to the next candle in the orignal loop.
So as I said, the ADR does not appear to be correct.
I appreciate any guidance, explanations, example code, etc.
I am first to admit that my method of code might not be the best, cleanest, nor the quickest way. But it is how my thought process was and the extent of my understanding so far to this point. If I may be so bold to presume to ask, but could you focus your guidance and advice to help me fix my current way of doing it. If it is completely wrong and there is no way for me to accomplish my goal, then sure, I am ready to hear that and learn the proper way. But if I can do it with making some changes with what I have, I would like that more.
I thank you in advance.
-Stearno
Attached File(s)
adrbcalculationa-bdraftu1.mq4
6 KB
|
265 downloads