加密货币-量化交易系统

GitHub - ccxt/ccxt: cryptocurrency trading API with support for more than 100 bitcoin/altcoin exchanges 虽然ccxt本身不是一个完整的量化交易系统,而是一个交易所API接口的统一库,支持超过100个加密货币交易所。它为开发者提供了一套标准化的接口来交互各大交易所,非常适合构建自定义的量化交易系统。

GitHub - hummingbot/hummingbot: Open source software that helps you create and deploy high-frequency crypto trading bots Hummingbot是一个开源的算法交易机器人,专为加密货币市场设计。它支持多种交易策略,如做市、套利和跟随交易等,并且能够与众多主流交易所集成。

GitHub - DeviaVir/zenbot:Zenbot 是一个使用 Node.js 和 MongoDB 的命令行加密货币交易机器人。

GitHub - askmike/gekko:用节点编写的比特币交易机器人 - https://gekko.wizb.it/

GitHub - scrtlabs/catalyst: An Algorithmic Trading Library for Crypto-Assets in Python

CCXT(Cryptocurrency Exchange Trading Library)是一个非常受欢迎且功能强大的开源交易库,旨在为开发者提供一个统一的接口来接入全球范围内的多个加密货币交易所。以下是关于CCXT的详细信息:

  • 目的:CCXT的主要目标是简化加密货币交易的开发流程,使得获取市场数据、下单交易、账户管理等操作变得简单易行。它通过提供一个统一的API接口,使得开发者无需为每个交易所单独编写适配代码,大大节省了开发时间和成本。
  • 支持语言:CCXT目前支持Python、JavaScript和PHP三种主流编程语言,这意味着无论你使用哪种语言进行开发,都有可能通过CCXT与加密货币交易所进行交互。
  • 交易所覆盖:它支持超过100家加密货币交易所,涵盖了大多数知名和一些小众的交易平台,而且这个列表还在不断更新中,以适应快速变化的加密货币市场。
  • 功能特性:CCXT不仅支持市场数据的获取(如行情、订单薄、交易历史),还支持交易操作(如下单、取消订单、查询账户状态、资金管理等)。此外,它还具备API密钥管理、错误处理和异常报告等功能,有助于开发者安全高效地进行交易。
  • 统一接口:CCXT为所有支持的交易所提供了一致的API调用方式,这意味着一旦熟悉了CCXT的使用,你可以轻松切换到任何它支持的交易所,无需重新学习每个交易所特定的API。
  • 高级功能:除了基础的交易功能,CCXT还支持更高级的交易策略,如市场和限价订单、止盈止损订单等。
  • 社区与文档:CCXT拥有活跃的开发者社区,提供了丰富的文档、示例代码和教程,帮助开发者快速上手并解决问题。
  • 开源与可扩展:作为开源项目,CCXT鼓励社区贡献,你可以根据需要修改或扩展其功能,满足特定的交易需求。
  • 量化交易:是CCXT最广泛应用的场景之一,它为量化交易者提供了一个强大的工具,可以快速开发和测试交易策略。
  • 数据收集与分析:许多数据科学家和研究人员使用CCXT来收集加密货币市场数据,进行市场分析和预测。
1
pip install ccxt
1
2
import ccxt
print(ccxt.exchanges) # print a list of all available exchange classes

该库在 Python 3.7.0+ 中支持具有 asyncio 和 async/await 的并发异步模式

1
import ccxt.async_support as ccxt # link against the asynchronous version of ccxt

利用ccxt的公共 API 获取binance的ETH_USDT市场数据

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 导入ccxt库
import ccxt

##无代理初始化Binance交易所对象 binance = ccxt.binance()
# 代理服务器地址和端口
proxy = 'http://127.0.0.1:10819'

# 初始化Binance交易所对象,并设置代理  # 初始化Binance交易所对象,这里我们不提供API密钥和私钥,因为我们只是获取公共数据
binance = ccxt.binance({
    'proxies': {
        'http': proxy,
        'https': proxy,
    }
})

# 加载ETH/USDT市场数据
markets = binance.load_markets()

# 获取ETH/USDT的市场标识符,用于后续请求
market_symbol = binance.market('ETH/USDT')['symbol']

# 获取ETH/USDT的最新行情信息(ticker)
ticker = binance.fetch_ticker(market_symbol)

# 打印ETH/USDT的最新价格
print(f"ETH/USDT 最新价格: {ticker['last']}")

# 获取ETH/USDT的订单簿
order_book = binance.fetch_order_book(market_symbol)

# 打印ETH/USDT订单簿的前5个卖单和买单
print("ETH/USDT 订单簿 - 前5个卖单:")
for ask in order_book['asks'][:5]:
    print(f"价格: {ask[0]}, 数量: {ask[1]}")

print("\nETH/USDT 订单簿 - 前5个买单:")
for bid in order_book['bids'][:5]:
    print(f"价格: {bid[0]}, 数量: {bid[1]}")

利用ccxt的公共 API 获取binance的ETH_USDT 下面的信息 ,每个写成一个函数。需要获取的东西:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
"""
instruments/trading pairs
price feeds (exchange rates)
order books
trade history
tickers
OHLC(V) for charting
"""
def get_exchange_info():
    """获取交易所信息,包括所有交易对"""
    return binance.load_markets()

def get_ticker(symbol='ETH/USDT'):
    """获取指定交易对的最新价格信息"""
    return binance.fetch_ticker(symbol)

def get_order_book(symbol='ETH/USDT', limit=10):
    """获取指定交易对的订单簿,默认显示前10个深度"""
    return binance.fetch_order_book(symbol, limit)

def get_trade_history(symbol='ETH/USDT', limit=10):
    """获取指定交易对的最近交易历史,默认显示最近10条记录"""
    return binance.fetch_trades(symbol, limit)

def get_ohlcv(symbol='ETH/USDT', timeframe='1h', since=None, limit=100):
    """
    获取指定交易对的OHLCV数据,用于图表绘制。
    timeframe: 时间周期,如'1m', '5m', '1h', '1d'等。
    since: 获取OHLCV数据的起始时间戳(可选)。
    limit: 返回的数据条数限制(默认100,最大值取决于交易所)。
    """
    return binance.fetch_ohlcv(symbol, timeframe, since, limit)

def get_exchange_status():
    """获取交易所的状态信息"""
    return binance.fetch_status()

# 获取ETH/USDT的最新价格
ticker = get_ticker('ETH/USDT')
print(ticker)

加快处理,优化代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import asyncio
from ccxt.async_support import binance
import time

async def main():
    start_time = time.time()

    # 初始化Binance交易所对象
    exchange = binance({
        'enableRateLimit': True,  # 遵守ccxt的速率限制
    })

    # 加载ETH/USDT市场数据
    markets = await exchange.load_markets()

    # 获取ETH/USDT的市场标识符,用于后续请求
    market_symbol = exchange.market('ETH/USDT')['symbol']

    # 异步获取ETH/USDT的最新行情信息(ticker)
    ticker = await exchange.fetch_ticker(market_symbol)
    print(f"ETH/USDT 最新价格: {ticker['last']}")

    # 异步获取ETH/USDT的订单簿
    order_book = await exchange.fetch_order_book(market_symbol)

    # 打印ETH/USDT订单簿的前5个卖单和买单
    print("ETH/USDT 订单簿 - 前5个卖单:")
    for ask in order_book['asks'][:5]:
        print(f"价格: {ask[0]}, 数量: {ask[1]}")

    print("\nETH/USDT 订单簿 - 前5个买单:")
    for bid in order_book['bids'][:5]:
        print(f"价格: {bid[0]}, 数量: {bid[1]}")

    # 注意:下方的函数定义未修改,因为它们应该在异步上下文中被调用或重写为异步函数

    # 关闭交易所连接
    await exchange.close()

    end_time = time.time()
    print(f"执行时间:{end_time - start_time} 秒")

# 运行异步主函数
asyncio.run(main())
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
time python  public-eth-async.py 
ETH/USDT 最新价格: 2995.39
ETH/USDT 订单簿 - 前5个卖单:
价格: 2995.4, 数量: 6.7067
价格: 2995.44, 数量: 0.8203
价格: 2995.45, 数量: 1.3379
价格: 2995.5, 数量: 0.6699
价格: 2995.51, 数量: 0.0399

ETH/USDT 订单簿 - 前5个买单:
价格: 2995.39, 数量: 26.2894
价格: 2995.38, 数量: 2.8766
价格: 2995.35, 数量: 3.336
价格: 2995.34, 数量: 3.9316
价格: 2995.31, 数量: 0.0721
执行时间:2.6888670921325684 秒
1
{'symbol': 'ETH/USDT', 'timestamp': 1715165592564, 'datetime': '2024-05-08T10:53:12.564Z', 'high': 3106.0, 'low': 2978.4, 'bid': 3005.99, 'bidVolume': 3.6381, 'ask': 3006.0, 'askVolume': 74.2106, 'vwap': 3036.26648151, 'open': 3101.46, 'close': 3006.0, 'last': 3006.0, 'previousClose': 3101.45, 'change': -95.46, 'percentage': -3.078, 'average': 3053.73, 'baseVolume': 275326.9396, 'quoteVolume': 835965958.163883, 'info': {'symbol': 'ETHUSDT', 'priceChange': '-95.46000000', 'priceChangePercent': '-3.078', 'weightedAvgPrice': '3036.26648151', 'prevClosePrice': '3101.45000000', 'lastPrice': '3006.00000000', 'lastQty': '1.08230000', 'bidPrice': '3005.99000000', 'bidQty': '3.63810000', 'askPrice': '3006.00000000', 'askQty': '74.21060000', 'openPrice': '3101.46000000', 'highPrice': '3106.00000000', 'lowPrice': '2978.40000000', 'volume': '275326.93960000', 'quoteVolume': '835965958.16388300', 'openTime': '1715079192564', 'closeTime': '1715165592564', 'firstId': '1416144644', 'lastId': '1416939198', 'count': '794555'}}

这行数据看起来像是加密货币交易所中针对以太坊(ETH)兑美元稳定币(USDT)交易对的市场快照信息。以下是具体字段的解释:

  • symbol: 交易对标识符,这里是 ETH/USDT。
  • timestamp: 市场快照的 Unix 时间戳(毫秒)。
  • datetime: 相对应的 ISO 8601 格式的日期和时间。
  • high: 在统计期内的最高交易价格。
  • low: 在统计期内的最低交易价格。
  • bid: 买方出价(买一价),即市场上愿意支付的最高价格。
  • bidVolume: 与最高买价相对应的以太坊数量。
  • ask: 卖方报价(卖一价),即市场上愿意接受的最低价格。
  • askVolume: 与最低卖价相对应的以太坊数量。
  • vwap: 成交量加权平均价格。
  • open: 统计时间段开始时的交易价格。
  • close: 统计时间段结束时的交易价格(也是最新的交易价格)。
  • last: 最新成交价格。
  • previousClose: 上一个统计时间段结束时的价格。
  • change: 价格变化量(close - open)。
  • percentage: 百分比格式的价格变化。
  • average: 开盘价和收盘价的平均值。
  • baseVolume: 在统计时间段内交易的以太坊数量。
  • quoteVolume: 与 baseVolume 对应的 USDT 交易量。
  • info: 包含原始交易信息的对象,与上述大多数字段重复。

此行数据提供了 ETH/USDT 交易对在一个特定时间段内的交易信息,如价格变动、交易量等重要市场指标。这对于交易者、分析师和投资者来说是有价值的信息,


下面代码改下从binance 平台进行, 利用 proxy = ‘http://127.0.0.1:10819’ API密钥和私钥. 处理的对象是 ETH_USDT 。并且支持卖出和限价买入。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# coding=utf-8
import ccxt

# 代理服务器配置
proxy = 'http://127.0.0.1:10819'

# 初始化Binance交易所对象,设置API密钥、私钥及代理
exchange = ccxt.binance({
    'apiKey': 'YOUR_BINANCE_API_KEY',
    'secret': 'YOUR_BINANCE_SECRET',
    'proxies': {
        'http': proxy,
        'https': proxy,
    },
})

# 加载Binance的市场数据
try:
    markets = exchange.load_markets()
except ccxt.NetworkError as e:
    print(f"网络错误: {e}")
except Exception as e:
    print(f"其他错误: {e}")

# 打印Binance的ID和市场数据
print(exchange.id, markets)

# 获取ETH/USDT的订单簿
try:
    order_book = exchange.fetch_order_book('ETH/USDT')
    print("ETH/USDT的订单簿:", order_book)
except Exception as e:
    print(f"获取订单簿时出错: {e}")

# 获取ETH/USDT的最新价格
try:
    ticker = exchange.fetch_ticker('ETH/USDT')
    print("ETH/USDT的最新价格:", ticker['last'])
except Exception as e:
    print(f"获取最新价格时出错: {e}")

# 获取ETH/USDT的交易历史
try:
    trades = exchange.fetch_trades('ETH/USDT')
    print("ETH/USDT的交易历史:", trades[:5])  # 只打印最近5笔交易
except Exception as e:
    print(f"获取交易历史时出错: {e}")

# 注意: 以下为示例代码,实际执行交易操作前请确保已替换占位符为真实API密钥和私钥,
# 并且理解相关风险。这里不执行实际交易操作以避免误操作。
#  卖出一个ETH以市价换取美元
#  print(exchange.id, exchange.create_market_sell_order('ETH/USDT', 1))

#  限价买入,支付2500美元购买1个ETH
#  print(exchange.id, exchange.create_limit_buy_order('ETH/USDT', 1, 2500.00))

下面是对您提供的代码的逐行注释解释:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# 指定文件编码为UTF-8
# coding=utf-8

# 导入ccxt库
import ccxt

# 初始化HitBTC交易所对象,并设置verbose模式(输出更多调试信息)
hitbtc = ccxt.hitbtc({'verbose': True})

# 初始化BitMEX交易所对象
bitmex = ccxt.bitmex()

# 初始化火币Pro(Huobi Pro)交易所对象
huobipro = ccxt.huobipro()

# 初始化Exmo交易所对象,设置API密钥和私钥
exmo = ccxt.exmo({
    'apiKey': 'YOUR_PUBLIC_API_KEY',
    'secret': 'YOUR_SECRET_PRIVATE_KEY',
})

# 初始化Kraken交易所对象,同样设置API密钥和私钥
kraken = ccxt.kraken({
    'apiKey': 'YOUR_PUBLIC_API_KEY',
    'secret': 'YOUR_SECRET_PRIVATE_KEY',
})

# 动态获取Binance交易所类并初始化对象
exchange_id = 'binance'
exchange_class = getattr(ccxt, exchange_id)
exchange = exchange_class({
    'apiKey': 'YOUR_API_KEY',
    'secret': 'YOUR_SECRET',
})

# 加载HitBTC的市场数据
hitbtc_markets = hitbtc.load_markets()

# 打印交易所ID和市场数据
print(hitbtc.id, hitbtc_markets)

# 同样打印BitMEX和火币Pro的ID及市场数据
print(bitmex.id, bitmex.load_markets())
print(huobipro.id, huobipro.load_markets())

# 获取HitBTC的某个交易对的订单簿
print(hitbtc.fetch_order_book(hitbtc.symbols[0]))

# 获取BitMEX的BTC/USD的行情信息
print(bitmex.fetch_ticker('BTC/USD'))

# 获取火币Pro的LTC/USDT的交易记录
print(huobipro.fetch_trades('LTC/USDT'))

# 打印Exmo交易所的账户余额
print(exmo.fetch_balance())

# 在Exmo上以市价单卖出1个比特币
print(exmo.id, exmo.create_market_sell_order('BTC/USD', 1))

# 在Exmo上发出限价买单,以2500欧元购买1个比特币
print(exmo.id, exmo.create_limit_buy_order('BTC/EUR', 1, 2500.00))

# 在Kraken交易所发出一个带有额外参数的市价买入订单
# 注意这里的额外参数('trading_agreement': 'agree')是交易所特定的
kraken.create_market_buy_order('BTC/USD', 1, {'trading_agreement': 'agree'})

这段代码展示了如何使用CCXT库初始化多个加密货币交易所的对象,加载市场数据,获取订单簿、行情、交易记录、账户余额,以及如何在Exmo和Kraken交易所上下单。请注意,在实际使用中,您需要将'YOUR_PUBLIC_API_KEY''YOUR_SECRET_PRIVATE_KEY'以及交易对等占位符替换为您自己在相应交易所的真实凭据和正确的交易对名称。

python-binance CCXT Binance Connector


币安Python API简明教程 (defiplot.com)

binancefuture https://testnet.binancefuture.com

lfzwyc@gmail.com tong81*K

1
2
3
4
API Key
0b8e6d7f81c3e01224bde98a8444024462f55e5c52e6d9708a935a9048ea65d5
API Secret
aebe0a64108b49f159c43a78fd276c1087db2cd308e48440f79ed4c3f3a8fc37

https://testnet.binance.vision/ github Logged in as test user 1715260059400324628

python-binance 使用ok

Save these values right now. They won’t be shown ever again!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20

Step 1: Generate the private key test-prv-key.pem. Do not share this file with anyone!
openssl genrsa -out test-prv-key.pem 2048

Step 2: Generate the public key test-pub-key.pem from the private key.
openssl rsa -in test-prv-key.pem -pubout -outform PEM -out test-pub-key.pem

得到
API Key: 0V1PQqJHSUp3lYMXLhgrEFZDTQbUnJTncCXxqtKPMtnxhpq26e8zEIg8QHjJRG1r
Public key: (for reference)

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6gz1j7V86iqwf3I9qwFS
Asbuo1HYHgY1iccANSnKtU9LCO6DEmJiT4xjgikDVNTHWzyOKXyDugFuSK1i6lE6
Y/FFyjlX3Tmk76ntHRIsVM385yQ2sUvK6F0e4dNlL7x4+lXXtbwPPoagF6mi/zTg
WrkKPE57ArL64Tm77G18GRbnvSIr4SfOLb2t5BoWuVQtXgmM3bzKbhLbT+hyTAVw
UgUMo9v2IkewZnqd77Q1VbWgy7WMle1RCgEhL5lO31cz7x9JUszps5LfcmfzrlWY
c5hNrCe94r+KM9aXpB9Eq6WgWDihtROgLlI0vCbJivvcorNwo/XWAOkdXUwG/gUy
qQIDAQAB
-----END PUBLIC KEY-----

买与卖

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
## https://testnet.binance.vision/
export binance_api="5nV9ChLDDCSgIPkNWpBrKJlKQOMdIleOjSdYp1gvvRCAaF5L9gZtRx20RM8CMxQ8"
export binance_secret="5xHbdWenlYBF8FwU4FtiKQfjcUl8EG3XmIpmuEmajptVoZe7tyxBMTZmblIrrO0K"

## ls https://testnet.binancefuture.com/
export binance_api="0b8e6d7f81c3e01224bde98a8444024462f55e5c52e6d9708a935a9048ea65d5"
export binance_secret="aebe0a64108b49f159c43a78fd276c1087db2cd308e48440f79ed4c3f3a8fc37"

import os
from binance.client import Client

# 初始化 init
api_key = os.environ.get('binance_api')
api_secret = os.environ.get('binance_secret')
client = Client(api_key, api_secret)
client.API_URL = 'https://testnet.binance.vision/api'
 

## 查看账号信息 余额 assets
# get balances for all assets & some account information
print(client.get_account())

# get balance for a specific asset only (BTC)
print(client.get_asset_balance(asset='BTC'))
print(client.get_asset_balance(asset='ETH'))
 
# get balances for futures account
print(client.futures_account_balance())

# get balances for margin account
print(client.get_margin_account())


## 查看最symbol新价格  get_symbol_ticker

# get latest price from Binance API
btc_price = client.get_symbol_ticker(symbol="BTCUSDT")
# print full output (dictionary)
print(btc_price)
print(btc_price["price"])
eth_price = client.get_symbol_ticker(symbol="ETHUSDT")
print(client.get_symbol_ticker(symbol="ETHUSDT")["price"])



## WebSocket 查看最symbol新价格
from time import sleep
from binance import ThreadedWebsocketManager

btc_price = {'error':False}

def btc_trade_history(msg):
     if msg['e'] != 'error':
             print(msg['c'])
             btc_price['last'] = msg['c']
             btc_price['bid'] = msg['b']
             btc_price['last'] = msg['a']
             btc_price['error'] = False
     else:
             btc_price['error'] = True

# init and start the WebSocket
bsm = ThreadedWebsocketManager()
bsm.start()

# subscribe to a stream
bsm.start_symbol_ticker_socket(callback=btc_trade_history, symbol='BTCUSDT')

bsm.start_symbol_ticker_socket(callback=btc_trade_history, symbol='ETHUSDT')

# stop websocket
bsm.stop()

help(ThreadedWebsocketManager)

start_symbol_ticker_socket

## CSV  history 导出
# valid intervals - 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M

# get timestamp of earliest date data is available
timestamp = client._get_earliest_valid_timestamp('BTCUSDT', '1d')
print(timestamp)

# request historical candle (or klines) data
bars = client.get_historical_klines('BTCUSDT', '1d', timestamp, limit=1000)

# option 1 - save to file using json method
with open('btc_bars.json', 'w') as e:
    json.dump(bars, e)
	
timestamp = client._get_earliest_valid_timestamp('BTCUSDT', '1d')
print(timestamp)
bars = client.get_historical_klines('BTCUSDT', '1d', timestamp, limit=1000)
# delete unwanted data - just keep date, open, high, low, close
for line in bars:
    del line[5:]
		
# option 4 - create a Pandas DataFrame and export to CSV
btc_df = pd.DataFrame(bars, columns=['date', 'open', 'high', 'low', 'close'])
btc_df.set_index('date', inplace=True)
print(btc_df.head(30))

# export DataFrame to csv
btc_df.to_csv('btc_bars3.csv')


## 20 SMA

import btalib
import pandas as pd

# load DataFrame
btc_df = pd.read_csv('btc_bars3.csv', index_col=0)
btc_df.set_index('date', inplace=True)
btc_df.index = pd.to_datetime(btc_df.index, unit='ms')

# calculate 20 moving average using Pandas
btc_df['20sma'] = btc_df.close.rolling(20).mean()
print(btc_df.tail(5))


##  order
print(client.get_symbol_ticker(symbol="ETHUSDT")["price"])
print(client.get_asset_balance(asset='ETH'))
   
# buy 
## 限价买 
buy_order_limit = client.create_order(
    symbol='ETHUSDT',
    side='BUY',
    type='LIMIT',
    timeInForce='GTC',
    quantity=0.01,
    price=3036)

## 现价买 	
buy_order = client.create_order(symbol='ETHUSDT', side='BUY', type='MARKET', quantity=0.01)
print(client.get_asset_balance(asset='ETH'))
print(client.get_symbol_ticker(symbol="ETHUSDT")["price"])

---
# 封装 限价买 
import os
from binance.client import Client
from binance.enums import *
from binance.exceptions import BinanceAPIException, BinanceOrderException
 
api_key = os.environ.get('binance_api')
api_secret = os.environ.get('binance_secret')
client = Client(api_key, api_secret)
client.API_URL = 'https://testnet.binance.vision/api'


try:
	buy_limit = client.create_order(
		symbol='ETHUSDT',
		side='BUY',
		type='LIMIT',
		timeInForce='GTC',
		quantity=0.26,
		price=3049)
except BinanceAPIException as e:
    print(e)
except BinanceOrderException as e:
    print(e)

## 查看自己的交易历史
import pandas as pd
trades_df = pd.DataFrame(client.get_my_trades(symbol='ETHUSDT')).sort_values(by='time', ascending=False)
print(trades_df.head(10).to_csv(index=False))
print(client.get_symbol_ticker(symbol="ETHUSDT")["price"], client.get_asset_balance(asset='ETH'), client.get_open_orders()) # 查看eth最新价格,余额,未完成的订单。

"""
import pandas as pd

# 获取特定交易对的成交历史 
trades = client.get_my_trades(symbol='ETHUSDT')

#print(trades)
trades_df = pd.DataFrame(trades)

# 打印前20条记录 print(trades_df.head(20).to_csv(index=False))

trades_df_sorted = trades_df.sort_values(by='time', ascending=False)

# 获取最新的前10条记录
top_trades = trades_df_sorted.head(10)

# 输出最新前10条记录的CSV格式,不包括索引
print(top_trades.to_csv(index=False))
"""
	
---

#sell 
## 限价卖 limit sell
sell_order_limit = client.create_order(
    symbol='ETHUSDT',
    side='sell',
    type='LIMIT',
    timeInForce='GTC',
    quantity=0.01,
    price=3045)
print(client.get_symbol_ticker(symbol="ETHUSDT")["price"]) # 获取eth 当前价格
print(client.get_asset_balance(asset='ETH'))  # 获取eth余额(可自由交易的量)。
print(client.get_open_orders())        #获取未完成的订单

## 现价卖 market_sell
market_order = client.order_market_sell(symbol='ETHUSDT', quantity=0.01)
## ls order = client.create_order(symbol='ETHUSDT', side='SELL', type='MARKET', quantity=0.01)

---
##BTC 在5分内波动5%时,如何执行 ETH 交易? 
v0

import os
from time import sleep

import pandas as pd
from binance import ThreadedWebsocketManager
from binance.client import Client

# init
api_key = os.environ.get('binance_api')
api_secret = os.environ.get('binance_secret')
client = Client(api_key, api_secret)
price = {'BTCUSDT': pd.DataFrame(columns=['date', 'price']), 'error': False}


def btc_pairs_trade(msg):
    ''' define how to process incoming WebSocket messages '''
    if msg['e'] != 'error':
        price['BTCUSDT'].loc[len(price['BTCUSDT'])] = [pd.Timestamp.now(), float(msg['c'])]
    else:
        price['error'] = True

# init and start the WebSocket
bsm = ThreadedWebsocketManager()
bsm.start()
bsm.start_symbol_ticker_socket(symbol='BTCUSDT', callback=btc_pairs_trade)

## main
while len(price['BTCUSDT']) == 0:
    # wait for WebSocket to start streaming data
    sleep(0.1)

sleep(300)

while True:
    # error check to make sure WebSocket is working
    if price['error']:
        # stop and restart socket
        bsm.stop()
        sleep(2)
        bsm.start()
        price['error'] = False
    else:
        df = price['BTCUSDT']
        start_time = df.date.iloc[-1] - pd.Timedelta(minutes=5)
        df = df.loc[df.date >= start_time]
        max_price = df.price.max()
        min_price = df.price.min()
        if df.price.iloc[-1] < max_price * 0.95:
            try:
                order = client.futures_create_order(symbol='ETHUSDT', side='SELL', type='MARKET', quantity=1)
                break
            except Exception as e:
                print(e)

        elif df.price.iloc[-1] > min_price * 1.05:
            try:
                order = client.futures_create_order(symbol='ETHUSDT', side='BUY', type='MARKET', quantity=1)
                break
            except Exception as e:
                print(e)

    sleep(0.1)
# properly stop and terminate WebSocket
bsm.stop()

Binance Connector 报错

https://testnet.binance.vision/


CCXT

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Private APIs allow the following:

manage personal account info
query account balances
trade by making market and limit orders
deposit and withdraw fiat and crypto funds
query personal orders
get ledger history
transfer funds between accounts
use merchant services

交易trading

取款withdrawals 不打勾

期货future 不打勾

restrict accesss to trusted ips only 选择

数据的准确度是否正确呢? 具体看这些【每日波动率 分钟时间段波动率 涨跌幅 成交量 价格阈值】

https://wd-jishu.oss-cn-hangzhou.aliyuncs.com/img/image-20240525174825607.png@!full

加密货币领域的量化交易系统是指应用数学模型、统计学方法以及算法策略,在加密货币市场上自动执行交易决策的过程。与传统金融市场上的量化交易类似,加密货币量化交易的核心目标是通过程序化交易策略来发现并利用市场机会,以实现盈利或风险管理。

加密货币市场的24小时不间断交易特性、高波动性以及全球性访问的便利性,为量化交易提供了丰富的应用场景。量化交易系统在加密货币市场中可能包含以下几个关键组成部分:

  1. 数据获取与处理:收集和清洗市场数据(如价格、交易量、订单薄等),这些数据是量化策略的基础。加密货币交易所通常通过API提供实时和历史数据。
  2. 策略开发:设计并测试交易策略,这些策略可以基于技术指标、统计套利、市场情绪、机器学习预测等多种方法。策略需要在历史数据上回测以验证其有效性。
  3. 执行引擎:将策略转化为可执行的交易指令,自动下单、平仓等操作,要求低延迟且准确无误。
  4. 风险管理:设定止损止盈规则,控制仓位大小,确保策略执行符合风险偏好,防止极端市场条件下的重大损失。
  5. 性能监控与优化:持续监控策略表现,根据市场变化调整策略参数,剔除失效策略,开发新的交易模型。

量化交易系统的优势在于能够迅速响应市场变化,减少人为情绪影响,实现全天候交易,以及通过多样化的策略组合来分散风险。然而,它也面临着模型过拟合、市场适应性、技术与监管风险等挑战。

使用CCXT库构建量化交易系统涉及几个核心步骤,下面是一个简化的流程,以帮助你开始构建自己的加密货币量化交易系统:

首先,确保安装了CCXT库。在Python中,你可以通过pip安装:

Bash

1
1pip install ccxt

选择你想要交易的交易所,并初始化一个实例。这里以Binance为例:

Python

1
2
3
4
5
6
7
1import ccxt
2
3exchange = ccxt.binance({
4    'apiKey': 'YOUR_API_KEY',
5    'secret': 'YOUR_SECRET',
6    'enableRateLimit': True,  # 遵守CCXT的速率限制
7})

加载交易所的市场数据,以便获取交易对的详细信息。

Python

1
1markets = exchange.load_markets()

根据市场数据和你的策略逻辑,设计交易信号生成器。这可能包括技术分析、基本面分析、机器学习模型等。

获取实时或历史数据,用于策略回测或实时交易决策。例如,获取最新的ticker信息:

Python

1
1ticker = exchange.fetch_ticker('BTC/USDT')

根据策略生成的信号,执行买入或卖出操作。例如,创建一个限价单:

Python

1
1order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.01, 50000)

实施风险管理策略,如设置止损、止盈订单,监控账户余额和持仓情况,确保交易活动符合预定的风险水平。

Python

1
1balance = exchange.fetch_balance()

在实际交易之前,使用历史数据对你的策略进行回测,评估其在不同市场条件下的表现。

部署你的策略到实时交易环境中,持续监控交易状态,根据市场变化和策略反馈进行调整。

记录交易活动,包括交易日志、性能报告,便于分析和审计。

量化交易系统的核心指标覆盖了多个方面,包括策略制定、风险管理、以及业绩评估等关键环节。以下是一些最为重要的量化交易系统指标:

  1. 收益率 (Return): 这是最直观的衡量标准,反映了策略在一段时间内的总盈利情况。通常会用年化收益率来比较不同时间跨度的绩效。
  2. 最大回撤 (Maximum Drawdown): 衡量资金从最高点跌落到最低点的幅度,用来评估策略在不利市场条件下的风险承受能力。较小的最大回撤意味着策略在下跌期间能较好地控制损失。
  3. 夏普比率 (Sharpe Ratio): 用来衡量每单位风险所带来的超额回报。较高的夏普比率表明策略在考虑风险后,能获得更好的回报。
  4. 索提诺比率 (Sortino Ratio): 类似于夏普比率,但只考虑下行风险,更适合评估对负面波动敏感的策略。
  5. 盈亏比 (Profit-Loss Ratio): 或称为赢率,即平均盈利交易的收益与平均亏损交易的损失之比,体现了策略盈利能力的一个方面。
  6. 胜率 (Win Rate): 成功交易次数占总交易次数的比例,反映策略选择正确方向的能力。
  7. 交易频率 (Trade Frequency): 指单位时间内执行交易的次数,影响成本和执行效率。
  8. 资金管理 (Position Sizing and Risk Management): 如凯利公式等,用于决定每次交易的资金分配,以优化风险调整后的收益。
  9. 市场适应性 (Robustness): 指策略在不同市场环境下的稳定性和适应能力,通常通过在不同时间段、不同市场数据上的回测来评估。
  10. 交易成本 (Transaction Costs): 包括手续费、滑点等,直接影响策略的净收益,必须在策略设计中予以考虑。
  11. 回测与外推误差 (Backtest vs. Out-of-Sample Performance): 回测表现与实际交易表现之间的差异,用于检验策略在未来市场的适用性。
  12. alpha与beta: alpha衡量策略相对于市场基准的超额收益,而beta则反映了策略相对市场的系统性风险。

构建量化交易系统时,综合考虑这些指标并优化策略参数,以达到风险可控、收益可期的目标。同时,不断监控和调整这些指标,以确保系统在不断变化的市场环境中保持竞争力。

在加密货币里面 尤其eth-usdt 推荐几个可靠的高收益率的交易策略

在加密货币交易中,特别是针对ETH/USDT这样的交易对,设计高收益率的交易策略时,需要结合技术分析、市场情绪、基本面分析及风险管理。请注意,任何策略都不能保证绝对的高收益,且加密市场波动极大,风险也相应较高。以下是一些常见的交易策略思路,但请在实际应用前做好充分的测试和风险评估:

  1. 趋势跟踪策略
    • 利用移动平均线(如50天和200天均线)来识别趋势,并在价格突破这些均线时开仓。
    • 结合动量指标(如RSI或MACD)确认趋势强度,当指标显示超买或超卖时调整仓位。
  2. 网格交易
    • 在一定价格区间内设定多个买入和卖出价位,利用ETH/USDT的波动性自动低买高卖。
    • 需要合理设置网格间距和资金分配,避免单边行情导致大量未成交订单。
  3. 对冲策略
    • 利用相关性较低的资产(如BTC或其他稳定币对)进行对冲,减少ETH价格波动的影响。
    • 可以通过期权或期货市场进行更复杂的对冲操作。
  4. 套利策略
    • 在不同的交易所之间寻找ETH/USDT的价格差,迅速低买高卖赚取差价。
    • 考虑到滑点和转账时间,此策略需要自动化工具和高速网络支持。
  5. 波段交易
    • 分析历史价格图表,识别支撑位和阻力位,区间内低吸高抛。
    • 结合成交量和其他技术指标,判断波段转折点,适时入场出场。
  6. 算法交易
    • 使用智能算法根据预设规则自动执行交易,比如基于机器学习预测市场走势。
    • 需要较强的技术背景和持续的数据优化。

重要提示:在实施上述任何策略之前,务必做好风险管理,包括但不限于设置止损点、控制仓位大小、定期评估策略效果并根据市场变化调整策略。此外,考虑到加密市场的高度波动性和不确定性,建议仅投入可承受损失的资金。在制定具体策略时,也可以参考最新的市场分析、新闻动态和技术指标,以做出更为精准的决策。

加密货币里面你觉得常用的,成熟的,盈利概率高的 趋势跟踪策略有哪些?

在加密货币市场中,趋势跟踪策略是一种广泛采用的方法,旨在识别并跟随市场的主要趋势,以实现盈利。以下是一些常用的、较为成熟且有较高盈利概率的趋势跟踪策略:

  1. 移动平均线(Moving Averages, MA)策略
    • 简单移动平均(SMA):计算一定周期内的平均价格,当短期均线上穿长期均线时视为买入信号,反之则卖出。
    • 指数移动平均(EMA):赋予最近数据更多权重,反应更快,同样可以设置短期与长期均线交叉作为买卖信号。
    • 布林带(Bollinger Bands):结合了移动平均线和标准差,当价格突破上轨可能预示上升趋势,突破下轨可能预示下降趋势。
  2. 相对强弱指数(Relative Strength Index, RSI)
    • 通过比较资产的涨跌幅度来判断超买或超卖状态,通常RSI低于30被视为买入时机,高于70则是卖出时机。
  3. MACD(Moving Average Convergence Divergence)
    • 利用快速和慢速移动平均线的差异来判断市场趋势变化,当MACD线(快速线)上穿信号线(慢速线)时为买入信号,反之则卖出。
  4. 动量指标(Momentum)
    • 测量价格变动的速度,当价格上升速度加快,动量值增加,视为买入信号;下降则视为卖出信号。
  5. 斐波那契回撤与扩展
    • 用于确定潜在的支持和阻力水平,基于市场价格走势的自然比例,可以帮助识别趋势的延续或反转点。
  6. Ichimoku Cloud(一目均衡图)
    • 提供了一套综合的市场分析框架,包括云层、转换线、基准线等,帮助识别趋势、支撑与阻力。
  7. 趋势线与通道
    • 通过手动绘制趋势线来识别价格的上升或下降趋势,通道策略则是在趋势内利用上下边界作为买卖依据。
  8. Donchian Channels(唐奇安通道)
    • 基于过去一段时间内的最高价和最低价来定义上下边界,突破上边界视为买入,突破下边界视为卖出。

这些策略的成功在于正确识别并适应市场条件,以及合理设置参数和风险管理措施。没有任何单一策略能保证持续盈利,因此许多交易者会结合多种策略,并结合基本面分析和技术指标,同时严格控制风险,实施止损和资金管理规则。在实践中,持续监控市场动态、灵活调整策略,并进行适当的回测和实时测试是非常重要的。

给个实例,用ccxt 利用https://testnet.binance.vision/ 的 HMAC-SHA-256 Key registered API Key,Secret Key .构建量化交易系统。


selenium 与drissionpage 区别 哪个好。rpc 与rpa 区别 哪个好

Selenium 和 DrissionPage 都是用于自动化网页浏览器操作的工具库,但它们在设计理念、使用场景和功能特性方面存在一些区别。下面对这两个工具的主要特点进行比较,以帮助您根据实际需求选择合适的工具。

优点:

  1. 广泛的社区支持:Selenium 作为一个成熟的开源项目,拥有庞大的社区和广泛的资源,可以帮助解决各种问题。
  2. 跨浏览器兼容性:Selenium 支持几乎所有主流的浏览器,如 Chrome、Firefox、Edge 和 Safari,这使得它非常适合进行跨浏览器测试。
  3. 灵活性:Selenium 提供了对浏览器的底层控制,允许执行复杂的操作和集成。

缺点:

  1. 学习曲线:由于其功能强大,新手可能需要一段时间来学习如何有效地使用 Selenium。
  2. 资源消耗:Selenium 控制的是真实的浏览器实例,可能会占用较多的系统资源。

优点:

  1. 灵活的驱动管理:DrissionPage 可以灵活切换和管理无头浏览器和有头浏览器,使得网页操作更加高效。
  2. 简化操作:DrissionPage 旨在简化网页操作,如抓取和自动化任务,提供了更简单直观的 API,降低了使用的复杂度。
  3. 资源消耗较少:在无头模式下,DrissionPage 可以相比全功能浏览器占用更少的系统资源。

缺点:

  1. 社区和资源:相比于 Selenium,DrissionPage 的使用者较少,可能意味着寻找帮助和资源较为困难。
  2. 功能性:虽然对于大多数自动化任务来说已经足够,但 DrissionPage 在功能上可能不如 Selenium 灵活和全面。

选择哪个工具取决于您的具体需求:

  • 如果您需要进行复杂的网页自动化,尤其是涉及多种浏览器的自动化测试,那么 Selenium 可能是更好的选择,因为它提供了广泛的支持和高度的灵活性。
  • 如果您的项目主要是网页数据抓取和一些基本的网页操作,且希望操作简单、资源消耗低,那么 DrissionPage 可能更符合您的需求。

实际上,许多项目可能会根据不同的场景和需求,同时使用这两个工具来发挥各自的优势。

跟单交易|轻松复制专业交易者的交易策略,实现加密货币收益最大化|币安 (binance.com)

随机文章