Hmmm.
The role of the trading system is to react to market events, (trades, quotes, time) and respond with orders.
Virtual methods can avoid a lot a if/then/else logic and make it easy to abstract a system from the events that drive it. For example, there might be a virtual methods for gotQuote() and gotClockTick() that are called by the market data interface in response to market events. The broker interface would call methods like orderUpdate().
What these functions do is dependent on the system logic.
The system code''s main role is to call placeOrder() and cancelOrder() for example.
I use a object per system, per symbol. Any given system can only have one position per symbol
Further, I only have one entry and exit per position, per symbol, but more than system can trade the same symbol, each with different entry and exit rules. If the intent is to scale in and out, then this can be done by having many closely related systems with slightly different entry points. The can increase overall capacity and improve performance by being slightly de-correlated.
From the your description, it is not clear if you have a thread that spins, but if so then that should be avoided. Wait for a event to occur, either a time tick or a market event, then trigger a entry or exit if needed.