ctrader-api-client 0.2.0__tar.gz → 0.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/PKG-INFO +1 -1
  2. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/pyproject.toml +1 -1
  3. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/events/router.py +1 -1
  4. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/models/market_data.py +15 -2
  5. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/uv.lock +1 -1
  6. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/.claude/settings.local.json +0 -0
  7. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/.github/workflows/docs.yml +0 -0
  8. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/.gitignore +0 -0
  9. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/.pre-commit-config.yaml +0 -0
  10. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/.python-version +0 -0
  11. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/Justfile +0 -0
  12. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/LICENSE +0 -0
  13. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/README.md +0 -0
  14. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/docs/api/accounts.md +0 -0
  15. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/docs/api/client.md +0 -0
  16. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/docs/api/enums.md +0 -0
  17. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/docs/api/events.md +0 -0
  18. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/docs/api/market-data.md +0 -0
  19. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/docs/api/models.md +0 -0
  20. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/docs/api/symbols.md +0 -0
  21. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/docs/api/trading.md +0 -0
  22. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/docs/getting-started.md +0 -0
  23. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/docs/index.md +0 -0
  24. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/mkdocs.yml +0 -0
  25. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/protos/SOURCE +0 -0
  26. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/protos/VERSION +0 -0
  27. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/protos/update.sh +0 -0
  28. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/protos/vendor/.gitkeep +0 -0
  29. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/protos/vendor/OpenApiCommonMessages.proto +0 -0
  30. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/protos/vendor/OpenApiCommonModelMessages.proto +0 -0
  31. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/protos/vendor/OpenApiMessages.proto +0 -0
  32. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/protos/vendor/OpenApiModelMessages.proto +0 -0
  33. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/scripts/fix_proto_imports.py +0 -0
  34. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/__init__.py +0 -0
  35. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/_internal/__init__.py +0 -0
  36. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/_internal/messages.py +0 -0
  37. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/_internal/proto/OpenApiCommonMessages.py +0 -0
  38. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/_internal/proto/OpenApiCommonModelMessages.py +0 -0
  39. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/_internal/proto/OpenApiMessages.py +0 -0
  40. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/_internal/proto/OpenApiModelMessages.py +0 -0
  41. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/_internal/proto/__init__.py +0 -0
  42. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/_internal/serialization.py +0 -0
  43. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/api/__init__.py +0 -0
  44. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/api/accounts.py +0 -0
  45. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/api/market_data.py +0 -0
  46. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/api/symbols.py +0 -0
  47. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/api/trading.py +0 -0
  48. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/auth/__init__.py +0 -0
  49. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/auth/credentials.py +0 -0
  50. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/auth/manager.py +0 -0
  51. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/client.py +0 -0
  52. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/config.py +0 -0
  53. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/connection/__init__.py +0 -0
  54. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/connection/heartbeat.py +0 -0
  55. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/connection/protocol.py +0 -0
  56. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/connection/transport.py +0 -0
  57. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/enums.py +0 -0
  58. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/events/__init__.py +0 -0
  59. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/events/emitter.py +0 -0
  60. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/events/types.py +0 -0
  61. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/exceptions.py +0 -0
  62. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/models/__init__.py +0 -0
  63. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/models/_base.py +0 -0
  64. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/models/account.py +0 -0
  65. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/models/deal.py +0 -0
  66. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/models/order.py +0 -0
  67. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/models/position.py +0 -0
  68. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/models/requests.py +0 -0
  69. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/models/symbol.py +0 -0
  70. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/src/ctrader_api_client/py.typed +0 -0
  71. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/_internal/test_messages.py +0 -0
  72. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/_internal/test_serialization.py +0 -0
  73. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/api/conftest.py +0 -0
  74. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/api/test_accounts.py +0 -0
  75. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/api/test_market_data_api.py +0 -0
  76. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/api/test_symbols.py +0 -0
  77. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/api/test_trading.py +0 -0
  78. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/auth/test_credentials.py +0 -0
  79. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/auth/test_manager.py +0 -0
  80. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/connection/test_heartbeat.py +0 -0
  81. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/connection/test_protocol.py +0 -0
  82. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/connection/test_transport.py +0 -0
  83. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/events/test_emitter.py +0 -0
  84. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/events/test_router.py +0 -0
  85. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/events/test_types.py +0 -0
  86. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/models/test_account.py +0 -0
  87. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/models/test_deal.py +0 -0
  88. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/models/test_market_data.py +0 -0
  89. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/models/test_order.py +0 -0
  90. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/models/test_position.py +0 -0
  91. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/models/test_requests.py +0 -0
  92. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/models/test_symbol.py +0 -0
  93. {ctrader_api_client-0.2.0 → ctrader_api_client-0.2.1}/tests/unit/test_client.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ctrader-api-client
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: API Client to interact with the cTrader Open API spec
5
5
  Author-email: Elio <elioachukri@pm.me>
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ctrader-api-client"
3
- version = "0.2.0"
3
+ version = "0.2.1"
4
4
  description = "API Client to interact with the cTrader Open API spec"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -190,7 +190,7 @@ class EventRouter:
190
190
  bid=proto.bid / 1e5 if proto.bid else None,
191
191
  ask=proto.ask / 1e5 if proto.ask else None,
192
192
  timestamp=self._timestamp_to_datetime(proto.timestamp) if proto.timestamp else datetime.now(UTC),
193
- trendbar=Trendbar.from_proto(proto.trendbar[0]) if proto.trendbar else None,
193
+ trendbar=Trendbar.from_proto(proto.trendbar[0], bid_price=proto.bid) if proto.trendbar else None,
194
194
  )
195
195
  await self._emitter.emit(event)
196
196
 
@@ -56,11 +56,13 @@ class Trendbar(FrozenModel):
56
56
  volume: int
57
57
 
58
58
  @classmethod
59
- def from_proto(cls, proto: ProtoOATrendbar) -> Trendbar:
59
+ def from_proto(cls, proto: ProtoOATrendbar, bid_price: float | None = None) -> Trendbar:
60
60
  """Create Trendbar from proto message.
61
61
 
62
62
  Args:
63
63
  proto: The proto message.
64
+ bid_price: Optional bid price to use for specifying the close price since the API never provides delta_close
65
+ on live trendbar updates.
64
66
 
65
67
  Returns:
66
68
  A new Trendbar instance.
@@ -74,7 +76,18 @@ class Trendbar(FrozenModel):
74
76
  low = proto.low
75
77
  open_price = low + proto.delta_open
76
78
  high = low + proto.delta_high
77
- close = low + proto.delta_close
79
+
80
+ if bid_price is not None:
81
+ close = bid_price
82
+ else:
83
+ if proto.delta_close == 0:
84
+ # If delta_close is 0, it means the API did not provide a close price (e.g. for live updates).
85
+ # In this case, we must raise instead of silently returning an incorrect close price.
86
+ raise RuntimeError(
87
+ "delta_close missing from Trendbar proto and no bid_price was provided to use as fallback."
88
+ "Returning error as this is safer than silently returning an incorrect close price of low + 0."
89
+ )
90
+ close = low + proto.delta_close
78
91
 
79
92
  return cls(
80
93
  timestamp=ts,
@@ -201,7 +201,7 @@ wheels = [
201
201
 
202
202
  [[package]]
203
203
  name = "ctrader-api-client"
204
- version = "0.2.0"
204
+ version = "0.2.1"
205
205
  source = { editable = "." }
206
206
  dependencies = [
207
207
  { name = "anyio" },