trigerr 0.2.0__tar.gz → 0.3.0__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 (211) hide show
  1. {trigerr-0.2.0 → trigerr-0.3.0}/PKG-INFO +2 -1
  2. {trigerr-0.2.0 → trigerr-0.3.0}/pyproject.toml +1 -0
  3. trigerr-0.3.0/tests/test_crypto_utils.py +68 -0
  4. {trigerr-0.2.0 → trigerr-0.3.0}/tests/test_live_orders_correlation.py +29 -0
  5. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/__init__.py +1 -1
  6. trigerr-0.3.0/trigerr/crypto_utils.py +55 -0
  7. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/orders/live.py +17 -0
  8. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr.egg-info/PKG-INFO +2 -1
  9. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr.egg-info/SOURCES.txt +2 -0
  10. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr.egg-info/requires.txt +1 -0
  11. {trigerr-0.2.0 → trigerr-0.3.0}/LICENSE +0 -0
  12. {trigerr-0.2.0 → trigerr-0.3.0}/README.md +0 -0
  13. {trigerr-0.2.0 → trigerr-0.3.0}/setup.cfg +0 -0
  14. {trigerr-0.2.0 → trigerr-0.3.0}/tests/test_logging_utils.py +0 -0
  15. {trigerr-0.2.0 → trigerr-0.3.0}/tests/test_package.py +0 -0
  16. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/config.py +0 -0
  17. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/custom_indicators.py +0 -0
  18. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/data/__init__.py +0 -0
  19. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/data/historical.py +0 -0
  20. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/data/live.py +0 -0
  21. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/logging_utils.py +0 -0
  22. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/orders/__init__.py +0 -0
  23. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/orders/backtest.py +0 -0
  24. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/orders/orders_utils.py +0 -0
  25. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/orders/virtual.py +0 -0
  26. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/__init__.py +0 -0
  27. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/__main__.py +0 -0
  28. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/_typing.py +0 -0
  29. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/candle/__init__.py +0 -0
  30. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/candle/cdl_doji.py +0 -0
  31. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/candle/cdl_inside.py +0 -0
  32. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/candle/cdl_pattern.py +0 -0
  33. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/candle/cdl_z.py +0 -0
  34. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/candle/ha.py +0 -0
  35. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/core.py +0 -0
  36. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/custom.py +0 -0
  37. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/cycle/__init__.py +0 -0
  38. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/cycle/ebsw.py +0 -0
  39. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/cycle/reflex.py +0 -0
  40. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/ma.py +0 -0
  41. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/maps.py +0 -0
  42. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/__init__.py +0 -0
  43. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/ao.py +0 -0
  44. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/apo.py +0 -0
  45. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/bias.py +0 -0
  46. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/bop.py +0 -0
  47. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/brar.py +0 -0
  48. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/cci.py +0 -0
  49. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/cfo.py +0 -0
  50. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/cg.py +0 -0
  51. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/cmo.py +0 -0
  52. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/coppock.py +0 -0
  53. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/crsi.py +0 -0
  54. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/cti.py +0 -0
  55. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/dm.py +0 -0
  56. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/er.py +0 -0
  57. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/eri.py +0 -0
  58. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/exhc.py +0 -0
  59. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/fisher.py +0 -0
  60. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/inertia.py +0 -0
  61. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/kdj.py +0 -0
  62. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/kst.py +0 -0
  63. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/macd.py +0 -0
  64. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/mom.py +0 -0
  65. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/pgo.py +0 -0
  66. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/ppo.py +0 -0
  67. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/psl.py +0 -0
  68. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/qqe.py +0 -0
  69. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/roc.py +0 -0
  70. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/rsi.py +0 -0
  71. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/rsx.py +0 -0
  72. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/rvgi.py +0 -0
  73. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/slope.py +0 -0
  74. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/smc.py +0 -0
  75. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/smi.py +0 -0
  76. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/squeeze.py +0 -0
  77. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/squeeze_pro.py +0 -0
  78. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/stc.py +0 -0
  79. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/stoch.py +0 -0
  80. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/stochf.py +0 -0
  81. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/stochrsi.py +0 -0
  82. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/tmo.py +0 -0
  83. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/trix.py +0 -0
  84. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/tsi.py +0 -0
  85. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/uo.py +0 -0
  86. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/momentum/willr.py +0 -0
  87. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/__init__.py +0 -0
  88. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/alligator.py +0 -0
  89. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/alma.py +0 -0
  90. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/dema.py +0 -0
  91. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/ema.py +0 -0
  92. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/fwma.py +0 -0
  93. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/hilo.py +0 -0
  94. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/hl2.py +0 -0
  95. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/hlc3.py +0 -0
  96. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/hma.py +0 -0
  97. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/hwma.py +0 -0
  98. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/ichimoku.py +0 -0
  99. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/jma.py +0 -0
  100. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/kama.py +0 -0
  101. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/linreg.py +0 -0
  102. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/mama.py +0 -0
  103. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/mcgd.py +0 -0
  104. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/midpoint.py +0 -0
  105. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/midprice.py +0 -0
  106. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/ohlc4.py +0 -0
  107. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/pivots.py +0 -0
  108. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/pwma.py +0 -0
  109. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/rma.py +0 -0
  110. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/sinwma.py +0 -0
  111. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/sma.py +0 -0
  112. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/smma.py +0 -0
  113. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/ssf.py +0 -0
  114. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/ssf3.py +0 -0
  115. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/supertrend.py +0 -0
  116. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/swma.py +0 -0
  117. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/t3.py +0 -0
  118. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/tema.py +0 -0
  119. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/trima.py +0 -0
  120. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/vidya.py +0 -0
  121. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/wcp.py +0 -0
  122. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/wma.py +0 -0
  123. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/overlap/zlma.py +0 -0
  124. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/performance/__init__.py +0 -0
  125. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/performance/drawdown.py +0 -0
  126. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/performance/log_return.py +0 -0
  127. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/performance/percent_return.py +0 -0
  128. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/py.typed +0 -0
  129. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/statistics/__init__.py +0 -0
  130. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/statistics/entropy.py +0 -0
  131. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/statistics/kurtosis.py +0 -0
  132. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/statistics/mad.py +0 -0
  133. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/statistics/median.py +0 -0
  134. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/statistics/quantile.py +0 -0
  135. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/statistics/skew.py +0 -0
  136. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/statistics/stdev.py +0 -0
  137. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/statistics/tos_stdevall.py +0 -0
  138. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/statistics/variance.py +0 -0
  139. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/statistics/zscore.py +0 -0
  140. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/__init__.py +0 -0
  141. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/adx.py +0 -0
  142. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/alphatrend.py +0 -0
  143. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/amat.py +0 -0
  144. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/aroon.py +0 -0
  145. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/chop.py +0 -0
  146. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/cksp.py +0 -0
  147. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/decay.py +0 -0
  148. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/decreasing.py +0 -0
  149. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/dpo.py +0 -0
  150. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/ht_trendline.py +0 -0
  151. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/increasing.py +0 -0
  152. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/long_run.py +0 -0
  153. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/psar.py +0 -0
  154. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/qstick.py +0 -0
  155. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/rwi.py +0 -0
  156. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/short_run.py +0 -0
  157. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/trendflex.py +0 -0
  158. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/ttm_trend.py +0 -0
  159. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/vhf.py +0 -0
  160. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/vortex.py +0 -0
  161. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/trend/zigzag.py +0 -0
  162. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/utils/__init__.py +0 -0
  163. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/utils/_candles.py +0 -0
  164. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/utils/_core.py +0 -0
  165. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/utils/_math.py +0 -0
  166. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/utils/_numba.py +0 -0
  167. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/utils/_signals.py +0 -0
  168. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/utils/_study.py +0 -0
  169. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/utils/_time.py +0 -0
  170. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/utils/_validate.py +0 -0
  171. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volatility/__init__.py +0 -0
  172. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volatility/aberration.py +0 -0
  173. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volatility/accbands.py +0 -0
  174. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volatility/atr.py +0 -0
  175. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volatility/atrts.py +0 -0
  176. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volatility/bbands.py +0 -0
  177. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volatility/chandelier_exit.py +0 -0
  178. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volatility/donchian.py +0 -0
  179. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volatility/hwc.py +0 -0
  180. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volatility/kc.py +0 -0
  181. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volatility/massi.py +0 -0
  182. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volatility/natr.py +0 -0
  183. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volatility/pdist.py +0 -0
  184. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volatility/rvi.py +0 -0
  185. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volatility/thermo.py +0 -0
  186. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volatility/true_range.py +0 -0
  187. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volatility/ui.py +0 -0
  188. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/__init__.py +0 -0
  189. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/ad.py +0 -0
  190. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/adosc.py +0 -0
  191. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/aobv.py +0 -0
  192. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/cmf.py +0 -0
  193. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/efi.py +0 -0
  194. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/eom.py +0 -0
  195. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/kvo.py +0 -0
  196. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/mfi.py +0 -0
  197. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/nvi.py +0 -0
  198. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/obv.py +0 -0
  199. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/pvi.py +0 -0
  200. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/pvo.py +0 -0
  201. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/pvol.py +0 -0
  202. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/pvr.py +0 -0
  203. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/pvt.py +0 -0
  204. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/tsv.py +0 -0
  205. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/vhm.py +0 -0
  206. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/vp.py +0 -0
  207. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/vwap.py +0 -0
  208. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/ta/volume/vwma.py +0 -0
  209. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr/utils.py +0 -0
  210. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr.egg-info/dependency_links.txt +0 -0
  211. {trigerr-0.2.0 → trigerr-0.3.0}/trigerr.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trigerr
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: Python tools for quantitative trading research and analysis.
5
5
  Author: Anurag Singh Kushwah
6
6
  License-Expression: MIT
@@ -21,6 +21,7 @@ Requires-Dist: redis<6,>=5.0.8
21
21
  Requires-Dist: pymongo>=4.0
22
22
  Requires-Dist: numba>=0.57
23
23
  Requires-Dist: tqdm>=4.0
24
+ Requires-Dist: cryptography>=42
24
25
  Provides-Extra: dev
25
26
  Requires-Dist: build>=1.2; extra == "dev"
26
27
  Requires-Dist: pytest>=7.0; extra == "dev"
@@ -32,6 +32,7 @@ dependencies = [
32
32
  "pymongo>=4.0",
33
33
  "numba>=0.57",
34
34
  "tqdm>=4.0",
35
+ "cryptography>=42",
35
36
  ]
36
37
 
37
38
  [project.optional-dependencies]
@@ -0,0 +1,68 @@
1
+ import pytest
2
+ from cryptography.fernet import Fernet, InvalidToken
3
+
4
+ from trigerr import crypto_utils as cu
5
+
6
+
7
+ @pytest.fixture
8
+ def fernet():
9
+ return cu.load_key(Fernet.generate_key().decode())
10
+
11
+
12
+ def test_value_round_trip_string(fernet):
13
+ token = cu.encrypt_value("hunter2", fernet)
14
+ assert token != "hunter2"
15
+ assert cu.decrypt_value(token, fernet) == "hunter2"
16
+
17
+
18
+ def test_value_round_trip_int(fernet):
19
+ token = cu.encrypt_value(1234, fernet)
20
+ assert cu.decrypt_value(token, fernet) == 1234
21
+
22
+
23
+ def test_value_round_trip_none(fernet):
24
+ token = cu.encrypt_value(None, fernet)
25
+ assert cu.decrypt_value(token, fernet) is None
26
+
27
+
28
+ def test_input_round_trip(fernet):
29
+ input_list = [
30
+ {"key_name": "api_key", "key_value": "abc"},
31
+ {"key_name": "client_id", "key_value": 42},
32
+ ]
33
+ encrypted = cu.encrypt_input(input_list, fernet)
34
+ assert {d["key_name"] for d in encrypted} == {"api_key", "client_id"}
35
+ for d in encrypted:
36
+ assert d["key_value"] not in ("abc", 42)
37
+
38
+ decrypted = cu.decrypt_input(encrypted, fernet)
39
+ assert decrypted == {"api_key": "abc", "client_id": 42}
40
+
41
+
42
+ def test_is_encrypted():
43
+ assert cu.is_encrypted({"cred_enc": "fernet-v1"}) is True
44
+ assert cu.is_encrypted({"cred_enc": "something-else"}) is False
45
+ assert cu.is_encrypted({}) is False
46
+
47
+
48
+ def test_multi_key_rotation_decrypts_old_token():
49
+ old_key = Fernet.generate_key().decode()
50
+ new_key = Fernet.generate_key().decode()
51
+
52
+ old_fernet = cu.load_key(old_key)
53
+ token = cu.encrypt_value("secret", old_fernet)
54
+
55
+ rotated_fernet = cu.load_key(f"{new_key},{old_key}")
56
+ assert cu.decrypt_value(token, rotated_fernet) == "secret"
57
+
58
+ # new encryptions use the first (newest) key
59
+ new_token = cu.encrypt_value("secret2", rotated_fernet)
60
+ new_only_fernet = cu.load_key(new_key)
61
+ assert cu.decrypt_value(new_token, new_only_fernet) == "secret2"
62
+
63
+
64
+ def test_tamper_detection(fernet):
65
+ token = cu.encrypt_value("secret", fernet)
66
+ tampered = token[:-1] + ("A" if token[-1] != "A" else "B")
67
+ with pytest.raises(InvalidToken):
68
+ cu.decrypt_value(tampered, fernet)
@@ -98,3 +98,32 @@ def test_place_live_order_still_sends_auth_headers():
98
98
  finally:
99
99
  import trigerr
100
100
  trigerr.config["api_key"] = None
101
+
102
+
103
+ def test_validate_credential_success():
104
+ with patch("trigerr.orders.live.requests.post") as mock_post:
105
+ mock_post.return_value = _mock_response({"status": "SUCCESS", "message": "ok"})
106
+ status, message = live.validate_credential(credential_id="cred-1")
107
+
108
+ assert status == "success"
109
+ assert message == "ok"
110
+ sent_body = mock_post.call_args.kwargs["json"]
111
+ assert sent_body == {"credential_id": "cred-1"}
112
+
113
+
114
+ def test_validate_credential_error():
115
+ with patch("trigerr.orders.live.requests.post") as mock_post:
116
+ mock_post.return_value = _mock_response({"status": "ERROR", "message": "bad credential"})
117
+ status, message = live.validate_credential(credential_id="cred-1")
118
+
119
+ assert status == "error"
120
+ assert message == "bad credential"
121
+
122
+
123
+ def test_validate_credential_never_sends_credential_values():
124
+ with patch("trigerr.orders.live.requests.post") as mock_post:
125
+ mock_post.return_value = _mock_response({"status": "SUCCESS"})
126
+ live.validate_credential(credential_id="cred-1")
127
+
128
+ sent_body = mock_post.call_args.kwargs["json"]
129
+ assert set(sent_body.keys()) == {"credential_id"}
@@ -1,6 +1,6 @@
1
1
  from .config import config
2
2
 
3
- __version__ = "0.2.0"
3
+ __version__ = "0.3.0"
4
4
 
5
5
 
6
6
  def set_api_key(key):
@@ -0,0 +1,55 @@
1
+ """Shared envelope encryption for broker credential values (`broker_credentials.input[].key_value`).
2
+
3
+ Used by trigerr-oms (encrypt-on-write / decrypt-on-read at its Mongo resolver
4
+ choke point) and trigerr-broker-automation (decrypt before use in its daily
5
+ token-refresh cron, re-encrypt before persisting). Both hold the same master
6
+ key material (env var `BROKER_CRED_MASTER_KEYS`, comma-separated for
7
+ rotation); this module never reads the environment itself — each repo's own
8
+ config module reads the env var and passes the string into load_key().
9
+
10
+ Usage:
11
+ from trigerr.crypto_utils import load_key, encrypt_input, decrypt_input, is_encrypted, ENC_MARKER
12
+
13
+ fernet = load_key(os.environ["BROKER_CRED_MASTER_KEYS"])
14
+ encrypted_input = encrypt_input(doc["input"], fernet)
15
+ # doc["cred_enc"] = ENC_MARKER, doc["input"] = encrypted_input
16
+
17
+ if is_encrypted(doc):
18
+ credentials = decrypt_input(doc["input"], fernet)
19
+ """
20
+ import json
21
+
22
+ from cryptography.fernet import Fernet, MultiFernet
23
+
24
+ ENC_MARKER = "fernet-v1"
25
+
26
+
27
+ def load_key(keys_str):
28
+ """Comma-separated Fernet keys -> MultiFernet. First key encrypts; all
29
+ keys are tried on decrypt, so rotation is prepend-new-key/soak/drop-old
30
+ with no flag day."""
31
+ keys = [k.strip() for k in keys_str.split(",") if k.strip()]
32
+ return MultiFernet([Fernet(k) for k in keys])
33
+
34
+
35
+ def encrypt_value(value, fernet):
36
+ return fernet.encrypt(json.dumps(value).encode()).decode()
37
+
38
+
39
+ def decrypt_value(token, fernet):
40
+ return json.loads(fernet.decrypt(token.encode()).decode())
41
+
42
+
43
+ def encrypt_input(input_list, fernet):
44
+ """[{key_name, key_value}, ...] -> same shape, key_value replaced by ciphertext."""
45
+ return [{"key_name": d["key_name"], "key_value": encrypt_value(d["key_value"], fernet)}
46
+ for d in input_list]
47
+
48
+
49
+ def decrypt_input(input_list, fernet):
50
+ """[{key_name, key_value}, ...] (ciphertext) -> flat {key_name: plain_value} dict."""
51
+ return {d["key_name"]: decrypt_value(d["key_value"], fernet) for d in input_list}
52
+
53
+
54
+ def is_encrypted(doc):
55
+ return doc.get("cred_enc") == ENC_MARKER
@@ -289,3 +289,20 @@ def poll_order_status(credential_id, order_id, exchange, max_wait_seconds=1800,
289
289
  except Exception as e:
290
290
  print(f"Exception in Poll Order Status Function: {e}")
291
291
  return "failed", order_response
292
+
293
+
294
+ def validate_credential(credential_id):
295
+ """Ask OMS to check a broker credential is live (real broker call on its
296
+ side) without ever handling the plaintext credential values here.
297
+ Returns (status, message) — status is "success" or "error"."""
298
+ try:
299
+ print(f"Validating broker credential: {credential_id}")
300
+ response = requests.post(url=urljoin(orders_url, "validate_broker_credentials"),
301
+ json={"credential_id": str(credential_id)},
302
+ headers=get_auth_headers()).json()
303
+ if response.get("status") == "SUCCESS":
304
+ return "success", response.get("message")
305
+ return "error", response.get("message")
306
+ except Exception as e:
307
+ print(f"Exception in Validate Credential Function: {e}")
308
+ return "error", str(e)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trigerr
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: Python tools for quantitative trading research and analysis.
5
5
  Author: Anurag Singh Kushwah
6
6
  License-Expression: MIT
@@ -21,6 +21,7 @@ Requires-Dist: redis<6,>=5.0.8
21
21
  Requires-Dist: pymongo>=4.0
22
22
  Requires-Dist: numba>=0.57
23
23
  Requires-Dist: tqdm>=4.0
24
+ Requires-Dist: cryptography>=42
24
25
  Provides-Extra: dev
25
26
  Requires-Dist: build>=1.2; extra == "dev"
26
27
  Requires-Dist: pytest>=7.0; extra == "dev"
@@ -1,11 +1,13 @@
1
1
  LICENSE
2
2
  README.md
3
3
  pyproject.toml
4
+ tests/test_crypto_utils.py
4
5
  tests/test_live_orders_correlation.py
5
6
  tests/test_logging_utils.py
6
7
  tests/test_package.py
7
8
  trigerr/__init__.py
8
9
  trigerr/config.py
10
+ trigerr/crypto_utils.py
9
11
  trigerr/custom_indicators.py
10
12
  trigerr/logging_utils.py
11
13
  trigerr/utils.py
@@ -5,6 +5,7 @@ redis<6,>=5.0.8
5
5
  pymongo>=4.0
6
6
  numba>=0.57
7
7
  tqdm>=4.0
8
+ cryptography>=42
8
9
 
9
10
  [dev]
10
11
  build>=1.2
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes