How about closing them the first day of the month as a compromise. Would that hurt the system?
Thanks for the reply. No, it wouldn't hurt the system to do it that way either. The problems that I could foresee were: detecting the end day of the month and also detecting if the last day of the month fell on a day when the market's were not open (friday after 5 EST to Sunday at 4-6pm EST). Is there a way to detect the first day of the month and if the first day of the month is a valid trading day?
Hello,
I have an EA that I am programming to utilize one of several different order close conditions. The conditions are: daily, weekly, and equity based (if equity gets too high or too low). These are all programmed and working successfully. I am also needing to add a monthly close feature that detects the last trading day of the month so the EA will close all the open positions before the close of that day. I didn't know if there was an easier way to detect the last trading day of each month other than manually writing a boat-load of code to tell the EA the number of days in each month, leap-year information, etc...
Anybody done this before or have any ideas? Thanks.
Hope you got the idea....let me know...
if (TimeMonth(Time[0])!=TimeMonth(Time[1]) ) //close trades as new month
If you don't want to have the position opened over the weekend. Then expand on Ickyrus code like below. (Not-Tested).
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void start(){ int TC=TimeCurrent(); if( TimeMonth(TC)!=TimeMonth(TC+1) ){/*CloseAll*/} if( TimeDayOfWeek(TC)==5 ){bool Friday=true;} int _48hr_1Sec_=60*60*24*2+1;//Seconds*Minutes*Hours*Days+(1s) if(Friday){ if( TimeMonth(TC)!=TimeMonth(TC+_48hr_1Sec_) ){ /*CloseAll*/ } } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Thanks for the reply. No, it wouldn't hurt the system to do it that way either. The problems that I could foresee were: detecting the end day of the month and also detecting if the last day of the month fell on a day when the market's were not open (friday after 5 EST to Sunday at 4-6pm EST). Is there a way to detect the first day of the month and if the first day of the month is a valid trading day?
- First day of the month is easy
datetime now.srv = TimeCurrent(); int now.dom = TimeDay(now.srv); if (now.dom == 1) // First day of the month
If the market is closed, you won't get a tick and the code isn't running. If dom < previous.dom it's the first trading day of the month.
- Last day of the month slightly harder
if (now.dom == DaysOfMonth(now.srv)) // It's the last : bool IsLeapYear(int year){ return(year%4==0 && year%100!=0 && year%400==0); } int DaysOfMonth(datetime when){ // Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec static int dpm[] ={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int iDpm = TimeMonth(when) - 1; if (iDpm != 1) return(dpm[iDpm]); return(dpm[iDpm] + IsLeapYear(TimeYear(when))); }
- The hard one is when the market closes on Friday(UTC.) See my code. Testing for Friday is easy
int now.dow = TimeDayOfWeek(now.utc); #define FRIDAY 5 if (now.dow == FRIDAY) // It's Friday.
- friday after 5 EST to Sunday at 4-6pm ESTIs wrong. Market closes 4 pm ET (4 pm EDT or 4 pm EST) and opens 6 pm ET. See my code
Thank you all so much for the quick responses. These examples help out a ton. I'll begin implementing and let you know how it turns out. Thanks again!
You can also try using OrderOpenTime(). Ex.
if (TimeMonth(OrderOpenTime())!=TimeMonth(TimeCurrent()) ) {CloseOrder();}
This could be helpful if the Expert was not Active on Friday_Nite to close the order; Then on Monday is a different Month. IMHO- time can be very tricky stuff to program. When you start adding Holidays, Local vs BrokerTime, and whatever else it usually becomes a mess. I'd take the easy way out and not try to bullet-proof it. Cross that bridge when you get there.
- First day of the month is easy If the market is closed, you won't get a tick and the code isn't running. If dom < previous.dom it's the
first trading day of the month.
- Last day of the month slightly harder
- The hard one is when the market closes on Friday(UTC.) See my
code. Testing for Friday is easy
- Is wrong. Market closes 4 pm ET (4 pm EDT or 4 pm EST) and opens 6 pm ET. See my code
Thank you, all, and especially William. This has just helped me a lot.
One slight improvement was necessary in the IsLeapYear function, however, to get it (meaning "every 4 years, but not every 100 years, then again every 400 years") 100% correct:
bool IsLeapYear(int year){ return(year%4==0 && (year%100!=0 || year%400==0)); }
Hope this helps, and thanks again a million!
How about closing them the first day of the month as a compromise. Would that hurt the system?
Thank you Ubzen, I was looking for a solution to the OP question and you gave me a quick logical one. Close on open of the next month.
Us coders need to think what is the Goal, the Goal here is to run our EAs in Strategy Tester, to get an accurate estimation of past results. Not to squeeze every pip out of the backtest.
If we were running our EA Live, we would simply manually Close all trades last hour of the Month.
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Hello,
I have an EA that I am programming to utilize one of several different order close conditions. The conditions are: daily, weekly, and equity based (if equity gets too high or too low). These are all programmed and working successfully. I am also needing to add a monthly close feature that detects the last trading day of the month so the EA will close all the open positions before the close of that day. I didn't know if there was an easier way to detect the last trading day of each month other than manually writing a boat-load of code to tell the EA the number of days in each month, leap-year information, etc...
Anybody done this before or have any ideas? Thanks.