use of suite.primitive.adt.pair.LngFltPair in project suite by stupidsing.
the class StockHistory method adjustPrices.
private LngFltPair[] adjustPrices(String tag) {
LngFltPair[] pairs0 = data.get(tag);
int length = pairs0.length;
LngFltPair[] pairs1 = new LngFltPair[length];
int si = splits.length - 1;
int di = dividends.length - 1;
float a = 0f, b = 1f;
for (int i = length - 1; 0 <= i; i--) {
LngFltPair pair = pairs0[i];
long t = pair.t0;
if (0 <= di) {
LngFltPair dividend = dividends[di];
if (t < dividend.t0) {
if (Boolean.TRUE)
// may got negative prices
a -= dividend.t1 * b;
else
// may got skewed profits
b *= (pair.t0 - dividend.t0) / pair.t0;
di--;
}
}
if (0 <= si) {
LngFltPair split = splits[si];
if (t < split.t0) {
b *= split.t1;
si--;
}
}
pairs1[i] = LngFltPair.of(pair.t0, a + b * pair.t1);
}
return pairs1;
}
use of suite.primitive.adt.pair.LngFltPair in project suite by stupidsing.
the class Yahoo method getStockHistory.
private StockHistory getStockHistory(String symbol) {
Path path = HomeDir.dir("yahoo").resolve(symbol + ".txt");
StockHistory stockHistory0;
if (Files.exists(path))
try {
List<String> lines = Rethrow.ex(() -> Files.readAllLines(path));
stockHistory0 = StockHistory.of(Read.from(lines).outlet());
} catch (Exception ex) {
stockHistory0 = StockHistory.new_();
}
else
stockHistory0 = StockHistory.new_();
Time time = HkexUtil.getCloseTimeBefore(Time.now());
StockHistory stockHistory1;
if (stockHistory0.isActive && Time.compare(stockHistory0.time, time) < 0) {
JsonNode json = queryL1(symbol, TimeRange.of(stockHistory0.time.addDays(-14), Time.now()));
Streamlet<JsonNode> jsons = //
Read.each(json).flatMap(json_ -> json_.path("chart").path("result"));
String exchange = //
jsons.map(//
json_ -> json_.path("meta").path("exchangeName").textValue()).uniqueResult();
long[] ts = //
jsons.flatMap(//
json_ -> json_.path("timestamp")).collect(//
Obj_Lng.lift(t -> getOpenTimeBefore(exchange, t.longValue()))).toArray();
int length = ts.length;
Streamlet2<String, Streamlet<JsonNode>> dataJsons0 = //
Read.<String>empty().map2(tag -> //
jsons.flatMap(json_ -> {
JsonNode json0 = json_.path("indicators");
JsonNode json1;
if (//
false || //
!(json1 = json0.path("unadjclose")).isMissingNode() || !(json1 = json0.path("unadjquote")).isMissingNode())
return json1;
else
return List.of();
}).flatMap(json_ -> json_.path("unadj" + tag)));
Streamlet2<String, Streamlet<JsonNode>> dataJsons1 = //
Read.each("open", "close", "high", "low", //
"volume").map2(tag -> //
jsons.flatMap(//
json_ -> json_.path("indicators").path("quote")).flatMap(json_ -> json_.path(tag)));
Map<String, LngFltPair[]> data = //
Streamlet2.concat(dataJsons0, //
dataJsons1).mapValue(//
json_ -> json_.collect(Obj_Flt.lift(JsonNode::floatValue)).toArray()).filterValue(//
fs -> length <= fs.length).mapValue(//
fs -> To.array(length, LngFltPair.class, i -> LngFltPair.of(ts[i], fs[i]))).toMap();
LngFltPair[] dividends = //
jsons.flatMap(//
json_ -> json_.path("events").path("dividends")).map(//
json_ -> LngFltPair.of(json_.path("date").longValue(), json_.path("amount").floatValue())).sort(//
LngFltPair.comparatorByFirst()).toArray(LngFltPair.class);
LngFltPair[] splits = //
jsons.flatMap(//
json_ -> json_.path("events").path("splits")).map(json_ -> LngFltPair.of(json_.path("date").longValue(), //
json_.path("numerator").floatValue() / json_.path("denominator").floatValue())).sort(//
LngFltPair.comparatorByFirst()).toArray(LngFltPair.class);
if (data.containsKey("close"))
stockHistory1 = //
StockHistory.of(exchange, time, true, data, dividends, //
splits).merge(//
stockHistory0).alignToDate();
else
stockHistory1 = Fail.t();
FileUtil.write(path, stockHistory1.write());
} else
stockHistory1 = stockHistory0;
Predicate<LngFltPair> splitFilter;
LngFltPair[] splits2;
if (String_.equals(symbol, "0700.HK"))
splitFilter = pair -> pair.t0 != Time.of(2014, 5, 15, 9, 30).epochSec();
else if (String_.equals(symbol, "2318.HK"))
splitFilter = pair -> pair.t0 != Time.of(2015, 7, 27, 9, 30).epochSec();
else
splitFilter = null;
splits2 = //
splitFilter != null ? //
Read.from(stockHistory1.splits).filter(splitFilter).toArray(LngFltPair.class) : stockHistory1.splits;
StockHistory stockHistory2 = stockHistory1.create(stockHistory1.data, stockHistory1.dividends, splits2);
StockHistory stockHistory3 = LogUtil.prefix("for " + symbol + ": ", () -> stockHistory2.cleanse());
return stockHistory3;
}
use of suite.primitive.adt.pair.LngFltPair in project suite by stupidsing.
the class Trade_ method dividend.
public static float dividend(Streamlet<Trade> trades, Fun<String, LngFltPair[]> fun, Dbl_Dbl feeFun) {
float sum = 0f;
for (Pair<String, List<Trade>> pair : trades.toMultimap(trade -> trade.symbol).listEntries()) {
LngFltPair[] dividends = fun.apply(pair.t0);
Outlet<Trade> outlet = Outlet.of(pair.t1);
LngIntPair tn = LngIntPair.of(0l, 0);
Source<LngIntPair> tradeSource = () -> {
Trade trade = outlet.next();
long t = trade != null ? Time.of(trade.date + " 12:00:00").epochSec(8) : Long.MAX_VALUE;
return LngIntPair.of(t, tn.t1 + (trade != null ? trade.buySell : 0));
};
LngIntPair tn1 = tradeSource.source();
for (LngFltPair dividend : dividends) {
while (tn1 != null && tn1.t0 < dividend.t0) {
tn.update(tn1.t0, tn1.t1);
tn1 = tradeSource.source();
}
float amount = tn.t1 * dividend.t1;
sum += amount - feeFun.apply(amount);
}
}
return sum;
}
use of suite.primitive.adt.pair.LngFltPair in project suite by stupidsing.
the class LngFltMap method forEach.
public void forEach(LngFltSink sink) {
LngFltPair pair = LngFltPair.of((long) 0, (float) 0);
LngFltSource source = source_();
while (source.source2(pair)) sink.sink2(pair.t0, pair.t1);
}
Aggregations