Your soldiers seem to be very indisciplinated... ;D
As "The real Armstrong" said, increase their skill. Then use a script which stops your machine gunners, reveals the target and orders your MG's to fire. Yes, "fire" command is stupid... I tried it with mortars and... BOOM! 500 meters away.
Use MyMG reveal EnemySoldier, MyMG dofire EnemySoldier and dostop MyMG.
Your 'MyMG' will probably look at direction '0' (North) if you use 'dostop' command, but i think that if you set his group formation direction to the one you want them to head, they (as long as 'MyMG') will obey you:
The following script is just an incomplete sample:
[MachineGunner,Target list,Direction] exec ">name<.sqs"
_MG = _this select 0
_Targetlist = _this select 1
_dir = _this select 2
_grp = group _MG
_grp setformdir _dir
_n=0
#loop
~.3
? count _targetlist == 0 : exit
_Target = _targetlist select _n
_n=_n+1
_MG reveal _Target
_MG dofire _Target
@!(alive _target) or !(alive _MG) or (count _targetlist == 0)
? alive _MG and (count _targetlist > 0) : Goto "loop"
_MG dofire ObjNull
exit
The script sets the formation direction and reveals targets for the MGunner.
Then you could have another script which orders the MGunner to move to a certain position and makes him stop at that specified position:
_MG = this select 0
;[x,y]
_Pos = this select 1
;if MG belongs to group player, change domove to command move
_MG domove _Pos
@UnitReady _MG
dostop _MG
exit
Change these scripts as you want... But don't forget to verify their reliability!