신심리도 추가, 투자심리도 수정

This commit is contained in:
Macbook
2026-05-29 23:03:47 +09:00
parent 320675ea6b
commit 359e6c9653
19 changed files with 226 additions and 74 deletions
+37 -11
View File
@@ -113,7 +113,7 @@ export function calcVR(
return { plot0: toPlotData(bars, vals) };
}
/** 심리도(업비트): N일 중 전일 대비 상승일 비율 × 100 */
/** 심리도: N일 중 전일 대비 상승일 비율 × 100 */
export function calcPsychological(
bars: OHLCVBar[],
params: Record<string, number | string | boolean>,
@@ -131,27 +131,53 @@ export function calcPsychological(
return { plot0: toPlotData(bars, vals) };
}
/** @deprecated Psychological 사용 */
export const calcNewPsychological = calcPsychological;
/**
* 신심리도(업비트): [상승일수×상승폭비율 − 하락일수×하락폭비율] × 100 / N
* 상승폭비율 = 상승폭합 / (상승폭합+하락폭합)
*/
export function calcNewPsychological(
bars: OHLCVBar[],
params: Record<string, number | string | boolean>,
): Record<string, PlotData> {
const period = Number(params.length ?? 10);
const closes = bars.map(b => b.close);
const vals = closes.map((_, i) => {
if (i < period) return NaN;
let upSize = 0;
let downSize = 0;
let upDay = 0;
let downDay = 0;
for (let j = i - period + 1; j <= i; j++) {
const diff = closes[j] - closes[j - 1];
if (diff > 0) {
upSize += diff;
upDay++;
} else if (diff < 0) {
downSize += -diff;
downDay++;
}
}
const total = upSize + downSize;
if (total === 0) return NaN;
return (upDay * (upSize / total) - downDay * (downSize / total)) * 100 / period;
});
return { plot0: toPlotData(bars, vals) };
}
/** 투자심리도(업비트): N일 중 상승일 거래량 비중 × 100 */
/** 투자심리도(업비트): N일 중 전일 대비 상승일 비율 × 100 */
export function calcInvestPsychological(
bars: OHLCVBar[],
params: Record<string, number | string | boolean>,
): Record<string, PlotData> {
const period = Number(params.length ?? 10);
const closes = bars.map(b => b.close);
const volumes = bars.map(b => b.volume);
const vals = closes.map((_, i) => {
if (i < period) return NaN;
let upVol = 0;
let total = 0;
let up = 0;
for (let j = i - period + 1; j <= i; j++) {
total += volumes[j];
if (closes[j] > closes[j - 1]) upVol += volumes[j];
if (closes[j] > closes[j - 1]) up++;
}
if (total === 0) return NaN;
return (upVol / total) * 100;
return (up / period) * 100;
});
return { plot0: toPlotData(bars, vals) };
}