Add configurable RSI levels and remove line settings for RSI

RSI Changes:
- Add overbought and oversold level inputs (default 70/30)
- Update calculate() to return overboughtBand and oversoldBand instead of hardcoded bands
- Update plots to use overboughtBand and oversoldBand with fixed style='dashed' and width=1
- This makes RSI bands adjustable while keeping line style and width fixed

Configuration Panel:
- Hide Line Type and Line Width settings for RSI (indicator.type === 'rsi')
- RSI bands always dashed at 1px width as standard
- Overbought and oversold levels now appear as configurable parameters
This commit is contained in:
DiTus
2026-02-25 23:26:46 +01:00
parent c6a6f1cfb9
commit 7539830524
2 changed files with 19 additions and 13 deletions

View File

@ -3,6 +3,8 @@ import { BaseIndicator } from './base.js';
export class RSIIndicator extends BaseIndicator {
calculate(candles) {
const period = this.params.period || 14;
const overbought = this.params.overbought || 70;
const oversold = this.params.oversold || 30;
// 1. Calculate RSI using RMA (Wilder's Smoothing)
let rsiValues = new Array(candles.length).fill(null);
@ -38,29 +40,31 @@ export class RSIIndicator extends BaseIndicator {
return {
paneBg: 80, // Background lightening trick
rsi: rsi,
upperBand: 70,
lowerBand: 30
overboughtBand: overbought,
oversoldBand: oversold
};
});
}
getMetadata() {
const plots = [
// RSI Line
{ id: 'rsi', color: '#7E57C2', title: '', width: 1, lastValueVisible: true },
// Bands
{ id: 'upperBand', color: '#787B86', title: '', style: 'dashed', width: 1, lastValueVisible: false },
{ id: 'lowerBand', color: '#787B86', title: '', style: 'dashed', width: 1, lastValueVisible: false }
];
return {
name: 'RSI',
description: 'Relative Strength Index',
inputs: [
{ name: 'period', label: 'RSI Length', type: 'number', default: 14, min: 1, max: 100 }
{ name: 'period', label: 'RSI Length', type: 'number', default: 14, min: 1, max: 100 },
{ name: 'overbought', label: 'Overbought Level', type: 'number', default: 70, min: 50, max: 95 },
{ name: 'oversold', label: 'Oversold Level', type: 'number', default: 30, min: 5, max: 50 }
],
plots: [
// RSI Line - solid, 1px
{ id: 'rsi', color: '#7E57C2', title: '', style: 'solid', width: 1, lastValueVisible: true },
// Overbought Band - dashed, 1px
{ id: 'overboughtBand', color: '#787B86', title: '', style: 'dashed', width: 1, lastValueVisible: false },
// Oversold Band - dashed, 1px
{ id: 'oversoldBand', color: '#787B86', title: '', style: 'dashed', width: 1, lastValueVisible: false }
],
plots: plots,
displayMode: 'pane',
paneMin: 0,
paneMax: 100

View File

@ -281,6 +281,7 @@ return `
`.trim() + '';
}).join('')}
${indicator.type !== 'rsi' ? `
<div class="config-row">
<label>Line Type</label>
<select onchange="window.updateIndicatorSetting && window.updateIndicatorSetting('${indicator.id}', '_lineType', this.value)">
@ -293,6 +294,7 @@ return `
<input type="range" min="1" max="5" value="${indicator.params._lineWidth || 2}" onchange="this.nextElementSibling.textContent = this.value; window.updateIndicatorSetting && window.updateIndicatorSetting('${indicator.id}', '_lineWidth', parseInt(this.value))">
<span class="range-value">${indicator.params._lineWidth || 2}</span>
</div>
` : ''}
</div>
${meta?.inputs && meta.inputs.length > 0 ? `