Well he obviously could be much better than he is. However, for all his faults, Ash is still one of the best trainers in the anime. If you take a look at how he fairs in each league, you can start to see this. He finished at least in the top 16 at every league he has participated in. He also won the Orange League, and the Battle Frontier. While this may not seem like great accomplishments, what makes it so darn impressive, is how he achieves these results.
As we know, Ash dumps his pokemon to start fresh at the beginning of each league. Obviously this is to promote new region's pokemon, but it certainly handicaps Ash. Ash was able to beat Paul in the sinnoh league with pokemon he had caught within the past year. Paul, on the other hand, was using pokemon he had for possibly four years (Sinnoh was Paul's 4th league comp). Imagine if Ash had kept a certain core group of pokemon and constantly trained them over the course of the show. He would have probably swept through most of the leagues.
Not only does Ash leave his league pokemon behind, but he also a lot of his pokemon don't evolve. His team would be so ridiculously OP if he changed this.
Can you honestly see this team losing
Raichu
Charizard/Infernape
Sceptile/Venasaur/Serperior
Kingler/Blastoise/Feraligator/Lapras
Tyranitar
Garchomp
All those pokemon with multiple league experience would make Ash one of the strongest trainers in the anime if not the strongest. Yet, without all this, he's still able to compete at the highest level of trainers.