httptrading 1.0.0__py3-none-any.whl

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.
@@ -0,0 +1,538 @@
1
+ Metadata-Version: 2.4
2
+ Name: httptrading
3
+ Version: 1.0.0
4
+ Summary: 统一交易通道的接口服务
5
+ Author-email: songwei <github@songwei.name>
6
+ License: MIT
7
+ Requires-Python: >=3.13
8
+ Description-Content-Type: text/markdown
9
+ License-File: LICENSE
10
+ Requires-Dist: aiohttp>=3.12.6
11
+ Requires-Dist: humanize>=4.12.3
12
+ Requires-Dist: tomlkit>=0.13.2
13
+ Dynamic: license-file
14
+
15
+ # httptrading
16
+
17
+ 项目的用途
18
+ --------
19
+
20
+ 市面上有很多交易通道或者加密货币交易所提供了行情、交易的接口,
21
+ 不同的接口提供方提供各自的接入方式, 如果你同时使用多家的接口服务,
22
+ 必然需要兼容诸如标的代码格式, 报价单位类型, 下单参数, 判断订单生命周期, 接口限速.
23
+
24
+ 另外的, 混合接入多家 SDK 在一个项目, 会遇到一些兼容性问题:
25
+ 包里面的依赖互相版本冲突,
26
+ 或者部署的平台、二进制模块发布导致有限 python 的版本支持.
27
+
28
+ 所以, 这个项目打算使用一套统一格式的 http 接口, 把各种接口提供方的调用隐藏, 缺点是每家的功能均会有限制.
29
+ 支持一些主要的交易动作, 比如查特定持仓, 可用资金, 下限价单以及市价单,
30
+ 也可以基于基类, 自行编写自定义的其他交易平台接口.
31
+
32
+ 针对兼容性问题, 则可以把不兼容的 SDK 放在不同进程中, 用特定的启动脚本运行,
33
+ 如果做得好一点, 再用反向代理软件封装端口的流量.
34
+
35
+ 如何使用
36
+ -------
37
+
38
+ 这个项目默认支持如下交易平台:
39
+
40
+ | 交易通道 | 方式 |
41
+ |------|--------------------------------------------------|
42
+ | 盈透证券 | [ib-insync](https://pypi.org/project/ib-insync/) |
43
+ | 富途证券 | [futu-api](https://pypi.org/project/futu-api/) |
44
+ | 长桥证券 | [longport](https://pypi.org/project/longport/) |
45
+ | 老虎证券 | [tigeropen](https://pypi.org/project/tigeropen/) |
46
+
47
+ 本项目支持它们的原理是在函数中而非模块级引用相关 SDK 的包,
48
+ 即使得这个项目没有要求必须安装这些依赖.
49
+ 使用者需要使用到哪个平台, 需要自行在工程项目中安装其 SDK 方能正常工作,
50
+ 也就是说使用者根据自身情况自行选择和解决 SDK 兼容性问题.
51
+
52
+ SDK客户端连通(ping)、交易相关功能:
53
+
54
+ | 交易通道 | ping | 可用资金 | 查持仓 | 下单 | 撤单 | 查订单 |
55
+ |------|------|------|-----|----|----|-----|
56
+ | 盈透证券 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
57
+ | 富途证券 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
58
+ | 长桥证券 | - | ✅ | ✅ | ✅ | ✅ | ✅ |
59
+ | 老虎证券 | - | ✅ | ✅ | ✅ | ✅ | ✅ |
60
+
61
+ 交易品种范围:
62
+
63
+ | 交易通道 | 美股正股 | 港股正股 | A股正股 |
64
+ |------|------|------|------|
65
+ | 盈透证券 | ✅ | 不确定 | ❌ |
66
+ | 富途证券 | ✅ | 不确定 | ❌ |
67
+ | 长桥证券 | ✅ | 不确定 | ❌ |
68
+ | 老虎证券 | ✅ | 不确定 | ❌ |
69
+
70
+ 市场、报价相关功能:
71
+
72
+ | 交易通道 | 市场状态 | 报价快照 |
73
+ |------|------|------|
74
+ | 盈透证券 | ❌ | 不支持 |
75
+ | 富途证券 | ✅ | ✅ |
76
+ | 长桥证券 | ❌ | ✅ |
77
+ | 老虎证券 | ✅ | ✅ |
78
+
79
+
80
+ 报价品种范围:
81
+
82
+ | 交易通道 | 美股正股 | 港股正股 | A股正股 |
83
+ |------|------|------|------|
84
+ | 盈透证券 | ❌ | ❌ | ❌ |
85
+ | 富途证券 | ✅ | 不确定 | ✅ |
86
+ | 长桥证券 | ✅ | 不确定 | ✅ |
87
+ | 老虎证券 | ✅ | 不确定 | 不支持 |
88
+
89
+ 使用须知
90
+ -------
91
+
92
+ ```
93
+ 项目以及使用到的框架以及实际的部署方式可能存在弱点和缺陷, 因此项目仅供学习参考,不为任何盈亏负有责任。
94
+
95
+ 各个交易平台提供的接口服务, 并不能保证提供的数据准确、交易可靠以及有效, 参与投资请意识到技术上的风险隐患.
96
+ ```
97
+
98
+ 实例和验证
99
+ --------
100
+
101
+ 在配置交易通道前, 需要自行产生16到32字符的唯一实例id, 一个实例id对应一家交易通道配置.
102
+ 实例id会包含在请求的 path 中, 防止接口地址被嗅探.
103
+
104
+ 另外使用实例id是为了区分比如你有多家相同交易通道的账户, 这样如果用交易通道做类别就没办法多账户控制了.
105
+
106
+ 除了实例id, 交易通道需要配置一组16到64字符token, 在请求中携带 `HT-TOKEN` header 来确保可以正常操作此实例.
107
+
108
+ 例如下面是一个启动脚本:
109
+
110
+ ```python
111
+ from httptrading import run, Futu
112
+
113
+
114
+ # 交易通道的参数
115
+ args = {
116
+ 'host': '127.0.0.1',
117
+ 'port': 8888,
118
+ 'trade_env': 'SIMULATE',
119
+ }
120
+ futu = Futu(
121
+ broker_args=args,
122
+ instance_id='WyLqtMhDvAnBb6a3',
123
+ tokens=['Vt5UCW2sLBvgPXjR', ],
124
+ )
125
+ run(
126
+ host='0.0.0.0',
127
+ port=8080,
128
+ brokers=[futu, ],
129
+ )
130
+
131
+ ```
132
+
133
+ 这样携带某项 token 访问 http://127.0.0.1:8080/httptrading/api/WyLqtMhDvAnBb6a3/market/state 可以得到响应.
134
+
135
+
136
+ 接口说明
137
+ -------
138
+
139
+ 正常返回的接口会包含如下的字段:
140
+
141
+ ```json lines
142
+ {
143
+ "type": "apiResponse", // 节的类型
144
+ "instanceId": "ggUqPZbSKuQ7Ewsk", // 实例id
145
+ "broker": "futu", // 通道的类型
146
+ "brokerDisplay": "富途证券", // 通道的展示名称
147
+ "time": "2025-05-28T05:20:07.062298+00:00", // 服务器时间
148
+ "ex": null // 引发异常的文字描述
149
+ }
150
+ ```
151
+
152
+ ### ping
153
+
154
+ GET /httptrading/api/{instanceId}/ping/state
155
+
156
+ 用于检测和修复 SDK 客户端的连接,
157
+ 某些需要维持客户端连接的交易通道需要具体实现这个接口.
158
+
159
+ 对于用户, 最好在操作交易通道前测试这个接口, 避免下单时出错引起更复杂的人工检查核对.
160
+
161
+ ```json lines
162
+ {
163
+ "type": "apiResponse",
164
+ "instanceId": "ggUqPZbSKuQ7Ewsk",
165
+ "broker": "futu",
166
+ "brokerDisplay": "富途证券",
167
+ "time": "2025-05-28T05:20:07.062298+00:00",
168
+ "ex": null,
169
+ "pong": true
170
+ }
171
+ ```
172
+
173
+ 如果 pong 是 false, 表明客户端测试是失败的.
174
+
175
+
176
+ ### 报价快照
177
+
178
+ GET /httptrading/api/{instanceId}/market/quote
179
+
180
+ 需要在 query 提供 Contract 参数:
181
+
182
+ | 参数 | 说明 | 举例 |
183
+ |-----------|---------|--------------------|
184
+ | tradeType | 说明标的的品种 | Securities: 证券 |
185
+ | ticker | 代码 | QQQ, 00700, 000001 |
186
+ | region | 以国家区分代码 | US, HK, CN |
187
+
188
+ 举例 ?tradeType=Securities&region=CN&ticker=000001 参数的结果:
189
+ ```json lines
190
+ {
191
+ "type": "apiResponse",
192
+ "instanceId": "ggUqPZbSKuQ7Ewsk",
193
+ "broker": "futu",
194
+ "brokerDisplay": "富途证券",
195
+ "time": "2025-05-28T05:25:19.542635+00:00",
196
+ "ex": null,
197
+ "quote": {
198
+ "type": "quote",
199
+ "contract": {
200
+ "type": "contract",
201
+ "tradeType": "Securities",
202
+ "region": "CN",
203
+ "ticker": "000001"
204
+ },
205
+ "currency": "CNY", // 币种
206
+ "isTradable": true, // 此时是否可交易, 比如受到停牌熔断影响
207
+ "latest": 11.53, // 最新价
208
+ "preClose": 11.49, // 昨日收盘价
209
+ "highPrice": 11.55, // 日最高价
210
+ "lowPrice": 11.44, // 日最低价
211
+ "openPrice": 11.5, // 开盘价
212
+ "timestamp": 1748409918000 // 快照行情的时间
213
+ }
214
+ }
215
+ ```
216
+
217
+
218
+ ### 市场状态
219
+
220
+ GET /httptrading/api/{instanceId}/market/state
221
+
222
+ ```json lines
223
+ {
224
+ "type": "apiResponse",
225
+ "instanceId": "ggUqPZbSKuQ7Ewsk",
226
+ "broker": "futu",
227
+ "brokerDisplay": "富途证券",
228
+ "time": "2025-05-28T05:33:42.543109+00:00",
229
+ "ex": null,
230
+ "marketStatus": {
231
+ "securities": { // 证券类市场状态, 以 region 为键的结构
232
+ "US": {
233
+ "type": "marketStatus",
234
+ "region": "US",
235
+ "originStatus": "AFTER_HOURS_END", // 交易通道原始市场状态
236
+ "unifiedStatus": "CLOSED" // 统一映射的定义
237
+ },
238
+ "CN": {
239
+ "type": "marketStatus",
240
+ "region": "CN",
241
+ "originStatus": "AFTERNOON",
242
+ "unifiedStatus": "RTH"
243
+ },
244
+ "HK": {
245
+ "type": "marketStatus",
246
+ "region": "HK",
247
+ "originStatus": "AFTERNOON",
248
+ "unifiedStatus": "RTH"
249
+ }
250
+ }
251
+ }
252
+ }
253
+ ```
254
+
255
+ 统一映射的枚举:
256
+
257
+ | 枚举 | 说明 |
258
+ |-------------|---------------|
259
+ | UNKNOWN | 开盘前, 不能映射到的状态 |
260
+ | OVERNIGHT | 夜盘 |
261
+ | PRE_HOURS | 盘前 |
262
+ | RTH | 正常交易时段 |
263
+ | REST | 休市 |
264
+ | AFTER_HOURS | 盘后 |
265
+ | CLOSED | 收盘 |
266
+
267
+
268
+ ### 可用资金
269
+
270
+ GET /httptrading/api/{instanceId}/cash/state
271
+
272
+ ```json lines
273
+ {
274
+ "type": "apiResponse",
275
+ "instanceId": "ggUqPZbSKuQ7Ewsk",
276
+ "broker": "futu",
277
+ "brokerDisplay": "富途证券",
278
+ "time": "2025-05-28T05:39:10.743937+00:00",
279
+ "ex": null,
280
+ "cash": {
281
+ "type": "cash",
282
+ "currency": "USD",
283
+ "amount": 30877.499
284
+ }
285
+ }
286
+ ```
287
+
288
+
289
+ ### 持仓列表
290
+
291
+ GET /httptrading/api/{instanceId}/position/state
292
+
293
+ ```json lines
294
+ {
295
+ "type": "apiResponse",
296
+ "instanceId": "ggUqPZbSKuQ7Ewsk",
297
+ "broker": "futu",
298
+ "brokerDisplay": "富途证券",
299
+ "time": "2025-05-28T05:40:58.470655+00:00",
300
+ "ex": null,
301
+ "positions": [
302
+ {
303
+ "type": "position",
304
+ "broker": "futu",
305
+ "brokerDisplay": "富途证券",
306
+ "contract": {
307
+ "type": "contract",
308
+ "tradeType": "Securities",
309
+ "region": "US",
310
+ "ticker": "QQQ"
311
+ },
312
+ "unit": "Share",
313
+ "currency": "USD",
314
+ "qty": 2400
315
+ }
316
+ ]
317
+ }
318
+ ```
319
+
320
+
321
+ ### 下单
322
+
323
+ POST /httptrading/api/{instanceId}/order/place
324
+
325
+ 需要提交 json 格式的 Body, 其中的参数如下:
326
+
327
+ | 参数 | 说明 | 举例 |
328
+ |-------------|----------|--------------------------------------------------|
329
+ | tradeType | 说明标的的品种 | Securities: 证券 |
330
+ | ticker | 代码 | QQQ, 00700, 000001 |
331
+ | region | 以国家区分代码 | US, HK, CN |
332
+ | price | 限价 | 市价单不填此项 |
333
+ | qty | 订单数量, 整数 | |
334
+ | orderType | 订单类型 | Limit: 限价单<br>Market: 市价单 |
335
+ | timeInForce | 订单的有效期 | DAY: 日内<br>GTC: 撤销前有效 |
336
+ | lifecycle | 订单交易时段 | RTH: 正常交易时段<br>ETH: 正常交易时段+盘前盘后<br>OVERNIGHT: 夜盘 |
337
+ | direction | 买卖方向 | BUY, SELL |
338
+
339
+ 例如 Body 可以是这样:
340
+ ```json lines
341
+ {
342
+ "tradeType": "Securities",
343
+ "ticker": "AAPL",
344
+ "region": "US",
345
+ "price": 200.00,
346
+ "qty": 12,
347
+ "orderType": "Limit",
348
+ "timeInForce": "DAY",
349
+ "lifecycle": "ETH",
350
+ "direction": "BUY"
351
+ }
352
+ ```
353
+
354
+ 产生的响应:
355
+ ```json lines
356
+ {
357
+ "type": "apiResponse",
358
+ "instanceId": "ggUqPZbSKuQ7Ewsk",
359
+ "broker": "futu",
360
+ "brokerDisplay": "富途证券",
361
+ "time": "2025-05-28T06:01:23.575968+00:00",
362
+ "ex": null,
363
+ "orderId": "69788888", // 订单号
364
+ "args": { // 传递的参数
365
+ "tradeType": "Securities",
366
+ "ticker": "AAPL",
367
+ "region": "US",
368
+ "price": 200,
369
+ "qty": 12,
370
+ "orderType": "Limit",
371
+ "timeInForce": "DAY",
372
+ "lifecycle": "ETH",
373
+ "direction": "BUY"
374
+ }
375
+ }
376
+ ```
377
+
378
+ ### 撤单
379
+
380
+ POST /httptrading/api/{instanceId}/order/cancel
381
+
382
+ 需要提交 json 格式的 Body, 其中包含 orderId 字段来传递需要撤单的订单号码.
383
+
384
+ ```json lines
385
+ {
386
+ "type": "apiResponse",
387
+ "instanceId": "ggUqPZbSKuQ7Ewsk",
388
+ "broker": "futu",
389
+ "brokerDisplay": "富途证券",
390
+ "time": "2025-05-28T06:45:41.645855+00:00",
391
+ "ex": null // ex 字段将记录异常原因
392
+ }
393
+ ```
394
+
395
+
396
+ ### 查询单个订单
397
+
398
+ GET /httptrading/api/{instanceId}/order/state?orderId={订单号}
399
+
400
+ 接口会返回成交和订单状态相关的信息, 订单的更多信息, 需要在下单时自行保存.
401
+
402
+
403
+ ```json lines
404
+ {
405
+ "type": "apiResponse",
406
+ "instanceId": "ggUqPZbSKuQ7Ewsk",
407
+ "broker": "futu",
408
+ "brokerDisplay": "富途证券",
409
+ "time": "2025-05-28T05:59:29.984021+00:00",
410
+ "ex": null,
411
+ "order": {
412
+ "type": "order",
413
+ "orderId": "6278888",
414
+ "currency": "USD",
415
+ "qty": 12, // 订单数量
416
+ "filledQty": 0, // 已成交数量
417
+ "avgPrice": 0, // 成交价
418
+ "errorReason": "", // 如果订单异常, 这里记录错误信息
419
+ "isCanceled": false, // 是否已撤销
420
+ "isFilled": false, // 是否全部成交
421
+ "isCompleted": false // 全部成交 或者 有异常 或者 已撤销, 亦等价于不可撤的标志
422
+ }
423
+ }
424
+ ```
425
+
426
+ ```
427
+ 富途证券不支持查询单个订单. 意味着订单结束周期的交易日之后, 将查不到订单.
428
+ ```
429
+
430
+ 交易通道的参数
431
+ ------------
432
+
433
+ ### 富途证券
434
+
435
+ ```python
436
+ import httptrading
437
+ args = {
438
+ 'host': '127.0.0.1', # OpenD 地址
439
+ 'port': 12345, # OpenD 地址
440
+ 'trade_env': 'REAL', # 实盘填REAL, 模拟盘填SIMULATE
441
+ 'pk_path': '', # OpenD非本机部署需要填证书路径
442
+ # 实盘操作订单需要解锁密码
443
+ # https://openapi.futunn.com/futu-api-doc/trade/unlock.html
444
+ # 这里储存密码的md5值, 使用命令
445
+ # macos: md5 -s "123456"
446
+ # linux: echo -n "123456" | md5sum
447
+ 'unlock_pin': '',
448
+ }
449
+ broker = httptrading.Futu(args, ...)
450
+ ```
451
+
452
+ ### 长桥证券
453
+
454
+ ```python
455
+ import httptrading
456
+ args = {
457
+ 'app_key': '...',
458
+ 'app_secret': '...',
459
+ # 需要制作一个 token 文件供服务读写
460
+ # 具体情况见 httptrading/broker/longbridge.py
461
+ 'token_file': '...',
462
+ # 是否尝试自动刷新即将过期的 token
463
+ 'auto_refresh_token': True,
464
+ }
465
+ broker = httptrading.LongBridge(args, ...)
466
+ ```
467
+
468
+ ### 老虎证券
469
+
470
+ ```python
471
+ import httptrading
472
+ args = {
473
+ 'tiger_id': '...',
474
+ 'account': '...',
475
+ 'pk_path': '...',
476
+ }
477
+ broker = httptrading.Tiger(args, ...)
478
+ ```
479
+ ### 盈透证券(TWS方式)
480
+
481
+ ```python
482
+ import httptrading
483
+ args = {
484
+ 'host': '127.0.0.1',
485
+ 'port': 1234,
486
+ 'timeout': 8,
487
+ 'client_id': 123456, # TWS中设置的号码
488
+ 'account_id': 'U...', # U开头的账户号
489
+ }
490
+ broker = httptrading.InteractiveBrokers(args, ...)
491
+ ```
492
+
493
+ 开发自定义交易通道
494
+ ---------------
495
+
496
+ ```python
497
+ from httptrading import *
498
+ from httptrading.model import *
499
+
500
+
501
+ @broker_register('myApi', 'XX证券')
502
+ class MyTradingApi(BaseBroker):
503
+ # 根据需要的功能实现接口
504
+ # 如果 sdk 提供的方式会阻塞 eventloop, 需要使用 self.call_sync 方法传入阻塞方法
505
+ async def place_order(
506
+ self,
507
+ contract: Contract,
508
+ order_type: OrderType,
509
+ time_in_force: TimeInForce,
510
+ lifecycle: Lifecycle,
511
+ direction: str,
512
+ qty: int,
513
+ price: float = None,
514
+ **kwargs
515
+ ) -> str:
516
+ raise NotImplementedError
517
+
518
+ async def order(self, order_id: str) -> Order:
519
+ raise NotImplementedError
520
+
521
+ async def cancel_order(self, order_id: str):
522
+ raise NotImplementedError
523
+
524
+ async def positions(self) -> list[Position]:
525
+ raise NotImplementedError
526
+
527
+ async def cash(self) -> Cash:
528
+ raise NotImplementedError
529
+
530
+ async def ping(self) -> bool:
531
+ return True
532
+
533
+ async def quote(self, contract: Contract) -> Quote:
534
+ raise NotImplementedError
535
+
536
+ async def market_status(self) -> dict[str, dict[str, MarketStatus]]:
537
+ raise NotImplementedError
538
+ ```
@@ -0,0 +1,18 @@
1
+ httptrading/__init__.py,sha256=NIcpQPR6bj9_p0yN5RRaLvx5Q5zSfDekLp3fYLQY78A,258
2
+ httptrading/http_server.py,sha256=JlVwMSC_B6kYQWkoHYzD24jWgxUHr10NHa-IRpS7zOA,9633
3
+ httptrading/model.py,sha256=_j4NsBF5Ra5ach9ZMg_ZsBU6c57doYTOy7kKxHMaECo,3949
4
+ httptrading/broker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ httptrading/broker/base.py,sha256=UrCS2-PkwuNImow6bO4XacMqvFVS9cPmLXgi1PWy2BE,4622
6
+ httptrading/broker/futu.py,sha256=DfEYkIszxt386EMgQaAfwq28-uPKUGxyJjnSyGO8Qpw,15923
7
+ httptrading/broker/interactive_brokers.py,sha256=X-sCY-KSSw-hYMblbkomObrVY9AZe3AIUMFNZOPR7YA,11508
8
+ httptrading/broker/longbridge.py,sha256=alpPmPz_DbbWvg4SbL9-5WLpgzLHVk1SgXVcV6rOl4U,14139
9
+ httptrading/broker/tiger.py,sha256=ZoAA9jqvaN0ZgLcsUAD1eH00NS5QhjkfuMcdEnyK0Ss,13589
10
+ httptrading/tool/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ httptrading/tool/leaky_bucket.py,sha256=Bvab3Fkn16hhZ1-WLCFcPkbFH_bHHhQ9boLv8HrmGSE,2817
12
+ httptrading/tool/locate.py,sha256=vSIzd09FWKmckkgY3mWtFXQm2Z0VIKv4FCXHT44e61s,2748
13
+ httptrading/tool/time.py,sha256=7eVmZ_td72JLjsBRLjMOHklxltNbOxeN97uSLi7wvIA,2188
14
+ httptrading-1.0.0.dist-info/licenses/LICENSE,sha256=KfMSrfnpo-TOqpCTJqnbcZNl0w7ErxadsMQf8uas_tY,1093
15
+ httptrading-1.0.0.dist-info/METADATA,sha256=vGRvdxUVSC4w41amErpVcAdfyZpFrEaZcBk6hKP-i_w,15352
16
+ httptrading-1.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
17
+ httptrading-1.0.0.dist-info/top_level.txt,sha256=rsLGrGN6QubO9ILQRktwrWtxfGsGAmWUnQq7XksKu-4,12
18
+ httptrading-1.0.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 宋伟(songwei)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ httptrading