cyqnt-trd 0.1.9.dev0__tar.gz → 0.1.9.dev2__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 (257) hide show
  1. {cyqnt_trd-0.1.9.dev0/cyqnt_trd.egg-info → cyqnt_trd-0.1.9.dev2}/PKG-INFO +45 -22
  2. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/README.md +28 -8
  3. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/__init__.py +1 -1
  4. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/get_data/get_trending_data.py +0 -1
  5. cyqnt_trd-0.1.9.dev2/cyqnt_trd/standard_bot/data/_ssl_utils.py +39 -0
  6. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/data/adapters.py +7 -1
  7. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/data/downloader.py +7 -1
  8. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/data/historical.py +1 -1
  9. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/entrypoints/common.py +58 -0
  10. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/entrypoints/mvp_backtest.py +52 -2
  11. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/entrypoints/mvp_monitor_http.py +11 -0
  12. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/entrypoints/mvp_paper.py +33 -1
  13. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/entrypoints/mvp_runtime_consistency.py +33 -1
  14. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/signal/__init__.py +16 -0
  15. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/signal/numba_kernels.py +388 -0
  16. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/signal/plugins.py +731 -0
  17. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/simulation/execution_kernels.py +36 -8
  18. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/simulation/numba_runner.py +51 -0
  19. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2/cyqnt_trd.egg-info}/PKG-INFO +45 -22
  20. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd.egg-info/SOURCES.txt +1 -7
  21. cyqnt_trd-0.1.9.dev2/cyqnt_trd.egg-info/requires.txt +21 -0
  22. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd.egg-info/top_level.txt +0 -1
  23. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/pyproject.toml +18 -14
  24. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/references/repo-bootstrap.md +18 -17
  25. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/requirements.txt +12 -12
  26. cyqnt_trd-0.1.9.dev2/scripts/llm_strategy_evolution.py +1014 -0
  27. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/tests/standard_bot/test_numba_backtest.py +146 -0
  28. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/tests/standard_bot/test_signal_alignment.py +63 -0
  29. cyqnt_trd-0.1.9.dev0/cyqnt_trd.egg-info/requires.txt +0 -18
  30. cyqnt_trd-0.1.9.dev0/docs/backtests/btc_mtf_local_historical_smoke.json +0 -4623
  31. cyqnt_trd-0.1.9.dev0/docs/backtests/donchian_breakout_smoke.json +0 -4895
  32. cyqnt_trd-0.1.9.dev0/docs/backtests/e2e_mtf_backtest.json +0 -4858
  33. cyqnt_trd-0.1.9.dev0/docs/backtests/e2e_usercheck.json +0 -4858
  34. cyqnt_trd-0.1.9.dev0/docs/backtests/e2e_usercheck_rebuilt_venv.json +0 -4858
  35. cyqnt_trd-0.1.9.dev0/docs/backtests/tmp_mtf_window.json +0 -2378
  36. cyqnt_trd-0.1.9.dev0/docs/backtests/verification_mtf_ma_cross_5m_1h_20_20.json +0 -166936
  37. cyqnt_trd-0.1.9.dev0/scripts/llm_strategy_evolution.py +0 -531
  38. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/LICENSE +0 -0
  39. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/MANIFEST.in +0 -0
  40. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/backtesting/README.md +0 -0
  41. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/backtesting/__init__.py +0 -0
  42. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/backtesting/factor_test.py +0 -0
  43. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/backtesting/framework.py +0 -0
  44. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/backtesting/strategy_backtest.py +0 -0
  45. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/diagnose_api.py +0 -0
  46. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/get_data/__init__.py +0 -0
  47. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/get_data/get_futures_data.py +0 -0
  48. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/get_data/get_kline_with_factor.py +0 -0
  49. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/get_data/get_web3_trending_data.py +0 -0
  50. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/online_trading/__init__.py +0 -0
  51. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/online_trading/realtime_price_tracker.py +0 -0
  52. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/__init__.py +0 -0
  53. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/config.py +0 -0
  54. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/core/__init__.py +0 -0
  55. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/core/contracts.py +0 -0
  56. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/data/__init__.py +0 -0
  57. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/data/alignment.py +0 -0
  58. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/data/interfaces.py +0 -0
  59. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/data/snapshot.py +0 -0
  60. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/entrypoints/__init__.py +0 -0
  61. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/entrypoints/mvp_mainnet_execution.py +0 -0
  62. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/entrypoints/mvp_run_manager.py +0 -0
  63. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/entrypoints/mvp_testnet_execution.py +0 -0
  64. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/entrypoints/mvp_testnet_ma_demo.py +0 -0
  65. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/entrypoints/mvp_testnet_roundtrip.py +0 -0
  66. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/execution/__init__.py +0 -0
  67. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/execution/binance_futures_mainnet.py +0 -0
  68. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/execution/binance_futures_testnet.py +0 -0
  69. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/execution/idempotency.py +0 -0
  70. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/execution/interfaces.py +0 -0
  71. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/execution/paper.py +0 -0
  72. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/execution/rules.py +0 -0
  73. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/runtime/__init__.py +0 -0
  74. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/runtime/interfaces.py +0 -0
  75. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/runtime/run_manager.py +0 -0
  76. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/runtime/runner.py +0 -0
  77. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/signal/encoders.py +0 -0
  78. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/signal/interfaces.py +0 -0
  79. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/signal/registry.py +0 -0
  80. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/simulation/__init__.py +0 -0
  81. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/simulation/interfaces.py +0 -0
  82. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/simulation/metrics_kernels.py +0 -0
  83. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/standard_bot/simulation/runner.py +0 -0
  84. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/test.py +0 -0
  85. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/test_script/README.md +0 -0
  86. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/test_script/get_network_info.py +0 -0
  87. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/test_script/realtime_price_tracker.py +0 -0
  88. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/test_script/test_order.py +0 -0
  89. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/README.md +0 -0
  90. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/__init__.py +0 -0
  91. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/example_test_alpha.py +0 -0
  92. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/example_usage.py +0 -0
  93. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/factor/__init__.py +0 -0
  94. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/factor/adx_factor.py +0 -0
  95. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/factor/ao_factor.py +0 -0
  96. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/factor/bbp_factor.py +0 -0
  97. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/factor/cci_factor.py +0 -0
  98. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/factor/ema_factor.py +0 -0
  99. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/factor/ma_factor.py +0 -0
  100. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/factor/macd_factor.py +0 -0
  101. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/factor/momentum_factor.py +0 -0
  102. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/factor/rsi_factor.py +0 -0
  103. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/factor/stochastic_factor.py +0 -0
  104. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/factor/stochastic_tsi_factor.py +0 -0
  105. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/factor/uo_factor.py +0 -0
  106. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/factor/williams_r_factor.py +0 -0
  107. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/factor_details.json +0 -0
  108. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/__init__.py +0 -0
  109. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha1.py +0 -0
  110. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha10.py +0 -0
  111. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha100.py +0 -0
  112. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha101.py +0 -0
  113. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha11.py +0 -0
  114. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha12.py +0 -0
  115. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha13.py +0 -0
  116. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha14.py +0 -0
  117. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha15.py +0 -0
  118. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha16.py +0 -0
  119. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha17.py +0 -0
  120. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha18.py +0 -0
  121. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha19.py +0 -0
  122. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha2.py +0 -0
  123. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha20.py +0 -0
  124. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha21.py +0 -0
  125. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha22.py +0 -0
  126. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha23.py +0 -0
  127. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha24.py +0 -0
  128. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha25.py +0 -0
  129. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha26.py +0 -0
  130. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha27.py +0 -0
  131. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha28.py +0 -0
  132. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha29.py +0 -0
  133. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha3.py +0 -0
  134. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha30.py +0 -0
  135. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha31.py +0 -0
  136. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha32.py +0 -0
  137. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha33.py +0 -0
  138. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha34.py +0 -0
  139. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha35.py +0 -0
  140. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha36.py +0 -0
  141. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha37.py +0 -0
  142. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha38.py +0 -0
  143. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha39.py +0 -0
  144. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha4.py +0 -0
  145. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha40.py +0 -0
  146. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha41.py +0 -0
  147. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha42.py +0 -0
  148. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha43.py +0 -0
  149. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha44.py +0 -0
  150. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha45.py +0 -0
  151. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha46.py +0 -0
  152. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha47.py +0 -0
  153. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha48.py +0 -0
  154. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha49.py +0 -0
  155. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha5.py +0 -0
  156. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha50.py +0 -0
  157. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha51.py +0 -0
  158. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha52.py +0 -0
  159. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha53.py +0 -0
  160. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha54.py +0 -0
  161. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha55.py +0 -0
  162. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha56.py +0 -0
  163. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha57.py +0 -0
  164. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha58.py +0 -0
  165. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha59.py +0 -0
  166. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha6.py +0 -0
  167. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha60.py +0 -0
  168. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha61.py +0 -0
  169. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha62.py +0 -0
  170. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha63.py +0 -0
  171. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha64.py +0 -0
  172. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha65.py +0 -0
  173. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha66.py +0 -0
  174. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha67.py +0 -0
  175. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha68.py +0 -0
  176. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha69.py +0 -0
  177. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha7.py +0 -0
  178. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha70.py +0 -0
  179. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha71.py +0 -0
  180. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha72.py +0 -0
  181. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha73.py +0 -0
  182. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha74.py +0 -0
  183. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha75.py +0 -0
  184. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha76.py +0 -0
  185. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha77.py +0 -0
  186. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha78.py +0 -0
  187. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha79.py +0 -0
  188. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha8.py +0 -0
  189. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha80.py +0 -0
  190. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha81.py +0 -0
  191. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha82.py +0 -0
  192. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha83.py +0 -0
  193. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha84.py +0 -0
  194. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha85.py +0 -0
  195. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha86.py +0 -0
  196. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha87.py +0 -0
  197. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha88.py +0 -0
  198. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha89.py +0 -0
  199. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha9.py +0 -0
  200. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha90.py +0 -0
  201. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha91.py +0 -0
  202. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha92.py +0 -0
  203. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha93.py +0 -0
  204. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha94.py +0 -0
  205. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha95.py +0 -0
  206. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha96.py +0 -0
  207. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha97.py +0 -0
  208. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha98.py +0 -0
  209. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha99.py +0 -0
  210. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/alpha_utils.py +0 -0
  211. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/create_all_alphas.py +0 -0
  212. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/generate_alphas.py +0 -0
  213. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/selected_alpha/test_alpha.py +0 -0
  214. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/signal/__init__.py +0 -0
  215. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/signal/factor_based_signal.py +0 -0
  216. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/trading_signal/signal/ma_signal.py +0 -0
  217. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/utils/__init__.py +0 -0
  218. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd/utils/set_user.py +0 -0
  219. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/cyqnt_trd.egg-info/dependency_links.txt +0 -0
  220. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/docs/backtests/btc_ma_cross_1h_500.json +0 -0
  221. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/docs/backtests/btc_ma_cross_numba_1h_120.json +0 -0
  222. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/docs/backtests/btc_mtf_ma_cross_5m_1h_20_20_90d.json +0 -0
  223. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/docs/backtests/btc_mtf_ma_cross_5m_1h_20_20_90d_summary.md +0 -0
  224. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/docs/backtests/btc_mtf_ma_spread_5m_1h_20_20_600.json +0 -0
  225. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/docs/backtests/btc_price_ma_1h_500.json +0 -0
  226. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/docs/backtests/eth_ma_cross_1h_500.json +0 -0
  227. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/docs/backtests/eth_price_ma_1h_500.json +0 -0
  228. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/docs/backtests/llm_strategy_evolution_2026-04-13.json +0 -0
  229. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/docs/backtests/llm_strategy_evolution_2026-04-13.md +0 -0
  230. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/docs/backtests/ma_backtest_suite_2026-04-09.md +0 -0
  231. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/docs/backtests/sol_ma_cross_1h_500.json +0 -0
  232. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/docs/backtests/sol_price_ma_1h_500.json +0 -0
  233. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/docs/signal_specs/multi_timeframe_ma_spread_CN.md +0 -0
  234. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/docs/standard_bot_migration.md +0 -0
  235. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/docs/standard_bot_mvp.md +0 -0
  236. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/docs/standard_bot_progress_2026-04-09.md +0 -0
  237. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/docs/standard_bot_progress_2026-04-09_CN.md +0 -0
  238. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/references/backtest-workflow.md +0 -0
  239. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/references/natural-language-to-strategy.md +0 -0
  240. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/references/risk-controls.md +0 -0
  241. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/references/strategy-routing.md +0 -0
  242. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/references/trading-modes.md +0 -0
  243. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/references/watcher-session.md +0 -0
  244. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/setup.cfg +0 -0
  245. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/setup.py +0 -0
  246. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/test/real_time_trade.py +0 -0
  247. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/test/test_now_factor.py +0 -0
  248. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/test/track_k_line_continue.py +0 -0
  249. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/tests/standard_bot/test_config_and_execution.py +0 -0
  250. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/tests/standard_bot/test_historical_data.py +0 -0
  251. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/tests/standard_bot/test_monitor_http.py +0 -0
  252. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/tests/standard_bot/test_multi_timeframe_ma_signal.py +0 -0
  253. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/tests/standard_bot/test_mvp_backtest.py +0 -0
  254. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/tests/standard_bot/test_paper_runtime.py +0 -0
  255. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/tests/standard_bot/test_run_manager.py +0 -0
  256. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/tests/standard_bot/test_runtime_consistency.py +0 -0
  257. {cyqnt_trd-0.1.9.dev0 → cyqnt_trd-0.1.9.dev2}/tests/standard_bot/test_signal_plugins.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cyqnt-trd
3
- Version: 0.1.9.dev0
3
+ Version: 0.1.9.dev2
4
4
  Summary: A cryptocurrency trading toolkit centered on the standard_bot backtesting, paper signal, and execution workflow
5
5
  Author-email: Haowen Wang <wanghw@zju.edu.cn>
6
6
  License-Expression: MIT
@@ -14,27 +14,30 @@ Classifier: Programming Language :: Python :: 3
14
14
  Classifier: Programming Language :: Python :: 3.8
15
15
  Classifier: Programming Language :: Python :: 3.9
16
16
  Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
17
18
  Classifier: Topic :: Office/Business :: Financial :: Investment
18
- Requires-Python: <3.11,>=3.8
19
+ Requires-Python: <3.12,>=3.8
19
20
  Description-Content-Type: text/markdown
20
21
  License-File: LICENSE
21
- Requires-Dist: pandas>=2.2.0
22
- Requires-Dist: numpy<1.25.0,>=1.23.0
23
- Requires-Dist: polars<2.0,>=1.0
24
- Requires-Dist: numba<0.62,>=0.60
25
- Requires-Dist: pyarrow>=16.1.0
26
- Requires-Dist: matplotlib<3.8.0,>=3.5.0
27
- Requires-Dist: scipy<1.11.0,>=1.9.0
28
- Requires-Dist: requests>=2.32.0
29
- Requires-Dist: binance-sdk-spot
30
- Requires-Dist: binance-sdk-derivatives-trading-usds-futures
31
- Requires-Dist: binance-sdk-algo
32
- Requires-Dist: binance-common
22
+ Requires-Dist: pandas==2.3.3
23
+ Requires-Dist: numpy==1.24.4
24
+ Requires-Dist: polars==1.0.0
25
+ Requires-Dist: numba==0.60.0
26
+ Requires-Dist: pyarrow==21.0.0
27
+ Requires-Dist: matplotlib==3.7.5
28
+ Requires-Dist: scipy==1.10.1
29
+ Requires-Dist: requests==2.32.5
30
+ Requires-Dist: binance-sdk-spot==8.2.1
31
+ Requires-Dist: binance-sdk-derivatives-trading-usds-futures==10.0.1
32
+ Requires-Dist: binance-sdk-algo==2.6.0
33
+ Requires-Dist: binance-common==3.8.0
33
34
  Provides-Extra: dev
34
35
  Requires-Dist: pytest>=8.0.0; extra == "dev"
35
36
  Requires-Dist: pytest-cov<5.0.0,>=4.0.0; extra == "dev"
36
37
  Requires-Dist: black<24.0.0,>=22.0.0; extra == "dev"
37
38
  Requires-Dist: ruff<0.2.0,>=0.1.0; extra == "dev"
39
+ Provides-Extra: market-data
40
+ Requires-Dist: yfinance>=0.2.38; extra == "market-data"
38
41
  Dynamic: license-file
39
42
 
40
43
  # cyqnt-trd
@@ -59,6 +62,25 @@ The current recommended path is:
59
62
  pip install cyqnt-trd
60
63
  ```
61
64
 
65
+ The package supports Python `>=3.8,<3.12`, which includes Binance AI's Python `3.11.2`.
66
+
67
+ For HTTPS requests, `cyqnt-trd` resolves the CA bundle in this order:
68
+
69
+ 1. `REQUESTS_CA_BUNDLE`
70
+ 2. `SSL_CERT_FILE`
71
+ 3. `CURL_CA_BUNDLE`
72
+ 4. Linux system CA bundle: `/etc/ssl/certs/ca-certificates.crt`
73
+ 5. `certifi`
74
+ 6. `requests` default verification behavior
75
+
76
+ For special Linux deployments where Binance endpoints are signed by an internal CA that exists only in the
77
+ system trust store, set the deployment CA bundle via environment variables, for example:
78
+
79
+ ```bash
80
+ export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
81
+ export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
82
+ ```
83
+
62
84
  ### For development
63
85
 
64
86
  ```bash
@@ -152,17 +174,18 @@ The `standard_bot` mainline currently includes Numba-backed support for:
152
174
 
153
175
  Key dependencies include:
154
176
 
155
- - `pandas>=2.2.0`
156
- - `polars>=1.0,<2.0`
157
- - `numba>=0.60,<0.62`
158
- - `pyarrow>=16.1.0`
159
- - `requests>=2.32.0`
177
+ - `pandas==2.3.3`
178
+ - `polars==1.0.0`
179
+ - `numba==0.60.0`
180
+ - `pyarrow==21.0.0`
181
+ - `requests==2.32.5`
160
182
 
161
183
  Binance SDK dependencies:
162
184
 
163
- - `binance-sdk-spot`
164
- - `binance-sdk-derivatives-trading-usds-futures`
165
- - `binance-sdk-algo`
185
+ - `binance-sdk-spot==8.2.1`
186
+ - `binance-sdk-derivatives-trading-usds-futures==10.0.1`
187
+ - `binance-sdk-algo==2.6.0`
188
+ - `binance-common==3.8.0`
166
189
  - `binance-common`
167
190
 
168
191
  ## License
@@ -20,6 +20,25 @@ The current recommended path is:
20
20
  pip install cyqnt-trd
21
21
  ```
22
22
 
23
+ The package supports Python `>=3.8,<3.12`, which includes Binance AI's Python `3.11.2`.
24
+
25
+ For HTTPS requests, `cyqnt-trd` resolves the CA bundle in this order:
26
+
27
+ 1. `REQUESTS_CA_BUNDLE`
28
+ 2. `SSL_CERT_FILE`
29
+ 3. `CURL_CA_BUNDLE`
30
+ 4. Linux system CA bundle: `/etc/ssl/certs/ca-certificates.crt`
31
+ 5. `certifi`
32
+ 6. `requests` default verification behavior
33
+
34
+ For special Linux deployments where Binance endpoints are signed by an internal CA that exists only in the
35
+ system trust store, set the deployment CA bundle via environment variables, for example:
36
+
37
+ ```bash
38
+ export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
39
+ export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
40
+ ```
41
+
23
42
  ### For development
24
43
 
25
44
  ```bash
@@ -113,17 +132,18 @@ The `standard_bot` mainline currently includes Numba-backed support for:
113
132
 
114
133
  Key dependencies include:
115
134
 
116
- - `pandas>=2.2.0`
117
- - `polars>=1.0,<2.0`
118
- - `numba>=0.60,<0.62`
119
- - `pyarrow>=16.1.0`
120
- - `requests>=2.32.0`
135
+ - `pandas==2.3.3`
136
+ - `polars==1.0.0`
137
+ - `numba==0.60.0`
138
+ - `pyarrow==21.0.0`
139
+ - `requests==2.32.5`
121
140
 
122
141
  Binance SDK dependencies:
123
142
 
124
- - `binance-sdk-spot`
125
- - `binance-sdk-derivatives-trading-usds-futures`
126
- - `binance-sdk-algo`
143
+ - `binance-sdk-spot==8.2.1`
144
+ - `binance-sdk-derivatives-trading-usds-futures==10.0.1`
145
+ - `binance-sdk-algo==2.6.0`
146
+ - `binance-common==3.8.0`
127
147
  - `binance-common`
128
148
 
129
149
  ## License
@@ -9,7 +9,7 @@ Cyqnt Trading Package
9
9
  - backtesting: 回测框架,支持因子测试和策略回测
10
10
  """
11
11
 
12
- __version__ = "0.1.9.dev"
12
+ __version__ = "0.1.9.dev2"
13
13
 
14
14
  _OPTIONAL_IMPORT_ERRORS = {}
15
15
 
@@ -768,4 +768,3 @@ if __name__ == "__main__":
768
768
  # limit=100,
769
769
  # output_dir="data"
770
770
  # )
771
-
@@ -0,0 +1,39 @@
1
+ """
2
+ Helpers for resolving the CA bundle used by outbound HTTPS requests.
3
+ """
4
+
5
+ from __future__ import annotations
6
+
7
+ import os
8
+ from pathlib import Path
9
+ from typing import Union
10
+
11
+
12
+ _LINUX_SYSTEM_CA = "/etc/ssl/certs/ca-certificates.crt"
13
+
14
+
15
+ def resolve_ca_bundle() -> Union[str, bool]:
16
+ """
17
+ Resolve the CA bundle for HTTPS requests.
18
+
19
+ Resolution order:
20
+ 1. Explicit deployment environment variables
21
+ 2. Linux system CA bundle
22
+ 3. certifi bundle when available
23
+ 4. requests default verification behavior
24
+ """
25
+
26
+ for env_var in ("REQUESTS_CA_BUNDLE", "SSL_CERT_FILE", "CURL_CA_BUNDLE"):
27
+ value = os.environ.get(env_var, "").strip()
28
+ if value and Path(value).exists():
29
+ return value
30
+
31
+ if Path(_LINUX_SYSTEM_CA).exists():
32
+ return _LINUX_SYSTEM_CA
33
+
34
+ try:
35
+ import certifi
36
+
37
+ return certifi.where()
38
+ except ImportError: # pragma: no cover - depends on environment packaging
39
+ return True
@@ -13,6 +13,7 @@ from typing import Dict, List, Optional
13
13
  import requests
14
14
 
15
15
  from ..core import Bar, BundleMeta, MarketBundle, MarketQuery
16
+ from ._ssl_utils import resolve_ca_bundle
16
17
 
17
18
 
18
19
  _SPOT_KLINES_URL = "https://api.binance.com/api/v3/uiKlines"
@@ -87,7 +88,12 @@ class BinanceRestMarketDataAdapter:
87
88
  if market_query.time_range.end_ts is not None:
88
89
  params["endTime"] = int(market_query.time_range.end_ts)
89
90
 
90
- response = requests.get(self.base_url, params=params, timeout=self.timeout)
91
+ response = requests.get(
92
+ self.base_url,
93
+ params=params,
94
+ timeout=self.timeout,
95
+ verify=resolve_ca_bundle(),
96
+ )
91
97
  response.raise_for_status()
92
98
  return response.json()
93
99
 
@@ -14,6 +14,7 @@ import requests
14
14
 
15
15
  from .alignment import timeframe_to_ms
16
16
  from .historical import build_history_path, ensure_pyarrow_available
17
+ from ._ssl_utils import resolve_ca_bundle
17
18
  from .adapters import _FUTURES_KLINES_URL, _SPOT_KLINES_URL
18
19
 
19
20
  try:
@@ -179,6 +180,11 @@ class HistoricalBinanceDownloader:
179
180
  "limit": int(self.chunk_limit),
180
181
  }
181
182
  session = self.session or requests
182
- response = session.get(self.base_url, params=params, timeout=self.timeout)
183
+ response = session.get(
184
+ self.base_url,
185
+ params=params,
186
+ timeout=self.timeout,
187
+ verify=resolve_ca_bundle(),
188
+ )
183
189
  response.raise_for_status()
184
190
  return response.json()
@@ -27,7 +27,7 @@ except ImportError: # pragma: no cover - exercised in environments without pyar
27
27
  pq = None
28
28
 
29
29
 
30
- SUPPORTED_RESAMPLE_TIMEFRAMES = {"5m", "1h"}
30
+ SUPPORTED_RESAMPLE_TIMEFRAMES = {"5m", "15m", "1h"}
31
31
  PARQUET_COLUMNS = [
32
32
  "open_time",
33
33
  "close_time",
@@ -72,6 +72,10 @@ def build_market_data_adapter(
72
72
  )
73
73
 
74
74
 
75
+ def infer_contract_multiplier(*, market_type: str, symbol: str) -> float:
76
+ return 1.0
77
+
78
+
75
79
  def build_strategy_pipeline(
76
80
  *,
77
81
  strategy: str,
@@ -87,6 +91,17 @@ def build_strategy_pipeline(
87
91
  overbought: float,
88
92
  donchian_window: int = 20,
89
93
  breakout_buffer_bps: float = 0.0,
94
+ adx_period: int = 14,
95
+ adx_threshold: float = 25.0,
96
+ atr_ma_period: int = 20,
97
+ atr_period: int = 14,
98
+ atr_multiplier: float = 2.0,
99
+ bollinger_period: int = 20,
100
+ bollinger_stddev_multiplier: float = 2.0,
101
+ macd_fast_period: int = 12,
102
+ macd_slow_period: int = 26,
103
+ macd_signal_period: int = 9,
104
+ macd_histogram_threshold: float = 0.0,
90
105
  primary_ma_period: int = 20,
91
106
  reference_ma_period: int = 20,
92
107
  spread_threshold_bps: float = 0.0,
@@ -133,6 +148,49 @@ def build_strategy_pipeline(
133
148
  "breakout_buffer_bps": breakout_buffer_bps,
134
149
  },
135
150
  }
151
+ elif strategy == "adx_trend_strength":
152
+ plugin_spec = {
153
+ "plugin_id": "adx_trend_strength",
154
+ "config": {
155
+ "instrument_id": symbol,
156
+ "timeframe": interval,
157
+ "period": adx_period,
158
+ "adx_threshold": adx_threshold,
159
+ },
160
+ }
161
+ elif strategy == "atr_breakout":
162
+ plugin_spec = {
163
+ "plugin_id": "atr_breakout",
164
+ "config": {
165
+ "instrument_id": symbol,
166
+ "timeframe": interval,
167
+ "ma_period": atr_ma_period,
168
+ "atr_period": atr_period,
169
+ "atr_multiplier": atr_multiplier,
170
+ },
171
+ }
172
+ elif strategy == "bollinger_mean_reversion":
173
+ plugin_spec = {
174
+ "plugin_id": "bollinger_mean_reversion",
175
+ "config": {
176
+ "instrument_id": symbol,
177
+ "timeframe": interval,
178
+ "period": bollinger_period,
179
+ "stddev_multiplier": bollinger_stddev_multiplier,
180
+ },
181
+ }
182
+ elif strategy == "macd_trend_follow":
183
+ plugin_spec = {
184
+ "plugin_id": "macd_trend_follow",
185
+ "config": {
186
+ "instrument_id": symbol,
187
+ "timeframe": interval,
188
+ "fast_period": macd_fast_period,
189
+ "slow_period": macd_slow_period,
190
+ "signal_period": macd_signal_period,
191
+ "histogram_threshold": macd_histogram_threshold,
192
+ },
193
+ }
136
194
  elif strategy == "multi_timeframe_ma_spread":
137
195
  plugin_spec = {
138
196
  "plugin_id": "multi_timeframe_ma_spread",
@@ -17,6 +17,7 @@ from .common import (
17
17
  build_market_data_adapter,
18
18
  build_strategy_pipeline,
19
19
  build_time_range,
20
+ infer_contract_multiplier,
20
21
  make_registry,
21
22
  )
22
23
  from ..simulation import NumbaBacktestRunner, SnapshotBacktestRunner
@@ -31,7 +32,17 @@ def build_parser() -> argparse.ArgumentParser:
31
32
  parser.add_argument("--engine", choices=["python", "numba"], default="numba")
32
33
  parser.add_argument(
33
34
  "--strategy",
34
- choices=["moving_average_cross", "price_moving_average", "rsi_reversion", "donchian_breakout", "multi_timeframe_ma_spread"],
35
+ choices=[
36
+ "moving_average_cross",
37
+ "price_moving_average",
38
+ "rsi_reversion",
39
+ "donchian_breakout",
40
+ "adx_trend_strength",
41
+ "atr_breakout",
42
+ "bollinger_mean_reversion",
43
+ "macd_trend_follow",
44
+ "multi_timeframe_ma_spread",
45
+ ],
35
46
  default="moving_average_cross",
36
47
  )
37
48
  parser.add_argument("--secondary-interval", default="1h")
@@ -43,6 +54,17 @@ def build_parser() -> argparse.ArgumentParser:
43
54
  parser.add_argument("--overbought", type=float, default=70.0)
44
55
  parser.add_argument("--donchian-window", type=int, default=20)
45
56
  parser.add_argument("--breakout-buffer-bps", type=float, default=0.0)
57
+ parser.add_argument("--adx-period", type=int, default=14)
58
+ parser.add_argument("--adx-threshold", type=float, default=25.0)
59
+ parser.add_argument("--atr-ma-period", type=int, default=20)
60
+ parser.add_argument("--atr-period", type=int, default=14)
61
+ parser.add_argument("--atr-multiplier", type=float, default=2.0)
62
+ parser.add_argument("--bollinger-period", type=int, default=20)
63
+ parser.add_argument("--bollinger-stddev-multiplier", type=float, default=2.0)
64
+ parser.add_argument("--macd-fast-period", type=int, default=12)
65
+ parser.add_argument("--macd-slow-period", type=int, default=26)
66
+ parser.add_argument("--macd-signal-period", type=int, default=9)
67
+ parser.add_argument("--macd-histogram-threshold", type=float, default=0.0)
46
68
  parser.add_argument("--primary-ma-period", type=int, default=20)
47
69
  parser.add_argument("--reference-ma-period", type=int, default=20)
48
70
  parser.add_argument("--spread-threshold-bps", type=float, default=0.0)
@@ -54,6 +76,10 @@ def build_parser() -> argparse.ArgumentParser:
54
76
  parser.add_argument("--impact-slippage-bps", type=float, default=0.0)
55
77
  parser.add_argument("--funding-bps-per-bar", type=float, default=0.0)
56
78
  parser.add_argument("--max-bar-volume-fraction", type=float, default=0.10)
79
+ parser.add_argument("--contract-multiplier", type=float, default=None)
80
+ parser.add_argument("--quantity-step", type=float, default=0.0)
81
+ parser.add_argument("--min-quantity", type=float, default=0.0)
82
+ parser.add_argument("--fixed-fee-per-contract", type=float, default=0.0)
57
83
  parser.add_argument("--tail-bars", type=int, default=120)
58
84
  parser.add_argument("--output-json", default=None)
59
85
  return add_historical_data_arguments(parser)
@@ -111,6 +137,17 @@ def main() -> int:
111
137
  overbought=args.overbought,
112
138
  donchian_window=args.donchian_window,
113
139
  breakout_buffer_bps=args.breakout_buffer_bps,
140
+ adx_period=args.adx_period,
141
+ adx_threshold=args.adx_threshold,
142
+ atr_ma_period=args.atr_ma_period,
143
+ atr_period=args.atr_period,
144
+ atr_multiplier=args.atr_multiplier,
145
+ bollinger_period=args.bollinger_period,
146
+ bollinger_stddev_multiplier=args.bollinger_stddev_multiplier,
147
+ macd_fast_period=args.macd_fast_period,
148
+ macd_slow_period=args.macd_slow_period,
149
+ macd_signal_period=args.macd_signal_period,
150
+ macd_histogram_threshold=args.macd_histogram_threshold,
114
151
  primary_ma_period=args.primary_ma_period,
115
152
  reference_ma_period=args.reference_ma_period,
116
153
  spread_threshold_bps=args.spread_threshold_bps,
@@ -128,6 +165,7 @@ def main() -> int:
128
165
  "commission_bps": args.commission_bps,
129
166
  "taker_fee_bps": args.taker_fee_bps if args.taker_fee_bps is not None else args.commission_bps,
130
167
  "funding_bps_per_bar": args.funding_bps_per_bar,
168
+ "fixed_fee_per_contract": args.fixed_fee_per_contract,
131
169
  },
132
170
  slippage_model={
133
171
  "slippage_bps": args.slippage_bps,
@@ -137,6 +175,14 @@ def main() -> int:
137
175
  extras={
138
176
  "engine": args.engine,
139
177
  "execution_assumption": "signal_at_bar_close_fill_next_bar_open",
178
+ "market_type": args.market_type,
179
+ "contract_multiplier": (
180
+ args.contract_multiplier
181
+ if args.contract_multiplier is not None
182
+ else infer_contract_multiplier(market_type=args.market_type, symbol=args.symbol.upper())
183
+ ),
184
+ "quantity_step": args.quantity_step,
185
+ "min_quantity": args.min_quantity,
140
186
  },
141
187
  )
142
188
 
@@ -169,11 +215,15 @@ def main() -> int:
169
215
  if args.engine == "numba":
170
216
  print(
171
217
  "execution_model=signal_at_bar_close_fill_next_bar_open "
172
- "taker_fee_bps=%.4f funding_bps_per_bar=%.4f max_bar_volume_fraction=%.4f"
218
+ "taker_fee_bps=%.4f funding_bps_per_bar=%.4f max_bar_volume_fraction=%.4f "
219
+ "contract_multiplier=%.4f quantity_step=%.4f fixed_fee_per_contract=%.4f"
173
220
  % (
174
221
  float(request.fee_model.get("taker_fee_bps", 0.0)),
175
222
  float(request.fee_model.get("funding_bps_per_bar", 0.0)),
176
223
  float(request.slippage_model.get("max_bar_volume_fraction", 0.0)),
224
+ float(request.extras.get("contract_multiplier", 1.0)),
225
+ float(request.extras.get("quantity_step", 0.0)),
226
+ float(request.fee_model.get("fixed_fee_per_contract", 0.0)),
177
227
  )
178
228
  )
179
229
  if trades:
@@ -172,6 +172,17 @@ def handler_factory(args, *, runner_override=None):
172
172
  overbought=float(payload.get("overbought", 70.0)),
173
173
  donchian_window=int(payload.get("donchian_window", 20)),
174
174
  breakout_buffer_bps=float(payload.get("breakout_buffer_bps", 0.0)),
175
+ adx_period=int(payload.get("adx_period", 14)),
176
+ adx_threshold=float(payload.get("adx_threshold", 25.0)),
177
+ atr_ma_period=int(payload.get("atr_ma_period", 20)),
178
+ atr_period=int(payload.get("atr_period", 14)),
179
+ atr_multiplier=float(payload.get("atr_multiplier", 2.0)),
180
+ bollinger_period=int(payload.get("bollinger_period", 20)),
181
+ bollinger_stddev_multiplier=float(payload.get("bollinger_stddev_multiplier", 2.0)),
182
+ macd_fast_period=int(payload.get("macd_fast_period", 12)),
183
+ macd_slow_period=int(payload.get("macd_slow_period", 26)),
184
+ macd_signal_period=int(payload.get("macd_signal_period", 9)),
185
+ macd_histogram_threshold=float(payload.get("macd_histogram_threshold", 0.0)),
175
186
  primary_ma_period=int(payload.get("primary_ma_period", 20)),
176
187
  reference_ma_period=int(payload.get("reference_ma_period", 20)),
177
188
  spread_threshold_bps=float(payload.get("spread_threshold_bps", 0.0)),
@@ -29,7 +29,17 @@ def build_parser() -> argparse.ArgumentParser:
29
29
  parser.add_argument("--market-type", choices=["spot", "futures"], default="spot")
30
30
  parser.add_argument(
31
31
  "--strategy",
32
- choices=["moving_average_cross", "price_moving_average", "rsi_reversion", "donchian_breakout", "multi_timeframe_ma_spread"],
32
+ choices=[
33
+ "moving_average_cross",
34
+ "price_moving_average",
35
+ "rsi_reversion",
36
+ "donchian_breakout",
37
+ "adx_trend_strength",
38
+ "atr_breakout",
39
+ "bollinger_mean_reversion",
40
+ "macd_trend_follow",
41
+ "multi_timeframe_ma_spread",
42
+ ],
33
43
  default="moving_average_cross",
34
44
  )
35
45
  parser.add_argument("--fast-window", type=int, default=5)
@@ -40,6 +50,17 @@ def build_parser() -> argparse.ArgumentParser:
40
50
  parser.add_argument("--overbought", type=float, default=70.0)
41
51
  parser.add_argument("--donchian-window", type=int, default=20)
42
52
  parser.add_argument("--breakout-buffer-bps", type=float, default=0.0)
53
+ parser.add_argument("--adx-period", type=int, default=14)
54
+ parser.add_argument("--adx-threshold", type=float, default=25.0)
55
+ parser.add_argument("--atr-ma-period", type=int, default=20)
56
+ parser.add_argument("--atr-period", type=int, default=14)
57
+ parser.add_argument("--atr-multiplier", type=float, default=2.0)
58
+ parser.add_argument("--bollinger-period", type=int, default=20)
59
+ parser.add_argument("--bollinger-stddev-multiplier", type=float, default=2.0)
60
+ parser.add_argument("--macd-fast-period", type=int, default=12)
61
+ parser.add_argument("--macd-slow-period", type=int, default=26)
62
+ parser.add_argument("--macd-signal-period", type=int, default=9)
63
+ parser.add_argument("--macd-histogram-threshold", type=float, default=0.0)
43
64
  parser.add_argument("--secondary-interval", default="1h")
44
65
  parser.add_argument("--primary-ma-period", type=int, default=20)
45
66
  parser.add_argument("--reference-ma-period", type=int, default=20)
@@ -117,6 +138,17 @@ def main() -> int:
117
138
  overbought=args.overbought,
118
139
  donchian_window=args.donchian_window,
119
140
  breakout_buffer_bps=args.breakout_buffer_bps,
141
+ adx_period=args.adx_period,
142
+ adx_threshold=args.adx_threshold,
143
+ atr_ma_period=args.atr_ma_period,
144
+ atr_period=args.atr_period,
145
+ atr_multiplier=args.atr_multiplier,
146
+ bollinger_period=args.bollinger_period,
147
+ bollinger_stddev_multiplier=args.bollinger_stddev_multiplier,
148
+ macd_fast_period=args.macd_fast_period,
149
+ macd_slow_period=args.macd_slow_period,
150
+ macd_signal_period=args.macd_signal_period,
151
+ macd_histogram_threshold=args.macd_histogram_threshold,
120
152
  primary_ma_period=args.primary_ma_period,
121
153
  reference_ma_period=args.reference_ma_period,
122
154
  spread_threshold_bps=args.spread_threshold_bps,
@@ -49,7 +49,17 @@ def build_parser() -> argparse.ArgumentParser:
49
49
  parser.add_argument("--market-type", choices=["spot", "futures"], default="futures")
50
50
  parser.add_argument(
51
51
  "--strategy",
52
- choices=["moving_average_cross", "price_moving_average", "rsi_reversion", "donchian_breakout", "multi_timeframe_ma_spread"],
52
+ choices=[
53
+ "moving_average_cross",
54
+ "price_moving_average",
55
+ "rsi_reversion",
56
+ "donchian_breakout",
57
+ "adx_trend_strength",
58
+ "atr_breakout",
59
+ "bollinger_mean_reversion",
60
+ "macd_trend_follow",
61
+ "multi_timeframe_ma_spread",
62
+ ],
53
63
  default="multi_timeframe_ma_spread",
54
64
  )
55
65
  parser.add_argument("--fast-window", type=int, default=5)
@@ -60,6 +70,17 @@ def build_parser() -> argparse.ArgumentParser:
60
70
  parser.add_argument("--overbought", type=float, default=70.0)
61
71
  parser.add_argument("--donchian-window", type=int, default=20)
62
72
  parser.add_argument("--breakout-buffer-bps", type=float, default=0.0)
73
+ parser.add_argument("--adx-period", type=int, default=14)
74
+ parser.add_argument("--adx-threshold", type=float, default=25.0)
75
+ parser.add_argument("--atr-ma-period", type=int, default=20)
76
+ parser.add_argument("--atr-period", type=int, default=14)
77
+ parser.add_argument("--atr-multiplier", type=float, default=2.0)
78
+ parser.add_argument("--bollinger-period", type=int, default=20)
79
+ parser.add_argument("--bollinger-stddev-multiplier", type=float, default=2.0)
80
+ parser.add_argument("--macd-fast-period", type=int, default=12)
81
+ parser.add_argument("--macd-slow-period", type=int, default=26)
82
+ parser.add_argument("--macd-signal-period", type=int, default=9)
83
+ parser.add_argument("--macd-histogram-threshold", type=float, default=0.0)
63
84
  parser.add_argument("--entry-threshold", type=float, default=0.0)
64
85
  parser.add_argument("--primary-ma-period", type=int, default=20)
65
86
  parser.add_argument("--reference-ma-period", type=int, default=20)
@@ -143,6 +164,17 @@ def main() -> int:
143
164
  overbought=args.overbought,
144
165
  donchian_window=args.donchian_window,
145
166
  breakout_buffer_bps=args.breakout_buffer_bps,
167
+ adx_period=args.adx_period,
168
+ adx_threshold=args.adx_threshold,
169
+ atr_ma_period=args.atr_ma_period,
170
+ atr_period=args.atr_period,
171
+ atr_multiplier=args.atr_multiplier,
172
+ bollinger_period=args.bollinger_period,
173
+ bollinger_stddev_multiplier=args.bollinger_stddev_multiplier,
174
+ macd_fast_period=args.macd_fast_period,
175
+ macd_slow_period=args.macd_slow_period,
176
+ macd_signal_period=args.macd_signal_period,
177
+ macd_histogram_threshold=args.macd_histogram_threshold,
146
178
  primary_ma_period=args.primary_ma_period,
147
179
  reference_ma_period=args.reference_ma_period,
148
180
  spread_threshold_bps=args.spread_threshold_bps,
@@ -13,8 +13,16 @@ from .interfaces import (
13
13
  from .encoders import EncodedCloseSeries, encode_close_series, series_for
14
14
  from .numba_kernels import NUMBA_AVAILABLE
15
15
  from .plugins import (
16
+ AdxTrendStrengthConfig,
17
+ AdxTrendStrengthPlugin,
18
+ AtrBreakoutConfig,
19
+ AtrBreakoutPlugin,
20
+ BollingerMeanReversionConfig,
21
+ BollingerMeanReversionPlugin,
16
22
  DonchianBreakoutConfig,
17
23
  DonchianBreakoutPlugin,
24
+ MacdTrendFollowConfig,
25
+ MacdTrendFollowPlugin,
18
26
  MovingAverageCrossConfig,
19
27
  MovingAverageCrossPlugin,
20
28
  MultiTimeframeMaSpreadConfig,
@@ -28,11 +36,19 @@ from .plugins import (
28
36
  from .registry import PipelineStepResult, SignalPluginRegistry
29
37
 
30
38
  __all__ = [
39
+ "AdxTrendStrengthConfig",
40
+ "AdxTrendStrengthPlugin",
41
+ "AtrBreakoutConfig",
42
+ "AtrBreakoutPlugin",
31
43
  "BatchSignalPlugin",
44
+ "BollingerMeanReversionConfig",
45
+ "BollingerMeanReversionPlugin",
32
46
  "DonchianBreakoutConfig",
33
47
  "DonchianBreakoutPlugin",
34
48
  "EncodedCloseSeries",
35
49
  "IncrementalSignalPlugin",
50
+ "MacdTrendFollowConfig",
51
+ "MacdTrendFollowPlugin",
36
52
  "MovingAverageCrossConfig",
37
53
  "MovingAverageCrossPlugin",
38
54
  "MultiTimeframeMaSpreadConfig",