regex – grep chain of unordered chains with logic and

I have a file that contains two strings S1 and S2 and I want to grep
all lines that contain both S1 and S2 knowing that S1 and S2 are
not ordered

I have tried

grep & # 39; (S1) && (S2) & # 39; filename 

but it does not work
the only solution I've found so far is
using grep twice with a pipe

grep S1 file_name | grep S2 

can I do the same thing with a command

grep S1 LOGICAL_AND S2 file_name