To solve this problem, we first need to define the decision variables and the objective function. Let's denote the number of acres planted with apple trees as \(A\) and the number of acres planted with peach trees as \(P\). The profit per acre from apple trees is $900, and from peach trees is $1100. The farmer wants to maximize his total profit.

The constraints are:
1. The total land used cannot exceed 400 acres: \(A + P \leq 400\).
2. At least 60 acres must be planted with apple trees: \(A \geq 60\).
3. At least 40 acres must be planted with peach trees: \(P \geq 40\).
4. The farmer can plant at most 3 times the amount of peach trees as apple trees: \(P \leq 3A\).

The objective function to maximize is the total profit: \(900A + 1100P\).

Here's how we can translate this into Gurobi code in Python:

```python
from gurobipy import *

# Create a model
m = Model("Farmer_Profit")

# Define variables
A = m.addVar(lb=60, name="Apple_Acres")  # At least 60 acres of apple trees
P = m.addVar(lb=40, name="Peach_Acres")  # At least 40 acres of peach trees

# Define constraints
m.addConstr(A + P <= 400, name="Total_Land")  # Total land constraint
m.addConstr(P <= 3 * A, name="Peach_to_Apple_Ratio")  # Peach to apple ratio constraint

# Define the objective function
m.setObjective(900 * A + 1100 * P, GRB.MAXIMIZE)

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Apple Acres: {A.x}")
    print(f"Peach Acres: {P.x}")
    print(f"Total Profit: ${900 * A.x + 1100 * P.x}")
else:
    print("No optimal solution found")

```