The 27-year-old was named Yorkshire captain in December.
"The new deal has come at the perfect time for me," Ballance told the club website. "I can now purely focus on the captaincy, batting and scoring runs."
The Zimbabwe-born left-hander has played 21 Tests for England, the last of them against Bangladesh in October.
After being recalled to the Test team for last summer's home series against Pakistan, Ballance made just 24 runs in four innings during England's drawn series in Bangladesh and did not feature in the 4-0 defeat in India at the end of 2016.
Ballance will captain Yorkshire in all three formats in 2017 having replaced Andrew Gale, who retired to become Yorkshire head coach in November.
England batsman Gary Ballance has signed a new contract with Yorkshire which will keep him at Headingley until the end of the 2019 season.