Excel *should* allow up to 255 arguments from Excel 2007, and up to 30 before that... and if there's no error in the log that suggests PyXLL thinks your function should be ok, but maybe it's failing to register with Excel for some other reason (possibly the limit is lower for macro sheet equivalent functions, which yours will be since you're using the cached_object example).
Anyway, for functions that take a large number of arguments I find it's often better to have the function take a table instead so that the arguments are laid out in the sheet - it can make things a bit clearer. For example, your function could take a table with two columns, the first column being the parameter names and the second column being their values. You would then process that table in your python code to get the actual function parameters (and can default any missing or return an error if they can't be defaulted).
As you need to pass different types, you can make the table of type "var" and use the pyxll function get_type_converter to convert from 'var' to whatever types you're expecting (see https://www.pyxll.com/docs/index.html?highlight=get_type_converter#pyxll.get_type_converter
If you don't like the idea of having a table of parameters in the sheet, another option would be to group related parameters and pass them in as arrays. You could even have a utility function that takes a number of parameters and constructs a 2d array from them if it's not convenient to have any parameters next to each other in a block on the sheet (eg a function that takes in total 6 parameters could be re-written to take two arrays of 3, and a function 'create_array' could create an array from some other arguments: "=my_func(create_array(A1,A3,A5), create_array(C1, C3, C5))" ).
I hope this helps,