Ichimoku Kinko Hyo (SDK Trading)

The so-called Ichimoku Kinko Hyo, or Ichimoku for short, is a technical indicator that is used to help traders gauge momentum along with future areas of support and resistance. It's an all-in-one technical indicator comprised of five lines called the Tenkan line, Kijun line, Senkou Span A, Senkou Span B and Chikou Span line.

Ichimoku Kinko Hyo (SDK Trading)

registerIndicator("ichimoku", "Ichimoku Kinko Hyo(v1.0)", function (context) {
    var dataInputHigh = getDataInput(context, 0)
    var dataInputLow = getDataInput(context, 1)
    var dataInputClose = getDataInput(context, 2)
    var dataOutputTenkan = getDataOutput(context, "tenkan")
    var dataOutputKijun = getDataOutput(context, "kijun")
    var dataOutputChikou = getDataOutput(context, "chikou")
    var dataOutputSpanA = getDataOutput(context, "spana")
    var dataOutputSpanB = getDataOutput(context, "spanb")

    var tenkan = getIndiParameter(context, "tenkan")
    var kijun = getIndiParameter(context, "kijun")
    var senkou = getIndiParameter(context, "senkou")
    var spanA;
    if (kijun < tenkan) {
        spanA = tenkan;
    }else{
        spanA = kijun;
    }

    var calculatedLength = getCalculatedLength(context)
    var ptr = calculatedLength
    var maxParam = Math.max(tenkan, kijun, spanA, senkou)

    if (ptr > 0) {
        ptr--
    } else {
        ptr = maxParam - 1

        for (var i = 1; i < maxParam; i++) {
            dataOutputTenkan[ptr - i] = 0
            dataOutputKijun[ptr - i] = 0
            dataOutputChikou[ptr - i] = 0
            dataOutputSpanA[ptr - i] = 0
            dataOutputSpanB[ptr - i] = 0
        }
    }

    var ptr2, tmp, highest, lowest

    while (ptr < dataInputHigh.length) {
        tmp = null
        highest = -Number.MAX_VALUE
        lowest = Number.MAX_VALUE

        ptr2 = ptr - tenkan + 1

        while (ptr2 <= ptr) {
            tmp = dataInputHigh[ptr2]
            if (highest < tmp) {
                highest = tmp
            }

            tmp = dataInputLow[ptr2]
            if (lowest > tmp) {
                lowest = tmp
            }

            ptr2++
        }

        dataOutputTenkan[ptr] = (highest + lowest) / 2

        tmp = null
        highest = -Number.MAX_VALUE
        lowest = Number.MAX_VALUE

        ptr2 = ptr - kijun + 1

        while (ptr2 <= ptr) {
            tmp = dataInputHigh[ptr2]
            if (highest < tmp) {
                highest = tmp
            }

            tmp = dataInputLow[ptr2]
            if (lowest > tmp) {
                lowest = tmp
            }

            ptr2++
        }

        dataOutputKijun[ptr] = (highest + lowest) / 2

        dataOutputSpanA[ptr] = (dataOutputTenkan[ptr] + dataOutputKijun[ptr]) / 2

        tmp = null
        highest = -Number.MAX_VALUE
        lowest = Number.MAX_VALUE

        ptr2 = ptr - senkou + 1

        while (ptr2 <= ptr) {
            tmp = dataInputHigh[ptr2]
            if (highest < tmp) {
                highest = tmp
            }

            tmp = dataInputLow[ptr2]
            if (lowest > tmp) {
                lowest = tmp
            }

            ptr2++
        }

        dataOutputSpanB[ptr] = (highest + lowest) / 2

        dataOutputChikou[ptr] = dataInputClose[ptr]

        ptr++
    }

    if (calculatedLength == 0) {
        setIndiShift(context, "chikou", -kijun)
        setIndiShift(context, "spana", kijun)
        setIndiShift(context, "spanb", kijun)
    }
},[{
    name: "tenkan",
    value: 9,
    required: true,
    type: PARAMETER_TYPE.INTEGER,
    range: [1, 100]
},{
    name: "kijun",
    value: 26,
    required: true,
    type: PARAMETER_TYPE.INTEGER,
    range: [1, 100]
},{
    name: "senkou",
    value: 52,
    required: true,
    type: PARAMETER_TYPE.INTEGER,
    range: [1, 100]
}],
[{
    name: DATA_NAME.HIGH,
    index: 0
},{
    name: DATA_NAME.LOW,
    index: 1
},{
    name: DATA_NAME.CLOSE,
    index: 2
}],
[{
    name: "tenkan",
    visible: true,
    renderType: RENDER_TYPE.LINE,
    color: "#DE5029"
},{
    name: "kijun",
    visible: true,
    renderType: RENDER_TYPE.LINE,
    color: "steelblue"
},{
    name: "chikou",
    visible: true,
    renderType: RENDER_TYPE.DASHARRAY,
    color: "#4EC2B4"
},{
    name: "spana",
    visible: true,
    renderType: RENDER_TYPE.ROUND,
    color: "steelblue"
},{
    name: "spanb",
    visible: true,
    renderType: RENDER_TYPE.ROUND,
    color: "#CCCCCC"
}],
WHERE_TO_RENDER.CHART_WINDOW)