German Martens, who had not won for nearly two years, ended the 170km stage from Dona Santos to Cuidad Romana De Clunia two seconds ahead of Moreno on the uphill finish.
Orica-GreenEdge's Simon Clarke led a small chasing group across the line, ahead of Nacer Bouhanni of FDJ-BigMat.
Victory for Rabobank was the Dutch team's second in as many days following Matti Breschel's stage three win.
"My last victory was the GP Wallonie in 2010; that is already a long time ago,” said Martens. “Also my spring was not as I wanted and at a given moment you can begin to doubt yourself immensely.
"You actually needed to get to a victory to get over that, but that is so terribly difficult. That was true for Matti Breschel too. You want it so much, but there are so many factors play a role. "
The race concludes on Sunday with a 170km stage from Comarca Pinares to Lagunas de Neila.
Stage four times (top 10):
1. Paul Martens (Ger) Rabobank 3:50:35
2. Daniel Moreno (Spa) Katusha 0:00:02
3. Simon Clarke (Aus) Orica GreenEdge Cycling Team 0:00:05
4. Nacer Bouhanni (Fra) FDJ-BigMat
5. Stefano Garzelli (Ita) Acqua & Sapone
6. Matti Breschel (Den) Rabobank 0:00:06
7. Tom Dumoulin (Ned) Argos-Shimano
8. Jérémie Galland (Fra) Saur-Sojasun 0:00:09
9. Francesco Reda (Ita) Acqua & Sapone
10. Daniele Ratto (Ita) Liquigas-Cannondale
- Matti Breschel