persistable srecord noeq PriceDigitizer(PriceCells cells) { double lastPrice = Double.NaN; gettable double lastDigitizedPrice = Double.NaN; settable double digitizedPrice = Double.NaN; settable bool verbose; void init(double price) { lastDigitizedPrice = digitizedPrice = lastPrice = price; } // returns new digitized price double digitize(double price) { if (verbose) printVars("digitize", +lastPrice, +price); lastDigitizedPrice = digitizedPrice; if (!isNaN(lastPrice)) { if (price > lastPrice) { double limit = cells.nextCellLimit(lastPrice); if (verbose) print("PriceDigitizer limit: " + limit); if (price >= limit) { // Go up one cell digitizedPrice = limit; // Go up more cells? /*while (price >= (limit = cells.nextCellLimit(digitizedPrice))) digitizedPrice = limit;*/ } } else if (price < lastPrice) { double limit = cells.previousCellLimit(lastPrice); if (verbose) print("PriceDigitizer limit: " + limit); if (price <= limit) { digitizedPrice = limit; // Go down more cells? /*while (price <= (limit = cells.previousCellLimit(digitizedPrice))) digitizedPrice = limit;*/ } } } lastPrice = price; ret digitizedPrice; } // digitize price without looking at history double digitizeIndividually(double price) { double price2 = cells.nextCellLimit(price); double price1 = cells.previousCellLimit(price2); ret absdiff(price, price1) < absdiff(price, price2) ? price1 : price2; } }