Just a little side note: You can schedule the job every day, but whether the program runs can be controlled by the program.
So create a selection screen variant for it with dynamic date calculation, and if that date is the last date of any month, then continue. Else exit.
You can do quite a few funky things with selection screen dynamic fields to send runtime information to the parameters instead of coding it all yourself.
Downside is that folks might be able to run the program, so you might want to check sy-batch and also that it is only running that variant and protect the variant (see transaction VARCH). You can also create it in client 000, then it can only be changed there as a system variant. Then it does only that.
Cheers,
Julius