当前位置: 首页 > 科技观察

如何使用Python自动进行加密货币交易

时间:2023-03-16 11:26:37 科技观察

在本教程中,教您如何使用Pythonic进行设置和编程。它是一种图形化编程工具,允许用户使用现成的功能模块轻松创建Python程序。然而,与纽约证券交易所等传统证券交易所不同,它有固定的交易时间。对于加密货币,它是24/7交易,因此任何人都不可能单独关注市场。过去,我经常思考与加密货币交易相关的问题:一夜之间发生了什么?为什么没有日志记录?为什么要下订单?为什么不下订单?通常的解决方案是使用加密货币交易机器人,在您做其他事情(例如睡觉、与家人共度时光或享受空闲时间)时为您下订单。虽然有许多可用的商业解决方案,但我选择了开源解决方案,因此我编写了一个加密货币交易机器人Pythonic。正如我去年所写,“Pythonic是一种图形化编程工具,它允许用户使用现成的功能模块轻松创建Python应用程序。”日志记录引擎和经过良好测试的可重用组件,例如调度程序和计时器。入门本教程将教您如何开始使用Pythonic自动交易。我以Binance币安交易所Tron和Bitcoin比特币交易对为例。我选择这个加密货币对是因为它们相对于彼此的波动性,而不是因为个人偏好。机器人将根据指数移动平均线(EMA)做出决策。TRX/BTC1-HourCandlestickEMA指标通常是加权移动平均线,对近期价格数据给予更多权重。尽管移动平均线可能是一个简单的指标,但我对它们有很多经验。上图中的紫色线显示了EMA-25指标(这意味着考虑了最接近的25个值)。机器人监控当前EMA-25值(t0)和之前的EMA-25值(t-1)之间的差距。如果差值超过一定值,则表示价格上涨,机器人将下单买单。如果差异低于某个值,机器人将下达卖单。点差将是做出交易决策的主要指标。在本教程中,它被称为交易参数。工具链本教程会用到以下工具:BinanceProfessionalTradingView(别人已经做过数据可视化了,不用重新造轮子)Jupyternotebook:用于数据科学任务Pythonic:作为一个整体框架PythonicDaemon:作为一个运行终端(仅限控制台和Linux)数据挖掘为了让加密货币交易机器人尽可能做出最好的决策,关键是要有一种可靠的方法来获取资产的美线开盘-高-低-收盘图表(OHLC)数据.您可以使用Pythonic内置元素并使用您自己的逻辑扩展它们。一般工作流程:与Binance时间同步下载OHLC数据将OHLC数据从文件加载到内存中比较数据集并扩展更新数据集即使在连接时也能顺利运行。首先,您需要一个BinanceOHLC查询元素和一个基本操作元素来执行您的代码。数据挖掘工作流OHLC查询设置为每小时查询一次TRXBTC资产对(TRON/Bitcoin)。配置输出元素为PandasDataFrame的OHLC查询元素。您可以使用基本操作元素中的输入变量来访问DataFrame。其中,Vim被设置为基本操作元素的默认代码编辑器。使用Vim编辑基本操作元素。具体代码如下:importpickle,pathlib,osimportpandasaspdoutout=Noneifisinstance(input,pd.DataFrame):file_name='TRXBTC_1h.bin'home_path=str(pathlib.Path.home())data_path=os.path.join(home_path,file_name)尝试:df=pickle.load(open(data_path,'rb'))n_row_cnt=df.shape[0]df=pd.concat([df,input],ignore_index=True)。drop_duplicates(['close_time'])df.reset_index(drop=True,inplace=True)n_new_rows=df.shape[0]-n_row_cntlog_txt='{}:{}newrowswritten'.format(file_name,n_new_rows)除了:log_txt='Fileerror-writingnewone:{}'.format(e)df=inputpickle.dump(df,open(data_path,"wb"))output=df首先,检查输入是否是DataFrame元素.然后在用户的主目录(~/)中查找名为TRXBTC_1h.bin的文件。如果存在,则打开它,执行新的代码段(try部分中的代码),并删除重复项。如果文件不存在,则引发异常并执行except部分中的代码,创建一个新文件。只要启用复选框日志输出,就可以使用命令行工具tail查看日志记录:$tail-f~/Pythonic_2020/Feb/log_2020_02_19.txt出于开发目的,现在跳过与币安时间的同步,计划执行,下面会具体实施。准备数据的下一步是在单独的网格中处理评估逻辑。因此,您必须借助Return元素将DataFrame从网格1传递到网格2的第一个元素。在网格2中,通过将DataFrame传递给基本技术分析元素,用包含EMA值的列扩展DataFrame。在网格2中,技术分析工作流程配置技术分析元素以计算25个值的EMA。配置技术分析元素当您运行整个程序并打开技术分析元素的调试输出时,您会注意到EMA-25列中的值似乎都相同。Insufficientprecisioninoutput这是因为调试输出中的EMA-25值仅包含六位小数,即使输出保留了8个字节的全精度浮点值。为了进一步处理,添加一个基本操作元素:Grid2中的工作流使用一个基本操作元素来转储带有添加的EMA-25列的DataFrame,以便可以将其加载到JupyterNotebook中;扩展的StoringtheDataFrametoFileEvaluationStrategies在JuypterNotebooks中开发评估策略,让您更直接地访问代码。要加载DataFrame,您需要使用如下代码:对于所有小数位,您可以使用iloc和列名来访问最新的EMA-25值,它将保留所有小数位。您已经知道如何获取最新数据。上面示例的最后一行只是显示了值。为了能够将值复制到不同的变量,必须使用如下所示的.at方法才能成功。您也可以直接计算出您下一步需要的交易参数。买卖决策决定交易参数如上代码所示,我选择0.009作为交易参数。但我怎么知道0.009是决定交易的好参数?其实这个参数真的很糟糕,所以,你可以直接计算出表现最好的交易参数。假设您要根据收盘价买入或卖出。回测函数在这个例子中,buy_factor和sell_factor是预定义的。因此采用发散思维直接计算性能最好的参数。嵌套for循环以确定买卖参数这运行81个循环(9x9)并在我的机器(Corei7267QM)上花费几分钟。5Af65b11f637ce55589036c357df10.png"target="_blank">5Af65b11f637ce55589036c357df10.png"width="auto"border="0"height="auto"alt=""title="">系统在每个周期的利用率将buy_factor、sell_factor元组和生成的利润元组附加到trading_factors列表。按利润降序排列列表。将与利润相关的交易参数按降序排列,当您打印列表时,您会看到0.002是最佳参数。贸易要素和利益的有序清单在我于2020年3月撰写本文时,价格的波动还不足以呈现更理想的结果。我在2月份获得了更好的结果,但即便如此,表现最好的交易参数也在0.002左右。拆分执行路径现在会启动一个新的网格以保持逻辑清晰。使用返回元素将带有EMA-25列的DataFrame从网格2传递到网格3的0A元素。在网格3中,添加基本操作元素以执行评估逻辑。下面是该元素中的代码:如果输出1意味着您应该购买,如果输出2意味着您应该出售,则实施评估策略。输出0表示现在不需要任何操作。使用Branch元素来控制执行路径。5A397c4d0c592d6c5e8d54b81c.png"target="_blank">分支元素:格子3,2A位置因为0和-1的处理流程是一样的,所以需要在最右边加一个分支元素来判断是否卖掉分支element:Mesh3,3BLocationMesh3现在应该是这样的:WorkflowforMesh3Ordering因为你不需要在一个周期内购买两次,所以你必须在周期之间保留一个持久变量来指示你是否有购买。你可以使用Stack元素执行此操作。顾名思义,stack元素表示基于文件的堆栈,可以放置任何Python数据类型。您需要将堆栈定义为仅包含一种布尔类型,用于确定购买是(True)还是(False)。因此,您必须使用False来初始化堆栈。例如,您只需将False传递给堆栈即可在Grid4中设置它。将False变量传递给后续堆栈元素。分支树后面的stack实例可以配置如下:设置stack元素在stack元素设置中,将输入操作Dothiswithinput设置为Nothing。否则,布尔值将被1或0覆盖。此设置确保堆栈中只保存一个值(True或False),并且只读取一个值(为清楚起见)。在stack元素之后,还需要一个分支元素判断stack的值,然后放置BinanceOrder元素。判断栈中的变量将币安订单元素添加到分支元素的True路径中。网格3上的工作流现在应如下所示:网格3的工作流币安订单元素应配置如下:编辑币安订单元素您可以在币安网站的账户设置中生成API和密钥。在币安账户设置中创建API密钥在本文中,每笔交易都作为市场交易执行,交易量为10,000TRX(2020年3月约为150美元)(出于教学目的,我通过使用市场订单来演示整个过程。因此,我建议至少使用限价订单。)如果订单未正确执行(例如,网络问题、资金不足或货币对不正确),将不会触发后续元素。因此,您可以假设如果后续元素触发,则订单已经下达。下面是一个成功的XMRBTC卖单的输出示例:一个成功的卖单的输出这种行为使后续步骤更容易:您始终可以假设任何成功的输出都意味着订单成功。所以你可以添加一个基本动作元素,它只会输出True并将这个值放在堆栈上以指示是否下订单。如果发生错误,您可以在日志消息中查看详细信息(如果启用了日志记录)。5A5046bc2.png"target="_blank">5A5046bc2.png"width="600"border="0"height="auto"alt=""title="">输出日志信息在币安订单元素中调度同步用于调度和同步,将整个工作流程放在Grid1中BinanceScheduler元素的前面。BinanceScheduler在grid1,位置1A由于BinanceScheduler元素只执行一次,所以在Grid1的末尾拆分执行路径并强制重启通过将输出传回BinanceSchedulerSynchronize。Grid1:SplitExecutionPath5A元素指向Grid2的1A元素,5B元素指向Grid1的1A元素(BinanceScheduler)。部署您可以在本地计算机上全天候24/7运行整个程序,或者将其完全托管在廉价的云系统上。例如,您可以以每月5美元左右的价格使用Linux/FreeBSD云系统,但通常不提供图形界面。如果你想利用这些低成本的云,你可以使用完全在终端运行的PythonicDaemon。PythonicDaemon控制台PythonicDaemon是基本程序的一部分。要使用它,请保存完整的工作流程,将其传输到远程运行的系统(例如,通过SecureCopySCP),并以工作流程文件作为参数启动PythonicDaemon:$PythonicDaemontrading_bot_one以便能够在系统上启动PythonicDaemon自动添加一个条目到crontab:#crontab-e5Affe9f04ec1f392dab2124b8.png"target="_blank">5Affe9f04ec1f392dab2124b8.png"width="auto"border="0"height="auto"alt=""title="》>CrontabNextStepsonUbuntuServer正如我在开头所说,本教程只是对自动交易的介绍。对交易机器人进行编程大约需要10%的编程和90%的测试。在让您的机器人进行货币交易时,您一定要对自己编写的代码三思而后行。因此,我建议您编写尽可能简单易懂的代码。如果你想自己继续开发交易机器人,接下来你需要做的事情:自动计算收益(希望你有正收益!)filled?)你可以从GitHub获取完整的代码。