I was taught in the earlier bootcamps that "def OnData(self, data)" would be the primary entry point of the algo, and the codes for trade executions(e.g. SetHoldings()) were placed in this function in those bootcamps, so I kind of assumed that would always be the case. 

Why is it that in the Liquid Universe bootcamp, the codes for trade execution go under the "def OnSecuritiesChanged()" function? Why is it that some algos have their SetHoldings code under some functions, and some algos have it in other functions? Does it strictly vary depending on what you're trying to build? Do the instructions for orders always go under def OnSecuritiesChanged() when building an algorithm that deals with a liquid universe?