Skip to content

Latest commit

 

History

History
405 lines (261 loc) · 13.2 KB

数字货币交易系统-开发文档.md

File metadata and controls

405 lines (261 loc) · 13.2 KB

数字货币交易系统说明文档

概览

111啊伟大伟大

配置

全局配置

安装node+npm

chromium安装

路径配置

API

页面操作

计算与决策

指标计算

n日均线

K线走势

boll带

boll带宽度

涨速

控制台输出流

初始化配置

币对信息

Log日志

自定义格式

服务端

镜像系统选择

阿里云-Centos8.2,优势:

  1. Linux比window速度更快,系统进程内存占用更小;
  2. Centos比Ubuntu 的系统进程内存占用更小,更适合于企业级开发。

node、npm安装及全局环境配置

  1. 下载最新稳定版node(linux 64位);

  2. 选择任意路径如,/app/software/解压上传

    tar -xvf  node-v6.10.0-linux-x64.tar.xz
    mv node-v6.10.0-linux-x64  nodejs
    // 确认一下nodejs下bin目录是否有node 和npm文件,
    // 如果有执行软连接,如果没有重新下载执行上边步骤;
    
  3. 建立软连接,变为全局:

     ln -s /app/software/nodejs/bin/npm /usr/bin/
     ln -s /app/software/nodejs/bin/node /usr/bin/
    
  4. 检验node、npm版本,是否已变为全局

    node -v
    npm -v
    
  5. 查看node和node_modules所在位置

    npm root -g		//查看node_modules的目录
    npm bin -g		//查看npm的可执行文件所在目录
    npm config set prefix /usr/local	//修改npm的工作目录
    

安装puppeteer+Chromium

npm i puppeteer -g  //会报错
ERROR: Failed to set up Chromium r856583! Set "PUPPETEER_SKIP_DOWNLOAD" env variable to skip download.

安装淘宝的cnpm,自动使用国内源

npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm i puppeteer -g

测试无头模式:

//上传testLinux.js、相关库

const puppeteer = require("puppeteer");
const sleep = require("./src/sleep");

(async () => {
  /* 浏览器启动配置 */
  const browser = await puppeteer.launch({
    headless: true,
    defaultViewport: {
      width: 1600,
      height: 1024,
    },
    ignoreDefaultArgs: ["--enable-automation"],
  });
  async function mouseDown(selector, page) {
    try {
      const allselector = await page.waitForSelector(selector);
      const allinfo = allselector.boundingBox();
      await page.mouse.move((await allinfo).x + 2, (await allinfo).y);
      await page.mouse.down();
      await page.waitForTimeout(80 + Math.random() * 40);
      await page.mouse.up();
    } catch (error) {
      console.log("Again");
    }
  }
  const page = await browser.newPage();
  await page.goto("https://www.baidu.com/");
  page.waitForSelector(login);
  await mouseDown(login, page);
  sleep(800);
  console.log("successfuly!");
})();

const login = "#u1 > a";
node testLinux //报错
(node:804034) UnhandledPromiseRejectionWarning: Error: Failed to launch the browser process!
/root/coinEx/node_modules/_puppeteer@8.0.0@puppeteer/.local-chromium/linux-856583/chrome-linux/chrome: error while loading shared libraries: libxshmfence.so.1: cannot open shared object file: No such file or directory


TROUBLESHOOTING: https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md

    at onClose (/root/coinEx/node_modules/_puppeteer@8.0.0@puppeteer/lib/cjs/puppeteer/node/BrowserRunner.js:193:20)
    at Interface.<anonymous> (/root/coinEx/node_modules/_puppeteer@8.0.0@puppeteer/lib/cjs/puppeteer/node/BrowserRunner.js:183:68)
    at Interface.emit (events.js:327:22)
    at Interface.close (readline.js:424:8)
    at Socket.onend (readline.js:202:10)
    at Socket.emit (events.js:327:22)
    at endReadableNT (internal/streams/readable.js:1327:12)
    at processTicksAndRejections (internal/process/task_queues.js:80:21)
(Use `node --trace-warnings ...` to show where the warning was created)
(node:804034) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:804034) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

查到网上:原来puppet虽然帮你下了一个Chromium,但并没有帮你把依赖都装好。于是你要自己把那些so都装好。

#依赖库
yum install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 -y

#字体
yum install ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc -y

再此执行,还是同样报错——仔细看错误原因是chromium无法调用lib动态库.so文件

error while loading shared libraries: libxshmfence.so.1: cannot open shared object file: No such file or directory
yum install libxshmfence.so.1 //无效,报错
whereis libxshmfence.so.1 //查看库文件libxshmfence.so: /usr/lib/libxshmfence.so.1,能找得到

再次用网上的解决办法

//法一:无效
# vim /etc/ld.so.conf      //在新的一行中加入库文件所在目录
  /usr/lib  
# ldconfig                 //更新/etc/ld.so.cache文件
//法二:无效
ldd $(which /root/coinEx/node_modules/puppeteer/.local-chromium/linux-856583/chrome-linux/chrome)
ln -s /usr/local/lib64/libxshmfence.so.1 /lib/libxshmfence.so.1//上面这个好像写反了
ln -s /lib/libxshmfence.so.1 /usr/local/lib64/libxshmfence.so.1

看着libxshmfence.so.1就在我眼前,然而chromium这傻孩子完全眼瞎了似的:

image-20210227172248182

终极解决办法

找到chromium-browser的快捷方式,强制设为启动路径即可!

image-20210302234018870

/usr/bin/chromium-browser

图形可视化下登录OKEx

无头模式登录后会遇到人工滑块验证,鼠标轨迹很难模拟,难以通过。。。

还是决定先使用centos8图形化后登录

图形化界面参考阿里云安装教程:

https://help.aliyun.com/knowledge_detail/151830.html?spm=5176.smartservice_service_chat.0.0.7df83f1bLaSuz0

注意:新增VNC配置文件~/.vnc/config的~千万不要漏,就是因为这个坑卡了我好几天,吃了大亏,血与泪的教训啊!!!

chromium-browser --no-sandbox //图形界面终端启动,鼠标点击运行没反应,可能是没有nosandbox且在root下运行的原因

Chromium登录账号,使得userdata存档,一直保持自动登录状态。

获取userdata路径

image-20210303114951334

image-20210303115027487

通常是/root/.config/chromium/Default

完成后,暂时关闭centos8的图形界面,减少内存占用,往后有需要再开启:

init 3 // 关闭图形界面,重启会自动开启
init 5 // 开启图形界面

上传项目并测试

image-20210303125142371

项目后台运行

// 新建后台窗口
screen -S <projectName>
// 查看后台窗口
screen -ls
// 恢复后台窗口
scrren -r
// 若无法进入,则先将登录的账户登出
screen -D <ID>
// 再输入对应ID重新登录
screen -r <ID>

更新日志

早于2021-02-20

  • 累计运行时间实时保存 - 功能;
  • 保本交易 - 功能;
  • 消息提示铃声 - 功能;
  • 涨速=(现价 /上一次现价- 1)*1000‰ - 功能;
  • 总资产、累计触发未能及时更新,与browser有关 - bug;
  • 强制平仓后避免再次误买入--和抄底买入相悖 - 功能。

2021-02-23

  • 撤单操作和方案 - 功能;
  • js内存泄漏——Chromium内存随时间不断增长 - bug(修复:减少了page的数量,定期重启);
  • 轮询顺序买入方案 --> 最优买入方案 - 功能;
  • 持续盈利策略。

2021-02-27

  • 部分成交下检测不到交易方向漏洞;
  • 触及1分钟线上轨过早抛出、触及下轨过早买入的问题——考察更高时间粒度,待回测验证;
  • 累计运行、累计触发莫名NaN(可能是人为造成,待观察);

2021-03-02

  • 买入指标修正:(low - Number(BOLL_1min[2]) <= 0) --> (low - Number(_BOLL_1min[2]) * 0.999 <= 0);
  • 实现项目自动重启功能——减少服务端拒绝访问、内存泄漏宕机风险;

2021-03-03

  • 买入指标下调:由-0.1%下调至-0.3%,

    (low - Number(BOLL_1min[2]) * 0.999 <= 0) --> (low - Number(_BOLL_1min[2]) * 0.997 <= 0)

  • 卖出指标上调:由0.5%上调至1.5%,

    (sellPrice * 0.995 > basePrice) --> (sellPrice * 0.975 > basePrice)

  • 行情群跌现象阻止买入——新增主要指数级监控;image-20210303003947216

  • 两个交易周期之间间隔10分钟,避免多空转换风险;

  • log记录当日触发次数应每次存储,否则会因重启而记录不准确;

  • 初始运行占用内存230M,随后chromium内存泄漏,直至吃完所有剩余内存至服务器卡死;node初始90M,随后95M,也存在内存泄漏——page.reload()

2021-03-04

  • 卖出指标回归到0.5%;
  • 买卖指标由1minBOLL参考 --> 15minBOLL参考;
  • 买入指标上调至0.0%;
  • BOLL15min比例调整,k=10;
  • 降低上轨触及难度:(high * 1.002 - Number(_BOLL_15min[0]) >= 0) --> (high * 1.008 - Number(_BOLL_15min[0]) >= 0)

2021-03-07

未来项目维护的大方向:朝着买卖灵活化、盈利小幅化、应对情景化的交易模式转变。

2021-03-08

  • 引入BOLL带宽度参数:在触及下轨,且BOLL带宽度很宽时,抄底效果明显!
  • BOLL宽度相对平稳时,触及下轨条件宽松,1.000附近;BOLL宽度相对波动时,触及下轨条件严格,0.999~0.98!

2021-03-09

  • 前20的买卖深度数据,订单数求和。看多方支撑和空方压力情况,决定(空转平衡即将多时)适合买入||(多转平衡即将空时)改变既定策略及时卖出————进一步降低风险
  • 卖出点由1.008下调至1.006;买入点由1.000下调至0.997;
  • 修复Bug:reload后未重新点击“隐藏已撤销”;
  • 更新了历史委托相关的selector的查找(原因是官方更新了HTML结构);
  • 卖出后冷却时间由600秒增加至1200秒;
  • 痛心:今日由3个点盈利变成-1亏损,还应该由涨速决定卖出指标,卖出指标应该更灵活!

2021-03-10

  • 新增“历史委托”更新阀,进一步优化性能。服务器内存占用由1.4G最高,下降至700M;15分钟负载由2.31降至1.57

  • 更新了输出的样式,改为表格条件带颜色输出;

  • 涨速计算结果仍有问题;

  • 新增卖出策略:阶梯保留收益,回落到前一阶梯时卖出;同时将BOLL卖出指标下降至1.000;

    ​ // 最大化盈利卖出

    ​ // 如果浮盈超过1%,则记录每次最高浮盈,

    ​ // 当回调超过0.3%时,卖出保证不错过最大盈利,

    ​ // 旨在弥补BOLL未触轨造成的由盈转亏风险

2021-03-11

  • 新增市场情绪行情判断
  • 新增持仓成本计算功能;
  • 新增总盈亏计算;
  • 新增单日涨跌幅;

2021-03-12

  • 改版后发生内存泄漏————经排查:原因是堆内存溢出,已经尽量重置几乎全部对象;

image-20210313032112745

2021-03-15

  • 使用heapdump生成快照追踪内存泄漏;

2021-03-19

  • 完成了代码模块化、解耦,优化了模块间的启动顺序,暂时停用交易模块;
  • 完成子进程运行、项目定时重新启动功能;
  • 尚有很细微的内存泄漏和浏览器长时间运行后缓存过大的问题需要解决;
  • 开始使用git管理代码版本

image-20210319215345709

image-20210319215354607

image-20210319215400521