交易爬虫和分析脚本

2018-12-27  本文已影响0人  smg666

此脚本用于EOS链上获取鲸交所2018年12月26日0点0分0秒到12月26日59分59秒的数据。

const axios = require('axios');
const fs = require('fs');

const start = 3996731;
const to = 4056774;
let now = start;

let allActions = [];

let total = to - start;
async function fetchData() {
  let offset = 99;
  if (now + offset >= to) {
    offset = to - now;
  }
  let startTime = Date.now();
  let waitTime = 5;
  try {
    let response = await axios.post('https://eos.greymass.com/v1/history/get_actions', {
      account_name: 'whaleextrust',
      pos: now,
      offset: offset
    });
    if (response.status == 200) {
      var actions = response.data.actions;
      allActions.push.apply(allActions, actions);
      now += 100;
      console.log('('+Math.ceil((now - start) / 100)+'/'+Math.ceil(total / 100)+')fetch success in ' + (Date.now() - startTime) + 'ms');
      if (now > to) {
        console.log('data fetch complete.');
        var finalData = JSON.stringify(allActions);
        fs.writeFile('actions.json', finalData, function(){
          console.log('actions saved.');
        });
        return;
      }
    } else {
      console.log('fetch error.');
      waitTime = 1000;
    }
  } catch (e) {
    console.log('fetch failure.');
    waitTime = 1000;
  }

  setTimeout(() => {
    fetchData();
  }, 10);
}

//start
fetchData();

以下脚本用于采集数据的分析

function parseData() {
  console.log('start analyze...');
  const startTime = Date.now();
  let data = fs.readFileSync('actions.json');
  const actions = JSON.parse(data);
  data = null;
  let trades = 0;
  let mineTrades = 0;
  let accounts = [];
  let mineAccounts = [];
  let candyAccounts = [];
  for (const action of actions) {
    const act = action.action_trace.act;
    if (act.name == 'verifytrade') {
      trades++;
      if (!accounts.includes(act.data.buyer)) {
        accounts.push(act.data.buyer);
      }
      if (!accounts.includes(act.data.seller)) {
        accounts.push(act.data.seller);
      }
      if (act.data.buyer == act.data.seller) {
        mineTrades++;
        if (!mineAccounts.includes(act.data.buyer)) {
          mineAccounts.push(act.data.buyer);
        }
      }
    }
    if (act.name == 'verifyad') {
      if (!candyAccounts.includes(act.data.to)) {
        candyAccounts.push(act.data.to);
      }
    }
  }
 
  let mineAmount = 0;
  let totalAmount = 0;
  let actionMaps = {};
  for (const action of actions) {
    const act = action.action_trace.act;
    if (typeof actionMaps[act.name] == 'undefined') {
      actionMaps[act.name] = 0;
    }
    actionMaps[act.name]++;
    if (act.name == 'verifytrade') {
      if (mineAccounts.includes(act.data.buyer) || mineAccounts.includes(act.data.seller)) {
        mineAmount += act.data.quote_amount;
      }
      totalAmount  += act.data.quote_amount;
    }
  }
  for (const action in actionMaps) {
    console.log('action: '+ action + ':' + actionMaps[action]);
  }
  console.log('--------------------');
  console.log('action count:' + actions.length);
  console.log('trade count:' + trades);
  console.log('account count:' + accounts.length);
  console.log('total amount:' + (totalAmount / 10000));
  console.log('candy account count:' + candyAccounts.length);
  console.log('--------------------');
  console.log('mine trade count:' + mineTrades);
  console.log('mine account count:' +  mineAccounts.length);
  console.log('mine amount:' + (mineAmount / 10000));
  console.log('--------------------');
  console.log('cost time: ' + (Date.now() - startTime) + 'ms');
}

parseData();
上一篇 下一篇

猜你喜欢

热点阅读