Libraryless. Click here for Pure Java version (15303L/89K).
persistable sclass MultiCallbackJuicer extends AbstractJuicer { // Must have at least one level, otherwise no closing at all sclass Level { // At juice value minJuiceValue, define the callback rate. // Callback rates are interpolated between levels. settable double minJuiceValue; settable double callback; toString { ret "Callback " + callback + "% starting at " + formatDouble2(minJuiceValue); } } settableWithVar new L<Level> levels; // Highest juice value seen settableWithVar double crest = -infinity(); settableWithVar double currentCallback; { onCalculatingCloseSignals(signals -> { if (juiceValue > crest) crest(juiceValue); currentCallback(callbackForJuiceValue(crest)); var signal = new CloseSignal().createdBy(this).reason(formatDouble2(currentCallback) + "% Callback"); signal.strength(doubleRatio(crest-juiceValue, currentCallback)*100); signals.add(signal); }); } double callbackForJuiceValue(double juice) { for (int i = l(levels)-1; i >= 0; i--) { Level level = levels.get(i); if (juice < level.minJuiceValue) continue; Level nextLevel = get(levels, i+1); if (nextLevel == null) ret level.callback; ret blend(level.callback, nextLevel.callback, transformToZeroToOne(juice, level.minJuiceValue, nextLevel.minJuiceValue)); } ret empty(levels) ? 1000 : first(levels).callback; } void addLevel(double minJuiceValue, double callback) { levels.add(new Level().minJuiceValue(minJuiceValue).callback(callback)); } toString { ret commaCombine( shortClassName(this), levels, crest == -infinity() ? null : "Highest profit seen: " + formatDouble2(crest), "Current callback: " + formatDouble2(currentCallback), ); } void copyTransientValuesFrom(AbstractJuicer juicer) { if (juicer cast MultiCallbackJuicer) crest(juicer.crest); } }
Began life as a copy of #1036356
download show line numbers debug dex old transpilations
Travelled to 2 computer(s): mqqgnosmbjvj, wnsclhtenguj
No comments. add comment
Snippet ID: | #1036534 |
Snippet name: | MultiCallbackJuicer - saner version of MultiPullbackJuicer |
Eternal ID of this version: | #1036534/6 |
Text MD5: | a24a630c506af79bbb848db2d812cccd |
Transpilation MD5: | 251fb15583ad1a10ff2fac0023f867db |
Author: | stefan |
Category: | javax |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2023-01-24 17:57:46 |
Source code size: | 2077 bytes / 67 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 183 / 244 |
Version history: | 5 change(s) |
Referenced in: | #1003674 - Standard Classes + Interfaces (LIVE continued in #1034167) #1036611 - MultiStopLossJuicer - even simpler version of MultiCallbackJuicer with fixed thresholds & stop loss levels |