I have not worked with the SOAP API very much, but one approach (which I just implemented and checked in my DEV org) is to use a flow instead, and trigger this flow from the button. This way your logic would be completed using point and click config, and calling this flow would be a single line url in your button.
I used the following page as a general guide to figure it out: https://salesforcesidekick.com/2015/06/25/assign-to-me-button/
You would first need to create a flow with a single Record Create set as the Flow Start point (do this by clicking the green plus button that appears when hovering over it).
Set the Create Record to create a Lead, and then add each of the fields you want to populate under the Field section, and set them to new variables (naming the variables whatever you want).
Save your flow as an AutoLaunched Flow, and make sure to activate it. I called mine createLeadFromAccount.
Then when creating your button set it to be Detail Page Button and set the behaviour to Display in existing window without sidebar or header and set the Content Source to URL. Then for the URL set it to something like the following:
This should then add a button to the page, that whenever it is clicked will run the flow, and generate the lead as required.