2021年3月

贝尔实验室把 UNIX 姊妹系统 Plan 9 的版权转让给基金会

上世纪 80 年代,UNIX 的创始人们在贝尔实验室还开发了一个新的操作系统 Plan 9,但是却并没有真正推向世界。虽然 Plan 9 中有许多划时代的发明,比如 UTF-8 字符编码是为 Plan 9 发明的,并在 Plan 9 中首次实现;提出通过文件系统提供操作系统服务的概念;Plan 9 分布式的设计要比微服务架构早十多年等等。但 Plan 9 一直只是一个概念验证型操作系统,可以用 QEMU 虚拟机运行它,也可以运行在 PC 和树莓派上。

事实上,有一个活跃的社区一直在从事 Plan 9 的开发。这个社区正在自下而上地组织起来,成立了新的 Plan 9 基金会。本周,诺基亚贝尔实验室将把 Plan 9 软件的版权转让Plan 9 基金会,并以 MIT 许可证重新发布了所有历史版本

这是一种“不实用”的操作系统,因为它实在太概念了,也没多少应用,但是确实是值得操作系统爱好者摆弄的好玩具。

全球最大比特币矿场出手买下了 NVIDIA 60% 的 CMP 矿卡

今年 2 月底,NVIDIA 宣布推出 CMP 系列矿卡,这些矿卡取消了视频输出接口,也不能运行 3D 游戏,只为挖矿而生。全球最大的比特币矿厂 Hut 8 Mining Corp 宣布他们已购买了价值 3000 万美元的 NVIDIA CMP 矿卡,定于 5 月下旬开始交付,预计将于夏季完成全面部署。这个新的挖矿系统可提供约 1600 GH/s 的算力,可用于挖以太币等加密货币。

虽然 CMP 矿卡推出也很受欢迎,但是 RTX 一样被疯抢,都是因为加密货币太火了。

攻击者入侵了 2 万台微软 Exchange 服务器,后门域名挑衅安全专家

Shadowserver 基金会是一个帮助网络所有者识别和修复安全威胁的非营利组织,它说已经发现了似乎被后门入侵的 21,248 台 Exchange 服务器。与这些服务器后门通讯的域名是一个名为 brian.krebsonsecurity.top 的域名,攻击者们用这个名字挑衅网络安全专家 Brian Krebs。虽然微软本月早些时候在紧急补丁发布中解决了这些缺陷,但是以及有大量的未打补丁的 Exchange 服务器被攻陷。

真是嚣张的攻击者,但是最主要还是企业的 IT 管理太烂了。

来学习下搜索文件中内容的基本操作,然后下载我们的备忘录作为 grep 和正则表达式的快速参考指南。

 title=

grep 全局正则表达式打印 Global Regular Expression Print )是由 Ken Thompson 早在 1974 年开发的基本 Unix 命令之一。在计算领域,它无处不在,通常被用作为动词(“搜索一个文件中的内容”)。如果你的谈话对象有极客精神,那么它也能在真实生活场景中使用。(例如,“我会 grep 我的内存条来回想起那些信息。”)简而言之,grep 是一种用特定的字符模式来搜索文件中内容的方式。如果你感觉这听起来像是文字处理器或文本编辑器的现代 Find 功能,那么你就已经在计算行业感受到了 grep 的影响。

grep 绝不是被现代技术抛弃的远古命令,它的强大体现在两个方面:

  • grep 可以在终端操作数据流,因此你可以把它嵌入到复杂的处理中。你不仅可以在一个文本文件中查找文字,还可以提取文字后把它发给另一个命令。
  • grep 使用正则表达式来提供灵活的搜索能力。

虽然需要一些练习,但学习 grep 命令还是很容易的。本文会介绍一些我认为 grep 最有用的功能。

安装 grep

Linux 默认安装了 grep

MacOS 默认安装了 BSD 版的 grep。BSD 版的 grep 跟 GNU 版有一点不一样,因此如果你想完全参照本文,那么请使用 HomebrewMacPorts 安装 GNU 版的 grep

基础的 grep

所有版本的 grep 基础语法都一样。入参是匹配模式和你需要搜索的文件。它会把匹配到的每一行输出到你的终端。

$ grep gnu gpl-3.0.txt
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
<http://www.gnu.org/licenses/>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

grep 命令默认大小写敏感,因此 “gnu”、“GNU”、“Gnu” 是三个不同的值。你可以使用 --ignore-case 选项来忽略大小写。

$ grep --ignore-case gnu gpl-3.0.txt
                    GNU GENERAL PUBLIC LICENSE
  The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
[...16 more results...]
<http://www.gnu.org/licenses/>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

你也可以通过 --invert-match 选项来输出所有没有匹配到的行:

$ grep --invert-match \
--ignore-case gnu gpl-3.0.txt
                      Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
[...648 lines...]
Public License instead of this License.  But first, please read

管道

能搜索文件中的文本内容是很有用的,但是 POSIX 的真正强大之处是可以通过“管道”来连接多条命令。我发现我使用 grep 最好的方式是把它与其他工具如 cuttrcurl 联合使用。

假如现在有一个文件,文件中每一行是我想要下载的技术论文。我可以打开文件手动点击每一个链接,然后点击火狐浏览器的选项把每一个文件保存到我的硬盘,但是需要点击多次且耗费很长时间。而我还可以搜索文件中的链接,用 --only-matching 选项打印出匹配到的字符串。

$ grep --only-matching http\:\/\/.*pdf example.html
http://example.com/linux_whitepaper.pdf
http://example.com/bsd_whitepaper.pdf
http://example.com/important_security_topic.pdf

输出是一系列的 URL,每行一个。而这与 Bash 处理数据的方式完美契合,因此我不再把 URL 打印到终端,而是把它们通过管道传给 curl

$ grep --only-matching http\:\/\/.*pdf \
example.html | curl --remote-name

这条命令可以下载每一个文件,然后以各自的远程文件名命名保存在我的硬盘上。

这个例子中我的搜索模式可能很晦涩。那是因为它用的是正则表达式,一种在大量文本中进行模糊搜索时非常有用的”通配符“语言。

正则表达式

没有人会觉得 正则表达式 regular expression (简称 “regex”)很简单。然而,我发现它的名声往往比它应得的要差。诚然,很多人在使用正则表达式时“过于炫耀聪明”,直到它变得难以阅读,大而全,以至于复杂得换行才好理解,但是你不必过度使用正则。这里简单介绍一下我使用正则表达式的方式。

首先,创建一个名为 example.txt 的文件,输入以下内容:

Albania
Algeria
Canada
0
1
3
11

最基础的元素是不起眼的 . 字符。它表示一个字符。

$ grep Can.da example.txt
Canada

模式 Can.da 能成功匹配到 Canada 是因为 . 字符表示任意一个字符。

可以使用下面这些符号来使 . 通配符表示多个字符:

  • ? 匹配前面的模式零次或一次
  • * 匹配前面的模式零次或多次
  • + 匹配前面的模式一次或多次
  • {4} 匹配前面的模式 4 次(或是你在括号中写的其他次数)

了解了这些知识后,你可以用你认为有意思的所有模式来在 example.txt 中做练习。可能有些会成功,有些不会成功。重要的是你要去分析结果,这样你才会知道原因。

例如,下面的命令匹配不到任何国家:

$ grep A.a example.txt

因为 . 字符只能匹配一个字符,除非你增加匹配次数。使用 * 字符,告诉 grep 匹配一个字符零次或者必要的任意多次直到单词末尾。因为你知道你要处理的内容,因此在本例中零次是没有必要的。在这个列表中一定没有单个字母的国家。因此,你可以用 + 来匹配一个字符至少一次且任意多次直到单词末尾:

$ grep A.+a example.txt
Albania
Algeria

你可以使用方括号来提供一系列的字母:

$ grep [A,C].+a example.txt
Albania
Algeria
Canada

也可以用来匹配数字。结果可能会震惊你:

$ grep [1-9] example.txt
1
3
11

看到 11 出现在搜索数字 1 到 9 的结果中,你惊讶吗?

如果把 13 加到搜索列表中,会出现什么结果呢?

这些数字之所以会被匹配到,是因为它们包含 1,而 1 在要匹配的数字中。

你可以发现,正则表达式有时会令人费解,但是通过体验和练习,你可以熟练掌握它,用它来提高你搜索数据的能力。

下载备忘录

grep 命令还有很多文章中没有列出的选项。有用来更好地展示匹配结果、列出文件、列出匹配到的行号、通过打印匹配到的行周围的内容来显示上下文的选项,等等。如果你在学习 grep,或者你经常使用它并且通过查阅它的帮助页面来查看选项,那么你可以下载我们的备忘录。这个备忘录使用短选项(例如,使用 -v,而不是 --invert-matching)来帮助你更好地熟悉 grep。它还有一部分正则表达式可以帮你记住用途最广的正则表达式代码。 现在就下载 grep 备忘录!


via: https://opensource.com/article/21/3/grep-cheat-sheet

作者:Seth Kenlon 选题:lujun9972 译者:lxbwolf 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

AI 在“我的世界”中生成一只会走路、可再生的毛毛虫

在 3D 世界构建游戏“我的世界”中建造一个建筑和功能机器,对很多人来说并不稀奇。现在科学家们教会了神经网络将单个立方体长成包含数千块砖头的复杂设计,比如城堡、树木或装修好的公寓楼,甚至长成功能机器,比如毛毛虫。

而且 AI 从“生命游戏”中得到了启发制作的这种“自动细胞机”,不但可以行走,还可以自动生长,在该“毛毛虫”被切成两段后自动再生。未来,研究人员希望训练系统不仅能生长出预定义的形式,而且能发明出执行某些功能的设计。

真是令人震惊的 AI 进步,我不敢想象会不会将来有更超出想象的进步。

4 万行有缺陷的代码差点进入 FreeBSD 内核

为了可以在 Netgate 公司流行的 pfSense 路由器发行版中使用 WireGuard,该公司让一个开发者将 WireGuard 移植到 FreeBSD 内核。但该开发者最终提交的移植代码却大部分未经过审查和充分测试,存在多个缓冲区溢出、测试性质的 printf 语句,甚至有总是“返回真”空验证函数。这些代码直接提交到了 FreeBSD 代码库中,并计划纳入到 FreeBSD 13.0 中。幸好,WireGuard 的创始人发现了许多问题,并着手亲自动手修复这些存在缺陷的代码。

而对此事件,在 FreeBSD 社区引发了一些争议

从这件事中反映出的一个问题是,FreeBSD 似乎缺乏足够的代码审查环节,而是依赖于对代码提交者的信任来保证 FreeBSD 的质量。这让我们不得不怀疑,FreeBSD 的质量真的那么可靠吗?

Open Collective 推出资助开源社区的基金

Open Collective 是一个非营利性平台,为“集体”提供接收资金的工具,同时也提供机制让这些集体的成员以民主和透明的方式花钱。它为 2500 多个项目提供了服务,试图让开源项目全职工作成为在营利性公司从事开发工作的替代选择。

现在,它正在将基金引入其开放资金管理平台,以使公司更容易投资开源项目,通过向该基金一次性付款,然后基金将资金重新分配给不同的项目和贡献者,而不是单独向这些项目付款。

现在越来越多的公司开始意识到需要对开发者在开源项目上的工作进行补偿,并愿意为他们提供资金。这是一件好事,开源不仅仅是热情和理想,也会成为一种职业。

这几天,开源界就 RMS 重返 FSF 形成了一场大辩论,有人因为 RMS 本人的一些言论和观点而 反对 他重新回到 FSF 董事会,相应的,也有一些人基于 RMS 的既往贡献和对言论自由的保护而 支持 他重返。

我个人一直以来是以敬仰和尊敬的态度来看待 RMS 的,也积极支持 RMS 重返他创立的 FSF。但是在我公开表明了“支持”的态度后,经过读者反馈,我发现 RMS 在其 博客 上发表的一些言论是充满偏见和误解的。

我对引发 RMS 辞职和重返 FSF 后受到的抗议的 原因,并没有强烈的倾向性观点。但是,在了解了 RMS 近年来关于中国的部分言论存在偏见,作为一名中国人,以我所了解的信息事实,有些观点和偏见是我无法接受的。虽然 RMS 曾多次来访中国,但我认为 RMS 至少在部分信息上存在严重缺失,并基于此有重大偏见。因此,我不会再继续支持他,并从支持 RMS 的公开信中撤销了签名,由此引发了一点关注,这也是我写这封说明的原因。

另外一方面,鉴于 RMS 对自由软件运动的巨大贡献,为如今的自由及开源软件的蓬勃发展奠定了坚实的基础,其创立的 FSF 也发挥了重要的作用,因此,我也不会反对他返回 FSF。

所以,我对 RMS 重返 FSF 这件事持既不反对、也不支持的态度

wxy@Linux 中国

2021/3/28

COPR 是个人软件仓库 集合,它不在 Fedora 中。这是因为某些软件不符合轻松打包的标准;或者它可能不符合其他 Fedora 标准,尽管它是自由而开源的。COPR 可以在 Fedora 套件之外提供这些项目。COPR 中的软件不受 Fedora 基础设施的支持,或者是由项目自己背书的。但是,这是一种尝试新的或实验性的软件的一种巧妙的方式。

本文介绍了 COPR 中一些有趣的新项目。如果你第一次使用 COPR,请参阅 COPR 用户文档

Ytfzf

Ytfzf 是一个简单的命令行工具,用于搜索和观看 YouTube 视频。它提供了围绕模糊查找程序 fzf 构建的快速直观的界面。它使用 youtube-dl 来下载选定的视频,并打开外部视频播放器来观看。由于这种方式,ytfzf 比使用浏览器观看 YouTube 资源占用要少得多。它支持缩略图(通过 ueberzug)、历史记录保存、多个视频排队或下载它们以供以后使用、频道订阅以及其他方便的功能。多亏了像 dmenurofi 这样的工具,它甚至可以在终端之外使用。

安装说明

目前仓库为 Fedora 33 和 34 提供 Ytfzf。要安装它,请使用以下命令:

sudo dnf copr enable bhoman/ytfzf
sudo dnf install ytfzf

Gemini 客户端

你有没有想过,如果万维网走的是一条完全不同的路线,不采用 CSS 和客户端脚本,你的互联网浏览体验会如何?Gemini 是 HTTPS 协议的现代替代品,尽管它并不打算取代 HTTPS 协议。stenstorp/gemini COPR 项目提供了各种客户端来浏览 Gemini 网站,有 CastorDragonstoneKristallLagrange

Gemini 站点提供了一些使用该协议的主机列表。以下显示了使用 Castor 访问这个站点的情况:

安装说明

仓库 目前为 Fedora 32、33、34 和 Fedora Rawhide 提供 Gemini 客户端。EPEL 7 和 8,以及 CentOS Stream 也可使用。要安装浏览器,请从这里显示的安装命令中选择:

sudo dnf copr enable stenstorp/gemini

sudo dnf install castor
sudo dnf install dragonstone
sudo dnf install kristall
sudo dnf install lagrange

Ly

Ly 是一个 Linux 和 BSD 的轻量级登录管理器。它有一个类似于 ncurses 的基于文本的用户界面。理论上,它应该支持所有的 X 桌面环境和窗口管理器(其中很多都 经过测试)。Ly 还提供了基本的 Wayland 支持(Sway 也工作良好)。在配置的某个地方,有一个复活节彩蛋选项,可以在背景中启用著名的 PSX DOOM fire 动画,就其本身而言,值得一试。

安装说明

仓库 目前为 Fedora 32、33 和 Fedora Rawhide 提供 Ly。要安装它,请使用以下命令:

sudo dnf copr enable dhalucario/ly
sudo dnf install ly

在将 Ly 设置为系统登录界面之前,请在终端中运行 ly 命令以确保其正常工作。然后关闭当前的登录管理器,启用 Ly。

sudo systemctl disable gdm
sudo systemctl enable ly

最后,重启计算机,使其更改生效。

AWS CLI v2

AWS CLI v2 带来基于社区反馈进行的稳健而有条理的演变,而不是对原有客户端的大规模重新设计。它引入了配置凭证的新机制,现在允许用户从 AWS 控制台中生成的 .csv 文件导入凭证。它还提供了对 AWS SSO 的支持。其他主要改进是服务端自动补全,以及交互式参数生成。一个新功能是交互式向导,它提供了更高层次的抽象,并结合多个 AWS API 调用来创建、更新或删除 AWS 资源。

安装说明

仓库 目前为 Fedora Linux 32、33、34 和 Fedora Rawhide 提供 AWS CLI v2。要安装它,请使用以下命令:

sudo dnf copr enable spot/aws-cli-2
sudo dnf install aws-cli-2

自然地,访问 AWS 账户凭证是必要的。


via: https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-march-2021/

作者:Jakub Kadlčík 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在本教程中,教你如何设置和使用 Pythonic 来编程。它是一个图形化编程工具,用户可以很容易地使用现成的函数模块创建 Python 程序。

 title=

然而,不像纽约证券交易所这样的传统证券交易所一样,有一段固定的交易时间。对于加密货币而言,则是 7×24 小时交易,这使得任何人都无法独自盯着市场。

在以前,我经常思考与加密货币交易相关的问题:

  • 一夜之间发生了什么?
  • 为什么没有日志记录?
  • 为什么下单?
  • 为什么不下单?

通常的解决手段是使用加密交易机器人,当在你做其他事情时,例如睡觉、与家人在一起或享受空闲时光,代替你下单。虽然有很多商业解决方案可用,但是我选择开源的解决方案,因此我编写了加密交易机器人 Pythonic。 正如去年 我写过的文章 一样,“Pythonic 是一种图形化编程工具,它让用户可以轻松使用现成的函数模块来创建 Python 应用程序。” 最初它是作为加密货币机器人使用,并具有可扩展的日志记录引擎以及经过精心测试的可重用部件,例如调度器和计时器。

开始

本教程将教你如何开始使用 Pythonic 进行自动交易。我选择 币安 Binance 交易所的 波场 Tron 比特币 Bitcoin 交易对为例。我之所以选择这个加密货币对,是因为它们彼此之间的波动性大,而不是出于个人喜好。

机器人将根据 指数移动平均 exponential moving averages (EMA)来做出决策。

 title=

TRX/BTC 1 小时 K 线图

EMA 指标通常是一个加权的移动平均线,可以对近期价格数据赋予更多权重。尽管移动平均线可能只是一个简单的指标,但我对它很有经验。

上图中的紫色线显示了 EMA-25 指标(这表示要考虑最近的 25 个值)。

机器人监视当前的 EMA-25 值(t0)和前一个 EMA-25 值(t-1)之间的差距。如果差值超过某个值,则表示价格上涨,机器人将下达购买订单。如果差值低于某个值,则机器人将下达卖单。

差值将是做出交易决策的主要指标。在本教程中,它称为交易参数。

工具链

将在本教程使用如下工具:

  • 币安专业交易视图(已经有其他人做了数据可视化,所以不需要重复造轮子)
  • Jupyter 笔记本:用于数据科学任务
  • Pythonic:作为整体框架
  • PythonicDaemon :作为终端运行(仅适用于控制台和 Linux)

数据挖掘

为了使加密货币交易机器人尽可能做出正确的决定,以可靠的方式获取资产的 美国线 open-high-low-close chart OHLC)数据是至关重要。你可以使用 Pythonic 的内置元素,还可以根据自己逻辑来对其进行扩展。

一般的工作流程:

  1. 与币安时间同步
  2. 下载 OHLC 数据
  3. 从文件中把 OHLC 数据加载到内存
  4. 比较数据集并扩展更新数据集

这个工作流程可能有点夸张,但是它能使得程序更加健壮,甚至在停机和断开连接时,也能平稳运行。

一开始,你需要 币安 OHLC 查询 Binance OHLC Query 元素和一个 基础操作 Basic Operation 元素来执行你的代码。

 title=

数据挖掘工作流程

OHLC 查询设置为每隔一小时查询一次 TRXBTC 资产对(波场/比特币)。

 title=

配置 OHLC 查询元素

其中输出的元素是 Pandas DataFrame。你可以在 基础操作 元素中使用 输入 input 变量来访问 DataFrame。其中,将 Vim 设置为 基础操作 元素的默认代码编辑器。

 title=

使用 Vim 编辑基础操作元素

具体代码如下:

import pickle, pathlib, os
import pandas as pd

outout = None

if isinstance(input, pd.DataFrame):
    file_name = 'TRXBTC_1h.bin'
    home_path = str(pathlib.Path.home())
    data_path = os.path.join(home_path, file_name)

    try:
        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_cnt
        log_txt = '{}: {} new rows written'.format(file_name, n_new_rows)
    except:
        log_txt = 'File error - writing new one: {}'.format(e)
        df = input

    pickle.dump(df, open(data_path, "wb" ))
    output = df

首先,检查输入是否为 DataFrame 元素。然后在用户的家目录(~/)中查找名为 TRXBTC_1h.bin 的文件。如果存在,则将其打开,执行新代码段(try 部分中的代码),并删除重复项。如果文件不存在,则触发异常并执行 except 部分中的代码,创建一个新文件。

只要启用了复选框 日志输出 log output ,你就可以使用命令行工具 tail 查看日志记录:

$ tail -f ~/Pythonic_2020/Feb/log_2020_02_19.txt

出于开发目的,现在跳过与币安时间的同步和计划执行,这将在下面实现。

准备数据

下一步是在单独的 网格 Grid 中处理评估逻辑。因此,你必须借助 返回元素 Return element 将 DataFrame 从网格 1 传递到网格 2 的第一个元素。

在网格 2 中,通过使 DataFrame 通过 基础技术分析 Basic Technical Analysis 元素,将 DataFrame 扩展包含 EMA 值的一列。

 title=

在网格 2 中技术分析工作流程

配置技术分析元素以计算 25 个值的 EMA。

 title=

配置技术分析元素

当你运行整个程序并开启 技术分析 Technical Analysis 元素的调试输出时,你将发现 EMA-25 列的值似乎都相同。

 title=

输出中精度不够

这是因为调试输出中的 EMA-25 值仅包含六位小数,即使输出保留了 8 个字节完整精度的浮点值。

为了能进行进一步处理,请添加 基础操作 元素:

 title=

网格 2 中的工作流程

使用 基础操作 元素,将 DataFrame 与添加的 EMA-25 列一起转储,以便可以将其加载到 Jupyter 笔记本中;

 title=

将扩展后的 DataFrame 存储到文件中

评估策略

在 Juypter 笔记本中开发评估策略,让你可以更直接地访问代码。要加载 DataFrame,你需要使用如下代码:

 title=

用全部小数位表示

你可以使用 iloc 和列名来访问最新的 EMA-25 值,并且会保留所有小数位。

你已经知道如何来获得最新的数据。上面示例的最后一行仅显示该值。为了能将该值拷贝到不同的变量中,你必须使用如下图所示的 .at 方法方能成功。

你也可以直接计算出你下一步所需的交易参数。

 title=

买卖决策

确定交易参数

如上面代码所示,我选择 0.009 作为交易参数。但是我怎么知道 0.009 是决定交易的一个好参数呢? 实际上,这个参数确实很糟糕,因此,你可以直接计算出表现最佳的交易参数。

假设你将根据收盘价进行买卖。

 title=

回测功能

在此示例中,buy_factorsell_factor 是预先定义好的。因此,发散思维用直接计算出表现最佳的参数。

 title=

嵌套的 for 循环,用于确定购买和出售的参数

这要跑 81 个循环(9x9),在我的机器(Core i7 267QM)上花费了几分钟。

 title=

在暴力运算时系统的利用率

在每个循环之后,它将 buy_factorsell_factor 元组和生成的 profit 元组追加到 trading_factors 列表中。按利润降序对列表进行排序。

 title=

将利润与相关的交易参数按降序排序

当你打印出列表时,你会看到 0.002 是最好的参数。

 title=

交易要素和收益的有序列表

当我在 2020 年 3 月写下这篇文章时,价格的波动还不足以呈现出更理想的结果。我在 2 月份得到了更好的结果,但即使在那个时候,表现最好的交易参数也在 0.002 左右。

分割执行路径

现在开始新建一个网格以保持逻辑清晰。使用 返回 元素将带有 EMA-25 列的 DataFrame 从网格 2 传递到网格 3 的 0A 元素。

在网格 3 中,添加 基础操作 元素以执行评估逻辑。这是该元素中的代码:

 title=

实现评估策略

如果输出 1 表示你应该购买,如果输出 2 则表示你应该卖出。 输出 0 表示现在无需操作。使用 分支 Branch 元素来控制执行路径。

 title=

分支元素:网格 3,2A 位置

因为 0-1 的处理流程一样,所以你需要在最右边添加一个分支元素来判断你是否应该卖出。

 title=

分支元素:网格 3,3B 位置

网格 3 应该现在如下图所示:

 title=

网格 3 的工作流程

下单

由于无需在一个周期中购买两次,因此必须在周期之间保留一个持久变量,以指示你是否已经购买。

你可以利用 Stack 元素来实现。顾名思义,栈元素表示可以用任何 Python 数据类型来放入的基于文件的栈。

你需要定义栈仅包含一个布尔类型,该布尔类型决定是否购买了(True)或(False)。因此,你必须使用 False 来初始化栈。例如,你可以在网格 4 中简单地通过将 False 传递给栈来进行设置。

 title=

将 False 变量传输到后续的栈元素中

在分支树后的栈实例可以进行如下配置:

 title=

设置栈元素

在栈元素设置中,将 对输入的操作 Do this with input 设置成 Nothing 。否则,布尔值将被 10 覆盖。

该设置确保仅将一个值保存于栈中(TrueFalse),并且只能读取一个值(为了清楚起见)。

在栈元素之后,你需要另外一个 分支 元素来判断栈的值,然后再放置 币安订单 Binance Order 元素。

 title=

判断栈中的变量

将币安订单元素添加到分支元素的 True 路径。网格 3 上的工作流现在应如下所示:

 title=

网格 3 的工作流程

币安订单元素应如下配置:

 title=

编辑币安订单元素

你可以在币安网站上的帐户设置中生成 API 和密钥。

 title=

在币安账户设置中创建一个 API 密钥

在本文中,每笔交易都是作为市价交易执行的,交易量为 10,000 TRX(2020 年 3 月约为 150 美元)(出于教学的目的,我通过使用市价下单来演示整个过程。因此,我建议至少使用限价下单。)

如果未正确执行下单(例如,网络问题、资金不足或货币对不正确),则不会触发后续元素。因此,你可以假定如果触发了后续元素,则表示该订单已下达。

这是一个成功的 XMRBTC 卖单的输出示例:

 title=

成功卖单的输出

该行为使后续步骤更加简单:你可以始终假设只要成功输出,就表示订单成功。因此,你可以添加一个 基础操作 元素,该元素将简单地输出 True 并将此值放入栈中以表示是否下单。

如果出现错误的话,你可以在日志信息中查看具体细节(如果启用日志功能)。

 title=

币安订单元素中的输出日志信息

调度和同步

对于日程调度和同步,请在网格 1 中将整个工作流程置于 币安调度器 Binance Scheduler 元素的前面。

 title=

在网格 1,1A 位置的币安调度器

由于币安调度器元素只执行一次,因此请在网格 1 的末尾拆分执行路径,并通过将输出传递回币安调度器来强制让其重新同步。

 title=

网格 1:拆分执行路径

5A 元素指向 网格 2 的 1A 元素,并且 5B 元素指向网格 1 的 1A 元素(币安调度器)。

部署

你可以在本地计算机上全天候 7×24 小时运行整个程序,也可以将其完全托管在廉价的云系统上。例如,你可以使用 Linux/FreeBSD 云系统,每月约 5 美元,但通常不提供图形化界面。如果你想利用这些低成本的云,可以使用 PythonicDaemon,它能在终端中完全运行。

 title=

PythonicDaemon 控制台

PythonicDaemon 是基础程序的一部分。要使用它,请保存完整的工作流程,将其传输到远程运行的系统中(例如,通过 安全拷贝协议 Secure Copy SCP),然后把工作流程文件作为参数来启动 PythonicDaemon:

$ PythonicDaemon trading_bot_one

为了能在系统启动时自启 PythonicDaemon,可以将一个条目添加到 crontab 中:

# crontab -e

 title=

在 Ubuntu 服务器上的 Crontab

下一步

正如我在一开始时所说的,本教程只是自动交易的入门。对交易机器人进行编程大约需要 10% 的编程和 90% 的测试。当涉及到让你的机器人用金钱交易时,你肯定会对编写的代码再三思考。因此,我建议你编码时要尽可能简单和易于理解。

如果你想自己继续开发交易机器人,接下来所需要做的事:

  • 收益自动计算(希望你有正收益!)
  • 计算你想买的价格
  • 比较你的预订单(例如,订单是否填写完整?)

你可以从 GitHub 上获取完整代码。


via: https://opensource.com/article/20/4/python-crypto-trading-bot

作者:Stephan Avenwedde 选题:lujun9972 译者:wyxplus 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出