신심리도 추가, 투자심리도 수정
This commit is contained in:
@@ -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) };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user