This is very possible: what you want to do is set the trigger for the next run at the end of the run.
So, you would run the function once manually and at the end insert this snippet:
ScriptApp.newTrigger("FUNCTION HERE")
.timeBased()
.at(new Date(new Date().setHours(new Date().getHours()+1,0,0,0))
.create();
But, because this is, in some ways, a tenuous chain of triggers (if one ever fails, it won't continue running the next hour) you have a few options.
I would make a failsafe function that runs every day and makes sure the above function is working (if not, start the chain again). I would also wrap whatever else is in this function in a try catch block (scroll to the bottom of the page: you should be doing this anyway for all your functions, always) and add the above code to that as well so that even if your function fails, it will still run next time (or put it in the beginning of the function).