{"record":{"id":"9891c46051bec2af","repo":"nautechsystems/nautilus_trader","slug":"unexpected-csv-header-was-header-3","errorCode":null,"errorMessage":"Unexpected CSV header, was {header[:3]}","messagePattern":"Unexpected CSV header, was (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/nautilus_trader/testkit/providers.py","lineNumber":513,"sourceCode":"\n    @staticmethod\n    def quotes_from_truefx_csv(\n        instrument: CurrencyPair | PerpetualContract,\n        csv_name: str,\n        max_rows: int | None = None,\n    ) -> list[QuoteTick]:\n        \"\"\"\n        Build QuoteTicks from a TrueFX tick CSV file ('timestamp,bid,ask').\n        \"\"\"\n        precision = instrument.price_precision\n        size = Quantity.from_str(\"1000000\")\n        ticks: list[QuoteTick] = []\n\n        with _open_test_data_text(csv_name) as f:\n            reader = csv.reader(f)\n            header = next(reader)\n            if header[:3] != [\"timestamp\", \"bid\", \"ask\"]:\n                raise ValueError(f\"Unexpected CSV header, was {header[:3]}\")\n\n            for i, row in enumerate(reader):\n                if max_rows is not None and i >= max_rows:\n                    break\n                ts_ns = _parse_iso_to_ns(row[0])\n                ticks.append(\n                    QuoteTick(\n                        instrument_id=instrument.id,\n                        bid_price=Price(float(row[1]), precision=precision),\n                        ask_price=Price(float(row[2]), precision=precision),\n                        bid_size=size,\n                        ask_size=size,\n                        ts_event=ts_ns,\n                        ts_init=ts_ns,\n                    ),\n                )\n\n        return ticks","sourceCodeStart":495,"sourceCodeEnd":531,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/python/nautilus_trader/testkit/providers.py#L495-L531","documentation":"Guard in TestInstrumentProvider.quotes_from_truefx_csv that rejects a TrueFX tick CSV whose first three columns are not exactly timestamp,bid,ask. It fires when a file with a different layout or an extra leading column is passed, before any row parsing begins.","triggerScenarios":"Thrown at python/nautilus_trader/testkit/providers.py:513 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Point csv_name at a genuine TrueFX 'timestamp,bid,ask' tick export","Verify the file was not transformed, reordered, or given a different delimiter before loading"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}