CookieClicker trading bot

Automatically trade stocks

// ==UserScript==
// @name        CookieClicker trading bot
// @namespace   Violentmonkey Scripts
// @match       http://orteil.dashnet.org/cookieclicker/
// @match       https://orteil.dashnet.org/cookieclicker/
// @match       http://ozh.github.io/cookieclicker/
// @grant       none
// @version     1.0.8
// @author      lordratte
// @description  Automatically trade stocks
// ==/UserScript==

function trader_tick() {
  'use strict'
  let mgame = Game.Objects.Bank.minigame;
  let resting_values = mgame.goodsById.map(g => 10 * (g.id + 1) + Game.Objects.Bank.level - 1);

  function loop_goods(callback) {
    for (let good_id in mgame.goodsById.reverse()) {
      let good = mgame.goodsById[good_id];
      let sell_lim = resting_values[good_id];
      // price x (1 + broker_fee) <= resting_price
      // therefore: price <= resting_price / (1 + broker_fee)
      let buy_lim = sell_lim / (1 + 0.01 * (20 * Math.pow(0.95, mgame.brokers)));

      callback({
        'good': good,
        'sell_lim': sell_lim,
        'buy_lim': buy_lim
      });


    }
  }

  loop_goods(data => {
    if (data.good.val >= data.sell_lim) {
      mgame.sellGood(data.good.id, 20);
    }
  });
  loop_goods(data => {
    if (data.good.val < data.buy_lim) {
      mgame.buyGood(data.good.id, 20);
    }
  });

}

window.eval(trader_tick.toString() + ";" + "(" + (function() {
  'use strict';

  function load_trader() {
    try {
      Game.Objects.Bank.minigame.__old_tick = Game.Objects.Bank.minigame.tick;
      Game.Objects.Bank.minigame.tick = function() {
        this.__old_tick();
        trader_tick();
      }
      Sounds['snd/cashIn.mp3'] = {readyState:1};
      Sounds['snd/cashOut.mp3'] = {readyState:1};
      console.log('Trader loaded');
      return true;
    } catch {
      return false;
    }
  }

  var interval = setInterval(function() {
    if (Game && Game.ready && load_trader()) {
      clearInterval(interval);
    }
  }, 1000);
}).toString() + ")()");

// vim: ts=2 sw=2 sts=2