Ruby, ungolfed version 322 347 347345 bytes
->e,a,i,w,u,l,t{s="<svg viewBox='0-90 358 180'style='background:tan'>" k=v=d=0v=d=0.01 (r=(a-a*e*e)/(1+e*Math.cos(v+=d)) t+=r*r/(u*(a-a*e*e))**0.5*d x,q=(1i**((v+w)/n=1i.arg)).rect y,z=(q*1i**(i/n)).rect s<<"<circle r='1'cx='#{(j=((-x-y*1i).arg-t/l*n*=4)%n*57).round(1)}'cy='#{(Math.asin(z)*-57).round(1)}'/>" v>2*d||k=jv>2*d||K=j)until v%6.29<d&&(j-kK).abs<20 s}
Try it online!Try it online!
Initialise s with an SVG header, and set d and v to the step size. Step size is 0.01 radians. The Ruby preprocessor likes to be sure that a variable will be initialised before it is used and does not like the fact that k is only assigned in a conditional. Therefore we conveniently initialise k to the same value as d to avoid an error. We open a bracket to start looping.
s="<svg viewBox='0-90 358 180'style='background:tan'>" k=v=d=0v=d=0.01 (
Record the longitude on the 1st iteration (at the start of the 1st orbit): v>2*d||k=jv>2*d||K=j
Keep iterating until the start of an orbit where the longitude is within 20 degrees of the 1st orbit: )until v%6.29<d&&(j-kK).abs<20
Return from function with SVG image in string s}
v>2*d||k=jv>2*d||K=j)until v%6.29<d&&(j-kK).abs<20 s}
Note the use of uppercase K here. The Ruby preprocessor likes to know that all variables will be assigned before they are used, and if lowercase k is used it insists that k be initialised outside the loop to guarantee it will be assigned before it is used, as the assignment in the code shown occurs in a conditional. 2 bytes were saved by switching to uppercase K which represents a constant, since the preprocessor does not check constants in the same way and the assignment can be avoided.