clodds 1.2.8 → 1.3.0

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 (232) hide show
  1. package/dist/skills/bundled/acp/SKILL.md +188 -0
  2. package/dist/skills/bundled/acp/index.d.ts +0 -3
  3. package/dist/skills/bundled/acp/index.js +1 -1
  4. package/dist/skills/bundled/acp/index.js.map +1 -1
  5. package/dist/skills/bundled/agentbets/SKILL.md +19 -0
  6. package/dist/skills/bundled/ai-strategy/SKILL.md +111 -0
  7. package/dist/skills/bundled/ai-strategy/index.js +1 -1
  8. package/dist/skills/bundled/ai-strategy/index.js.map +1 -1
  9. package/dist/skills/bundled/alerts/SKILL.md +87 -0
  10. package/dist/skills/bundled/analytics/SKILL.md +252 -0
  11. package/dist/skills/bundled/analytics/index.js +2 -2
  12. package/dist/skills/bundled/analytics/index.js.map +1 -1
  13. package/dist/skills/bundled/arbitrage/SKILL.md +287 -0
  14. package/dist/skills/bundled/auto-reply/SKILL.md +285 -0
  15. package/dist/skills/bundled/auto-reply/index.js +2 -2
  16. package/dist/skills/bundled/auto-reply/index.js.map +1 -1
  17. package/dist/skills/bundled/automation/SKILL.md +242 -0
  18. package/dist/skills/bundled/automation/index.js +2 -2
  19. package/dist/skills/bundled/automation/index.js.map +1 -1
  20. package/dist/skills/bundled/backtest/SKILL.md +225 -0
  21. package/dist/skills/bundled/bags/SKILL.md +131 -0
  22. package/dist/skills/bundled/bankr/SKILL.md +114 -0
  23. package/dist/skills/bundled/betfair/SKILL.md +113 -0
  24. package/dist/skills/bundled/binance-futures/SKILL.md +84 -0
  25. package/dist/skills/bundled/binance-futures/index.d.ts +0 -3
  26. package/dist/skills/bundled/binance-futures/index.js +1 -2
  27. package/dist/skills/bundled/binance-futures/index.js.map +1 -1
  28. package/dist/skills/bundled/botchan/SKILL.md +66 -0
  29. package/dist/skills/bundled/botchan/index.d.ts +0 -3
  30. package/dist/skills/bundled/botchan/index.js +0 -1
  31. package/dist/skills/bundled/botchan/index.js.map +1 -1
  32. package/dist/skills/bundled/bridge/SKILL.md +215 -0
  33. package/dist/skills/bundled/bybit-futures/SKILL.md +84 -0
  34. package/dist/skills/bundled/bybit-futures/index.d.ts +0 -3
  35. package/dist/skills/bundled/bybit-futures/index.js +0 -1
  36. package/dist/skills/bundled/bybit-futures/index.js.map +1 -1
  37. package/dist/skills/bundled/clanker/SKILL.md +125 -0
  38. package/dist/skills/bundled/clanker/index.d.ts +0 -3
  39. package/dist/skills/bundled/clanker/index.js +0 -1
  40. package/dist/skills/bundled/clanker/index.js.map +1 -1
  41. package/dist/skills/bundled/copy-trading/SKILL.md +285 -0
  42. package/dist/skills/bundled/copy-trading/index.js +2 -2
  43. package/dist/skills/bundled/copy-trading/index.js.map +1 -1
  44. package/dist/skills/bundled/copy-trading-solana/SKILL.md +66 -0
  45. package/dist/skills/bundled/credentials/SKILL.md +261 -0
  46. package/dist/skills/bundled/crypto-hft/SKILL.md +121 -0
  47. package/dist/skills/bundled/dca/SKILL.md +27 -0
  48. package/dist/skills/bundled/dex/SKILL.md +87 -0
  49. package/dist/skills/bundled/dex/index.d.ts +36 -0
  50. package/dist/skills/bundled/dex/index.js +537 -0
  51. package/dist/skills/bundled/dex/index.js.map +1 -0
  52. package/dist/skills/bundled/divergence/SKILL.md +83 -0
  53. package/dist/skills/bundled/doctor/SKILL.md +267 -0
  54. package/dist/skills/bundled/doctor/index.js +2 -8
  55. package/dist/skills/bundled/doctor/index.js.map +1 -1
  56. package/dist/skills/bundled/drift/SKILL.md +53 -0
  57. package/dist/skills/bundled/drift-sdk/SKILL.md +103 -0
  58. package/dist/skills/bundled/drift-sdk/index.d.ts +0 -3
  59. package/dist/skills/bundled/drift-sdk/index.js +0 -1
  60. package/dist/skills/bundled/drift-sdk/index.js.map +1 -1
  61. package/dist/skills/bundled/edge/SKILL.md +84 -0
  62. package/dist/skills/bundled/embeddings/SKILL.md +244 -0
  63. package/dist/skills/bundled/endaoment/SKILL.md +65 -0
  64. package/dist/skills/bundled/endaoment/index.d.ts +0 -3
  65. package/dist/skills/bundled/endaoment/index.js +0 -1
  66. package/dist/skills/bundled/endaoment/index.js.map +1 -1
  67. package/dist/skills/bundled/ens/SKILL.md +63 -0
  68. package/dist/skills/bundled/ens/index.d.ts +0 -3
  69. package/dist/skills/bundled/ens/index.js +0 -1
  70. package/dist/skills/bundled/ens/index.js.map +1 -1
  71. package/dist/skills/bundled/erc8004/SKILL.md +79 -0
  72. package/dist/skills/bundled/erc8004/index.d.ts +0 -3
  73. package/dist/skills/bundled/erc8004/index.js +0 -1
  74. package/dist/skills/bundled/erc8004/index.js.map +1 -1
  75. package/dist/skills/bundled/execution/SKILL.md +278 -0
  76. package/dist/skills/bundled/farcaster/SKILL.md +80 -0
  77. package/dist/skills/bundled/features/SKILL.md +20 -0
  78. package/dist/skills/bundled/feeds/SKILL.md +288 -0
  79. package/dist/skills/bundled/harden/SKILL.md +74 -0
  80. package/dist/skills/bundled/history/SKILL.md +257 -0
  81. package/dist/skills/bundled/hyperliquid/SKILL.md +200 -0
  82. package/dist/skills/bundled/hyperliquid/index.d.ts +0 -3
  83. package/dist/skills/bundled/hyperliquid/index.js +0 -1
  84. package/dist/skills/bundled/hyperliquid/index.js.map +1 -1
  85. package/dist/skills/bundled/identity/SKILL.md +228 -0
  86. package/dist/skills/bundled/identity/index.js +2 -2
  87. package/dist/skills/bundled/identity/index.js.map +1 -1
  88. package/dist/skills/bundled/integrations/SKILL.md +321 -0
  89. package/dist/skills/bundled/integrations/index.js +2 -2
  90. package/dist/skills/bundled/integrations/index.js.map +1 -1
  91. package/dist/skills/bundled/jupiter/SKILL.md +163 -0
  92. package/dist/skills/bundled/kamino/SKILL.md +69 -0
  93. package/dist/skills/bundled/ledger/SKILL.md +20 -0
  94. package/dist/skills/bundled/lighter/SKILL.md +83 -0
  95. package/dist/skills/bundled/lighter/index.d.ts +0 -3
  96. package/dist/skills/bundled/lighter/index.js +0 -1
  97. package/dist/skills/bundled/lighter/index.js.map +1 -1
  98. package/dist/skills/bundled/marginfi/SKILL.md +62 -0
  99. package/dist/skills/bundled/market-index/SKILL.md +242 -0
  100. package/dist/skills/bundled/market-index/index.js +1 -3
  101. package/dist/skills/bundled/market-index/index.js.map +1 -1
  102. package/dist/skills/bundled/markets/SKILL.md +49 -0
  103. package/dist/skills/bundled/mcp/SKILL.md +235 -0
  104. package/dist/skills/bundled/mcp/index.js +1 -3
  105. package/dist/skills/bundled/mcp/index.js.map +1 -1
  106. package/dist/skills/bundled/memory/SKILL.md +209 -0
  107. package/dist/skills/bundled/metaculus/SKILL.md +62 -0
  108. package/dist/skills/bundled/meteora/SKILL.md +28 -0
  109. package/dist/skills/bundled/meteora-dbc/SKILL.md +25 -0
  110. package/dist/skills/bundled/metrics/SKILL.md +338 -0
  111. package/dist/skills/bundled/mev/SKILL.md +239 -0
  112. package/dist/skills/bundled/mev/index.js +2 -2
  113. package/dist/skills/bundled/mev/index.js.map +1 -1
  114. package/dist/skills/bundled/mexc-futures/SKILL.md +86 -0
  115. package/dist/skills/bundled/mexc-futures/index.d.ts +0 -3
  116. package/dist/skills/bundled/mexc-futures/index.js +0 -1
  117. package/dist/skills/bundled/mexc-futures/index.js.map +1 -1
  118. package/dist/skills/bundled/mm/SKILL.md +142 -0
  119. package/dist/skills/bundled/monitoring/SKILL.md +249 -0
  120. package/dist/skills/bundled/news/SKILL.md +95 -0
  121. package/dist/skills/bundled/onchainkit/SKILL.md +83 -0
  122. package/dist/skills/bundled/opinion/SKILL.md +87 -0
  123. package/dist/skills/bundled/opportunity/SKILL.md +308 -0
  124. package/dist/skills/bundled/orca/SKILL.md +28 -0
  125. package/dist/skills/bundled/pairing/SKILL.md +275 -0
  126. package/dist/skills/bundled/pancakeswap/SKILL.md +93 -0
  127. package/dist/skills/bundled/pancakeswap/index.d.ts +0 -3
  128. package/dist/skills/bundled/pancakeswap/index.js +0 -1
  129. package/dist/skills/bundled/pancakeswap/index.js.map +1 -1
  130. package/dist/skills/bundled/percolator/SKILL.md +22 -0
  131. package/dist/skills/bundled/permissions/SKILL.md +269 -0
  132. package/dist/skills/bundled/permissions/index.js +2 -2
  133. package/dist/skills/bundled/permissions/index.js.map +1 -1
  134. package/dist/skills/bundled/plugins/SKILL.md +263 -0
  135. package/dist/skills/bundled/plugins/index.js +2 -2
  136. package/dist/skills/bundled/plugins/index.js.map +1 -1
  137. package/dist/skills/bundled/portfolio/SKILL.md +161 -0
  138. package/dist/skills/bundled/portfolio/index.js +1 -1
  139. package/dist/skills/bundled/portfolio/index.js.map +1 -1
  140. package/dist/skills/bundled/portfolio-sync/SKILL.md +466 -0
  141. package/dist/skills/bundled/positions/SKILL.md +262 -0
  142. package/dist/skills/bundled/predictfun/SKILL.md +109 -0
  143. package/dist/skills/bundled/predictfun/index.js +1 -1
  144. package/dist/skills/bundled/predictfun/index.js.map +1 -1
  145. package/dist/skills/bundled/predictit/SKILL.md +66 -0
  146. package/dist/skills/bundled/presence/SKILL.md +217 -0
  147. package/dist/skills/bundled/presence/index.js +2 -2
  148. package/dist/skills/bundled/presence/index.js.map +1 -1
  149. package/dist/skills/bundled/processes/SKILL.md +254 -0
  150. package/dist/skills/bundled/pump-swarm/SKILL.md +309 -0
  151. package/dist/skills/bundled/pumpfun/SKILL.md +145 -0
  152. package/dist/skills/bundled/pumpfun/index.d.ts +8 -1
  153. package/dist/skills/bundled/pumpfun/index.js +221 -11
  154. package/dist/skills/bundled/pumpfun/index.js.map +1 -1
  155. package/dist/skills/bundled/qmd/SKILL.md +129 -0
  156. package/dist/skills/bundled/qrcoin/SKILL.md +60 -0
  157. package/dist/skills/bundled/qrcoin/index.d.ts +0 -3
  158. package/dist/skills/bundled/qrcoin/index.js +0 -1
  159. package/dist/skills/bundled/qrcoin/index.js.map +1 -1
  160. package/dist/skills/bundled/raydium/SKILL.md +198 -0
  161. package/dist/skills/bundled/remote/SKILL.md +201 -0
  162. package/dist/skills/bundled/research/SKILL.md +83 -0
  163. package/dist/skills/bundled/research/index.js +2 -2
  164. package/dist/skills/bundled/research/index.js.map +1 -1
  165. package/dist/skills/bundled/risk/SKILL.md +323 -0
  166. package/dist/skills/bundled/router/SKILL.md +233 -0
  167. package/dist/skills/bundled/routing/SKILL.md +258 -0
  168. package/dist/skills/bundled/sandbox/SKILL.md +257 -0
  169. package/dist/skills/bundled/search-config/SKILL.md +257 -0
  170. package/dist/skills/bundled/search-config/index.js +2 -2
  171. package/dist/skills/bundled/search-config/index.js.map +1 -1
  172. package/dist/skills/bundled/sessions/SKILL.md +251 -0
  173. package/dist/skills/bundled/sessions/index.js +1 -1
  174. package/dist/skills/bundled/sessions/index.js.map +1 -1
  175. package/dist/skills/bundled/setup/SKILL.md +53 -0
  176. package/dist/skills/bundled/shield/SKILL.md +21 -0
  177. package/dist/skills/bundled/signals/SKILL.md +106 -0
  178. package/dist/skills/bundled/signals/index.d.ts +0 -3
  179. package/dist/skills/bundled/signals/index.js +3 -4
  180. package/dist/skills/bundled/signals/index.js.map +1 -1
  181. package/dist/skills/bundled/sizing/SKILL.md +238 -0
  182. package/dist/skills/bundled/slippage/SKILL.md +306 -0
  183. package/dist/skills/bundled/smarkets/SKILL.md +107 -0
  184. package/dist/skills/bundled/solend/SKILL.md +63 -0
  185. package/dist/skills/bundled/strategy/SKILL.md +266 -0
  186. package/dist/skills/bundled/streaming/SKILL.md +150 -0
  187. package/dist/skills/bundled/streaming/index.js +2 -2
  188. package/dist/skills/bundled/streaming/index.js.map +1 -1
  189. package/dist/skills/bundled/tailscale/SKILL.md +249 -0
  190. package/dist/skills/bundled/tailscale/index.js +2 -2
  191. package/dist/skills/bundled/tailscale/index.js.map +1 -1
  192. package/dist/skills/bundled/ticks/SKILL.md +61 -0
  193. package/dist/skills/bundled/token-security/SKILL.md +18 -0
  194. package/dist/skills/bundled/trading-evm/SKILL.md +329 -0
  195. package/dist/skills/bundled/trading-futures/SKILL.md +865 -0
  196. package/dist/skills/bundled/trading-kalshi/SKILL.md +629 -0
  197. package/dist/skills/bundled/trading-manifold/SKILL.md +387 -0
  198. package/dist/skills/bundled/trading-polymarket/SKILL.md +1080 -0
  199. package/dist/skills/bundled/trading-solana/SKILL.md +418 -0
  200. package/dist/skills/bundled/trading-system/SKILL.md +290 -0
  201. package/dist/skills/bundled/triggers/SKILL.md +433 -0
  202. package/dist/skills/bundled/tts/SKILL.md +220 -0
  203. package/dist/skills/bundled/tweet-ideas/SKILL.md +77 -0
  204. package/dist/skills/bundled/usage/SKILL.md +239 -0
  205. package/dist/skills/bundled/usage/index.js +2 -2
  206. package/dist/skills/bundled/usage/index.js.map +1 -1
  207. package/dist/skills/bundled/veil/SKILL.md +76 -0
  208. package/dist/skills/bundled/veil/index.d.ts +0 -3
  209. package/dist/skills/bundled/veil/index.js +0 -1
  210. package/dist/skills/bundled/veil/index.js.map +1 -1
  211. package/dist/skills/bundled/verify/SKILL.md +199 -0
  212. package/dist/skills/bundled/verify/index.d.ts +0 -3
  213. package/dist/skills/bundled/verify/index.js +0 -1
  214. package/dist/skills/bundled/verify/index.js.map +1 -1
  215. package/dist/skills/bundled/virtuals/SKILL.md +82 -0
  216. package/dist/skills/bundled/voice/SKILL.md +217 -0
  217. package/dist/skills/bundled/voice/index.js +2 -2
  218. package/dist/skills/bundled/voice/index.js.map +1 -1
  219. package/dist/skills/bundled/weather/SKILL.md +80 -0
  220. package/dist/skills/bundled/webhooks/SKILL.md +297 -0
  221. package/dist/skills/bundled/webhooks/index.js +2 -2
  222. package/dist/skills/bundled/webhooks/index.js.map +1 -1
  223. package/dist/skills/bundled/whale-tracking/SKILL.md +287 -0
  224. package/dist/skills/bundled/whale-tracking/index.js +2 -2
  225. package/dist/skills/bundled/whale-tracking/index.js.map +1 -1
  226. package/dist/skills/bundled/yoink/SKILL.md +54 -0
  227. package/dist/skills/bundled/yoink/index.d.ts +0 -3
  228. package/dist/skills/bundled/yoink/index.js +0 -1
  229. package/dist/skills/bundled/yoink/index.js.map +1 -1
  230. package/dist/skills/executor.js +5 -3
  231. package/dist/skills/executor.js.map +1 -1
  232. package/package.json +2 -2
@@ -0,0 +1,865 @@
1
+ ---
2
+ name: trading-futures
3
+ description: "Trade perpetual futures on Binance, Bybit, Hyperliquid, MEXC with up to 200x leverage"
4
+ emoji: "📈"
5
+ gates:
6
+ envs:
7
+ anyOf:
8
+ - BINANCE_API_KEY
9
+ - BYBIT_API_KEY
10
+ - HYPERLIQUID_PRIVATE_KEY
11
+ - MEXC_API_KEY
12
+ ---
13
+
14
+ # Perpetual Futures Trading - Complete API Reference
15
+
16
+ Trade leveraged perpetual futures across 4 exchanges with database tracking, custom strategies, and A/B testing.
17
+
18
+ **200+ methods across 4 exchanges. This is the complete reference.**
19
+
20
+ ## Supported Exchanges
21
+
22
+ | Exchange | Type | Max Leverage | KYC | API Methods |
23
+ |----------|------|--------------|-----|-------------|
24
+ | Binance Futures | CEX | 125x | Yes | 55+ |
25
+ | Bybit | CEX | 100x | Yes | 50+ |
26
+ | MEXC | CEX | 200x | No (small) | 35+ |
27
+ | Hyperliquid | DEX | 50x | No | 60+ |
28
+
29
+ ## Required Environment Variables
30
+
31
+ ```bash
32
+ # Binance Futures
33
+ BINANCE_API_KEY=your_api_key
34
+ BINANCE_API_SECRET=your_api_secret
35
+
36
+ # Bybit
37
+ BYBIT_API_KEY=your_api_key
38
+ BYBIT_API_SECRET=your_api_secret
39
+
40
+ # MEXC (No KYC for small amounts)
41
+ MEXC_API_KEY=your_api_key
42
+ MEXC_API_SECRET=your_api_secret
43
+
44
+ # Hyperliquid (Fully decentralized, No KYC)
45
+ HYPERLIQUID_PRIVATE_KEY=your_private_key
46
+ HYPERLIQUID_WALLET_ADDRESS=0x...
47
+
48
+ # Optional: Database for trade tracking
49
+ DATABASE_URL=postgres://user:pass@localhost:5432/clodds
50
+ ```
51
+
52
+ ---
53
+
54
+ ## Chat Commands
55
+
56
+ ### Account & Balance
57
+
58
+ ```
59
+ /futures balance [exchange] # Check margin balance (all or specific)
60
+ /futures positions # View all open positions
61
+ /futures positions <exchange> # View positions on specific exchange
62
+ ```
63
+
64
+ ### Opening Positions
65
+
66
+ ```
67
+ /futures long <symbol> <size> [leverage]x # Open long position
68
+ /futures short <symbol> <size> [leverage]x # Open short position
69
+
70
+ # Examples:
71
+ /futures long BTCUSDT 0.1 10x # Open 0.1 BTC long at 10x
72
+ /futures short ETHUSDT 1 20x # Open 1 ETH short at 20x
73
+ /futures long BTCUSDT 0.01 # Use default leverage
74
+ ```
75
+
76
+ ### Take-Profit & Stop-Loss
77
+
78
+ ```
79
+ /futures tp <symbol> <price> # Set take-profit
80
+ /futures sl <symbol> <price> # Set stop-loss
81
+ /futures tpsl <symbol> <tp> <sl> # Set both at once
82
+
83
+ # Examples:
84
+ /futures tp BTCUSDT 105000 # Take profit at $105k
85
+ /futures sl BTCUSDT 95000 # Stop loss at $95k
86
+ /futures tpsl BTCUSDT 105000 95000 # Both
87
+ ```
88
+
89
+ ### Closing Positions
90
+
91
+ ```
92
+ /futures close <symbol> # Close specific position
93
+ /futures close-all # Close ALL positions (all exchanges)
94
+ /futures close-all <exchange> # Close all on specific exchange
95
+ ```
96
+
97
+ ### Market Data
98
+
99
+ ```
100
+ /futures markets [exchange] # List available markets
101
+ /futures price <symbol> # Get current price
102
+ /futures funding <symbol> # Check funding rate
103
+ /futures orderbook <symbol> # View orderbook depth
104
+ ```
105
+
106
+ ### Account Info
107
+
108
+ ```
109
+ /futures stats # Trade statistics from database
110
+ /futures history [symbol] # Trade history
111
+ /futures pnl [period] # P&L summary (day/week/month)
112
+ ```
113
+
114
+ ### Leverage & Margin
115
+
116
+ ```
117
+ /futures leverage <symbol> <value> # Set leverage
118
+ /futures margin <symbol> <mode> # Set margin mode (cross/isolated)
119
+ ```
120
+
121
+ ---
122
+
123
+ ## TypeScript API Reference
124
+
125
+ ### Quick Setup
126
+
127
+ ```typescript
128
+ import { setupFromEnv } from 'clodds/trading/futures';
129
+
130
+ // Auto-configure from environment variables
131
+ const { clients, database, strategyEngine } = await setupFromEnv();
132
+
133
+ // Access individual clients
134
+ const binance = clients.binance;
135
+ const bybit = clients.bybit;
136
+ const mexc = clients.mexc;
137
+ const hyperliquid = clients.hyperliquid;
138
+ ```
139
+
140
+ ### Manual Client Setup
141
+
142
+ ```typescript
143
+ import {
144
+ BinanceFuturesClient,
145
+ BybitFuturesClient,
146
+ MexcFuturesClient,
147
+ HyperliquidClient,
148
+ FuturesDatabase,
149
+ StrategyEngine,
150
+ } from 'clodds/trading/futures';
151
+
152
+ // Binance
153
+ const binance = new BinanceFuturesClient({
154
+ apiKey: process.env.BINANCE_API_KEY!,
155
+ apiSecret: process.env.BINANCE_API_SECRET!,
156
+ testnet: false, // true for testnet
157
+ });
158
+
159
+ // Bybit
160
+ const bybit = new BybitFuturesClient({
161
+ apiKey: process.env.BYBIT_API_KEY!,
162
+ apiSecret: process.env.BYBIT_API_SECRET!,
163
+ testnet: false,
164
+ });
165
+
166
+ // MEXC (No KYC)
167
+ const mexc = new MexcFuturesClient({
168
+ apiKey: process.env.MEXC_API_KEY!,
169
+ apiSecret: process.env.MEXC_API_SECRET!,
170
+ });
171
+
172
+ // Hyperliquid (Decentralized, No KYC)
173
+ const hyperliquid = new HyperliquidClient({
174
+ privateKey: process.env.HYPERLIQUID_PRIVATE_KEY!,
175
+ walletAddress: process.env.HYPERLIQUID_WALLET_ADDRESS!,
176
+ testnet: false,
177
+ });
178
+ ```
179
+
180
+ ---
181
+
182
+ ## Binance Futures API (55+ Methods)
183
+
184
+ ### Market Data
185
+
186
+ ```typescript
187
+ // Prices & Tickers
188
+ await binance.getMarkPrice('BTCUSDT');
189
+ await binance.getTicker24h('BTCUSDT');
190
+ await binance.getAllTickers();
191
+ await binance.getBookTicker('BTCUSDT');
192
+
193
+ // Orderbook & Trades
194
+ await binance.getOrderBook('BTCUSDT', 100);
195
+ await binance.getRecentTrades('BTCUSDT', 500);
196
+ await binance.getHistoricalTrades('BTCUSDT', 500);
197
+ await binance.getAggTrades('BTCUSDT');
198
+
199
+ // Klines (Candlesticks)
200
+ await binance.getKlines('BTCUSDT', '1h', 100);
201
+ await binance.getContinuousKlines('BTCUSDT', '1h', 'PERPETUAL');
202
+ await binance.getIndexPriceKlines('BTCUSDT', '1h');
203
+ await binance.getMarkPriceKlines('BTCUSDT', '1h');
204
+ await binance.getPremiumIndexKlines('BTCUSDT', '1h');
205
+
206
+ // Funding Rates
207
+ await binance.getFundingRate('BTCUSDT');
208
+ await binance.getFundingRateHistory('BTCUSDT', 100);
209
+
210
+ // Market Info
211
+ await binance.getExchangeInfo();
212
+ await binance.getOpenInterest('BTCUSDT');
213
+ await binance.getOpenInterestHistory('BTCUSDT', '1h');
214
+ ```
215
+
216
+ ### Trading
217
+
218
+ ```typescript
219
+ // Place Orders
220
+ await binance.placeOrder({
221
+ symbol: 'BTCUSDT',
222
+ side: 'BUY',
223
+ type: 'MARKET',
224
+ quantity: 0.01,
225
+ });
226
+
227
+ await binance.placeOrder({
228
+ symbol: 'BTCUSDT',
229
+ side: 'BUY',
230
+ type: 'LIMIT',
231
+ quantity: 0.01,
232
+ price: 95000,
233
+ timeInForce: 'GTC',
234
+ });
235
+
236
+ // With TP/SL
237
+ await binance.placeOrder({
238
+ symbol: 'BTCUSDT',
239
+ side: 'BUY',
240
+ type: 'MARKET',
241
+ quantity: 0.01,
242
+ takeProfit: 105000,
243
+ stopLoss: 95000,
244
+ });
245
+
246
+ // Batch Orders
247
+ await binance.placeBatchOrders([
248
+ { symbol: 'BTCUSDT', side: 'BUY', type: 'LIMIT', quantity: 0.01, price: 94000 },
249
+ { symbol: 'BTCUSDT', side: 'BUY', type: 'LIMIT', quantity: 0.01, price: 93000 },
250
+ ]);
251
+
252
+ // Modify & Cancel
253
+ await binance.modifyOrder('BTCUSDT', orderId, { quantity: 0.02 });
254
+ await binance.cancelOrder('BTCUSDT', orderId);
255
+ await binance.cancelAllOrders('BTCUSDT');
256
+ await binance.cancelBatchOrders('BTCUSDT', [orderId1, orderId2]);
257
+
258
+ // Auto-cancel
259
+ await binance.setAutoCancel(60000); // Cancel all after 60s
260
+ await binance.cancelAutoCancel();
261
+ ```
262
+
263
+ ### Account & Positions
264
+
265
+ ```typescript
266
+ // Account Info
267
+ await binance.getAccountInfo();
268
+ await binance.getBalance();
269
+ await binance.getPositions();
270
+ await binance.getPositionRisk();
271
+
272
+ // Orders & History
273
+ await binance.getOpenOrders();
274
+ await binance.getOpenOrders('BTCUSDT');
275
+ await binance.getAllOrders('BTCUSDT');
276
+ await binance.getOrder('BTCUSDT', orderId);
277
+ await binance.getTradeHistory('BTCUSDT');
278
+ await binance.getIncomeHistory();
279
+ await binance.getIncomeHistory('BTCUSDT', 'REALIZED_PNL');
280
+
281
+ // Commission
282
+ await binance.getCommissionRate('BTCUSDT');
283
+ ```
284
+
285
+ ### Risk Management
286
+
287
+ ```typescript
288
+ // Leverage
289
+ await binance.setLeverage('BTCUSDT', 10);
290
+ await binance.getLeverageBrackets();
291
+ await binance.getLeverageBrackets('BTCUSDT');
292
+
293
+ // Margin Mode
294
+ await binance.setMarginType('BTCUSDT', 'ISOLATED');
295
+ await binance.modifyIsolatedMargin('BTCUSDT', 100, 'ADD');
296
+ await binance.modifyIsolatedMargin('BTCUSDT', 50, 'REDUCE');
297
+
298
+ // Position Mode
299
+ await binance.getPositionMode();
300
+ await binance.setPositionMode(true); // Hedge mode
301
+ await binance.setPositionMode(false); // One-way mode
302
+
303
+ // Multi-Asset Mode
304
+ await binance.getMultiAssetMode();
305
+ await binance.setMultiAssetMode(true);
306
+ ```
307
+
308
+ ### Analytics
309
+
310
+ ```typescript
311
+ // Market Analytics
312
+ await binance.getLongShortRatio('BTCUSDT', '1h');
313
+ await binance.getTopTraderLongShortRatio('BTCUSDT', '1h');
314
+ await binance.getTopTraderPositions('BTCUSDT', '1h');
315
+ await binance.getGlobalLongShortRatio('BTCUSDT', '1h');
316
+ await binance.getTakerBuySellVolume('BTCUSDT', '1h');
317
+ ```
318
+
319
+ ### Staking & Earn
320
+
321
+ ```typescript
322
+ // Staking
323
+ await binance.getStakingProducts();
324
+ await binance.stake('BNB', 10);
325
+ await binance.unstake('BNB', 5);
326
+ await binance.getStakingHistory();
327
+ await binance.getStakingPositions();
328
+ ```
329
+
330
+ ### Convert
331
+
332
+ ```typescript
333
+ // Convert between assets
334
+ await binance.getConvertPairs('USDT', 'BTC');
335
+ await binance.sendQuote('USDT', 'BTC', 100);
336
+ await binance.acceptQuote(quoteId);
337
+ await binance.getConvertHistory();
338
+ ```
339
+
340
+ ### Portfolio Margin
341
+
342
+ ```typescript
343
+ await binance.getPortfolioMarginAccount();
344
+ await binance.getPortfolioMarginBankruptcyLoan();
345
+ await binance.repayPortfolioMarginLoan();
346
+ ```
347
+
348
+ ---
349
+
350
+ ## Bybit API (50+ Methods)
351
+
352
+ ### Market Data
353
+
354
+ ```typescript
355
+ await bybit.getTickers('linear');
356
+ await bybit.getTickers('linear', 'BTCUSDT');
357
+ await bybit.getOrderbook('BTCUSDT', 'linear');
358
+ await bybit.getKline('BTCUSDT', '1h', 'linear');
359
+ await bybit.getMarkPriceKline('BTCUSDT', '1h', 'linear');
360
+ await bybit.getIndexPriceKline('BTCUSDT', '1h', 'linear');
361
+ await bybit.getPremiumIndexPriceKline('BTCUSDT', '1h', 'linear');
362
+ await bybit.getInstrumentsInfo('linear');
363
+ await bybit.getFundingHistory('BTCUSDT', 'linear');
364
+ await bybit.getPublicTradingHistory('BTCUSDT', 'linear');
365
+ await bybit.getOpenInterest('BTCUSDT', 'linear', '1h');
366
+ await bybit.getHistoricalVolatility();
367
+ await bybit.getInsurance();
368
+ await bybit.getRiskLimit('linear');
369
+ ```
370
+
371
+ ### Trading
372
+
373
+ ```typescript
374
+ // Place Order
375
+ await bybit.placeOrder({
376
+ category: 'linear',
377
+ symbol: 'BTCUSDT',
378
+ side: 'Buy',
379
+ orderType: 'Market',
380
+ qty: '0.01',
381
+ });
382
+
383
+ await bybit.placeOrder({
384
+ category: 'linear',
385
+ symbol: 'BTCUSDT',
386
+ side: 'Buy',
387
+ orderType: 'Limit',
388
+ qty: '0.01',
389
+ price: '95000',
390
+ timeInForce: 'GTC',
391
+ });
392
+
393
+ // Batch Orders
394
+ await bybit.placeBatchOrders('linear', [
395
+ { symbol: 'BTCUSDT', side: 'Buy', orderType: 'Limit', qty: '0.01', price: '94000' },
396
+ { symbol: 'BTCUSDT', side: 'Buy', orderType: 'Limit', qty: '0.01', price: '93000' },
397
+ ]);
398
+
399
+ // Modify & Cancel
400
+ await bybit.amendOrder({ category: 'linear', symbol: 'BTCUSDT', orderId, qty: '0.02' });
401
+ await bybit.cancelOrder({ category: 'linear', symbol: 'BTCUSDT', orderId });
402
+ await bybit.cancelAllOrders({ category: 'linear', symbol: 'BTCUSDT' });
403
+ await bybit.cancelBatchOrders('linear', [{ symbol: 'BTCUSDT', orderId }]);
404
+ ```
405
+
406
+ ### Account & Positions
407
+
408
+ ```typescript
409
+ await bybit.getWalletBalance('UNIFIED');
410
+ await bybit.getPositionInfo('linear');
411
+ await bybit.getPositionInfo('linear', 'BTCUSDT');
412
+ await bybit.getOpenOrders('linear');
413
+ await bybit.getOrderHistory('linear');
414
+ await bybit.getExecutionList('linear');
415
+ await bybit.getClosedPnl('linear');
416
+ await bybit.getBorrowHistory();
417
+ await bybit.getCollateralInfo();
418
+ await bybit.getCoinGreeks();
419
+ await bybit.getFeeRate('linear', 'BTCUSDT');
420
+ await bybit.getAccountInfo();
421
+ await bybit.getTransactionLog();
422
+ await bybit.getMMPState('linear');
423
+ await bybit.setMMP({ baseCoin: 'BTC', window: '5000', frozenPeriod: '100', qtyLimit: '10', deltaLimit: '100' });
424
+ await bybit.resetMMP('BTC');
425
+ ```
426
+
427
+ ### Risk Management
428
+
429
+ ```typescript
430
+ await bybit.setLeverage({ category: 'linear', symbol: 'BTCUSDT', buyLeverage: '10', sellLeverage: '10' });
431
+ await bybit.setMarginMode('ISOLATED_MARGIN');
432
+ await bybit.setPositionMode({ category: 'linear', mode: 0 }); // 0=one-way, 3=hedge
433
+ await bybit.setRiskLimit({ category: 'linear', symbol: 'BTCUSDT', riskId: 1 });
434
+ await bybit.setTradingStop({ category: 'linear', symbol: 'BTCUSDT', takeProfit: '105000', stopLoss: '95000' });
435
+ await bybit.setTpSlMode({ category: 'linear', symbol: 'BTCUSDT', tpSlMode: 'Full' });
436
+ await bybit.addOrReduceMargin({ category: 'linear', symbol: 'BTCUSDT', margin: '100' });
437
+ await bybit.switchCrossIsolatedMargin({ category: 'linear', symbol: 'BTCUSDT', tradeMode: 1, buyLeverage: '10', sellLeverage: '10' });
438
+ ```
439
+
440
+ ### Copy Trading
441
+
442
+ ```typescript
443
+ await bybit.getCopyTradingLeaders();
444
+ await bybit.followLeader(leaderId);
445
+ await bybit.unfollowLeader(leaderId);
446
+ await bybit.getCopyPositions();
447
+ await bybit.closeCopyPosition(symbol);
448
+ ```
449
+
450
+ ### Lending & Earn
451
+
452
+ ```typescript
453
+ await bybit.getLendingProducts();
454
+ await bybit.depositToLending(productId, amount);
455
+ await bybit.redeemFromLending(productId, amount);
456
+ await bybit.getLendingOrders();
457
+ await bybit.getEarnProducts();
458
+ await bybit.getEarnOrders();
459
+ ```
460
+
461
+ ---
462
+
463
+ ## Hyperliquid API (60+ Methods)
464
+
465
+ ### Market Data
466
+
467
+ ```typescript
468
+ await hyperliquid.getMeta();
469
+ await hyperliquid.getMetaAndAssetCtxs();
470
+ await hyperliquid.getAssetCtxs();
471
+ await hyperliquid.getAllMids();
472
+ await hyperliquid.getCandleSnapshot('BTC', '1h', startTime, endTime);
473
+ await hyperliquid.getL2Snapshot('BTC');
474
+ await hyperliquid.getFundingHistory('BTC', startTime, endTime);
475
+ await hyperliquid.getRecentTrades('BTC');
476
+ await hyperliquid.getPredictedFunding();
477
+ ```
478
+
479
+ ### Trading
480
+
481
+ ```typescript
482
+ // Place Order
483
+ await hyperliquid.placeOrder({
484
+ asset: 'BTC',
485
+ isBuy: true,
486
+ sz: 0.01,
487
+ limitPx: 95000,
488
+ orderType: { limit: { tif: 'Gtc' } },
489
+ reduceOnly: false,
490
+ });
491
+
492
+ // Market Order
493
+ await hyperliquid.placeOrder({
494
+ asset: 'BTC',
495
+ isBuy: true,
496
+ sz: 0.01,
497
+ limitPx: null,
498
+ orderType: { market: {} },
499
+ });
500
+
501
+ // TWAP Order
502
+ await hyperliquid.placeTwapOrder({
503
+ asset: 'BTC',
504
+ isBuy: true,
505
+ sz: 1.0,
506
+ duration: 3600, // 1 hour
507
+ randomize: true,
508
+ });
509
+
510
+ // Modify & Cancel
511
+ await hyperliquid.modifyOrder(orderId, { sz: 0.02 });
512
+ await hyperliquid.cancelOrder('BTC', orderId);
513
+ await hyperliquid.cancelAllOrders();
514
+ await hyperliquid.cancelOrdersByCloid(['cloid1', 'cloid2']);
515
+
516
+ // Batch Operations
517
+ await hyperliquid.batchModifyOrders([{ oid: orderId1, sz: 0.02 }, { oid: orderId2, sz: 0.03 }]);
518
+ ```
519
+
520
+ ### Account & Positions
521
+
522
+ ```typescript
523
+ await hyperliquid.getUserState(walletAddress);
524
+ await hyperliquid.getClearinghouseState(walletAddress);
525
+ await hyperliquid.getOpenOrders(walletAddress);
526
+ await hyperliquid.getFrontendOpenOrders(walletAddress);
527
+ await hyperliquid.getUserFills(walletAddress);
528
+ await hyperliquid.getUserFillsByTime(walletAddress, startTime, endTime);
529
+ await hyperliquid.getUserFunding(walletAddress);
530
+ await hyperliquid.getUserFundingHistory(walletAddress, startTime, endTime);
531
+ await hyperliquid.getHistoricalOrders(walletAddress);
532
+ await hyperliquid.getOrderStatus(walletAddress, orderId);
533
+ await hyperliquid.getTwapHistory(walletAddress);
534
+ await hyperliquid.getSubaccounts(walletAddress);
535
+ ```
536
+
537
+ ### Leverage & Margin
538
+
539
+ ```typescript
540
+ await hyperliquid.updateLeverage('BTC', 10, false); // false = cross
541
+ await hyperliquid.updateLeverage('BTC', 10, true); // true = isolated
542
+ await hyperliquid.updateIsolatedMargin('BTC', 100);
543
+ ```
544
+
545
+ ### Transfers
546
+
547
+ ```typescript
548
+ await hyperliquid.usdTransfer(toAddress, amount);
549
+ await hyperliquid.spotTransfer(toAddress, token, amount);
550
+ await hyperliquid.withdraw(amount);
551
+ await hyperliquid.classTransfer(amount, toPerp);
552
+ ```
553
+
554
+ ### Spot Trading
555
+
556
+ ```typescript
557
+ await hyperliquid.getSpotMeta();
558
+ await hyperliquid.getSpotMetaAndAssetCtxs();
559
+ await hyperliquid.getSpotClearinghouseState(walletAddress);
560
+ await hyperliquid.placeSpotOrder({
561
+ asset: 'HYPE',
562
+ isBuy: true,
563
+ sz: 10,
564
+ limitPx: 25,
565
+ });
566
+ ```
567
+
568
+ ### Vaults
569
+
570
+ ```typescript
571
+ await hyperliquid.getVaultDetails(vaultAddress);
572
+ await hyperliquid.getUserVaultEquities(walletAddress);
573
+ await hyperliquid.depositToVault(vaultAddress, amount);
574
+ await hyperliquid.withdrawFromVault(vaultAddress, amount);
575
+ await hyperliquid.getAllVaults();
576
+ ```
577
+
578
+ ### Staking
579
+
580
+ ```typescript
581
+ await hyperliquid.getValidatorSummaries();
582
+ await hyperliquid.getUserStakingSummary(walletAddress);
583
+ await hyperliquid.stakeHype(amount, validatorAddress);
584
+ await hyperliquid.unstakeHype(amount, validatorAddress);
585
+ await hyperliquid.claimStakingRewards();
586
+ ```
587
+
588
+ ### Delegations
589
+
590
+ ```typescript
591
+ await hyperliquid.getDelegatorSummary(walletAddress);
592
+ await hyperliquid.getDelegatorHistory(walletAddress);
593
+ await hyperliquid.delegate(amount, agentAddress);
594
+ await hyperliquid.undelegate(amount, agentAddress);
595
+ ```
596
+
597
+ ### Referrals & Analytics
598
+
599
+ ```typescript
600
+ await hyperliquid.getReferralState(walletAddress);
601
+ await hyperliquid.createReferralCode(code);
602
+ await hyperliquid.getReferredUsers(walletAddress);
603
+ await hyperliquid.getUserAnalytics(walletAddress);
604
+ await hyperliquid.getLeaderboard();
605
+ await hyperliquid.getMaxBuilderFee();
606
+ ```
607
+
608
+ ---
609
+
610
+ ## MEXC API (35+ Methods)
611
+
612
+ ### Market Data
613
+
614
+ ```typescript
615
+ await mexc.getContractDetail('BTC_USDT');
616
+ await mexc.getAllContractDetails();
617
+ await mexc.getOrderbook('BTC_USDT');
618
+ await mexc.getKlines('BTC_USDT', '1h');
619
+ await mexc.getTicker('BTC_USDT');
620
+ await mexc.getAllTickers();
621
+ await mexc.getFundingRate('BTC_USDT');
622
+ await mexc.getFundingRateHistory('BTC_USDT');
623
+ await mexc.getOpenInterest('BTC_USDT');
624
+ await mexc.getRecentTrades('BTC_USDT');
625
+ await mexc.getIndexPrice('BTC_USDT');
626
+ await mexc.getFairPrice('BTC_USDT');
627
+ ```
628
+
629
+ ### Trading
630
+
631
+ ```typescript
632
+ // Place Order
633
+ await mexc.placeOrder({
634
+ symbol: 'BTC_USDT',
635
+ side: 1, // 1=Open Long, 2=Close Short, 3=Open Short, 4=Close Long
636
+ type: 5, // 1=Limit, 2=Post Only, 3=IOC, 4=FOK, 5=Market
637
+ vol: 1, // Contracts
638
+ leverage: 10,
639
+ });
640
+
641
+ // With TP/SL
642
+ await mexc.placeOrder({
643
+ symbol: 'BTC_USDT',
644
+ side: 1,
645
+ type: 5,
646
+ vol: 1,
647
+ leverage: 10,
648
+ takeProfit: 105000,
649
+ stopLoss: 95000,
650
+ });
651
+
652
+ // Batch Orders
653
+ await mexc.placeBatchOrders([
654
+ { symbol: 'BTC_USDT', side: 1, type: 1, vol: 1, price: 94000, leverage: 10 },
655
+ { symbol: 'BTC_USDT', side: 1, type: 1, vol: 1, price: 93000, leverage: 10 },
656
+ ]);
657
+
658
+ // Trigger Order
659
+ await mexc.placeTriggerOrder({
660
+ symbol: 'BTC_USDT',
661
+ side: 1,
662
+ type: 1,
663
+ vol: 1,
664
+ triggerPrice: 96000,
665
+ triggerType: 1, // 1=Last Price, 2=Fair Price, 3=Index Price
666
+ executionPrice: 96100,
667
+ leverage: 10,
668
+ });
669
+
670
+ // Cancel
671
+ await mexc.cancelOrder('BTC_USDT', orderId);
672
+ await mexc.cancelAllOrders('BTC_USDT');
673
+ await mexc.cancelBatchOrders([orderId1, orderId2]);
674
+ ```
675
+
676
+ ### Account & Positions
677
+
678
+ ```typescript
679
+ await mexc.getAccountInfo();
680
+ await mexc.getPositions();
681
+ await mexc.getPositions('BTC_USDT');
682
+ await mexc.getOpenOrders();
683
+ await mexc.getOpenOrders('BTC_USDT');
684
+ await mexc.getOrderHistory('BTC_USDT');
685
+ await mexc.getTradeHistory('BTC_USDT');
686
+ await mexc.getTriggerOrders();
687
+ await mexc.getStopOrders();
688
+ await mexc.getRiskLimit('BTC_USDT');
689
+ await mexc.getAssets();
690
+ await mexc.getAssetRecords();
691
+ ```
692
+
693
+ ### Risk Management
694
+
695
+ ```typescript
696
+ await mexc.setLeverage('BTC_USDT', 10);
697
+ await mexc.changeMarginMode('BTC_USDT', 1); // 1=Isolated, 2=Cross
698
+ await mexc.changePositionMode(1); // 1=Hedge, 2=One-way
699
+ await mexc.autoAddMargin('BTC_USDT', true);
700
+ ```
701
+
702
+ ---
703
+
704
+ ## Database Tracking
705
+
706
+ ### Initialize Database
707
+
708
+ ```typescript
709
+ import { FuturesDatabase } from 'clodds/trading/futures';
710
+
711
+ const db = new FuturesDatabase(process.env.DATABASE_URL!);
712
+ await db.initialize(); // Creates tables if not exist
713
+ ```
714
+
715
+ ### Log Trades
716
+
717
+ ```typescript
718
+ await db.logTrade({
719
+ exchange: 'binance',
720
+ symbol: 'BTCUSDT',
721
+ orderId: '12345',
722
+ side: 'BUY',
723
+ price: 95000,
724
+ quantity: 0.01,
725
+ realizedPnl: 50.25,
726
+ commission: 0.95,
727
+ commissionAsset: 'USDT',
728
+ timestamp: Date.now(),
729
+ isMaker: false,
730
+ strategy: 'momentum',
731
+ variant: 'aggressive',
732
+ });
733
+ ```
734
+
735
+ ### Query Trades
736
+
737
+ ```typescript
738
+ // Get trades
739
+ const trades = await db.getTrades({ exchange: 'binance' });
740
+ const btcTrades = await db.getTrades({ exchange: 'binance', symbol: 'BTCUSDT' });
741
+ const recentTrades = await db.getTrades({ limit: 100 });
742
+
743
+ // Get statistics
744
+ const stats = await db.getTradeStats('binance');
745
+ // { totalTrades, winRate, totalPnl, avgPnl, bestTrade, worstTrade }
746
+
747
+ // Get variant performance
748
+ const results = await db.getVariantPerformance('momentum');
749
+ // { aggressive: { trades, pnl, winRate }, conservative: { ... } }
750
+ ```
751
+
752
+ ---
753
+
754
+ ## Custom Strategies
755
+
756
+ ### Strategy Interface
757
+
758
+ ```typescript
759
+ import { FuturesStrategy, StrategySignal } from 'clodds/trading/futures';
760
+
761
+ interface FuturesStrategy {
762
+ name: string;
763
+ analyze(data: MarketData): Promise<StrategySignal | null>;
764
+ }
765
+
766
+ interface StrategySignal {
767
+ action: 'BUY' | 'SELL' | 'CLOSE';
768
+ symbol: string;
769
+ confidence: number; // 0-1
770
+ reason: string;
771
+ metadata?: Record<string, unknown>;
772
+ }
773
+ ```
774
+
775
+ ### Example Strategy
776
+
777
+ ```typescript
778
+ class RSIStrategy implements FuturesStrategy {
779
+ name = 'rsi-strategy';
780
+
781
+ constructor(private config: { period: number; oversold: number; overbought: number }) {}
782
+
783
+ async analyze(data: MarketData): Promise<StrategySignal | null> {
784
+ const rsi = calculateRSI(data.closes, this.config.period);
785
+
786
+ if (rsi < this.config.oversold) {
787
+ return {
788
+ action: 'BUY',
789
+ symbol: data.symbol,
790
+ confidence: (this.config.oversold - rsi) / this.config.oversold,
791
+ reason: `RSI oversold at ${rsi.toFixed(1)}`,
792
+ metadata: { rsi },
793
+ };
794
+ }
795
+
796
+ if (rsi > this.config.overbought) {
797
+ return {
798
+ action: 'SELL',
799
+ symbol: data.symbol,
800
+ confidence: (rsi - this.config.overbought) / (100 - this.config.overbought),
801
+ reason: `RSI overbought at ${rsi.toFixed(1)}`,
802
+ metadata: { rsi },
803
+ };
804
+ }
805
+
806
+ return null;
807
+ }
808
+ }
809
+ ```
810
+
811
+ ### Register & Run
812
+
813
+ ```typescript
814
+ const engine = new StrategyEngine(db);
815
+ engine.registerStrategy(new RSIStrategy({ period: 14, oversold: 30, overbought: 70 }));
816
+
817
+ // A/B Test Variants
818
+ engine.registerVariant('rsi-strategy', 'aggressive', { oversold: 25, overbought: 75 });
819
+ engine.registerVariant('rsi-strategy', 'conservative', { oversold: 35, overbought: 65 });
820
+ ```
821
+
822
+ ---
823
+
824
+ ## Built-in Strategies
825
+
826
+ | Strategy | Logic | Config |
827
+ |----------|-------|--------|
828
+ | MomentumStrategy | Follow price trends | `lookbackPeriod`, `threshold` |
829
+ | MeanReversionStrategy | Buy dips, sell rallies | `maPeriod`, `deviationMultiplier` |
830
+ | GridStrategy | Place orders at intervals | `gridSize`, `levels`, `spacing` |
831
+
832
+ ---
833
+
834
+ ## Error Handling
835
+
836
+ All clients throw typed errors:
837
+
838
+ ```typescript
839
+ import { FuturesError, InsufficientBalanceError, InvalidOrderError } from 'clodds/trading/futures';
840
+
841
+ try {
842
+ await binance.placeOrder({ ... });
843
+ } catch (error) {
844
+ if (error instanceof InsufficientBalanceError) {
845
+ console.log('Not enough margin');
846
+ } else if (error instanceof InvalidOrderError) {
847
+ console.log('Invalid order params:', error.message);
848
+ } else if (error instanceof FuturesError) {
849
+ console.log('Exchange error:', error.code, error.message);
850
+ }
851
+ }
852
+ ```
853
+
854
+ ---
855
+
856
+ ## Rate Limits
857
+
858
+ | Exchange | Limit | Notes |
859
+ |----------|-------|-------|
860
+ | Binance | 2400/min | Per IP, weight-based |
861
+ | Bybit | 120/min | Per endpoint |
862
+ | Hyperliquid | 1200/min | Per wallet |
863
+ | MEXC | 20/sec | Per IP |
864
+
865
+ All clients automatically handle rate limiting with exponential backoff.