4bc36d09d2
* fix: add copy_rates_from_pos_as_df fallback in fetch_latest_closed_rates_for_trading_client Mt5DataClient (returned by create_trading_client) exposes copy_rates_from_pos_as_df, not fetch_latest_rates_as_df. Adds a fallback path that resolves the granularity string to an integer timeframe via parse_timeframe, fetches count+1 bars from start_pos=0, and applies the same drop_forming_rate_bar + tail(count) logic so callers that use the client returned by create_trading_client no longer need a compatibility shim. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Bump version to v1.0.3 * fix: hoist parse_timeframe before dispatch and add invalid-granularity test Hoisting parse_timeframe(granularity) before the fetch_latest_rates_as_df / copy_rates_from_pos_as_df dispatch ensures invalid granularity strings fail consistently on both paths with a clear ValueError, rather than only when the fallback branch is taken. Adds test_copy_rates_from_pos_fallback_raises_on_invalid_granularity to pin the early-validation contract and confirm the underlying method is never called. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: agent <agent@localhost> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>