This looks interesting; I do my own work in Ninjatrader so I'm familiar with some of what you're doing.
Some questions -
What's your fill algorithm? Do you have it set to the "strict" method (that is, if you use limit orders, do you require trade-through prices to fill your limit?)
Slippage isn't calculated like you think in Ninja...for example, for futures you might specify 2 ticks of slippage. However, if NinjaTrader detects that you "could have" sold on the bid, it will not take into account any of the slippage you programmed in. If you want to test this, do something crazy like add +50 points of slippage, and watch your backtest results come out the same.
How precise is the data you're using for backtesting? That is, do you have not only "last" trades, but "bid" and "ask"? If Ninja doesn't detect bid or ask prices in your historical data, it will just go off of last. That doesn't help at all with limit orders, or even market orders.
I once used NeoTicker to develop systems. I had put a lot of time in to a specific system that appeared to work well across every instrument, with (literally) no parameter adjustment. I was totally stoked, and I actually put it to use trading live money.
What I discovered was that NeoTicker was using a "one touch" fill mechanism - that is, a price simply needed to have traded and you were filled. You can imagine, on a tick-by-tick basis, how this sort of algorithm can replicate a money-making machine.
In reality, getting filled is harder than you think. If your system uses time-in-force entry orders, then the fill algorithm for backtesting needs to be very strict to simulate your likelihood of getting filled (especially if you're not sitting in the queue for a while).
Just things to keep in mind.