trigerr 0.7.2__tar.gz → 0.7.3__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 (237) hide show
  1. {trigerr-0.7.2/trigerr.egg-info → trigerr-0.7.3}/PKG-INFO +1 -1
  2. trigerr-0.7.3/tests/test_brokerage.py +152 -0
  3. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/__init__.py +1 -1
  4. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/utils.py +35 -14
  5. {trigerr-0.7.2 → trigerr-0.7.3/trigerr.egg-info}/PKG-INFO +1 -1
  6. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr.egg-info/SOURCES.txt +1 -0
  7. {trigerr-0.7.2 → trigerr-0.7.3}/LICENSE +0 -0
  8. {trigerr-0.7.2 → trigerr-0.7.3}/README.md +0 -0
  9. {trigerr-0.7.2 → trigerr-0.7.3}/pyproject.toml +0 -0
  10. {trigerr-0.7.2 → trigerr-0.7.3}/setup.cfg +0 -0
  11. {trigerr-0.7.2 → trigerr-0.7.3}/tests/test_bt_orders.py +0 -0
  12. {trigerr-0.7.2 → trigerr-0.7.3}/tests/test_crypto_utils.py +0 -0
  13. {trigerr-0.7.2 → trigerr-0.7.3}/tests/test_data_market.py +0 -0
  14. {trigerr-0.7.2 → trigerr-0.7.3}/tests/test_exit_mutex.py +0 -0
  15. {trigerr-0.7.2 → trigerr-0.7.3}/tests/test_historical_client_config.py +0 -0
  16. {trigerr-0.7.2 → trigerr-0.7.3}/tests/test_ledger_contract.py +0 -0
  17. {trigerr-0.7.2 → trigerr-0.7.3}/tests/test_live_orders_correlation.py +0 -0
  18. {trigerr-0.7.2 → trigerr-0.7.3}/tests/test_logging_utils.py +0 -0
  19. {trigerr-0.7.2 → trigerr-0.7.3}/tests/test_orders_schema.py +0 -0
  20. {trigerr-0.7.2 → trigerr-0.7.3}/tests/test_package.py +0 -0
  21. {trigerr-0.7.2 → trigerr-0.7.3}/tests/test_reference_symbol_details.py +0 -0
  22. {trigerr-0.7.2 → trigerr-0.7.3}/tests/test_schema_parity.py +0 -0
  23. {trigerr-0.7.2 → trigerr-0.7.3}/tests/test_symbols.py +0 -0
  24. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/config.py +0 -0
  25. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/crypto_utils.py +0 -0
  26. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/custom_indicators.py +0 -0
  27. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/data/__init__.py +0 -0
  28. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/data/historical.py +0 -0
  29. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/data/market.py +0 -0
  30. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/data/reference.py +0 -0
  31. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/framework/__init__.py +0 -0
  32. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/framework/bt_state.py +0 -0
  33. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/framework/candle_transforms.py +0 -0
  34. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/framework/catalog.py +0 -0
  35. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/framework/clock.py +0 -0
  36. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/framework/compiler.py +0 -0
  37. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/framework/data_feeds.py +0 -0
  38. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/framework/execution_core.py +0 -0
  39. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/framework/exit_engine.py +0 -0
  40. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/framework/expressions.py +0 -0
  41. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/framework/instrument.py +0 -0
  42. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/framework/point_in_time.py +0 -0
  43. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/framework/position_sizing.py +0 -0
  44. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/framework/tick_sources.py +0 -0
  45. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/jobs.py +0 -0
  46. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/orders/__init__.py +0 -0
  47. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/orders/backtest.py +0 -0
  48. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/orders/live.py +0 -0
  49. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/orders/orders_utils.py +0 -0
  50. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/orders/virtual.py +0 -0
  51. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/symbols.py +0 -0
  52. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/__init__.py +0 -0
  53. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/__main__.py +0 -0
  54. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/_typing.py +0 -0
  55. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/candle/__init__.py +0 -0
  56. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/candle/cdl_doji.py +0 -0
  57. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/candle/cdl_inside.py +0 -0
  58. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/candle/cdl_pattern.py +0 -0
  59. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/candle/cdl_z.py +0 -0
  60. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/candle/ha.py +0 -0
  61. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/core.py +0 -0
  62. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/custom.py +0 -0
  63. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/cycle/__init__.py +0 -0
  64. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/cycle/ebsw.py +0 -0
  65. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/cycle/reflex.py +0 -0
  66. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/ma.py +0 -0
  67. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/maps.py +0 -0
  68. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/__init__.py +0 -0
  69. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/ao.py +0 -0
  70. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/apo.py +0 -0
  71. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/bias.py +0 -0
  72. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/bop.py +0 -0
  73. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/brar.py +0 -0
  74. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/cci.py +0 -0
  75. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/cfo.py +0 -0
  76. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/cg.py +0 -0
  77. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/cmo.py +0 -0
  78. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/coppock.py +0 -0
  79. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/crsi.py +0 -0
  80. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/cti.py +0 -0
  81. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/dm.py +0 -0
  82. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/er.py +0 -0
  83. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/eri.py +0 -0
  84. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/exhc.py +0 -0
  85. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/fisher.py +0 -0
  86. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/inertia.py +0 -0
  87. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/kdj.py +0 -0
  88. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/kst.py +0 -0
  89. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/macd.py +0 -0
  90. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/mom.py +0 -0
  91. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/pgo.py +0 -0
  92. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/ppo.py +0 -0
  93. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/psl.py +0 -0
  94. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/qqe.py +0 -0
  95. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/roc.py +0 -0
  96. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/rsi.py +0 -0
  97. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/rsx.py +0 -0
  98. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/rvgi.py +0 -0
  99. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/slope.py +0 -0
  100. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/smc.py +0 -0
  101. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/smi.py +0 -0
  102. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/squeeze.py +0 -0
  103. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/squeeze_pro.py +0 -0
  104. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/stc.py +0 -0
  105. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/stoch.py +0 -0
  106. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/stochf.py +0 -0
  107. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/stochrsi.py +0 -0
  108. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/tmo.py +0 -0
  109. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/trix.py +0 -0
  110. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/tsi.py +0 -0
  111. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/uo.py +0 -0
  112. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/momentum/willr.py +0 -0
  113. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/__init__.py +0 -0
  114. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/alligator.py +0 -0
  115. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/alma.py +0 -0
  116. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/dema.py +0 -0
  117. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/ema.py +0 -0
  118. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/fwma.py +0 -0
  119. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/hilo.py +0 -0
  120. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/hl2.py +0 -0
  121. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/hlc3.py +0 -0
  122. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/hma.py +0 -0
  123. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/hwma.py +0 -0
  124. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/ichimoku.py +0 -0
  125. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/jma.py +0 -0
  126. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/kama.py +0 -0
  127. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/linreg.py +0 -0
  128. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/mama.py +0 -0
  129. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/mcgd.py +0 -0
  130. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/midpoint.py +0 -0
  131. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/midprice.py +0 -0
  132. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/ohlc4.py +0 -0
  133. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/pivots.py +0 -0
  134. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/pwma.py +0 -0
  135. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/rma.py +0 -0
  136. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/sinwma.py +0 -0
  137. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/sma.py +0 -0
  138. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/smma.py +0 -0
  139. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/ssf.py +0 -0
  140. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/ssf3.py +0 -0
  141. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/supertrend.py +0 -0
  142. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/swma.py +0 -0
  143. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/t3.py +0 -0
  144. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/tema.py +0 -0
  145. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/trima.py +0 -0
  146. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/vidya.py +0 -0
  147. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/wcp.py +0 -0
  148. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/wma.py +0 -0
  149. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/overlap/zlma.py +0 -0
  150. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/performance/__init__.py +0 -0
  151. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/performance/drawdown.py +0 -0
  152. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/performance/log_return.py +0 -0
  153. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/performance/percent_return.py +0 -0
  154. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/py.typed +0 -0
  155. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/statistics/__init__.py +0 -0
  156. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/statistics/entropy.py +0 -0
  157. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/statistics/kurtosis.py +0 -0
  158. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/statistics/mad.py +0 -0
  159. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/statistics/median.py +0 -0
  160. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/statistics/quantile.py +0 -0
  161. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/statistics/skew.py +0 -0
  162. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/statistics/stdev.py +0 -0
  163. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/statistics/tos_stdevall.py +0 -0
  164. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/statistics/variance.py +0 -0
  165. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/statistics/zscore.py +0 -0
  166. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/__init__.py +0 -0
  167. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/adx.py +0 -0
  168. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/alphatrend.py +0 -0
  169. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/amat.py +0 -0
  170. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/aroon.py +0 -0
  171. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/chop.py +0 -0
  172. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/cksp.py +0 -0
  173. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/decay.py +0 -0
  174. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/decreasing.py +0 -0
  175. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/dpo.py +0 -0
  176. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/ht_trendline.py +0 -0
  177. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/increasing.py +0 -0
  178. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/long_run.py +0 -0
  179. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/psar.py +0 -0
  180. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/qstick.py +0 -0
  181. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/rwi.py +0 -0
  182. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/short_run.py +0 -0
  183. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/trendflex.py +0 -0
  184. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/ttm_trend.py +0 -0
  185. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/vhf.py +0 -0
  186. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/vortex.py +0 -0
  187. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/trend/zigzag.py +0 -0
  188. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/utils/__init__.py +0 -0
  189. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/utils/_candles.py +0 -0
  190. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/utils/_core.py +0 -0
  191. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/utils/_math.py +0 -0
  192. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/utils/_numba.py +0 -0
  193. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/utils/_signals.py +0 -0
  194. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/utils/_study.py +0 -0
  195. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/utils/_time.py +0 -0
  196. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/utils/_validate.py +0 -0
  197. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volatility/__init__.py +0 -0
  198. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volatility/aberration.py +0 -0
  199. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volatility/accbands.py +0 -0
  200. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volatility/atr.py +0 -0
  201. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volatility/atrts.py +0 -0
  202. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volatility/bbands.py +0 -0
  203. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volatility/chandelier_exit.py +0 -0
  204. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volatility/donchian.py +0 -0
  205. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volatility/hwc.py +0 -0
  206. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volatility/kc.py +0 -0
  207. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volatility/massi.py +0 -0
  208. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volatility/natr.py +0 -0
  209. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volatility/pdist.py +0 -0
  210. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volatility/rvi.py +0 -0
  211. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volatility/thermo.py +0 -0
  212. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volatility/true_range.py +0 -0
  213. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volatility/ui.py +0 -0
  214. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/__init__.py +0 -0
  215. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/ad.py +0 -0
  216. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/adosc.py +0 -0
  217. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/aobv.py +0 -0
  218. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/cmf.py +0 -0
  219. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/efi.py +0 -0
  220. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/eom.py +0 -0
  221. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/kvo.py +0 -0
  222. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/mfi.py +0 -0
  223. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/nvi.py +0 -0
  224. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/obv.py +0 -0
  225. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/pvi.py +0 -0
  226. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/pvo.py +0 -0
  227. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/pvol.py +0 -0
  228. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/pvr.py +0 -0
  229. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/pvt.py +0 -0
  230. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/tsv.py +0 -0
  231. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/vhm.py +0 -0
  232. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/vp.py +0 -0
  233. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/vwap.py +0 -0
  234. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr/ta/volume/vwma.py +0 -0
  235. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr.egg-info/dependency_links.txt +0 -0
  236. {trigerr-0.7.2 → trigerr-0.7.3}/trigerr.egg-info/requires.txt +0 -0
  237. {trigerr-0.7.2 → trigerr-0.7.3}/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.7.2
3
+ Version: 0.7.3
4
4
  Summary: Python tools for quantitative trading research and analysis.
5
5
  Author: Anurag Singh Kushwah
6
6
  License-Expression: MIT
@@ -0,0 +1,152 @@
1
+ """ calculate_brokerage for the Indian market: the charge schedule every number below is worked out from.
2
+
3
+ Statutory charges are the same at every broker; brokerage is the one part that differs. Rates in force from 1 April 2026:
4
+ STT delivery 0.1% buy and sell; intraday equity 0.025% sell; futures 0.05% sell; options 0.15% of the premium, sell
5
+ Exchange (NSE) equity 0.00307%, futures 0.00183%, options 0.03553% of premium (NSE/FA/73061, from 1 March 2026);
6
+ BSE equity 0.00375%, futures nil, options 0.0325%
7
+ SEBI Rs 10 per crore (0.0001%) of turnover
8
+ Stamp duty on the buy side: delivery 0.015%, intraday equity and options 0.003%, futures 0.002%
9
+ GST 18% on brokerage + exchange charges + SEBI fee (+ DP charges on delivery)
10
+ STT and stamp duty on futures/options are rounded to the rupee/paisa as the function does; every total here was added up by
11
+ hand from those components, not read back from the function.
12
+ """
13
+ import pytest
14
+
15
+ from trigerr.utils import calculate_brokerage
16
+
17
+
18
+ def charges(broker="zerodha", **kwargs):
19
+ args = dict(market_type="options", holding_type="intraday", exchange="NFO", market="IN", lot_size=25, order_type="MARKET")
20
+ return calculate_brokerage(broker=broker, **{**args, **kwargs})
21
+
22
+
23
+ # ---- options: 44 lots of 25 bought at 90, sold at 100; flat Rs 20 per executed order
24
+
25
+ def test_nse_options_round_trip():
26
+ # brokerage 40 | SEBI 0.21 (209,000 x 0.0001%) | exchange 74.26 (209,000 x 0.03553%) | STT 165 (110,000 x 0.15%)
27
+ # stamp 2.97 (99,000 x 0.003%) | GST 20.60 (18% of 40 + 0.21 + 74.26) -> total 303.04
28
+ assert charges(buy_price=90, sell_price=100, quantity=1100) == (303.04, 10696.96)
29
+
30
+
31
+ @pytest.mark.parametrize("exchange", ["NSE", "NFO", "XNSE"])
32
+ def test_every_label_for_the_nse_prices_options_at_the_nse_rate(exchange):
33
+ # the strategies place options on "NFO", a plain cash symbol on "NSE": both are NSE
34
+ assert charges(buy_price=90, sell_price=100, quantity=1000, exchange=exchange) == (279.79, 9720.21)
35
+ # brokerage 40 | SEBI 0.19 | exchange 67.51 (190,000 x 0.03553%) | STT 150 | stamp 2.70 | GST 19.39
36
+
37
+
38
+ @pytest.mark.parametrize("exchange", ["BSE", "BFO", "XBSE"])
39
+ def test_bse_options_use_the_bse_rate(exchange):
40
+ # exchange 61.75 (190,000 x 0.0325%) -> GST 18.35 -> total 272.99
41
+ assert charges(buy_price=90, sell_price=100, quantity=1000, exchange=exchange) == (272.99, 9727.01)
42
+
43
+
44
+ def test_a_short_position_has_the_same_charges_and_the_opposite_sign_of_gross_pnl():
45
+ # the charges depend on the two prices, not on which came first; gross is (90 - 100) x 1,100 = -11,000
46
+ assert charges(buy_price=90, sell_price=100, quantity=1100, position_type="SHORT") == (303.04, -11303.04)
47
+
48
+
49
+ # ---- futures: one Nifty lot (75) bought at 22,000, sold at 22,100
50
+
51
+ def test_nse_futures_round_trip():
52
+ # brokerage 40 (the Rs 20 cap; 0.03% of 3,307,500 is 992.25) | SEBI 3.31 | exchange 60.53 (0.00183%) | STT 829 (1,657,500 x 0.05%)
53
+ # stamp 33.00 (1,650,000 x 0.002%) | GST 18.69 (18% of 40 + 3.31 + 60.53) -> total 984.53
54
+ assert charges(market_type="futures", buy_price=22000, sell_price=22100, quantity=75) == (984.53, 6515.47)
55
+
56
+
57
+ def test_bse_futures_pay_no_exchange_charge():
58
+ # brokerage 18 (0.03% of 60,000) | SEBI 0.06 | exchange 0 | STT 15 | stamp 0.60 | GST 3.25 -> 36.91
59
+ assert charges(market_type="futures", exchange="BFO", buy_price=100, sell_price=100, quantity=300) == (36.91, -36.91)
60
+
61
+
62
+ def test_small_futures_trades_pay_the_percentage_not_the_cap():
63
+ # brokerage 18 (0.03% of 60,000) | SEBI 0.06 | exchange 1.10 | STT 15 | stamp 0.60 | GST 3.45 -> 38.21
64
+ assert charges(market_type="futures", buy_price=100, sell_price=100, quantity=300) == (38.21, -38.21)
65
+
66
+
67
+ # ---- equity
68
+
69
+ def test_intraday_equity_round_trip():
70
+ # 100 shares bought at 100, sold at 102. brokerage 6.06 (0.03% of 20,200) | SEBI 0.02 | exchange 0.62 (0.00307%)
71
+ # STT 2.55 (10,200 x 0.025%) | stamp 0.30 | GST 1.21 -> 10.76
72
+ assert charges(market_type="equity", exchange="NSE", buy_price=100, sell_price=102, quantity=100) == (10.76, 189.24)
73
+
74
+
75
+ def test_delivery_equity_round_trip():
76
+ # zero brokerage; the DP charge is 15.34 | SEBI 0.02 | exchange 0.62 | STT 20.20 (0.1% of 10,000 and of 10,200)
77
+ # stamp 1.50 (0.015%) | GST 2.88 -> 40.56
78
+ assert charges(market_type="equity", holding_type="delivery", exchange="NSE", buy_price=100, sell_price=102, quantity=100) == (40.56, 159.44)
79
+
80
+
81
+ def test_spot_is_priced_by_the_callers_as_equity():
82
+ assert charges(market_type="equity", exchange="NSE", buy_price=100, sell_price=102, quantity=100) is not None
83
+
84
+
85
+ # ---- what it still refuses (None, the signal tts_fees.has_fee_model reads)
86
+
87
+ @pytest.mark.parametrize("broker, market", [("zerodha", "US"), ("zerodha", "CRYPTO"), ("someone", "IN"), ("", "IN")])
88
+ def test_a_broker_or_market_with_no_schedule_returns_none(broker, market):
89
+ assert charges(broker=broker, market=market, buy_price=90, sell_price=100, quantity=1000) is None
90
+
91
+
92
+ # ---- Upstox and Dhan: the same statutory charges, a different brokerage
93
+ # Brokerage per executed order (each broker's published schedule, read 2026-10-08):
94
+ # zerodha delivery nil (DP 15.34 on a sell) | intraday equity and futures: the lower of Rs 20 and 0.03% | options Rs 20
95
+ # upstox delivery Rs 20 (+ DP Rs 20 on a sell) | intraday equity: lower of Rs 20 and 0.1% | futures: lower of Rs 20 and 0.05% | options Rs 20
96
+ # dhan delivery nil (DP Rs 12.50) | intraday equity: lower of Rs 20 and 0.03% | futures and options: flat Rs 20
97
+ # GST is charged on the DP fee too, so it sits in the same line as brokerage below.
98
+
99
+ BROKERS = ("zerodha", "upstox", "dhan")
100
+
101
+
102
+ @pytest.mark.parametrize("broker", BROKERS)
103
+ def test_options_cost_the_same_at_every_broker(broker):
104
+ # Rs 20 flat per order everywhere: the options round trip of test_nse_options_round_trip
105
+ assert charges(broker=broker, buy_price=90, sell_price=100, quantity=1100) == (303.04, 10696.96)
106
+
107
+
108
+ @pytest.mark.parametrize("broker", BROKERS)
109
+ def test_a_futures_lot_pays_the_cap_at_every_broker(broker):
110
+ # 0.03% / 0.05% of 3,307,500 is far above Rs 20, so brokerage is the cap of 40: test_nse_futures_round_trip
111
+ assert charges(broker=broker, market_type="futures", buy_price=22000, sell_price=22100, quantity=75) == (984.53, 6515.47)
112
+
113
+
114
+ @pytest.mark.parametrize("broker, expected_total", [
115
+ ("zerodha", 38.21), # brokerage 18.00 (0.03% of 60,000)
116
+ ("upstox", 52.37), # brokerage 30.00 (0.05%): SEBI 0.06 | exchange 1.10 | STT 15 | stamp 0.60 | GST 5.61
117
+ ("dhan", 64.17), # brokerage 40.00 (flat Rs 20 per order): GST 7.41
118
+ ])
119
+ def test_small_futures_trades_show_each_brokers_rule(broker, expected_total):
120
+ assert charges(broker=broker, market_type="futures", buy_price=100, sell_price=100, quantity=300) == (expected_total, -expected_total)
121
+
122
+
123
+ @pytest.mark.parametrize("broker, expected_total", [
124
+ ("zerodha", 10.76), # brokerage 6.06 (0.03% of 20,200): SEBI 0.02 | exchange 0.62 | STT 2.55 | stamp 0.30 | GST 1.21
125
+ ("upstox", 27.44), # brokerage 20.20 (0.1%): GST 3.75
126
+ ("dhan", 10.76), # brokerage 6.06 (0.03%)
127
+ ])
128
+ def test_intraday_equity_shows_each_brokers_percentage(broker, expected_total):
129
+ assert charges(broker=broker, market_type="equity", exchange="NSE", buy_price=100, sell_price=102, quantity=100) == \
130
+ (expected_total, round(200 - expected_total, 2))
131
+
132
+
133
+ @pytest.mark.parametrize("broker, expected_total", [
134
+ ("zerodha", 40.56), # DP 15.34: SEBI 0.02 | exchange 0.62 | STT 20.20 | stamp 1.50 | GST 2.88
135
+ ("upstox", 93.26), # Rs 20 x 2 orders + DP Rs 20 = 60: GST 10.92
136
+ ("dhan", 37.21), # no brokerage, DP 12.50: GST 2.37
137
+ ])
138
+ def test_delivery_shows_each_brokers_fees(broker, expected_total):
139
+ assert charges(broker=broker, market_type="equity", holding_type="delivery", exchange="NSE",
140
+ buy_price=100, sell_price=102, quantity=100) == (expected_total, round(200 - expected_total, 2))
141
+
142
+
143
+ @pytest.mark.parametrize("broker", ["upstox", "dhan"])
144
+ @pytest.mark.parametrize("market", ["US", "CRYPTO", "MCX"])
145
+ def test_the_new_brokers_are_priced_for_the_indian_market_only(broker, market):
146
+ assert charges(broker=broker, market=market, buy_price=90, sell_price=100, quantity=1000) is None
147
+
148
+
149
+ @pytest.mark.parametrize("broker", ["Upstox", "DHAN", "upstox "])
150
+ def test_the_broker_name_is_matched_exactly(broker):
151
+ # callers lower-case it (tts_fees.has_fee_model reads None as "refuse"): an unlisted spelling stays unpriced
152
+ assert charges(broker=broker, buy_price=90, sell_price=100, quantity=1000) is None
@@ -1,6 +1,6 @@
1
1
  from .config import config
2
2
 
3
- __version__ = "0.7.2"
3
+ __version__ = "0.7.3"
4
4
 
5
5
 
6
6
  def set_api_key(key):
@@ -1480,23 +1480,48 @@ def send_order_alert(alert_dict):
1480
1480
  pass
1481
1481
 
1482
1482
 
1483
+ # Brokerage on Indian intraday equity and futures, per executed order: (percent of the order's value, cap in rupees).
1484
+ # The lower of the two is charged; percent None = the flat cap. As the Zerodha branch always did, the percentage is
1485
+ # taken on the round trip's turnover against the cap of all its orders. Options are a flat 20 an order at all three.
1486
+ # Each broker's published schedule, read 2026-10-08 (upstox.com/brokerage-charges, dhan.co/pricing, zerodha.com/charges).
1487
+ # Dhan lists futures with options at a flat 20; another copy of its page puts them under the 0.03% rule, which only
1488
+ # differs below a Rs 66,667 notional.
1489
+ _IN_BROKERAGE = {
1490
+ "zerodha": {"equity": (0.03, 20), "futures": (0.03, 20)},
1491
+ "upstox": {"equity": (0.1, 20), "futures": (0.05, 20)},
1492
+ "dhan": {"equity": (0.03, 20), "futures": (None, 20)},
1493
+ }
1494
+
1495
+
1496
+ def _in_brokerage(broker, product, turnover, no_of_orders):
1497
+ percent, cap = _IN_BROKERAGE[broker][product]
1498
+ flat = cap * no_of_orders
1499
+ return flat if percent is None else min(flat, round(turnover * (percent / 100), 2))
1500
+
1501
+
1483
1502
  def calculate_brokerage(buy_price, sell_price, quantity, broker="zerodha", market_type="options", order_type="MARKET", lot_size=100, position_type="LONG", holding_type="intraday", no_of_orders=2, market="IN", exchange="NSE", spot_price=None, exit_spot_price=None, underlying=None):
1484
1503
  """Function to calculate brokerage"""
1485
1504
  try:
1486
1505
 
1487
- if broker == "zerodha":
1506
+ if broker in _IN_BROKERAGE:
1488
1507
 
1489
1508
  if market == "IN":
1490
1509
  gst = 0.18
1491
1510
  sebi_fees = 0.0001
1492
1511
  clearing_charge = 0
1512
+ # Orders carry the segment they went to ("NFO" for NSE options and futures), cash symbols the exchange.
1513
+ nse = exchange in ("NSE", "NFO", "XNSE")
1514
+ # Statutory rates in force from 1 April 2026: exchange charges per NSE/FA/73061 (from 1 March 2026), STT on
1515
+ # futures and options per Budget 2026. Not modelled: STT on exercised options, physical settlement.
1493
1516
 
1494
1517
  # Calculating Turn Over
1495
1518
  turnover = (buy_price * quantity) + (sell_price * quantity)
1496
1519
 
1497
1520
  if market_type == "equity" and holding_type == "delivery":
1498
- broker_fees = 15.34
1499
- transaction_fees = 0.00297 if exchange == "NSE" else 0.00375
1521
+ # Delivery brokerage is nil at Zerodha and Dhan, so this is their DP charge on the sell (Zerodha's
1522
+ # includes the GST that the total adds again); Upstox charges Rs 20 an order and Rs 20 DP.
1523
+ broker_fees = {"zerodha": 15.34, "upstox": 20 * no_of_orders + 20, "dhan": 12.5}[broker]
1524
+ transaction_fees = 0.00307 if nse else 0.00375
1500
1525
  stt_fees = 0.1
1501
1526
  stamp_fees = 0.015
1502
1527
 
@@ -1512,11 +1537,9 @@ def calculate_brokerage(buy_price, sell_price, quantity, broker="zerodha", marke
1512
1537
  stamp_charge = round((quantity * buy_price * stamp_fees)/100, 2)
1513
1538
 
1514
1539
  elif market_type == "equity" and holding_type == "intraday":
1515
- broker_fees_1 = 20 * no_of_orders
1516
- broker_fees_2 = round(turnover * (0.03 / 100), 2)
1517
- broker_fees = min(broker_fees_1, broker_fees_2)
1540
+ broker_fees = _in_brokerage(broker, "equity", turnover, no_of_orders)
1518
1541
 
1519
- transaction_fees = 0.00297 if exchange == "NSE" else 0.00375
1542
+ transaction_fees = 0.00307 if nse else 0.00375
1520
1543
  stamp_fees = 0.003
1521
1544
  stt_fees = 0.025
1522
1545
 
@@ -1530,12 +1553,10 @@ def calculate_brokerage(buy_price, sell_price, quantity, broker="zerodha", marke
1530
1553
  stamp_charge = round(quantity * buy_price * stamp_fees / 100, 2)
1531
1554
 
1532
1555
  elif market_type == "futures":
1533
- broker_fees_1 = 20 * no_of_orders
1534
- broker_fees_2 = round(turnover * (0.03 / 100), 2)
1535
- broker_fees = min(broker_fees_1, broker_fees_2)
1536
- transaction_fees = 0.00173 if exchange == "NSE" else 0
1556
+ broker_fees = _in_brokerage(broker, "futures", turnover, no_of_orders)
1557
+ transaction_fees = 0.00183 if nse else 0
1537
1558
  stamp_fees = 0.002
1538
- stt_fees = 0.02
1559
+ stt_fees = 0.05
1539
1560
 
1540
1561
  # Calculating STT Charge
1541
1562
  stt_charge = round(quantity * sell_price * stt_fees / 100)
@@ -1548,10 +1569,10 @@ def calculate_brokerage(buy_price, sell_price, quantity, broker="zerodha", marke
1548
1569
 
1549
1570
  else:
1550
1571
  broker_fees = 20 * no_of_orders
1551
- transaction_fees = 0.03503 if exchange == "NSE" else 0.0325
1572
+ transaction_fees = 0.03553 if nse else 0.0325
1552
1573
  stamp_fees = 0.003
1553
1574
 
1554
- stt_fees = 0.1
1575
+ stt_fees = 0.15
1555
1576
 
1556
1577
  # Calculating STT Charge
1557
1578
  stt_charge = round(quantity * sell_price * stt_fees / 100)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trigerr
3
- Version: 0.7.2
3
+ Version: 0.7.3
4
4
  Summary: Python tools for quantitative trading research and analysis.
5
5
  Author: Anurag Singh Kushwah
6
6
  License-Expression: MIT
@@ -1,6 +1,7 @@
1
1
  LICENSE
2
2
  README.md
3
3
  pyproject.toml
4
+ tests/test_brokerage.py
4
5
  tests/test_bt_orders.py
5
6
  tests/test_crypto_utils.py
6
7
  tests/test_data_market.py
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