定義済みのSMAを呼び出しGMMAを作る

概要

addItemIndicatorメソッドを使えば定義済みのアイテムインジケーターを呼び出すことが可能です。 定義済みのSMAを呼び出してGMMAの作成方法について説明します。

他の人が作成したインジケーターを追加することも可能ですが、作成者により悪意を持ったコードが埋め込まれている可能性があります。信頼できるコードのみを使用するようご注意ください。
GMMAの説明はアイネット証券様のサイト等を参照してください。 アイネット証券:GMMA(複合型移動平均線)

addItemIndicator の使用例

このサンプルを実行する前に、tutor.SMAを登録してください 参照:単純移動平均を作る
tutor.SMAのコード
export default (): ItemIndicator<
    {
        period: number
        lineColor: string
        lineWidth: number
        lineDash: number[]
        targetOhlc: 'opens' | 'highs' | 'lows' | 'closes' 
    }, {
        smaBuffer: IndicatorBuffer
    }

> => {
    return {
        type: 'i',
        name: "tutor.SMA",
        onInit() {
            const { period, targetOhlc, ...smaParams } = this.params
            const smaBuffer = this.smaBuffer = this.addLineBuffer(smaParams)
            this.shortName = 'SMA'
            this.onChartChange = ({ index, ...rest }) => {
                const targetBuffer = rest[targetOhlc] 
                if (!targetBuffer) {
                    throw new Error(`${targetOhlc}にはopens,highs,lows,closesを指定してください`) 
                }
                targetBuffer.sma(smaBuffer, period, index)
            }
            this.getDisplayData = (index) => {
                return {
                    sma: smaBuffer.get(index)
                }
            }
        },
        params: {
            period: 25,
            lineColor: 'red',
            lineWidth: 2,
            lineDash: [3, 3],
            targetOhlc: 'closes'
        }
    }
}
               

addItemIndicatorの例として、SMAを2つ追加します。

export default (): ItemIndicator => {
    return {
        type: "i",
        name: "tutor.addItemIndicatorSample",
        onInit() {
            const sma1 = this.addItemIndicator('tutor.SMA', { //1
                period: 25
            });
            const smaBuffer1 = sma1.smaBuffer //2
            const sma2 = this.addItemIndicator('tutor.SMA', { //3
                period: 50,
                lineColor: 'cyan',
                lineDash: [],
                lineWidth: 3
            })
            const smaBuffer2 = sma2.smaBuffer
            // this.onChartChange=()=>{} //4
            this.getDisplayData = (index) => { //5
                return {
                    sma1: smaBuffer1.get(index),
                    sma2: smaBuffer2.get(index)
                }
            }
        }
    }
}
               
1 定義済みのtutor.SMAを呼び出しています。
2 addItemIndicatorで呼び出したの型情報にemaBufferが含まれています。 SMAを定義した時を定義した時に、ItemIndicator型の第2引数にsmaBufferを登録し、thisへの参照を追加した為です。
3 上記とは別に、tutor.SMAを呼び出しています。 呼び出すインジケーターにパラメーターを渡す場合は、addItemIndicatorの第2引数にオブジェクトを渡します。
4 addItemIndicator関数で定義済みのインジケーターを使用するだけの場合、onChartChangeイベントのオーバーライドは不要です。
5 addItemIndicator関数で定義済みのインジケーターを呼び出した場合、getDisplayDataは引き継がれません。必要な場合は明示的に実装する必要があります。

GMMA

このサンプルを実行する前に、tutor.SMAを登録してください 参照:単純移動平均を作る
tutor.SMAのコード
export default (): ItemIndicator<
    {
        period: number
        lineColor: string
        lineWidth: number
        lineDash: number[]
        targetOhlc: 'opens' | 'highs' | 'lows' | 'closes' 
    }, {
        smaBuffer: IndicatorBuffer
    }

> => {
    return {
        type: 'i',
        name: "tutor.SMA",
        onInit() {
            const { period, targetOhlc, ...smaParams } = this.params
            const smaBuffer = this.smaBuffer = this.addLineBuffer(smaParams)
            this.shortName = 'SMA'
            this.onChartChange = ({ index, ...rest }) => {
                const targetBuffer = rest[targetOhlc] 
                if (!targetBuffer) {
                    throw new Error(`${targetOhlc}にはopens,highs,lows,closesを指定してください`) 
                }
                targetBuffer.sma(smaBuffer, period, index)
            }
            this.getDisplayData = (index) => {
                return {
                    sma: smaBuffer.get(index)
                }
            }
        },
        params: {
            period: 25,
            lineColor: 'red',
            lineWidth: 2,
            lineDash: [3, 3],
            targetOhlc: 'closes'
        }
    }
}
               

実装例は下記です。

export default (): ItemIndicator<{
    shortPeriods: number[]
    longPeriods: number[]
    shortColor: string
    longColor: string
}, {
    shortSmaBuffers: IndicatorBuffer[];
    longSmaBuffers: IndicatorBuffer[];
}> => {
    return {
        type: "i",
        name: "tutor.GMMA",
        onInit() {
            this.shortName = "GMMA";
            const params = this.params;
            const _this = this;
            const shortSmas = params.shortPeriods.map(period => {
                return _this.addItemIndicator("tutor.SMA", {
                    period: period,
                    lineColor: params.shortColor,
                    lineDash: [],
                    lineWidth: 1,
                });
            });
            const longSmas = params.longPeriods.map(period => {
                return _this.addItemIndicator("tutor.SMA", {
                    period: period,
                    lineColor: params.longColor,
                    lineDash: [],
                    lineWidth: 1,
                });
            });
            this.shortSmaBuffers = shortSmas.map((x) => x.smaBuffer);
            this.longSmaBuffers = longSmas.map((x) => x.smaBuffer);
            this.getDisplayData = (index) => {
                return [...shortSmas, ...longSmas].reduce(
                    (acc, sma) => {
                        acc[sma.params.period] = Object.values(
                            sma.getDisplayData(index),
                        )[0];
                        return acc;
                    },
                    {} as Record<string, any>,
                );
            };
        },
        params: {
            shortPeriods: [3, 5, 8, 10, 12, 15],
            longPeriods: [30, 35, 40, 45, 50, 60],
            shortColor: "cyan",
            longColor: "pink",
        }
    }
}
               

補足

addItemIndicatorはネストすることが可能です。 例えば、上記のaddItemIndicatorを使用したGMMAを、別のインジケーターからaddItemIndicatorを使って呼び出すことが可能です。