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 stopLossThreshold = -infinity(); settable bool stopLossEnabled = true; // Reference threshold to calculate signal below 100% // (doesn't impact closing behavior) settable double startStopLossSignalAt; { onCalculatingCloseSignals(signals -> { // How close are we to our loss limit? if (stopLossEnabled && stopLossThreshold > -infinity()) { var signal = new CloseSignal().createdBy(this).reason("Stop loss"); if (juiceValue <= stopLossThreshold) signal.strength(1); else { double startAt = max(startStopLossSignalAt, 0); if (startAt > stopLossThreshold) signal.strength(doubleRatio(startAt-juiceValue, startAt-stopLossThreshold)); } signals.add(signal); } }); } }