RSIを作る JsTrader

RSIを作る

RSIの作成

RSIのサンプルコードは下記です。

export default (): ContainerIndicator<{
    period: number
    lineColor: string
    initialHeight: number | string
}, {
    rsiBuffer: IndicatorBuffer
}> => {
    return {
        type: "c",
        name: "tutor.RSI",
        onInit() {
            const { initialHeight, lineColor } = this.params
            this.initialHeight = initialHeight
            const diffBuffer = this.addWorkBuffer(); //1
            const rsiBuffer = this.rsiBuffer = this.addLineBuffer({ lineColor });
            this.addPercentLine(70, "darkgray")//2
            this.addPercentLine(30, "darkgray")
            this.digits = 0 //3
            this.getMin = (index, lows) => 0 //4
            this.getMax = (index, highs) => 100 //5
            this.onChartChange = ({ index, times, opens, highs, lows, closes, spreads }) => {
                const period = this.params.period;
                const diff = closes.get(index) - closes.get(index - 1)
                diffBuffer.set(index, diff);
                let sumGain = 0, sumLoss = 0
                for (let i = index - period + 1; i <= index; i++) {
                    const diff = diffBuffer.get(i)
                    if (diff > 0) {
                        sumGain += diff
                    } else if (diff <= 0) {
                        sumLoss -= diff
                    } else {
                        sumGain = NaN, sumLoss = NaN;
                        break;
                    }
                }
                const avgGain = sumGain / period, avgLoss = (Math.abs(sumLoss)) / period;
                const rsi = avgLoss === 0 ? 100 : avgGain === 0 ? 0 : (100 - (100 / (1 + (avgGain / avgLoss))))
                rsiBuffer.set(index, rsi)
            }
            this.getDisplayData = (index) => {
                return { rsi: this.rsiBuffer.get(index) }
            }
        },
        params: {
            period: 14,
            lineColor: "purple",
            initialHeight: "25%"
        }
    }
}
                   
1 計算の為に必要だが表示は不要の場合、addWorkBuffer関数を使ってWorkBufferを作成します。
strategy.chartからaddContainerIndicatorでこのインジケーターを呼び出した場合、workBufferを公開する必要は無い為、thisには設定していません
2 特定の価格に横線を表示するにはaddPercentLineメソッドを使用します。
3 インジケーターバッファーに設定した価格の小数点以下の桁数は、規定では表示中の通貨と同じになります。
symbol digits
EURUSD 5
USDJPY 3
これを上書きするにはインジケーターのdigitを明示的に設定します。

なお、次のようにインジケーターのsymbolプロパティを参照することで表示中の通貨名や小数点以下の桁数を取得することができます。


const symbolName = this.symbol.name; // 表示中のシンボル名
const symbolDigit = this.symbol.digits; // 表示中のシンボルの小数点以下の桁数
4 規定ではチャートに表示されるインジケーターの最小価格は、表示中のバーの中の最小価格となります。より小さい価格を返したい場合はgetMinメソッドで最小価格を返してください
5 規定ではチャートに表示されるインジケーターの最大価格は、表示中のバーの中の最大価格となります。より小さい価格を返したい場合はgetMinメソッドで最大価格を返してください