- Build indicator list dynamically from class getMetadata() instead of hardcoded array - Remove checkboxes; single-click previews config, double-click adds to chart - Support multiple instances of same indicator type (unique IDs) - Add TradingView-style column legend overlay on chart (top-left) - Recalculate indicators when historical data is prefetched on scroll - Make indicator list and config panels scrollable (hidden scrollbars) - Remove AVAILABLE_INDICATORS from strategies/config.js
38 lines
1.3 KiB
JavaScript
38 lines
1.3 KiB
JavaScript
import { BaseIndicator } from './base.js';
|
|
|
|
export class ATRIndicator extends BaseIndicator {
|
|
calculate(candles) {
|
|
const period = this.params.period || 14;
|
|
const results = new Array(candles.length).fill(null);
|
|
const tr = new Array(candles.length).fill(0);
|
|
|
|
for (let i = 1; i < candles.length; i++) {
|
|
const h_l = candles[i].high - candles[i].low;
|
|
const h_pc = Math.abs(candles[i].high - candles[i-1].close);
|
|
const l_pc = Math.abs(candles[i].low - candles[i-1].close);
|
|
tr[i] = Math.max(h_l, h_pc, l_pc);
|
|
}
|
|
|
|
let atr = 0;
|
|
let sum = 0;
|
|
for (let i = 1; i <= period; i++) sum += tr[i];
|
|
atr = sum / period;
|
|
results[period] = atr;
|
|
|
|
for (let i = period + 1; i < candles.length; i++) {
|
|
atr = (atr * (period - 1) + tr[i]) / period;
|
|
results[i] = atr;
|
|
}
|
|
return results;
|
|
}
|
|
|
|
getMetadata() {
|
|
return {
|
|
name: 'ATR',
|
|
description: 'Average True Range - measures market volatility',
|
|
inputs: [{ name: 'period', label: 'Period', type: 'number', default: 14, min: 1, max: 100 }],
|
|
plots: [{ id: 'value', color: '#795548', title: 'ATR' }]
|
|
};
|
|
}
|
|
}
|