Pine Script Strategy for Goat Funded Trader
Goat Funded Trader runs a simpler rule set than most futures prop firms — no consistency rule, a 5-day minimum, and a trailing drawdown that rewards steady sizing. Here's how to configure a Pine Script strategy around it.
Goat Funded Trader (GFT) has built a reputation as one of the more straightforward futures prop firms to evaluate against — a modest day count, no consistency check, and a rule set that fits on one page. Here's how to configure an automated Pine Script strategy so it respects GFT's actual mechanics rather than a firm's marketing copy.
Goat Funded Trader evaluation rules
| Account Size | Profit Target | Max Drawdown | Drawdown Type |
|---|---|---|---|
| $25,000 | $1,500* | $1,500* | Trailing (resets on highest balance) |
| $50,000 | $3,000 | $2,500 | Trailing (resets on highest balance) |
| $100,000 | $6,000* | $4,000* | Trailing (resets on highest balance) |
| $150,000 | $9,000* | $5,000* | Trailing (resets on highest balance) |
Understanding GFT's trailing drawdown
GFT's own materials describe the mechanic plainly: as the account's equity grows, the drawdown floor grows with it. That's a peak-equity trailing threshold, not a fixed floor set at account open — every new high-water mark the account reaches becomes the new base the drawdown is measured from.
That matters for how a script should behave. Compare it against a genuinely static floor, like MyFundedFutures':
- GFT (trailing): Start at $50,000, floor at $47,500. Equity runs up to $52,000 — the floor rises to $49,500. Give back $1,500 of that unrealized gain and the account is now $500 from the (raised) floor, not $4,000.
- Static floor (MyFundedFutures-style): Start at $50,000, floor locked at $47,500 for the life of the evaluation. The same run-up to $52,000 leaves a full $4,500 of cushion regardless of what happens next.
A trailing floor doesn't punish a script the way a tight intraday trail can — GFT's own framing suggests the mechanic tracks equity highs rather than every tick — but it still means unrealized profit shouldn't be treated as banked. The practical rule for an automated strategy is the same one that applies on any trailing-drawdown firm: exit at your target, don't let a winning trade's paper gains sit open waiting to give the floor room to rise further before a pullback erases the edge.
Recommended contracts and sizing for GFT evals
| Account | Contract | Starting Count | Suggested Max Stop |
|---|---|---|---|
| $25k | MES | 1–2 | 10 points MES |
| $50k | MES or MNQ | 2–3 | 12 points MES / 40 ticks MNQ |
| $100k | MES or MNQ | 4–6 | 12 points MES / 40 ticks MNQ |
These are risk-management suggestions, not firm-mandated limits — GFT doesn't publish a maximum contract count in its published rules, so sizing is a self-imposed discipline against the trailing floor above.
Pine Script configuration checklist for GFT
Internal daily risk cap
With no confirmed daily loss limit published, a script still needs a self-imposed ceiling — otherwise a single bad session can eat straight into the trailing floor with nothing to stop it. A reasonable default is capping daily realized-plus-unrealized loss at roughly 20–25% of the account's max drawdown: $500–$625 on a 50k account. Once that threshold is crossed, halt new entries for the rest of the session.
No overnight positions
GFT requires flat positions ahead of the weekly close and before major holidays on most plans. Build a session-close flattener into the script: force-close any open position at a fixed time on Friday afternoon and ahead of a holiday closure, independent of whether the position is currently winning or losing.
Session filter
GFT doesn't publish explicit session restrictions, but restricting entries to RTH keeps signal quality high. Reasonable windows:
- 9:30 AM – 11:30 AM ET (primary session)
- 1:30 PM – 3:15 PM ET (afternoon session — works well for MES/ES)
ATR-based stop sizing
Because the floor only rises with new highs rather than tightening on every tick the way an intraday trail does, a GFT strategy can typically run a slightly wider stop than an equivalent Apex intraday-trailing setup — a 0.9× to 1.0× ATR multiple is a reasonable starting point, tightened if the account is trading close to its floor.
Sample strategy — Pine Script v5
EMA crossover filtered by VWAP direction, sized for a 50k GFT account ($2,500 trailing floor, no confirmed daily cap). The internal risk cap below defaults to 20% of the max drawdown.
// ── GFT 50k — EMA/VWAP with trailing-floor-aware risk cap ─────────
strategy("GFT — EMA + VWAP Filter", overlay = true,
default_qty_type = strategy.fixed, default_qty_value = 1)
fastLen = input.int(9, "Fast EMA Length")
slowLen = input.int(21, "Slow EMA Length")
atrMult = input.float(1.0,"ATR Stop Multiplier")
rrRatio = input.float(1.5,"Reward:Risk Ratio")
riskCapPct = input.float(0.20, "Internal Daily Risk Cap (% of max DD)")
maxDrawdown = input.float(2500.0, "Account Max Drawdown ($)")
inSession = not na(time("1", "0930-1130:23456", "America/New_York")) or
not na(time("1", "1330-1515:23456", "America/New_York"))
newSession = ta.change(time("D")) != 0
var float sessionStart = na
sessionStart := newSession ? strategy.equity : sessionStart
todayPnl = strategy.equity - nz(sessionStart, strategy.equity)
riskCapDollars = maxDrawdown * riskCapPct
haltedForDay = todayPnl <= -riskCapDollars
fastEMA = ta.ema(close, fastLen)
slowEMA = ta.ema(close, slowLen)
vwapVal = ta.vwap(hlc3)
atrVal = ta.atr(14)
longSignal = ta.crossover(fastEMA, slowEMA) and close > vwapVal and barstate.isconfirmed
shortSignal = ta.crossunder(fastEMA, slowEMA) and close < vwapVal and barstate.isconfirmed
flat = strategy.position_size == 0
canTrade = inSession and not haltedForDay and flat
if longSignal and canTrade
stopPts = atrMult * atrVal
strategy.entry("L", strategy.long)
strategy.exit("L-x", "L", profit = stopPts * rrRatio / syminfo.mintick,
loss = stopPts / syminfo.mintick)
if shortSignal and canTrade
stopPts = atrMult * atrVal
strategy.entry("S", strategy.short)
strategy.exit("S-x", "S", profit = stopPts * rrRatio / syminfo.mintick,
loss = stopPts / syminfo.mintick)
// ── weekly / holiday flatten ───────────────────────────────────────
weeklyFlatten = dayofweek == dayofweek.friday and
not na(time("1", "1559-1601:6", "America/New_York"))
if weeklyFlatten and strategy.position_size != 0
strategy.close_all("Weekly flatten") Hitting the profit target on GFT's timeline
GFT requires 5 trading days minimum to complete an evaluation — comfortably fast if the strategy is producing consistent daily results, and not a rule that rewards rushing. A trailing floor still ratchets up on winning sessions, so there's no advantage to compressing the pass into as few sessions as possible: a steady, 5-plus-day approach with consistent small gains carries less risk than trying to hit the target in the minimum window with oversized positions.
GFT vs other prop firms for Pine Script traders
| Feature | Goat Funded Trader | Apex Trader Funding | Topstep |
|---|---|---|---|
| Drawdown type | Trailing (resets on highest balance) | Intraday trailing | EOD trailing |
| Min trading days | 5 | 1 | 10 |
| Consistency rule | None | None during eval; 30–50% at payout | None on the Combine |
| Eval fee (50k, typical) | ~$150–$250* | ~$150* | ~$165* |
* Pricing figures are typical/approximate and not part of Target Filled's reconciled firm data — verify current pricing directly with each firm.
GFT's absence of a consistency rule, combined with a trailing (not intraday-tick-sensitive) floor, makes it one of the more forgiving evaluation structures for a strategy that occasionally produces an outsized winning day. See our static vs. trailing drawdown guide for the mechanics behind each drawdown style referenced above.