Creo que para el orden por partes deberías usar algo como
order by case
when stock > 0 then 0
when stock < 0 then 1
end ascending,
price ascending
No revisé la sintaxis, pero esa es la idea. Puede buscar en Google el caso para obtener más información.
En cuanto al resto de sus requisitos, necesitaría la estructura de la tabla para comprender mejor...