在今天的指南中,我们将使用Python、PostgreSQL、Docker和CoinGecko APIDocker允许我们将应用程序及其依赖项打包到一个轻量级、可移植的容器中,该容器几乎可以部署在任何机器和操作系统上。
什么是加密货币纸币交易?
加密货币的纸面交易涉及模拟没有真实货币的交易,以测试策略;练习交易并跟踪绩效;在无风险的环境中。通过基于实时市场数据跟踪假设的损益,用户可以在投入实际资金之前建立信心。
纸币交易机器人是加密货币纸币交易的延伸——它们会自动代表您执行交易,但它们不会在实时交易所下真正的订单,而是在本地被嘲笑 ;在当前市场条件下尝试新策略时,这尤其有用。
先决条件
在我们开始之前,您需要以下工具:
- Python 3.10+
- IDE
- Docker
- Postgres
- WSL 2(仅限Windows)
演示API是免费使用的,并且足以满足我们的目的。创建您的CoinGecko帐户,前往开发人员仪表板,然后单击+添加新密钥生成您的演示API密钥。跟随本指南有关生成和设置密钥的更多信息。
步骤1。设置;你的Python环境
让我们从创建一个干净的Python虚拟环境并安装所需的依赖项开始。在空目录中,运行以下命令:
激活环境后,我们现在可以安装依赖项。因为我们在虚拟环境中运行,所以我们的需求只会在本地安装,不会影响全局Python解释器。
在项目目录的根目录下,创建一个名为需求.txt并粘贴以下要求:
要安装它们,只需运行pip安装-r要求.txt
;从终端或命令提示符。
步骤2。创建和导入配置
首先创建一个.env文件并定义以下变量:
CG_API_KEY公司是粘贴CoinGecko API密钥的位置。这个数据库URL变量保存PostgreSQL数据库的连接字符串,而其余变量是我们的机器人将使用的配置选项。
这些可以根据您的要求进行调整。这里要注意的一件事是价格变更变量。这代表了我们的纸质交易机器人在1小时内必须达到的最低百分比价格变化,才能下买入订单。这是我们逻辑的核心。
现在,要将这些设置导入到我们的应用程序中,请继续创建一个名为utils;在此目录中,创建一个名为的新文件;load_env.py;
为了保持有序,我们将把配置变量加载到此文件中,然后;每次我们需要访问它们时都导入此文件:
步骤3。创建项目结构
在构建我们的机器人之前,以下是对项目结构的快速概述:
现在就创建这些吧,因为这个项目结构将作为构建我们的纸质交易机器人的基础。
步骤4。创建模型
模型表示应用程序数据的结构——;它定义了实体(如用户、交易或投资组合项)的属性(字段)和关系,并充当相应数据库表的蓝图。
为了连接到我们的数据库,我们使用SQLAlchemy——一个强大而灵活的对象关系映射(ORM)库。SQLAlchemy充当Python代码和数据库之间的桥梁,使我们能够将数据库记录作为Python对象进行处理 ;
我们可以使用Python的内置类型系统来定义这些模型,而不是编写原始SQL查询;以更干净、更可维护的方式与数据库交互。
纸质交易机器人就是测试和衡量不同的策略和变化。一个结构良好的数据库对于实现这一目的至关重要,因为它使我们能够高效地存储和查询与交易、市场状况和策略绩效相关的大量数据。
Under数据访问/模型,让我们继续创建一个名为base.py。这样我们就可以为数据库模型定义一个通用的Base对象,用于构建所需的各种表。
创建硬币数据模型
我们现在可以开始定义我们的模型了。在同一目录中,继续创建一个名为的新文件coin.py。这就是我们定义我们的硬币型号:
在这里,我们定义了两个单独的模型——一个用于名为硬币还有一张桌子叫硬币价格。除了存储硬币的当前价格外,我们还想开始收集历史数据。为了实现这一点,我们将为硬币价格条目创建一个专用表。
硬币表存储数据库ID以及coin_id,这是由使用的唯一标识符CoinGecko API.此coin_id 在获取特定硬币的数据时至关重要。除了coin_id,我们还存储了硬币的符号和realized_pnl;价值,它将跟踪我们的机器人为该特定硬币所做的整体损益。
创建订单模型
在同一目录中,继续创建一个名为paper_order.py我们将在那里定义Order对象。
由于我们正在构建一个纸质交易机器人,我们将创建一个模拟订单对象;使用我们可能期望从交换订单中获得的公共字段,例如购买价格, 数量, 符号;以及我们贸易的方向。
创建投资组合模型
我们正在创建的最终模型定义了我们的Portfolio对象及其相关字段。在同一个数据访问/模型目录,创建一个名为的新文件portfolio_item.py.
在这个文件中,我们将定义两个对象:PnLEntry以及a投资组合项目.
我们将使用PnLEntry捕获投资组合绩效的定期快照,将每个快照链接到特定的投资组合项目。例如,您的总计比特币从所有比特币交易中积累的资产将归入您的比特币投资组合项目。该算法将每小时读取您的PnL,并相应地更新PnL条目 ;
这使我们能够轻松跟踪一段时间内的表现,并收集有关机器人在不同市场条件下表现的宝贵见解。
步骤5;创建Docker环境
现在我们已经定义了我们的模型,是时候设置我们的Docker环境了。
此步骤包括两个主要部分:;创建aDockerfile以及adocker-compose.yml文件–让我们更详细地讨论一下。
创建Dockerfile
Dockerfile定义了构建Docker镜像的指令。它指定基本映像、安装依赖项、复制应用程序代码并设置环境。它可以作为创建应用程序容器化版本的蓝图。
下面是我们将使用的Dockerfile,每行都有注释来解释发生了什么:
创建docker-compose.yml
这个docker-compose.yml文件定义和管理多容器Docker应用程序。它指定了如何为我们的应用程序和数据库配置和运行多个容器及其交互。此文件使使用单个命令启动所有必要的服务变得容易,简化了开发或生产环境的设置。
这告诉docker创建两个容器——app和db,以及一个存储数据库内容的db_data卷。
测试我们的Docker构建
为了确认一切按预期进行,让我们;创建amain.py ;使用以下代码在根目录中创建文件。
这应该将“Hello world”打印到docker容器内的控制台,并挂载我们的数据库表。
配置PGAdmin(可选)
PGAdmin是一个无需编写任何代码即可探索数据库的优秀工具。要开始使用,只需将PGAdmin下载到您的计算机上,然后通过输入以下详细信息注册新服务器:
;
密码也是admin。这些也在db容器下的docker-compose.yml中定义。
现在,如果展开服务器,请导航到数据 ;数据库,并扩展;桌子 ;对象,您将看到我们的应用程序的表已成功挂载。
您可以直接使用SQL查询数据,或者;右键单击表并选择查看所有行查看所有可用行。
步骤6;创建服务
现在,让我们创建我们的交易机器人将用于执行各种任务的服务类。让我们从CoinGeckoservice-包含从CoinGecko API获取数据的几种方法的类。
建立CoinGecko(API)服务
里面services目录,创建一个名为的新文件coingecko_service.py;在这个文件中,我们将定义一个CoinGecko类,其构造函数中有两个变量:自我领导和self.root这种方法确保我们的代码保持干燥(不要重复自己),避免不必要地重复端点的根URL。
CoinGecko类需要执行以下操作:
- 使用coin_id获取特定硬币的价格。
- 检索可用的基础币对(也称为/简单/支持的vs货币在CoinGecko API中)。
- 获取硬币数据列表。
我们的实现应该是这样的:
这个get_coin_list()函数是我们更新硬币数据的主要方法。此函数将调用/硬币/市场端点按市值检索前250个硬币的数据。此外,我们希望包括过去一小时内每种资产的价格变化百分比。
为了实现这一点,我们将以下参数传递给端点:
f“/硬币/市场?订单=market_cap_desc和per_page=250和vs_currency={货币.美元}和价格_变化_百分比=1小时”
当价格变动百分比如果包含参数,每个Coin对象都将包含一个存储此值的附加属性。在我们的例子中,该属性称为价格变动百分比因为我们要求对价格进行调整vs_货币;(美元)。
要获取所有vs_currents,您可以使用get_vs_currencies()方法,并将其输出存储在便于访问的地方。在这个应用程序中,我们将输出存储在枚举,位于枚举名为的文件中的目录currencies.py.
建立贸易服务
交易服务为我们的纸质交易机器人处理模拟买卖操作的执行。这些方法返回纸张订购对象,包含我们通常期望从交换订单中获得的关键信息。
此外,我们定义了calculate_cost_basis()计算特定硬币的累积成本所需的函数,帮助我们跟踪特定资产的持有总量和平均价值。
要开始,请创建一个名为的新文件trading_service.py服务。现在,让我们继续建设我们的购买(), sell()以及calculate_cost_basis()方法:
注意@统计学方法装饰器,它允许我们在不初始化类本身的情况下调用类方法。
步骤7;把逻辑放在一起
有了所有必要的组件,我们就可以构建核心逻辑并定义Python应用程序的入口点了。首先创建一个名为的文件main.py在根目录中导入;所需的依赖关系,包括外部库和我们在项目中创建的文件。
接下来,让我们创建一个数据库引擎并初始化会话 ;
请注意该行Base.media.create_all(引擎)'–;
这一行初始化我们在models目录下定义的数据库表。
我们还禁用了严重性低于临界值的日志,因为sqlalchemy非常冗长,所以我们的日志往往会在噪音中丢失!请随意删除logging.disable()如果您想查看数据库执行日志。
现在,让我们实例化我们的服务:
接下来,我们将定义一个函数来处理数据库初始化。虽然我们在前面的步骤中已经创建了数据库表,但它们目前缺乏供机器人操作的数据。为了解决这个问题,我们将使用CoinGecko.get_coin_list()类方法。
现在我们的数据库中有了一组初始的硬币和价格,我们需要一种方法通过向coin_prices表添加新条目来定期更新我们的硬币价格:
接下来,我们需要编写一个函数来处理我们的购买逻辑并将购买订单保存到数据库中:
最后,逻辑的最后一部分是处理销售逻辑的方法:
这里的两条重要线路是如果当前价格<;=stop_loss_price:
and elif当前价格>;=take_profit_price:
这基本上意味着,如果达到止损或止盈,我们希望关闭头寸。
现在我们已经构建了定义交易机器人逻辑的所有方法,我们需要在循环中运行这些方法,以便我们的机器人可以连续运行。
由于我们要求CoinGecko API更改1小时的价格,因此我们的交易机器人每小时运行一次,执行以下任务是有意义的:
这个main()函数将我们所有的逻辑整合到以下流程中:
- 我们用初始值填充数据库;数据并从CoinGecko中提取前250个硬币
- 然后,我们处理每个硬币的买入和卖出场景,并添加新的价格条目。
- 最后,我们的算法在重复循环之前休眠1小时。
要启动您的机器人,只需运行:docker compose-p“paper_bot”up-d构建
从根目录。
要查看您的应用程序日志;奔跑docker日志应用
从命令行。您也可以使用Docker Desktop并点击进入应用程序容器,您应该会看到以下日志:
要查看数据库,如果您已经安装了PGAdmin应用程序,则可以使用它并从那里进行查询。或者,安装psql CLI并使用以下命令连接到数据库:;
psql-h localhost-p 5432-U管理员-d数据
祝贺 你!现在,你有一个完全Docker化的纸质交易机器人,它可以按市值扫描前250个加密货币,以识别波动性资产。
结论与;注意事项
该机器人专为纸质交易而设计,这意味着不涉及真正的财务风险。然而,由于它进行模拟交易,它不会在实时订单簿中竞争。这意味着由于滑点或部分填充等因素,结果可能与实时交易不同。
要进行实时交易,机器人需要连接到交易所。如果您决定这样做,请确保您负责任地进行交易,并考虑实施额外的错误处理,以应对实时市场状况的复杂性。
为了快速开始,您可以克隆此存储库并使用Docker构建应用程序。