This is partial code but implement these callbacks in your wrapper impl.
def execDetails(self, reqId: int, contract: Contract, execution: Execution):
print("ExecDetails. ReqId:", reqId, "Symbol:", contract.symbol, "SecType:",
contract.secType, "Currency:", contract.currency, execution)
If you look up the Execution class you'll see a field for price along with some others.
You should also impl
def orderStatus(self, orderId: OrderId, status: str, filled: float,
remaining: float, avgFillPrice: float, permId: int,
parentId: int, lastFillPrice: float, clientId: int,
whyHeld: str, mktCapPrice: float):
Which will be called may times depending on the order and the avgFIllPrice will be current.