{
  "generated": "2026-09-17T16:51:15Z",
  "source": "bridge/excursion.py, MFE/MAE from M1 bars between entry and exit",
  "sample": {
    "trades": 27,
    "days": 14,
    "first": "2026-09-15 16:14:16",
    "last": "2026-09-17 18:03:24",
    "adequate": false,
    "min_trades_for_verdict": 30
  },
  "aggregate": {
    "captured_points": 672.0,
    "offered_points": 1845.0,
    "given_back_points": 1173.0,
    "given_back_pct": 63.6,
    "median_efficiency_pct": -1.7
  },
  "winners": {
    "n": 13,
    "median_efficiency_pct": 41.4,
    "median_given_back_points": 49.1,
    "max_adverse_excursion_points": 56.3
  },
  "losers": {
    "n": 14,
    "median_mfe_points": 23.9,
    "n_offered_10pts_or_more": 8,
    "points_if_half_mfe_banked_on_those": 154.2,
    "points_actually_made_on_those": -67.8
  },
  "costs": {
    "spread_points_per_round_trip": 2.0,
    "spread_points_total": 54.0,
    "spread_pct_of_gross_profit": 6.2
  },
  "tuning": {
    "stop_points_no_winner_exceeded": 56.3,
    "note": "No winning trade went further against us than this. A stop below it would have cost a winner ON THIS SAMPLE; a stop far above it is wider than the evidence requires. It is a sample minimum, not a law - fitting the stop exactly to it is overfitting."
  },
  "caveats": [
    "27 trades is BELOW the 30-trade bar this project requires before drawing conclusions about profitability.",
    "Excursions come from M1 bar extremes, so they are minute-accurate, not tick-accurate. A spike inside the entry minute can overstate MFE.",
    "One instrument, one broker, and trades spanning more than one configuration unless the run ledger says otherwise. Check runs.json before comparing across periods."
  ],
  "trail_sweep": {
    "trades": 27,
    "actual_net_points": 672.0,
    "headroom_points": {
      "winners_median": 57.9,
      "winners_worst": 86.6,
      "all_median": 48.0
    },
    "sweep": [
      {
        "offset_points": 5,
        "net_points": 37.3,
        "vs_actual_points": -634.7,
        "trades_exited_on_trail": 27,
        "of_trades": 27,
        "winners_still_winners": 5,
        "of_winners": 13
      },
      {
        "offset_points": 8,
        "net_points": 110.4,
        "vs_actual_points": -561.6,
        "trades_exited_on_trail": 25,
        "of_trades": 27,
        "winners_still_winners": 5,
        "of_winners": 13
      },
      {
        "offset_points": 10,
        "net_points": 97.2,
        "vs_actual_points": -574.8,
        "trades_exited_on_trail": 25,
        "of_trades": 27,
        "winners_still_winners": 4,
        "of_winners": 13
      },
      {
        "offset_points": 12,
        "net_points": 96.1,
        "vs_actual_points": -575.9,
        "trades_exited_on_trail": 24,
        "of_trades": 27,
        "winners_still_winners": 4,
        "of_winners": 13
      },
      {
        "offset_points": 15,
        "net_points": 109.8,
        "vs_actual_points": -562.2,
        "trades_exited_on_trail": 24,
        "of_trades": 27,
        "winners_still_winners": 6,
        "of_winners": 13
      },
      {
        "offset_points": 20,
        "net_points": 252.4,
        "vs_actual_points": -419.6,
        "trades_exited_on_trail": 23,
        "of_trades": 27,
        "winners_still_winners": 9,
        "of_winners": 13
      },
      {
        "offset_points": 25,
        "net_points": 233.1,
        "vs_actual_points": -438.9,
        "trades_exited_on_trail": 21,
        "of_trades": 27,
        "winners_still_winners": 9,
        "of_winners": 13
      },
      {
        "offset_points": 30,
        "net_points": 135.5,
        "vs_actual_points": -536.5,
        "trades_exited_on_trail": 20,
        "of_trades": 27,
        "winners_still_winners": 9,
        "of_winners": 13
      },
      {
        "offset_points": 40,
        "net_points": 283.5,
        "vs_actual_points": -388.5,
        "trades_exited_on_trail": 18,
        "of_trades": 27,
        "winners_still_winners": 11,
        "of_winners": 13
      },
      {
        "offset_points": 50,
        "net_points": 438.7,
        "vs_actual_points": -233.3,
        "trades_exited_on_trail": 12,
        "of_trades": 27,
        "winners_still_winners": 12,
        "of_winners": 13
      }
    ],
    "best_on_this_sample": {
      "offset_points": 50,
      "net_points": 438.7,
      "vs_actual_points": -233.3,
      "trades_exited_on_trail": 12,
      "of_trades": 27,
      "winners_still_winners": 12,
      "of_winners": 13
    },
    "sample_adequate": false,
    "caveats": [
      "Pessimistic by construction: within a bar the adverse move is assumed to come first, so every simulated figure is a floor.",
      "A wider offset can never beat actual, because the real exit still caps the trade. Only the tightening direction is informative.",
      "Re-entry is not modelled. A reversal system that is stopped out earlier takes a different next trade, and that effect is invisible here.",
      "best_on_this_sample is the peak of a curve fitted to 27 trades. It is a direction, not a setting."
    ]
  },
  "market_conditions": {
    "generated": "2026-09-17T16:51:21Z",
    "no_lookahead": "each day is classified from sessions strictly before it",
    "today": {
      "date": "2026-09-17",
      "direction": "bear",
      "structure": "trending",
      "volatility": "normal",
      "net_pct_20": -3.73,
      "efficiency_20": 0.307,
      "adr_20": 530.6
    },
    "parameters": {
      "lookback_sessions": 20,
      "trend_pct": 1.0,
      "efficiency_threshold": 0.3
    },
    "trades_by": {
      "structure": {
        "choppy": {
          "n": 13,
          "pts": 512.6,
          "usd": 50.37,
          "wins": 7,
          "win_rate_pct": 53.8,
          "pts_per_trade": 39.4,
          "lots": [
            0.1
          ],
          "lots_mixed": false,
          "enough_to_judge": false,
          "axis_has_contrast": true
        },
        "trending": {
          "n": 14,
          "pts": 159.4,
          "usd": 159.4,
          "wins": 6,
          "win_rate_pct": 42.9,
          "pts_per_trade": 11.4,
          "lots": [
            1.0
          ],
          "lots_mixed": false,
          "enough_to_judge": false,
          "axis_has_contrast": true
        }
      },
      "direction": {
        "bear": {
          "n": 27,
          "pts": 672.0,
          "usd": 209.77,
          "wins": 13,
          "win_rate_pct": 48.1,
          "pts_per_trade": 24.9,
          "lots": [
            0.1,
            1.0
          ],
          "lots_mixed": true,
          "enough_to_judge": false,
          "axis_has_contrast": false
        }
      },
      "volatility": {
        "normal": {
          "n": 27,
          "pts": 672.0,
          "usd": 209.77,
          "wins": 13,
          "win_rate_pct": 48.1,
          "pts_per_trade": 24.9,
          "lots": [
            0.1,
            1.0
          ],
          "lots_mixed": true,
          "enough_to_judge": false,
          "axis_has_contrast": false
        }
      }
    },
    "tagged_trades": 27,
    "caveats": [
      "Audit only. Nothing adapts to these labels.",
      "Thresholds are chosen, not fitted. Moving them moves every conclusion, which is itself a reason to distrust conclusions drawn from a small sample.",
      "A group with enough_to_judge false has too few trades to mean anything; the bar is 30, matching the rest of the project.",
      "Read pts, not usd. The lot size changed from 0.1 to 1.0 mid-sample, so summed dollars compare position sizing across groups, not market condition. Any group with lots_mixed true has that problem inside it.",
      "An axis with axis_has_contrast false put every trade in one group and has measured nothing; three days of history cannot contain a bull market."
    ]
  }
}