In your example code you are not reusing any variable. All the variables in your example a named differently so there is no problem.
However, "histo_1" does not seem to be locally declared and you probably meant the following:
void histo_up_count() { for (int i=0; i < 50; i++) { double histo_1 = iCustom(NULL,0,"MACD True",2,i); if (histo_1 > 0) ...
Local or temporary variables in a function should not collide with globally declared variables because that would interfere with the functionality. That is why you use should not "reuse" globally scoped variables for locally scoped functionality.
In my own programming I use a prefix of "g_" on globally scoped variables so as to differentiate them and prevent conflict, but you can use whatever naming convention you want as long as you understand the deferent variable scopes.
Agent86:
Hi,
My thoughts were this: why can't I reuse histo in the same way as I use "i" ?
void histo_up_count() { for (int i=0; i < 50; i++) { histo_1 = iCustom(NULL,0,"MACD True",2,i); if (histo_1 > 0) { histoupcount = i; } else return; } return; }
What are you trying to do?
Are you trying to find the first bar that the condition is true or are you trying to count the number of bars where the condition is true?
Why do you have the return in there?
If the condition is not true on the first check, it will return and so the function achieves nothing
In your example code you are not reusing any variable. All the variables in your example a named differently so there is no problem.
However, "histo_1" does not seem to be locally declared and you probably meant the following:
Local or temporary variables in a function should not collide with globally declared variables because that would interfere with the functionality. That is why you use should not "reuse" globally scoped variables for locally scoped functionality.
In my own programming I use a prefix of "g_" on globally scoped variables so as to differentiate them and prevent conflict, but you can use whatever naming convention you want as long as you understand the deferent variable scopes.
AHHH ! I think I see now. I can cut out a lot of code by locally declared variables of the same name.
I have some thinking and reading to do on this. Thanks Big Help
What are you trying to do?
Are you trying to find the first bar that the condition is true or are you trying to count the number of bars where the condition is true?
Why do you have the return in there?
If the condition is not true on the first check, it will return and so the function achieves nothing
So in this case it counts i++ up to 50 bars to find the point where histo is no longer >0 this is my reference bar for my other functions.
As far as the return goes, I think this was just left over from things I was working back and forth between functions. I'll clean this up too thanks.
Fernando's post about global vs local declarations will help me clean a lot of this up.
Thanks all for the responses it really helps.
No, that is not what I stated. I stated the exact opposite. Do not use the same name for local and global variables.
I even gave you my example of using the "g_"prefix on global variables so as not to be the same as local variables.
You can however use the same name for local variables in different functions.
Learn the difference between globally scoped and locally scoped variables.
else return; functions as expected, but return has differences.
no return or else return: counts way back in time and does function as expected.
void histo_up_count() { for (int i=0; i < 50; i++) { double histo_1 = iCustom(NULL,0,"MACD True",2,i); if (histo_1 > 0) histoupcount = i; //else return; } } // ------------Counting the BAR number that crossed below 0 historgram used to find fractals. void histo_down_count() { for (int i=0; i < 50; i++) { double histo_1 = iCustom(NULL,0,"MACD True",2,i); if (histo_1 < 0) histodowncount = i; //else return; } }
And to be clear. Declaration of local variables of the same name will not collide right ? Thanks
I asked you before
What are you trying to do?
Are you trying to find the first bar that the condition is true or are you trying to count the number of bars where the condition is true?
You replied
So in this case it counts i++ up to 50 bars to find the point where histo is no longer >0 this is my reference bar for my other functions.
Your latest code
So I cleaned this up and am confused about the "return" or the "else return".
else return; functions as expected, but return has differences.
no return or else return: counts way back in time and does function as expected.
void histo_up_count() { for (int i=0; i < 50; i++) { double histo_1 = iCustom(NULL,0,"MACD True",2,i); if (histo_1 > 0) histoupcount = i; //else return; } }
Both your function name and the variable name suggests that you are counting something, but you are looking for a bar index, correct? Use meaningful function and variable names to avoid confusion.
if you are trying to find the first bar where the histo is NOT >0
void histo_up_count() { for (int i=0; i < 50; i++) { double histo_1 = iCustom(NULL,0,"MACD True",2,i); if (histo_1 <= 0) { histoupcount = i; return; } } }
No, that is not what I stated. I stated the exact opposite. Do not use the same name for local and global variables.
I even gave you my example of using the "g_"prefix on global variables so as not to be the same as local variables.
You can however use the same name for local variables in different functions.
Learn the difference between globally scoped and locally scoped variables.
Yes, I think I understood this. What I meant was that I got rid of the global variable that I was attempting to reuse and opted for a locally declared variable for each of my functions.
Do I have this wrong still ?
Thanks
I asked you before
You replied
Your latest code
Both your function name and the variable name suggests that you are counting something, but you are looking for a bar index, correct? Use meaningful function and variable names to avoid confusion.
if you are trying to find the first bar where the histo is NOT >0
I misunderstood your question.
Yes the first bar where histo==true meaning first bar crossing up above 0.
This is the reference bar for counting in either direction. I count forward to get the first UPPER fractal and backwards to get the first LOWER fractal.
So once that bar is found the bar number is set to histoupcount=i
Then I use this to find fractals UPPER / LOWER
bool A_low() { { if(histo()) { val2=0; for (int i=histoupcount; val2==0; i++) { val2=iFractals(NULL, 0, MODE_LOWER, i); A = val2; atime=Time[i]; } if(A!=0) { //atime=Time[i]; //ObjectSet("B3",OBJPROP_BGCOLOR,clrLime); ObjectSet("B16",OBJPROP_TIME1,atime); ObjectSet("B16",OBJPROP_PRICE1,A); ObjectSet("B16",OBJPROP_ANCHOR,ANCHOR_UPPER); ObjectSetString(0,"B16",OBJPROP_TOOLTIP,"A Low = "+DoubleToStr(A,4)); //Print(A, " A Low Located at bar ",i); return(true); } } } //another snip for UPPER bool B_high() { { if(histo()) { for (int i=histoupcount; i!=0; i--) { val1=iFractals(NULL, 0, MODE_UPPER, i); B = val1; //Print(B, " B = val1"); if(B!=0) { btime = Time[i]; //ObjectSet("B2",OBJPROP_BGCOLOR,clrLime); ObjectSet("B17",OBJPROP_TIME1,btime); ObjectSet("B17",OBJPROP_PRICE1,B); ObjectSet("B17",OBJPROP_ANCHOR,ANCHOR_LOWER); ObjectSetString(0,"B17",OBJPROP_TOOLTIP,"B High = "+DoubleToStr(B,4)); //Print(B, " B high Located at bar ", i); return(true); } } } } //ObjectSet("B2",OBJPROP_BGCOLOR,clrBlack); return(false); }
That is the general idea to use histo crossed bar as a reference bar and count to the fractal I want from the reference bar. Either forward or back to the fractal I want.
It's not a good code but I'm learning.
Thanks for all the answers. I have learned a lot but there is still much foggy areas for me.
I was attempting to trim the fat and also make easier to work on for TEXT objects that move on the chart etc.
Aside from the TEXT variables the other OBJ_Labels and things work as expected.
I may be going about it all wrong but it's what lead me to ask about "reusing" the variables. Mostly the question was answered but may not actually be the question I should have been asking.
I think I may have worked my self in a corner from too many global variables making it too time consuming to make changes every time I think of a new way of writing the functions better and shorter.
So I'll keep working on this some more you all have given me a bunch to think about already.
Thanks again and every bit helps a lot.
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
My thoughts were this: why can't I reuse histo in the same way as I use "i" ?
I use histo for comparison for up/down cross.
I use histo_1 for counting
I'm concerned that reusing histo; will interfere with my comparison of histo<0 and histo>0 comparisons. Since histo value will change during the void function() ?
I guess the question is: Is it customary to keep creating variables/constants for others comparisons like this or what should be done to avoid such duplication etc.
Please advise
Thanks