persistable sclass StopLossJuicer extends AbstractJuicer { // How much loss we will accept // Can be positive (stop loss in profit) or negative (stop loss with actual loss) settable double stopLossLimit = -0.5; settable bool stopLossEnabled = true; // Reference threshold to calculate signal below 100% // (doesn't impact closing behavior) settable double startStopLossSignalAt; *(double *stopLossLimit) {} { onCalculatingCloseSignals(signals -> { // How close are we to our loss limit? if (stopLossEnabled && stopLossLimit > -infinity()) { var signal = new CloseSignal().createdBy(this).reason("Stop loss"); if (juiceValue <= stopLossLimit) signal.strength(100); else { double startAt = max(startStopLossSignalAt, 0); if (startAt > stopLossLimit) signal.strength(doubleRatio(startAt-juiceValue, startAt-stopLossLimit)*100); } signals.add(signal); } }); } }