Hi, I've just started learning to code mql4 over the last couple weeks and have gotten stuck with the first stage of the custom indicator & EA that I'm trying to code.
The first thing that I'm trying to get this to do is to create 2 vertical lines for each week, one on Monday 6.00, and one Friday 21.00. I want these lines to appear through from the beginning of the chart, to the current week.
This is what I have so far. When I attach it to the chart at the moment, nothing at all appears on the chart.
Any help & suggestions of changes I need to make would be most appreciated.
The most obvious thing to notice . . . when you create your first set of lines they then get re-created (and that will cause an error) at the next week . . . . if you want many lines then they need to have different names, you can't have more than one line named StartLine, you could just increment an integer variable and use it with StartLine, so StartLine0, StartLine1, etc.
The reason you aren't seeing any lines is because your Time1 values ( TimeHour(Time[pos]) ) aren't time values at all, look at the documentation for TimeHour() . . . it returns an int not a date time, it can return a value between 0 and 23 , why aren't you just using Time[pos] ?
The most obvious thing to notice . . . when you create your first set of lines they then get re-created (and that will cause an error) at the next week . . . . if you want many lines then they need to have different names, you can't have more than one line named StartLine, you could just increment an integer variable and use it with StartLine, so StartLine0, StartLine1, etc.
The reason you aren't seeing any lines is because your Time1 values ( TimeHour(Time[pos]) ) aren't time values at all, look at the documentation for TimeHour() . . . it returns an int not a date time, it can return a value between 0 and 23 , why aren't you just using Time[pos] ?
Hi Raptor, thanks for your reply. I did wonder if the naming of the lines would be an issue. Will try to do something along the lines of what you've suggested with that in the morning!
On the Time1 issue, I see what you mean, I think. Would this be more what I need? I'm still not getting any lines but maybe that's because of the naming problem.
Thanks again for your help.
while(pos>=0) { if( TimeHour(Time[pos])==StartTime && TimeDayOfWeek(Time[pos])==StartDay ) { ObjectCreate("StartLine",OBJ_VLINE,0,Time[pos],0); ObjectSet("StartLine", OBJPROP_STYLE, STYLE_DASHDOT); ObjectSet("StartLine", OBJPROP_COLOR, StartColour); } if( TimeHour(Time[pos])==EndTime && TimeDayOfWeek(Time[pos])==EndDay ) { ObjectCreate("EndLine",OBJ_VLINE,0,Time[pos],0); ObjectSet("EndLine", OBJPROP_STYLE, STYLE_DASHDOT); ObjectSet("EndLine", OBJPROP_COLOR, EndColour); } pos--; }
Hi Raptor, thanks for your reply. I did wonder if the naming of the lines would be an issue. Will try to do something along the lines of what you've suggested with that in the morning!
On the Time1 issue, I see what you mean, I think. Would this be more what I need? I'm still not getting any lines but maybe that's because of the naming problem.
Even without fixing the names you should get 2 lines . . . right click on yor chart and check the Objects, see if your lines are there, if they are find where they have been placed, that may give you some clues to what is wrong.
I looked for the two lines in the object list as you suggested and they were there, but they were back in 1970.
I've been trying to add an index number to my lines this morning but can't seem to get it right. I've gone through a few ideas and currently have this.
It seems to be getting there as I can now see the two lines. They're in odd places though, the first one is where I wanted it to start, the first Monday of the chart, but the second one is a few months late. Again, maybe this will correct itself once the names are sorted.
Best
#property indicator_chart_window //--- input parameters extern int StartDay=1; extern int EndDay=5; extern int StartTime=6; extern int EndTime=21; extern color StartColour=DarkOrange; extern color EndColour=OrangeRed; extern color FlatLineColour=Gold; string StartLineName="StartLine"; string EndLineName="EndLine"; string FlatLine; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); //---- //---- Check for possible errors if(counted_bars<0) return(-1); //---- Last counted bar will be recounted if(counted_bars>0) counted_bars--; int pos=Bars-counted_bars-1; //main calculation loop while(pos>=0) { int LineNum=0; string StartName=StartLineName+LineNum; string EndName=EndLineName+LineNum; if( TimeHour(Time[pos])==StartTime && TimeDayOfWeek(Time[pos])==StartDay ) { ObjectCreate(StartName,OBJ_VLINE,0,Time[pos],0); ObjectSet(StartName, OBJPROP_STYLE, STYLE_DASHDOT); ObjectSet(StartName, OBJPROP_COLOR, StartColour); } if( TimeHour(Time[pos])==EndTime && TimeDayOfWeek(Time[pos])==EndDay ) { ObjectCreate(EndName,OBJ_VLINE,0,Time[pos],0); ObjectSet(EndName, OBJPROP_STYLE, STYLE_DASHDOT); ObjectSet(EndName, OBJPROP_COLOR, EndColour); } LineNum++; pos--; } //---- return(0); } //+------------------------------------------------------------------+
I looked for the two lines in the object list as you suggested and they were there, but they were back in 1970.
I've been trying to add an index number to my lines this morning but can't seem to get it right. I've gone through a few ideas and currently have this.
It seems to be getting there as I can now see the two lines. They're in odd places though, the first one is where I wanted it to start, the first Monday of the chart, but the second one is a few months late. Again, maybe this will correct itself once the names are sorted.
Best
This is your problem . . .
int LineNum=0;
for each bar you are initializing LineNum to 0, move it to the beginning of your start() function and make it a static declaration. (click the link and scroll down a little)
Quality mate, working perfectly! Thank you very much for your speedy help.
Legend!
Using a counter, you can get multiple lines per bar on a chart refresh.
Instead time is unique and the code simpler.
ObjectCreate(StartName+Time[pos],OBJ_VLINE,0,Time[pos],0);
Ahh yeah nice one, that is simpler. Two new tricks learnt! :-)
Cheers
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
The first thing that I'm trying to get this to do is to create 2 vertical lines for each week, one on Monday 6.00, and one Friday 21.00. I want these lines to appear through from the beginning of the chart, to the current week.
This is what I have so far. When I attach it to the chart at the moment, nothing at all appears on the chart.
Any help & suggestions of changes I need to make would be most appreciated.
Best
Phil