To solve this optimization problem, we first need to define the decision variables, the objective function, and the constraints based on the given information.

Let's denote:
- \(x\) as the number of pieces of fried fish sold.
- \(y\) as the number of pieces of fried chicken sold.

The objective is to maximize revenue. Given that each piece of fried fish generates $4 in revenue and each piece of fried chicken generates $5 in revenue, the total revenue can be represented by the equation:
\[ \text{Revenue} = 4x + 5y \]

There are constraints based on the availability of batter and oil:
1. Each piece of fried fish requires 3 units of batter, and each piece of fried chicken requires 4 units of batter. The total available batter is 400 units.
2. Each piece of fried fish requires 5 units of oil, and each piece of fried chicken requires 6 units of oil. The total available oil is 500 units.

Thus, the constraints can be written as:
1. \(3x + 4y \leq 400\) (batter constraint)
2. \(5x + 6y \leq 500\) (oil constraint)

Also, \(x \geq 0\) and \(y \geq 0\), because the number of pieces sold cannot be negative.

Now, let's translate this into Gurobi code in Python:

```python
from gurobipy import *

# Create a new model
model = Model("Fried_Fish_and_Chicken")

# Define variables
x = model.addVar(vtype=GRB.CONTINUOUS, name="fried_fish")
y = model.addVar(vtype=GRB.CONTINUOUS, name="fried_chicken")

# Set the objective function to maximize revenue
model.setObjective(4*x + 5*y, GRB.MAXIMIZE)

# Add constraints
model.addConstr(3*x + 4*y <= 400, "batter_constraint")
model.addConstr(5*x + 6*y <= 500, "oil_constraint")

# Optimize the model
model.optimize()

# Print the results
if model.status == GRB.OPTIMAL:
    print(f"Optimal solution: x = {x.x}, y = {y.x}")
    print(f"Maximum revenue: {4*x.x + 5*y.x}")
else:
    print("No optimal solution found")

```