Your code actually looks pretty good. The only mistake I can see is that you are passing the spriteBatch.Draw function the rotation as:
arrow.currentAngle - arrow.oldAngle
The rotation given to SpriteBatch.Draw is the absolute rotation (MSDN) and so you should just pass it arrow.currentAngle
To be clear, you are currently passing it the change in angle (delta, or relative angle) from the last frame, when it has no memory of the last frame. You should just give it the angle to draw at.
Update Missed a few problems on your math.
Math.Atan returns a radian, and spriteBatch.Draw expects a radian, so you don't need to do the conversion between degrees and radians (in fact, that is probably why you see it jumping around wildly).
Your math gets the correct angle if you were travelling right. To get it travelling left, take 180 degrees and subtract the calculated angle.
With those improvements, your code becomes:
arrow.currentAngle = Math.Pi - Math.Atan(arrow.Yvelocity/arrow.Xvelocity);
Let me know how it goes!