let's say your providers are set to variables like VOIPOUT1 VOIPOUT2 VOIPOUT3 etc
[macro-voip_call]
exten => s,1,set(CALLERID(num)=55555555555)
exten => s,n,set(PROV_COUNT=1)
exten => s,n(start),dial(${VOIPOUT${PROV_COUNT}}/${ARG1},60)
exten => s,n,Goto(s-${DIALSTATUS},1) ; Jump based on status
exten => s-BUSY,1,playback(busy)
exten => s-BUSY,n,wait(10)
exten => s-BUSY,n,hangup
exten => s-NOANSWER,1,hangup
;if the DIALSTATUS var comes back as CHANUNAVAIL or anything else
;that can possibly be resolved by using a different provider...
exten => _s-.,1,set(PROV_COUNT=$[${PROV_COUNT}+1])
exten => _s-.,n,gotoif($[${PROV_COUNT}<4]?s,start)
exten => _s-.,n,playback(please-hold)
exten => _s-.,n,macro(pots_call,${ARG1})