# Symbol synchronization with M-QAM. M < 16

I working on M-QAM system using a Cortex-M4 processor. Using a alternating symbol as a preamble, I am able to get carrier lock. Symbol synchronization is then achieved by finding the peak. An early late gate is used to adjust for clock differences between modulator and demodulator. An integrator is used to even out the noise from the error detector. However, I can see the peak slipping from the optimum sampling position. Eventually after 500-600 symbols it loses sync. Are there any superior ways of doing symbol sync? Am I missing something?