To solve this problem, we need to define the variables and constraints based on the given information.

Let's denote:
- $M$ as the number of moving seat tickets sold,
- $R$ as the number of regular seat tickets sold.

The objective is to maximize profit. The profit made from selling a moving seat ticket is $15, and the profit made from selling a regular seat ticket is $10. Therefore, the total profit can be represented as $15M + 10R$.

The constraints are:
1. The theatre can seat at most 100 people: $M + R \leq 100$.
2. At least 15 seats are reserved for moving seats: $M \geq 15$.
3. At least 3 times as many people prefer sitting in regular seats than in moving seats: $R \geq 3M$.

To ensure the problem is feasible and to maximize profit, we need to consider these constraints when formulating our linear programming model.

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

```python
from gurobipy import *

# Create a new model
m = Model("Movie_Theatre_Profit")

# Define variables
M = m.addVar(vtype=GRB.INTEGER, name="Moving_Seats")
R = m.addVar(vtype=GRB.INTEGER, name="Regular_Seats")

# Set the objective function: Maximize profit
m.setObjective(15*M + 10*R, GRB.MAXIMIZE)

# Add constraints
m.addConstr(M + R <= 100, "Total_seats")
m.addConstr(M >= 15, "Moving_seats_minimum")
m.addConstr(R >= 3*M, "Regular_vs_Moving_seats")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print("Moving Seats:", M.x)
    print("Regular Seats:", R.x)
    print("Maximum Profit:", m.objVal)
else:
    print("No optimal solution found. Status:", m.status)

```