mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-07-27 17:27:43 +00:00
78 lines
3.0 KiB
Plaintext
78 lines
3.0 KiB
Plaintext
// Licensed under the Apache License, Version 2.0
|
|
// © mihakralj
|
|
//@version=6
|
|
indicator("Ichimoku Cloud", "ICHIMOKU", overlay=true)
|
|
|
|
//@function Calculate Ichimoku Cloud components
|
|
//@param tenkan_period Tenkan-sen (Conversion Line) period
|
|
//@param kijun_period Kijun-sen (Base Line) period
|
|
//@param senkou_b_period Senkou Span B (Leading Span B) period
|
|
//@returns [tenkan, kijun, senkou_a, senkou_b, chikou] Five Ichimoku components
|
|
//@optimized Single-pass calculation of all three Donchian midpoints
|
|
ichimoku(simple int tenkan_period, simple int kijun_period, simple int senkou_b_period) =>
|
|
if tenkan_period <= 0
|
|
runtime.error("Tenkan period must be greater than 0")
|
|
if kijun_period <= 0
|
|
runtime.error("Kijun period must be greater than 0")
|
|
if senkou_b_period <= 0
|
|
runtime.error("Senkou B period must be greater than 0")
|
|
|
|
int max_period = math.max(tenkan_period, math.max(kijun_period, senkou_b_period))
|
|
int effective_period = math.min(bar_index + 1, max_period)
|
|
|
|
float tenkan_high = high
|
|
float tenkan_low = low
|
|
float kijun_high = high
|
|
float kijun_low = low
|
|
float senkou_b_high = high
|
|
float senkou_b_low = low
|
|
|
|
for i = 1 to effective_period - 1
|
|
float h = nz(high[i])
|
|
float l = nz(low[i])
|
|
|
|
if not na(h) and not na(l)
|
|
if i < tenkan_period
|
|
if h > tenkan_high
|
|
tenkan_high := h
|
|
if l < tenkan_low
|
|
tenkan_low := l
|
|
|
|
if i < kijun_period
|
|
if h > kijun_high
|
|
kijun_high := h
|
|
if l < kijun_low
|
|
kijun_low := l
|
|
|
|
if i < senkou_b_period
|
|
if h > senkou_b_high
|
|
senkou_b_high := h
|
|
if l < senkou_b_low
|
|
senkou_b_low := l
|
|
|
|
float tenkan = (tenkan_high + tenkan_low) / 2.0
|
|
float kijun = (kijun_high + kijun_low) / 2.0
|
|
float senkou_a = (tenkan + kijun) / 2.0
|
|
float senkou_b = (senkou_b_high + senkou_b_low) / 2.0
|
|
float chikou = close
|
|
|
|
[tenkan, kijun, senkou_a, senkou_b, chikou]
|
|
|
|
// ---------- Main loop ----------
|
|
|
|
i_tenkan = input.int(9, "Tenkan Period", minval=1, maxval=5000)
|
|
i_kijun = input.int(26, "Kijun Period", minval=1, maxval=5000)
|
|
i_senkou_b = input.int(52, "Senkou B Period", minval=1, maxval=5000)
|
|
i_displacement = input.int(26, "Displacement", minval=1, maxval=500)
|
|
|
|
[tenkan, kijun, senkou_a, senkou_b, chikou] = ichimoku(i_tenkan, i_kijun, i_senkou_b)
|
|
|
|
plot(tenkan, "Tenkan-sen", color=color.blue, linewidth=1)
|
|
plot(kijun, "Kijun-sen", color=color.red, linewidth=1)
|
|
plot(chikou, "Chikou Span", color=color.purple, linewidth=1, offset=-i_displacement)
|
|
|
|
p1 = plot(senkou_a, "Senkou Span A", color=color.green, linewidth=1, offset=i_displacement)
|
|
p2 = plot(senkou_b, "Senkou Span B", color=color.red, linewidth=1, offset=i_displacement)
|
|
|
|
fill(p1, p2, color=senkou_a > senkou_b ? color.new(color.green, 90) : color.new(color.red, 90), title="Kumo Cloud")
|