Warning: session_start(): open(/var/lib/php/sessions/sess_u073s6ij8eekn2m071sllit7vn, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
persistable sclass TickerSequence is IntSize {
settable S market; // e.g. "TRBUSDT"
new LongBuffer timestamps;
new DoubleBuffer prices;
void addIfPriceChanged(double price, long timestamp) {
if (isEmpty() || last(prices) != price)
add(price, timestamp);
}
void add(double price, long timestamp) {
timestamps.add(timestamp);
prices.add(price);
}
void add(double[] prices, long[] timestamps) {
assertEquals(l(prices), l(timestamps));
this.prices.addAll(asList(prices));
this.timestamps.addAll(asList(timestamps));
}
toString {
ret "TickerSequence length " + n2(l(prices));
}
TickerSequence subSequence(int start, int end) {
new TickerSequence s;
s.add(
subDoubleArray(prices.toArray(), start, end),
subArray(timestamps.toArray(), start, end));
ret s;
}
TickerSequence cutOffAfterSeconds(double seconds) {
int idx = indexOfTimestamp(startTime()+secondsToMS(seconds));
ret subSequence(0, idx);
}
int indexOfTimestamp(double ts) {
ret binarySearch_insertionPoint(timestamps.asVirtualList(), lround(ts));
}
long nextTimestamp(double ts) {
ret getTimestamp(indexOfTimestamp(ts)+1);
}
double priceAtTimestamp(double ts) {
ret getPrice(indexOfTimestamp(ts));
}
public int size() { ret l(prices); }
public bool isEmpty() { ret size() == 0; }
TimestampRange timeRange() {
ret isEmpty() ? null : TimestampRange(first(timestamps), last(timestamps));
}
long startTime() { ret first(timestamps); }
long endTime() { ret last(timestamps); }
double getPrice(int i) { ret prices.get(clampToLength(size(), i)); }
long getTimestamp(int i) { ret timestamps.get(clampToLength(size(), i)); }
TickerSequence removePlateaus() {
new TickerSequence seq;
seq.market(market);
int n = size();
for i to n: {
var value = getPrice(i);
seq.prices.add(value);
seq.timestamps.add(getTimestamp(i));
while (i+1 < n && getPrice(i+1) == value) ++i;
}
ret seq;
}
double minPrice() { ret doubleMin(prices.toArray()); }
double maxPrice() { ret doubleMax(prices.toArray()); }
}