# Moving average
Moving average
V
R
AVG
# 入力
| ID | 略称 | 名前 | 型 | デフォルト | 説明 |
|---|---|---|---|---|---|
value | V | value | NUMBER | 0 | |
reset | R | reset | BOOLEAN | false |
# 出力
| ID | 略称 | 名前 | 型 | デフォルト | 説明 |
|---|---|---|---|---|---|
average | AVG | average | NUMBER | 0 |
# 設定
| ID | 名前 | 型 | デフォルト | 単位 | 説明 |
|---|---|---|---|---|---|
algorithm | algorithm | ENUM | 0 | 詳細: 値: EMA, CA | |
alpha | alpha | NUMBER | 0.2 | 詳細: 表示条件 algorithm = EMA> 0 ≤ 1 |
# 状態
| ID | 名前 | 型 | デフォルト | 単位 | 説明 |
|---|---|---|---|---|---|
count | count | NUMBER | 0 | ||
prev_reset | prev_reset | BOOLEAN | false |
# ソースコード
Volang ソースを表示
channel = input::channel()
value = input::value()
if (channel == "reset") {
prev_reset = state::get("prev_reset")
if (value and !prev_reset) {
current = input::get("value")
state::set("count", 1)
output::set("average", current)
}
state::set("prev_reset", value)
return
}
if (channel == "value") {
count = state::get("count")
avg = output::get("average")
if (count == 0) {
state::set("count", 1)
output::set("average", value)
return
}
algorithm = config::get("algorithm")
if (algorithm == 0) {
alpha = config::get("alpha")
new_avg = alpha * value + (1 - alpha) * avg
output::set("average", new_avg)
} else {
count = count + 1
state::set("count", count)
new_avg = avg + (value - avg) / count
output::set("average", new_avg)
}
}
