Your received signal has several deterministic but unknown parameters, the amplitude, the frequency offset, and the sampling timing offset, and perhaps some others. At a minimum you need an AGC to get to a known and desired amplitude, a carrier recovery circuit ( costas loop or a gardner loop) and a symbol timing recovery circuit (early-late gate combined with matched filtering). Oh and a decision device or slicer
For the AGC, decide the signal amplitude you desire, calculate the error in your received signal (Rx signal amplitude - desired amplitude), filter this error, and then use as the input to a numerically controlled gain block (a multiplier). Assuming you do this correctly, the signal amplitude will lock to your desired amplitude
For the carrier tracking, there are many circuits to be used, data-aided, or non-data-aided. for BPSK it might be as easy as squaring the RX signal( which effectively removes the data, filtering it, then feeding back the filtered signal to a numerically controlled oscillator (either a CORDIC, or a complex multiplier). Google "squaring loop."
For the downstream slicer, you will compare your signal against some metric, in the case of BSPK at complex baseband, the sign of your signal is what you use. Your received signal is in the presence of noise, and you want to make that comparison at the center (in the time domain) of the received signal when it is maximized ( or minimized for -1 symbols; the correct words to use are: when the signal is at a local extrema). This is symbol timing recovery. I'm less familiar with this, but this can be done by looking at the derivative of the signal and determining when the signal is increasing, at a local extrema, or decreasing. Do all three of these in parallel and you can get a pretty good picture of your symbol timing.