@himalaya-quant/ctrader-x 0.0.7

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 (308) hide show
  1. package/.env +6 -0
  2. package/.prettierrc +7 -0
  3. package/README.md +96 -0
  4. package/changelog.md +46 -0
  5. package/dist/src/classes/client.d.ts +21 -0
  6. package/dist/src/classes/client.d.ts.map +1 -0
  7. package/dist/src/classes/client.js +83 -0
  8. package/dist/src/classes/client.js.map +1 -0
  9. package/dist/src/classes/client.test.d.ts +2 -0
  10. package/dist/src/classes/client.test.d.ts.map +1 -0
  11. package/dist/src/classes/client.test.js +83 -0
  12. package/dist/src/classes/client.test.js.map +1 -0
  13. package/dist/src/classes/errors/client-not-connected.error.d.ts +5 -0
  14. package/dist/src/classes/errors/client-not-connected.error.d.ts.map +1 -0
  15. package/dist/src/classes/errors/client-not-connected.error.js +11 -0
  16. package/dist/src/classes/errors/client-not-connected.error.js.map +1 -0
  17. package/dist/src/classes/errors/connection.error.d.ts +5 -0
  18. package/dist/src/classes/errors/connection.error.d.ts.map +1 -0
  19. package/dist/src/classes/errors/connection.error.js +11 -0
  20. package/dist/src/classes/errors/connection.error.js.map +1 -0
  21. package/dist/src/classes/logger.d.ts +13 -0
  22. package/dist/src/classes/logger.d.ts.map +1 -0
  23. package/dist/src/classes/logger.js +21 -0
  24. package/dist/src/classes/logger.js.map +1 -0
  25. package/dist/src/classes/managers/authentication/authentication.manager.d.ts +13 -0
  26. package/dist/src/classes/managers/authentication/authentication.manager.d.ts.map +1 -0
  27. package/dist/src/classes/managers/authentication/authentication.manager.js +49 -0
  28. package/dist/src/classes/managers/authentication/authentication.manager.js.map +1 -0
  29. package/dist/src/classes/managers/authentication/authentication.manager.test.d.ts +2 -0
  30. package/dist/src/classes/managers/authentication/authentication.manager.test.d.ts.map +1 -0
  31. package/dist/src/classes/managers/authentication/authentication.manager.test.js +114 -0
  32. package/dist/src/classes/managers/authentication/authentication.manager.test.js.map +1 -0
  33. package/dist/src/classes/managers/authentication/errors/application-auth.error.d.ts +5 -0
  34. package/dist/src/classes/managers/authentication/errors/application-auth.error.d.ts.map +1 -0
  35. package/dist/src/classes/managers/authentication/errors/application-auth.error.js +11 -0
  36. package/dist/src/classes/managers/authentication/errors/application-auth.error.js.map +1 -0
  37. package/dist/src/classes/managers/authentication/errors/user-auth.error.d.ts +5 -0
  38. package/dist/src/classes/managers/authentication/errors/user-auth.error.d.ts.map +1 -0
  39. package/dist/src/classes/managers/authentication/errors/user-auth.error.js +11 -0
  40. package/dist/src/classes/managers/authentication/errors/user-auth.error.js.map +1 -0
  41. package/dist/src/classes/managers/models/base.manager.d.ts +15 -0
  42. package/dist/src/classes/managers/models/base.manager.d.ts.map +1 -0
  43. package/dist/src/classes/managers/models/base.manager.js +35 -0
  44. package/dist/src/classes/managers/models/base.manager.js.map +1 -0
  45. package/dist/src/classes/managers/models/credentials.model.d.ts +8 -0
  46. package/dist/src/classes/managers/models/credentials.model.d.ts.map +1 -0
  47. package/dist/src/classes/managers/models/credentials.model.js +3 -0
  48. package/dist/src/classes/managers/models/credentials.model.js.map +1 -0
  49. package/dist/src/classes/managers/symbols/errors/get-symbols-details.error.d.ts +5 -0
  50. package/dist/src/classes/managers/symbols/errors/get-symbols-details.error.d.ts.map +1 -0
  51. package/dist/src/classes/managers/symbols/errors/get-symbols-details.error.js +11 -0
  52. package/dist/src/classes/managers/symbols/errors/get-symbols-details.error.js.map +1 -0
  53. package/dist/src/classes/managers/symbols/errors/get-symbols-list.error.d.ts +5 -0
  54. package/dist/src/classes/managers/symbols/errors/get-symbols-list.error.d.ts.map +1 -0
  55. package/dist/src/classes/managers/symbols/errors/get-symbols-list.error.js +11 -0
  56. package/dist/src/classes/managers/symbols/errors/get-symbols-list.error.js.map +1 -0
  57. package/dist/src/classes/managers/symbols/errors/get-trend-bars.error.d.ts +6 -0
  58. package/dist/src/classes/managers/symbols/errors/get-trend-bars.error.d.ts.map +1 -0
  59. package/dist/src/classes/managers/symbols/errors/get-trend-bars.error.js +13 -0
  60. package/dist/src/classes/managers/symbols/errors/get-trend-bars.error.js.map +1 -0
  61. package/dist/src/classes/managers/symbols/errors/subscribe-live-trend-bars.error.d.ts +8 -0
  62. package/dist/src/classes/managers/symbols/errors/subscribe-live-trend-bars.error.d.ts.map +1 -0
  63. package/dist/src/classes/managers/symbols/errors/subscribe-live-trend-bars.error.js +17 -0
  64. package/dist/src/classes/managers/symbols/errors/subscribe-live-trend-bars.error.js.map +1 -0
  65. package/dist/src/classes/managers/symbols/errors/subscribe-spot-events.error.d.ts +5 -0
  66. package/dist/src/classes/managers/symbols/errors/subscribe-spot-events.error.d.ts.map +1 -0
  67. package/dist/src/classes/managers/symbols/errors/subscribe-spot-events.error.js +11 -0
  68. package/dist/src/classes/managers/symbols/errors/subscribe-spot-events.error.js.map +1 -0
  69. package/dist/src/classes/managers/symbols/errors/unsubscribe-live-trend-bars.error.d.ts +5 -0
  70. package/dist/src/classes/managers/symbols/errors/unsubscribe-live-trend-bars.error.d.ts.map +1 -0
  71. package/dist/src/classes/managers/symbols/errors/unsubscribe-live-trend-bars.error.js +11 -0
  72. package/dist/src/classes/managers/symbols/errors/unsubscribe-live-trend-bars.error.js.map +1 -0
  73. package/dist/src/classes/managers/symbols/symbols-updates.manager.d.ts +54 -0
  74. package/dist/src/classes/managers/symbols/symbols-updates.manager.d.ts.map +1 -0
  75. package/dist/src/classes/managers/symbols/symbols-updates.manager.js +250 -0
  76. package/dist/src/classes/managers/symbols/symbols-updates.manager.js.map +1 -0
  77. package/dist/src/classes/managers/symbols/symbols.manager.d.ts +30 -0
  78. package/dist/src/classes/managers/symbols/symbols.manager.d.ts.map +1 -0
  79. package/dist/src/classes/managers/symbols/symbols.manager.js +78 -0
  80. package/dist/src/classes/managers/symbols/symbols.manager.js.map +1 -0
  81. package/dist/src/classes/managers/symbols/symbols.manager.test.d.ts +2 -0
  82. package/dist/src/classes/managers/symbols/symbols.manager.test.d.ts.map +1 -0
  83. package/dist/src/classes/managers/symbols/symbols.manager.test.js +364 -0
  84. package/dist/src/classes/managers/symbols/symbols.manager.test.js.map +1 -0
  85. package/dist/src/classes/models/client-configuration.model.d.ts +10 -0
  86. package/dist/src/classes/models/client-configuration.model.d.ts.map +1 -0
  87. package/dist/src/classes/models/client-configuration.model.js +3 -0
  88. package/dist/src/classes/models/client-configuration.model.js.map +1 -0
  89. package/dist/src/classes/models/ctrader-x-error.model.d.ts +6 -0
  90. package/dist/src/classes/models/ctrader-x-error.model.d.ts.map +1 -0
  91. package/dist/src/classes/models/ctrader-x-error.model.js +21 -0
  92. package/dist/src/classes/models/ctrader-x-error.model.js.map +1 -0
  93. package/dist/src/config/config.d.ts +10 -0
  94. package/dist/src/config/config.d.ts.map +1 -0
  95. package/dist/src/config/config.js +40 -0
  96. package/dist/src/config/config.js.map +1 -0
  97. package/dist/src/examples/authentication.example.d.ts +2 -0
  98. package/dist/src/examples/authentication.example.d.ts.map +1 -0
  99. package/dist/src/examples/authentication.example.js +9 -0
  100. package/dist/src/examples/authentication.example.js.map +1 -0
  101. package/dist/src/examples/get-symbols-bars.example.d.ts +2 -0
  102. package/dist/src/examples/get-symbols-bars.example.d.ts.map +1 -0
  103. package/dist/src/examples/get-symbols-bars.example.js +18 -0
  104. package/dist/src/examples/get-symbols-bars.example.js.map +1 -0
  105. package/dist/src/examples/get-symbols-list.example.d.ts +2 -0
  106. package/dist/src/examples/get-symbols-list.example.d.ts.map +1 -0
  107. package/dist/src/examples/get-symbols-list.example.js +13 -0
  108. package/dist/src/examples/get-symbols-list.example.js.map +1 -0
  109. package/dist/src/examples/subscribe-live-bars.example.d.ts +2 -0
  110. package/dist/src/examples/subscribe-live-bars.example.d.ts.map +1 -0
  111. package/dist/src/examples/subscribe-live-bars.example.js +42 -0
  112. package/dist/src/examples/subscribe-live-bars.example.js.map +1 -0
  113. package/dist/src/index.d.ts +4 -0
  114. package/dist/src/index.d.ts.map +1 -0
  115. package/dist/src/index.js +20 -0
  116. package/dist/src/index.js.map +1 -0
  117. package/dist/src/models/common/ohlcv.d.ts +10 -0
  118. package/dist/src/models/common/ohlcv.d.ts.map +1 -0
  119. package/dist/src/models/common/ohlcv.js +13 -0
  120. package/dist/src/models/common/ohlcv.js.map +1 -0
  121. package/dist/src/models/proto/base-proto.d.ts +5 -0
  122. package/dist/src/models/proto/base-proto.d.ts.map +1 -0
  123. package/dist/src/models/proto/base-proto.js +9 -0
  124. package/dist/src/models/proto/base-proto.js.map +1 -0
  125. package/dist/src/models/proto/messages/authentication/ProtoOAAccountAuthReq.d.ts +5 -0
  126. package/dist/src/models/proto/messages/authentication/ProtoOAAccountAuthReq.d.ts.map +1 -0
  127. package/dist/src/models/proto/messages/authentication/ProtoOAAccountAuthReq.js +9 -0
  128. package/dist/src/models/proto/messages/authentication/ProtoOAAccountAuthReq.js.map +1 -0
  129. package/dist/src/models/proto/messages/authentication/ProtoOAAccountAuthRes.d.ts +4 -0
  130. package/dist/src/models/proto/messages/authentication/ProtoOAAccountAuthRes.d.ts.map +1 -0
  131. package/dist/src/models/proto/messages/authentication/ProtoOAAccountAuthRes.js +8 -0
  132. package/dist/src/models/proto/messages/authentication/ProtoOAAccountAuthRes.js.map +1 -0
  133. package/dist/src/models/proto/messages/authentication/ProtoOAApplicationAuthReq.d.ts +6 -0
  134. package/dist/src/models/proto/messages/authentication/ProtoOAApplicationAuthReq.d.ts.map +1 -0
  135. package/dist/src/models/proto/messages/authentication/ProtoOAApplicationAuthReq.js +10 -0
  136. package/dist/src/models/proto/messages/authentication/ProtoOAApplicationAuthReq.js.map +1 -0
  137. package/dist/src/models/proto/messages/authentication/ProtoOAApplicationAuthRes.d.ts +4 -0
  138. package/dist/src/models/proto/messages/authentication/ProtoOAApplicationAuthRes.d.ts.map +1 -0
  139. package/dist/src/models/proto/messages/authentication/ProtoOAApplicationAuthRes.js +8 -0
  140. package/dist/src/models/proto/messages/authentication/ProtoOAApplicationAuthRes.js.map +1 -0
  141. package/dist/src/models/proto/messages/common/ProtoOASubscribeSpotsReq.d.ts +6 -0
  142. package/dist/src/models/proto/messages/common/ProtoOASubscribeSpotsReq.d.ts.map +1 -0
  143. package/dist/src/models/proto/messages/common/ProtoOASubscribeSpotsReq.js +10 -0
  144. package/dist/src/models/proto/messages/common/ProtoOASubscribeSpotsReq.js.map +1 -0
  145. package/dist/src/models/proto/messages/common/ProtoOASubscribeSpotsRes.d.ts +4 -0
  146. package/dist/src/models/proto/messages/common/ProtoOASubscribeSpotsRes.d.ts.map +1 -0
  147. package/dist/src/models/proto/messages/common/ProtoOASubscribeSpotsRes.js +8 -0
  148. package/dist/src/models/proto/messages/common/ProtoOASubscribeSpotsRes.js.map +1 -0
  149. package/dist/src/models/proto/messages/symbols/ProtoOAGetTrendbarsReq.d.ts +10 -0
  150. package/dist/src/models/proto/messages/symbols/ProtoOAGetTrendbarsReq.d.ts.map +1 -0
  151. package/dist/src/models/proto/messages/symbols/ProtoOAGetTrendbarsReq.js +13 -0
  152. package/dist/src/models/proto/messages/symbols/ProtoOAGetTrendbarsReq.js.map +1 -0
  153. package/dist/src/models/proto/messages/symbols/ProtoOAGetTrendbarsRes.d.ts +11 -0
  154. package/dist/src/models/proto/messages/symbols/ProtoOAGetTrendbarsRes.d.ts.map +1 -0
  155. package/dist/src/models/proto/messages/symbols/ProtoOAGetTrendbarsRes.js +13 -0
  156. package/dist/src/models/proto/messages/symbols/ProtoOAGetTrendbarsRes.js.map +1 -0
  157. package/dist/src/models/proto/messages/symbols/ProtoOASubscribeLiveTrendbarReq.d.ts +7 -0
  158. package/dist/src/models/proto/messages/symbols/ProtoOASubscribeLiveTrendbarReq.d.ts.map +1 -0
  159. package/dist/src/models/proto/messages/symbols/ProtoOASubscribeLiveTrendbarReq.js +10 -0
  160. package/dist/src/models/proto/messages/symbols/ProtoOASubscribeLiveTrendbarReq.js.map +1 -0
  161. package/dist/src/models/proto/messages/symbols/ProtoOASubscribeLiveTrendbarRes.d.ts +4 -0
  162. package/dist/src/models/proto/messages/symbols/ProtoOASubscribeLiveTrendbarRes.d.ts.map +1 -0
  163. package/dist/src/models/proto/messages/symbols/ProtoOASubscribeLiveTrendbarRes.js +8 -0
  164. package/dist/src/models/proto/messages/symbols/ProtoOASubscribeLiveTrendbarRes.js.map +1 -0
  165. package/dist/src/models/proto/messages/symbols/ProtoOASymbolByIdReq.d.ts +5 -0
  166. package/dist/src/models/proto/messages/symbols/ProtoOASymbolByIdReq.d.ts.map +1 -0
  167. package/dist/src/models/proto/messages/symbols/ProtoOASymbolByIdReq.js +9 -0
  168. package/dist/src/models/proto/messages/symbols/ProtoOASymbolByIdReq.js.map +1 -0
  169. package/dist/src/models/proto/messages/symbols/ProtoOASymbolByIdRes.d.ts +8 -0
  170. package/dist/src/models/proto/messages/symbols/ProtoOASymbolByIdRes.d.ts.map +1 -0
  171. package/dist/src/models/proto/messages/symbols/ProtoOASymbolByIdRes.js +10 -0
  172. package/dist/src/models/proto/messages/symbols/ProtoOASymbolByIdRes.js.map +1 -0
  173. package/dist/src/models/proto/messages/symbols/ProtoOASymbolsListReq.d.ts +5 -0
  174. package/dist/src/models/proto/messages/symbols/ProtoOASymbolsListReq.d.ts.map +1 -0
  175. package/dist/src/models/proto/messages/symbols/ProtoOASymbolsListReq.js +9 -0
  176. package/dist/src/models/proto/messages/symbols/ProtoOASymbolsListReq.js.map +1 -0
  177. package/dist/src/models/proto/messages/symbols/ProtoOASymbolsListRes.d.ts +7 -0
  178. package/dist/src/models/proto/messages/symbols/ProtoOASymbolsListRes.d.ts.map +1 -0
  179. package/dist/src/models/proto/messages/symbols/ProtoOASymbolsListRes.js +10 -0
  180. package/dist/src/models/proto/messages/symbols/ProtoOASymbolsListRes.js.map +1 -0
  181. package/dist/src/models/proto/messages/symbols/ProtoOAUnsubscribeLiveTrendbarReq.d.ts +7 -0
  182. package/dist/src/models/proto/messages/symbols/ProtoOAUnsubscribeLiveTrendbarReq.d.ts.map +1 -0
  183. package/dist/src/models/proto/messages/symbols/ProtoOAUnsubscribeLiveTrendbarReq.js +10 -0
  184. package/dist/src/models/proto/messages/symbols/ProtoOAUnsubscribeLiveTrendbarReq.js.map +1 -0
  185. package/dist/src/models/proto/messages/symbols/ProtoOAUnsubscribeLiveTrendbarRes.d.ts +4 -0
  186. package/dist/src/models/proto/messages/symbols/ProtoOAUnsubscribeLiveTrendbarRes.d.ts.map +1 -0
  187. package/dist/src/models/proto/messages/symbols/ProtoOAUnsubscribeLiveTrendbarRes.js +8 -0
  188. package/dist/src/models/proto/messages/symbols/ProtoOAUnsubscribeLiveTrendbarRes.js.map +1 -0
  189. package/dist/src/models/proto/models/ProtoOAArchivedSymbol.d.ts +7 -0
  190. package/dist/src/models/proto/models/ProtoOAArchivedSymbol.d.ts.map +1 -0
  191. package/dist/src/models/proto/models/ProtoOAArchivedSymbol.js +11 -0
  192. package/dist/src/models/proto/models/ProtoOAArchivedSymbol.js.map +1 -0
  193. package/dist/src/models/proto/models/ProtoOAErrorRes.d.ts +8 -0
  194. package/dist/src/models/proto/models/ProtoOAErrorRes.d.ts.map +1 -0
  195. package/dist/src/models/proto/models/ProtoOAErrorRes.js +12 -0
  196. package/dist/src/models/proto/models/ProtoOAErrorRes.js.map +1 -0
  197. package/dist/src/models/proto/models/ProtoOAHoliday.d.ts +9 -0
  198. package/dist/src/models/proto/models/ProtoOAHoliday.d.ts.map +1 -0
  199. package/dist/src/models/proto/models/ProtoOAHoliday.js +13 -0
  200. package/dist/src/models/proto/models/ProtoOAHoliday.js.map +1 -0
  201. package/dist/src/models/proto/models/ProtoOAInterval.d.ts +6 -0
  202. package/dist/src/models/proto/models/ProtoOAInterval.d.ts.map +1 -0
  203. package/dist/src/models/proto/models/ProtoOAInterval.js +10 -0
  204. package/dist/src/models/proto/models/ProtoOAInterval.js.map +1 -0
  205. package/dist/src/models/proto/models/ProtoOALightSymbol.d.ts +11 -0
  206. package/dist/src/models/proto/models/ProtoOALightSymbol.d.ts.map +1 -0
  207. package/dist/src/models/proto/models/ProtoOALightSymbol.js +15 -0
  208. package/dist/src/models/proto/models/ProtoOALightSymbol.js.map +1 -0
  209. package/dist/src/models/proto/models/ProtoOASpotEvent.d.ts +11 -0
  210. package/dist/src/models/proto/models/ProtoOASpotEvent.d.ts.map +1 -0
  211. package/dist/src/models/proto/models/ProtoOASpotEvent.js +14 -0
  212. package/dist/src/models/proto/models/ProtoOASpotEvent.js.map +1 -0
  213. package/dist/src/models/proto/models/ProtoOASymbol.d.ts +44 -0
  214. package/dist/src/models/proto/models/ProtoOASymbol.d.ts.map +1 -0
  215. package/dist/src/models/proto/models/ProtoOASymbol.js +46 -0
  216. package/dist/src/models/proto/models/ProtoOASymbol.js.map +1 -0
  217. package/dist/src/models/proto/models/ProtoOATrendbar.d.ts +11 -0
  218. package/dist/src/models/proto/models/ProtoOATrendbar.d.ts.map +1 -0
  219. package/dist/src/models/proto/models/ProtoOATrendbar.js +14 -0
  220. package/dist/src/models/proto/models/ProtoOATrendbar.js.map +1 -0
  221. package/dist/src/models/proto/models/ProtoOATrendbarPeriod.d.ts +17 -0
  222. package/dist/src/models/proto/models/ProtoOATrendbarPeriod.d.ts.map +1 -0
  223. package/dist/src/models/proto/models/ProtoOATrendbarPeriod.js +21 -0
  224. package/dist/src/models/proto/models/ProtoOATrendbarPeriod.js.map +1 -0
  225. package/dist/src/models/proto/payload-types/payload-types.enum.d.ts +78 -0
  226. package/dist/src/models/proto/payload-types/payload-types.enum.d.ts.map +1 -0
  227. package/dist/src/models/proto/payload-types/payload-types.enum.js +82 -0
  228. package/dist/src/models/proto/payload-types/payload-types.enum.js.map +1 -0
  229. package/dist/src/utils/price.utils.d.ts +4 -0
  230. package/dist/src/utils/price.utils.d.ts.map +1 -0
  231. package/dist/src/utils/price.utils.js +36 -0
  232. package/dist/src/utils/price.utils.js.map +1 -0
  233. package/dist/src/utils/sleep.utils.d.ts +5 -0
  234. package/dist/src/utils/sleep.utils.d.ts.map +1 -0
  235. package/dist/src/utils/sleep.utils.js +15 -0
  236. package/dist/src/utils/sleep.utils.js.map +1 -0
  237. package/dist/src/utils/timeframe.utils.d.ts +6 -0
  238. package/dist/src/utils/timeframe.utils.d.ts.map +1 -0
  239. package/dist/src/utils/timeframe.utils.js +47 -0
  240. package/dist/src/utils/timeframe.utils.js.map +1 -0
  241. package/dist/src/utils/trendbar.utils.d.ts +7 -0
  242. package/dist/src/utils/trendbar.utils.d.ts.map +1 -0
  243. package/dist/src/utils/trendbar.utils.js +28 -0
  244. package/dist/src/utils/trendbar.utils.js.map +1 -0
  245. package/dist/tsconfig.tsbuildinfo +1 -0
  246. package/dist/vitest.config.d.ts +3 -0
  247. package/dist/vitest.config.d.ts.map +1 -0
  248. package/dist/vitest.config.js +12 -0
  249. package/dist/vitest.config.js.map +1 -0
  250. package/package.json +48 -0
  251. package/src/classes/client.test.ts +100 -0
  252. package/src/classes/client.ts +102 -0
  253. package/src/classes/errors/client-not-connected.error.ts +7 -0
  254. package/src/classes/errors/connection.error.ts +7 -0
  255. package/src/classes/logger.ts +26 -0
  256. package/src/classes/managers/authentication/authentication.manager.test.ts +187 -0
  257. package/src/classes/managers/authentication/authentication.manager.ts +65 -0
  258. package/src/classes/managers/authentication/errors/application-auth.error.ts +9 -0
  259. package/src/classes/managers/authentication/errors/user-auth.error.ts +9 -0
  260. package/src/classes/managers/models/base.manager.ts +50 -0
  261. package/src/classes/managers/models/credentials.model.ts +15 -0
  262. package/src/classes/managers/symbols/errors/get-symbols-details.error.ts +9 -0
  263. package/src/classes/managers/symbols/errors/get-symbols-list.error.ts +9 -0
  264. package/src/classes/managers/symbols/errors/get-trend-bars.error.ts +7 -0
  265. package/src/classes/managers/symbols/errors/subscribe-live-trend-bars.error.ts +17 -0
  266. package/src/classes/managers/symbols/errors/subscribe-spot-events.error.ts +9 -0
  267. package/src/classes/managers/symbols/errors/unsubscribe-live-trend-bars.error.ts +9 -0
  268. package/src/classes/managers/symbols/symbols-updates.manager.ts +440 -0
  269. package/src/classes/managers/symbols/symbols.manager.test.ts +455 -0
  270. package/src/classes/managers/symbols/symbols.manager.ts +134 -0
  271. package/src/classes/models/client-configuration.model.ts +39 -0
  272. package/src/classes/models/ctrader-x-error.model.ts +16 -0
  273. package/src/config/config.ts +48 -0
  274. package/src/index.ts +4 -0
  275. package/src/models/common/ohlcv.ts +19 -0
  276. package/src/models/proto/base-proto.ts +13 -0
  277. package/src/models/proto/messages/authentication/ProtoOAAccountAuthReq.ts +8 -0
  278. package/src/models/proto/messages/authentication/ProtoOAAccountAuthRes.ts +3 -0
  279. package/src/models/proto/messages/authentication/ProtoOAApplicationAuthReq.ts +13 -0
  280. package/src/models/proto/messages/authentication/ProtoOAApplicationAuthRes.ts +3 -0
  281. package/src/models/proto/messages/common/ProtoOASubscribeSpotsReq.ts +6 -0
  282. package/src/models/proto/messages/common/ProtoOASubscribeSpotsRes.ts +3 -0
  283. package/src/models/proto/messages/symbols/ProtoOAGetTrendbarsReq.ts +29 -0
  284. package/src/models/proto/messages/symbols/ProtoOAGetTrendbarsRes.ts +30 -0
  285. package/src/models/proto/messages/symbols/ProtoOASubscribeLiveTrendbarReq.ts +7 -0
  286. package/src/models/proto/messages/symbols/ProtoOASubscribeLiveTrendbarRes.ts +3 -0
  287. package/src/models/proto/messages/symbols/ProtoOASymbolByIdReq.ts +8 -0
  288. package/src/models/proto/messages/symbols/ProtoOASymbolByIdRes.ts +15 -0
  289. package/src/models/proto/messages/symbols/ProtoOASymbolsListReq.ts +8 -0
  290. package/src/models/proto/messages/symbols/ProtoOASymbolsListRes.ts +14 -0
  291. package/src/models/proto/messages/symbols/ProtoOAUnsubscribeLiveTrendbarReq.ts +11 -0
  292. package/src/models/proto/messages/symbols/ProtoOAUnsubscribeLiveTrendbarRes.ts +3 -0
  293. package/src/models/proto/models/ProtoOAArchivedSymbol.ts +21 -0
  294. package/src/models/proto/models/ProtoOAErrorRes.ts +20 -0
  295. package/src/models/proto/models/ProtoOAHoliday.ts +31 -0
  296. package/src/models/proto/models/ProtoOAInterval.ts +16 -0
  297. package/src/models/proto/models/ProtoOALightSymbol.ts +38 -0
  298. package/src/models/proto/models/ProtoOASpotEvent.ts +31 -0
  299. package/src/models/proto/models/ProtoOASymbol.ts +220 -0
  300. package/src/models/proto/models/ProtoOATrendbar.ts +11 -0
  301. package/src/models/proto/models/ProtoOATrendbarPeriod.ts +16 -0
  302. package/src/models/proto/payload-types/payload-types.enum.ts +77 -0
  303. package/src/utils/price.utils.ts +42 -0
  304. package/src/utils/sleep.utils.ts +13 -0
  305. package/src/utils/timeframe.utils.ts +50 -0
  306. package/src/utils/trendbar.utils.ts +59 -0
  307. package/tsconfig.tsbuildinfo +1 -0
  308. package/vitest.config.ts +11 -0
@@ -0,0 +1,440 @@
1
+ import { CTraderConnection } from '@reiryoku/ctrader-layer';
2
+ import { ILogger } from '../../logger';
3
+ import { BaseManager } from '../models/base.manager';
4
+ import { ICredentials } from '../models/credentials.model';
5
+ import { ProtoOASubscribeLiveTrendbarReq } from '../../../models/proto/messages/symbols/ProtoOASubscribeLiveTrendbarReq';
6
+ import {
7
+ tap,
8
+ from,
9
+ Subject,
10
+ switchMap,
11
+ catchError,
12
+ BehaviorSubject,
13
+ of,
14
+ } from 'rxjs';
15
+ import { ProtoOASubscribeSpotsReq } from '../../../models/proto/messages/common/ProtoOASubscribeSpotsReq';
16
+ import { ProtoOASubscribeSpotsRes } from '../../../models/proto/messages/common/ProtoOASubscribeSpotsRes';
17
+ import { SubscribeSpotEventsError } from './errors/subscribe-spot-events.error';
18
+ import { ProtoOASubscribeLiveTrendbarRes } from '../../../models/proto/messages/symbols/ProtoOASubscribeLiveTrendbarRes';
19
+ import { SubscribeLiveTrendBarsInternalError } from './errors/subscribe-live-trend-bars.error';
20
+ import { ProtoOASpotEvent } from '../../../models/proto/models/ProtoOASpotEvent';
21
+ import { CTraderLayerEvent } from '@reiryoku/ctrader-layer/build/src/core/events/CTraderLayerEvent';
22
+ import { OHLCV, OHLCVPositions } from '../../../models/common/ohlcv';
23
+ import { Price } from '../../../utils/price.utils';
24
+ import { TimeFrame } from '../../../utils/timeframe.utils';
25
+ import { ProtoOATrendbarPeriod } from '../../../models/proto/models/ProtoOATrendbarPeriod';
26
+ import { ProtoOAUnsubscribeLiveTrendbarReq } from '../../../models/proto/messages/symbols/ProtoOAUnsubscribeLiveTrendbarReq';
27
+ import { cTraderXError } from '../../models/ctrader-x-error.model';
28
+ import { UnsubscribeLiveTrendBarsError } from './errors/unsubscribe-live-trend-bars.error';
29
+ import { SymbolsManager } from './symbols.manager';
30
+ import { TrendBarUtils } from '../../../utils/trendbar.utils';
31
+
32
+ export interface ISubscribeBarsOptions extends ProtoOASubscribeLiveTrendbarReq {}
33
+ export interface IUnsubscribeBarsOptions extends ProtoOAUnsubscribeLiveTrendbarReq {}
34
+
35
+ export interface SubscribeLiveTrendBarsEvent {
36
+ symbolId: number;
37
+ ohlcv: OHLCV;
38
+ lastBarTime: number;
39
+ isInitialized: boolean;
40
+ period: ProtoOATrendbarPeriod;
41
+ }
42
+
43
+ export interface ILiveBarsSubscriber {
44
+ period: number;
45
+ lastBar: OHLCV | null;
46
+ isInitialized: boolean;
47
+ lastBarTime: number | null;
48
+ subscriber: Subject<unknown>;
49
+ }
50
+
51
+ export interface ILiveBarsSubscribers {
52
+ symbolId: number;
53
+ subscribers: ILiveBarsSubscriber[];
54
+ }
55
+
56
+ export class SymbolsUpdatesManager extends BaseManager {
57
+ private readonly liveBarsSubscriptions$: BehaviorSubject<
58
+ ILiveBarsSubscribers[]
59
+ > = new BehaviorSubject([]);
60
+
61
+ private readonly liveBarsSubscriptionsMapper$ =
62
+ this.liveBarsSubscriptions$.pipe(
63
+ tap((values) =>
64
+ values.forEach(({ symbolId }, idx) => {
65
+ this.liveBarsSubsSymbolsToSubscribersMap.set(symbolId, idx);
66
+ }),
67
+ ),
68
+ );
69
+
70
+ private liveBarsSubsSymbolsToSubscribersMap = new Map<number, number>();
71
+
72
+ constructor(
73
+ protected readonly credentials: ICredentials,
74
+ protected readonly connection: CTraderConnection,
75
+ protected readonly logger: ILogger,
76
+ private readonly symbolsManager: SymbolsManager,
77
+ ) {
78
+ super();
79
+ this.liveBarsSubscriptionsMapper$.subscribe();
80
+
81
+ this.connection.on(ProtoOASpotEvent.name, (event) => {
82
+ if (this.isTrackedSubscribeLiveTrendBarsDescriptor(event)) {
83
+ const { subscribers, idx } =
84
+ this.getSubscribeLiveTrendBarsSubscriptions(
85
+ +event.descriptor.symbolId,
86
+ );
87
+ if (idx === null) return;
88
+
89
+ subscribers.subscribers.forEach(
90
+ (
91
+ {
92
+ lastBar,
93
+ lastBarTime,
94
+ period,
95
+ subscriber,
96
+ isInitialized,
97
+ },
98
+ idx,
99
+ ) => {
100
+ const update =
101
+ this.spotEventDescriptorToSubscribeLiveBarsEvent(
102
+ event,
103
+ period,
104
+ lastBar,
105
+ lastBarTime,
106
+ isInitialized,
107
+ );
108
+ if (!update) return;
109
+
110
+ lastBar = update.ohlcv;
111
+ lastBarTime = update.lastBarTime;
112
+ subscriber.next({
113
+ ohlcv: update.ohlcv,
114
+ period: update.period,
115
+ symbolId: update.symbolId,
116
+ });
117
+
118
+ subscribers.subscribers[idx].isInitialized =
119
+ update.isInitialized;
120
+ subscribers.subscribers[idx].lastBar = lastBar;
121
+ subscribers.subscribers[idx].lastBarTime = lastBarTime;
122
+ },
123
+ );
124
+
125
+ this.updateSubscribeLiveTrendBarsSubscriptions(
126
+ subscribers,
127
+ idx,
128
+ );
129
+ }
130
+ });
131
+ }
132
+
133
+ async unsubscribeLiveTrendBars(opts: IUnsubscribeBarsOptions) {
134
+ this.removeSubscribeLiveTrendBarsSubscription(
135
+ opts.symbolId,
136
+ opts.period,
137
+ );
138
+
139
+ const symbolSubscriptions = this.getSubscribeLiveTrendBarsSubscriptions(
140
+ +opts.symbolId,
141
+ );
142
+ if (!symbolSubscriptions.subscribers.subscribers.length) {
143
+ this.logCallAttempt(this.unsubscribeLiveTrendBars, opts);
144
+
145
+ const payload: ProtoOAUnsubscribeLiveTrendbarReq = {
146
+ ...opts,
147
+ ctidTraderAccountId: this.credentials.ctidTraderAccountId,
148
+ };
149
+
150
+ try {
151
+ await this.connection.sendCommand(
152
+ ProtoOAUnsubscribeLiveTrendbarReq.name,
153
+ payload,
154
+ );
155
+ } catch (e) {
156
+ throw this.handleCTraderCallError(
157
+ e,
158
+ this.unsubscribeLiveTrendBars,
159
+ new UnsubscribeLiveTrendBarsError(e),
160
+ );
161
+ }
162
+ this.logCallAttemptSuccess(this.unsubscribeLiveTrendBars, opts);
163
+ }
164
+ }
165
+
166
+ subscribeLiveTrendBars(opts: ISubscribeBarsOptions) {
167
+ const subject = new Subject<
168
+ Omit<SubscribeLiveTrendBarsEvent, 'lastBarTime'>
169
+ >();
170
+ this.addSubscribeLiveTrendBarsSubscription(opts.symbolId, {
171
+ lastBar: null,
172
+ lastBarTime: null,
173
+ period: opts.period,
174
+ subscriber: subject,
175
+ isInitialized: false,
176
+ });
177
+ return from(
178
+ this.subscribeSpotEvents({
179
+ symbolId: opts.symbolId,
180
+ ctidTraderAccountId: this.credentials.ctidTraderAccountId,
181
+ }),
182
+ ).pipe(
183
+ switchMap(() => this.subscribeLiveTrendBarsInternal(opts)),
184
+ switchMap(() => subject),
185
+ catchError((e) => {
186
+ this.logger.error(
187
+ `[Symbol: ${opts.symbolId} Period: ${opts.period}] Error subscribing to live trend bars: ${cTraderXError.getMessageError(e)}`,
188
+ );
189
+ this.removeSubscribeLiveTrendBarsSubscription(
190
+ opts.symbolId,
191
+ opts.period,
192
+ );
193
+ throw e;
194
+ }),
195
+ );
196
+ }
197
+
198
+ private spotEventDescriptorToSubscribeLiveBarsEvent(
199
+ event: CTraderLayerEvent,
200
+ period: ProtoOATrendbarPeriod,
201
+ lastBar: OHLCV | null,
202
+ lastBarTime: number | null,
203
+ isInitialized: boolean,
204
+ ): SubscribeLiveTrendBarsEvent | null {
205
+ let lastBarClone = structuredClone(lastBar);
206
+ let lastBarTimeClone = structuredClone(lastBarTime);
207
+
208
+ // Calculate current price from bid/ask (used only for CLOSE)
209
+ const price = Price.getPrice(
210
+ +event.descriptor.bid,
211
+ +event.descriptor.ask,
212
+ );
213
+ if (price === null) return null;
214
+
215
+ // Find the trendbar for our subscribed period
216
+ const trendbar = event.descriptor.trendbar?.find(
217
+ (tb) => tb.period === ProtoOATrendbarPeriod[period],
218
+ );
219
+
220
+ // If no trendbar for our period, skip this event
221
+ // (shouldn't happen based on your logs, but safety check)
222
+ if (!trendbar) {
223
+ return null;
224
+ }
225
+
226
+ // Extract bar timestamp from trendbar (source of truth)
227
+ const barTimestamp = trendbar.utcTimestampInMinutes * 60000;
228
+
229
+ // Convert trendbar prices
230
+ const LOW = trendbar.low / 100000;
231
+ const OPEN = this.normalizePrice(LOW, trendbar.deltaOpen);
232
+ const HIGH = this.normalizePrice(LOW, trendbar.deltaHigh);
233
+ const VOLUME = trendbar.volume;
234
+
235
+ // ============================================================================
236
+ // SCENARIO 1: First event OR new bar detected
237
+ // ============================================================================
238
+ if (!lastBarTimeClone || barTimestamp !== lastBarTimeClone) {
239
+ // New bar (or first bar) - initialize from trendbar + current price
240
+ lastBarClone = [barTimestamp, OPEN, HIGH, LOW, price, VOLUME];
241
+ lastBarTimeClone = barTimestamp;
242
+ isInitialized = true;
243
+
244
+ return {
245
+ period,
246
+ isInitialized,
247
+ ohlcv: lastBarClone,
248
+ symbolId: event.descriptor.symbolId,
249
+ lastBarTime: barTimestamp,
250
+ };
251
+ }
252
+
253
+ // ============================================================================
254
+ // SCENARIO 2: Same bar - update from trendbar + current price
255
+ // ============================================================================
256
+ // WHY use trendbar values: The server continuously updates HIGH/LOW/VOLUME
257
+ // as the bar develops. We trust the server's calculations.
258
+ //
259
+ // WHY use price for CLOSE: deltaClose is null until bar closes, so CLOSE
260
+ // is always the current tick price.
261
+ if (!lastBarClone) {
262
+ lastBarClone = [barTimestamp, OPEN, HIGH, LOW, price, VOLUME];
263
+ } else {
264
+ lastBarClone[OHLCVPositions.OPEN] = OPEN; // Should not change, but update anyway
265
+ lastBarClone[OHLCVPositions.HIGH] = HIGH; // Server's accumulated HIGH
266
+ lastBarClone[OHLCVPositions.LOW] = LOW; // Server's accumulated LOW
267
+ lastBarClone[OHLCVPositions.CLOSE] = price; // Current tick
268
+ lastBarClone[OHLCVPositions.VOLUME] = VOLUME; // Server's accumulated VOLUME
269
+ }
270
+
271
+ return {
272
+ period,
273
+ isInitialized,
274
+ ohlcv: lastBarClone,
275
+ symbolId: event.descriptor.symbolId,
276
+ lastBarTime: barTimestamp,
277
+ };
278
+ }
279
+
280
+ private normalizePrice(low: number, priceDelta: number) {
281
+ return low + (priceDelta || 0) / 100000;
282
+ }
283
+
284
+ private isTrackedSubscribeLiveTrendBarsDescriptor(
285
+ event: CTraderLayerEvent,
286
+ ) {
287
+ return this.liveBarsSubsSymbolsToSubscribersMap.has(
288
+ +event.descriptor.symbolId,
289
+ );
290
+ }
291
+
292
+ private getSubscribeLiveTrendBarsSubscriptions(symbolId: number) {
293
+ const idx = this.liveBarsSubsSymbolsToSubscribersMap.get(symbolId);
294
+ if (idx === undefined) {
295
+ this.logger.warn(
296
+ `Received LiveTrendBars update, but no subscriber was found.`,
297
+ );
298
+ return {
299
+ idx: null,
300
+ subscribers: <ILiveBarsSubscribers>{
301
+ symbolId,
302
+ subscribers: [],
303
+ pricePrecision: null!,
304
+ },
305
+ };
306
+ }
307
+
308
+ return {
309
+ subscribers: this.liveBarsSubscriptions$.getValue()[idx!],
310
+ idx,
311
+ };
312
+ }
313
+
314
+ private removeSubscribeLiveTrendBarsSubscription(
315
+ symbolId: number,
316
+ period: ProtoOATrendbarPeriod | '*',
317
+ ) {
318
+ const subscriptionIdx =
319
+ this.liveBarsSubsSymbolsToSubscribersMap.get(symbolId);
320
+ if (subscriptionIdx === undefined) return;
321
+
322
+ const symbolSubscriptions =
323
+ this.liveBarsSubscriptions$.getValue()[subscriptionIdx];
324
+ symbolSubscriptions.subscribers =
325
+ symbolSubscriptions.subscribers.filter((s) => {
326
+ if (period === '*' || s.period === period) {
327
+ s.subscriber.complete();
328
+ return false;
329
+ }
330
+
331
+ return true;
332
+ });
333
+
334
+ const allSubscriptions = this.liveBarsSubscriptions$.getValue();
335
+ allSubscriptions[subscriptionIdx] = symbolSubscriptions;
336
+ this.liveBarsSubscriptions$.next([...allSubscriptions]);
337
+ }
338
+
339
+ private addSubscribeLiveTrendBarsSubscription(
340
+ symbolId: number,
341
+ subscriber: ILiveBarsSubscriber,
342
+ ) {
343
+ const allSubscriptions = this.liveBarsSubscriptions$.getValue();
344
+ const existingSubscriptionIdx =
345
+ this.liveBarsSubsSymbolsToSubscribersMap.get(symbolId);
346
+ if (existingSubscriptionIdx === undefined) {
347
+ allSubscriptions.push({
348
+ symbolId,
349
+ subscribers: [subscriber],
350
+ });
351
+ } else {
352
+ const existingSubscriberIdx = allSubscriptions[
353
+ existingSubscriptionIdx
354
+ ].subscribers.findIndex(
355
+ ({ period }) => period === subscriber.period,
356
+ );
357
+ if (existingSubscriberIdx !== -1) {
358
+ const existingSubscriber =
359
+ allSubscriptions[existingSubscriptionIdx].subscribers[
360
+ existingSubscriberIdx
361
+ ];
362
+ this.logger.warn(
363
+ `[Symbol: ${symbolId} Period: ${subscriber.period}] Completing previous subscriber subscription in favor of new subscriber`,
364
+ );
365
+ existingSubscriber.subscriber.complete();
366
+ existingSubscriber.subscriber = subscriber.subscriber;
367
+ } else {
368
+ allSubscriptions[existingSubscriptionIdx].subscribers.push(
369
+ subscriber,
370
+ );
371
+ }
372
+ }
373
+
374
+ this.liveBarsSubscriptions$.next([...allSubscriptions]);
375
+ }
376
+
377
+ private updateSubscribeLiveTrendBarsSubscriptions(
378
+ subscribers: ILiveBarsSubscribers,
379
+ idx: number,
380
+ ) {
381
+ const allSubscriptions = this.liveBarsSubscriptions$.getValue();
382
+ allSubscriptions[idx] = subscribers;
383
+ this.liveBarsSubscriptions$.next([...allSubscriptions]);
384
+ }
385
+
386
+ private async subscribeSpotEvents(opts: ProtoOASubscribeSpotsReq) {
387
+ this.logCallAttempt(this.subscribeSpotEvents);
388
+ const optsClone = structuredClone(opts);
389
+ optsClone.ctidTraderAccountId = this.credentials.ctidTraderAccountId;
390
+ optsClone.subscribeToSpotTimestamp = true;
391
+ try {
392
+ const result = (await this.connection.sendCommand(
393
+ ProtoOASubscribeSpotsReq.name,
394
+ optsClone,
395
+ )) as ProtoOASubscribeSpotsRes;
396
+ this.logCallAttemptSuccess(this.subscribeSpotEvents);
397
+ return result;
398
+ } catch (e) {
399
+ if (cTraderXError.isProtoOAErrorRes(e)) {
400
+ if (e.errorCode === 'ALREADY_SUBSCRIBED')
401
+ return of<ProtoOASubscribeLiveTrendbarRes>({
402
+ ctidTraderAccountId: optsClone.ctidTraderAccountId,
403
+ });
404
+ }
405
+ throw this.handleCTraderCallError(
406
+ e,
407
+ this.subscribeSpotEvents,
408
+ new SubscribeSpotEventsError(e),
409
+ );
410
+ }
411
+ }
412
+
413
+ private async subscribeLiveTrendBarsInternal(
414
+ opts: ProtoOASubscribeLiveTrendbarReq,
415
+ ) {
416
+ this.logCallAttempt(this.subscribeLiveTrendBarsInternal);
417
+ const optsClone = structuredClone(opts);
418
+ optsClone.ctidTraderAccountId = this.credentials.ctidTraderAccountId;
419
+ try {
420
+ const result = (await this.connection.sendCommand(
421
+ ProtoOASubscribeLiveTrendbarReq.name,
422
+ optsClone,
423
+ )) as ProtoOASubscribeLiveTrendbarRes;
424
+ this.logCallAttemptSuccess(this.subscribeLiveTrendBarsInternal);
425
+ return result;
426
+ } catch (e) {
427
+ if (cTraderXError.isProtoOAErrorRes(e)) {
428
+ if (e.errorCode === 'ALREADY_SUBSCRIBED')
429
+ return of<ProtoOASubscribeLiveTrendbarRes>({
430
+ ctidTraderAccountId: optsClone.ctidTraderAccountId,
431
+ });
432
+ }
433
+ throw this.handleCTraderCallError(
434
+ e,
435
+ this.subscribeLiveTrendBarsInternal,
436
+ new SubscribeLiveTrendBarsInternalError(e),
437
+ );
438
+ }
439
+ }
440
+ }