- Momentum
- Signal engine
- On price
- Advanced
A completed-candle adaptation of the regular IQOptionWiki Signals score. It weighs RSI, MACD, Bollinger %B, five directional candle patterns and optional chart-volume confirmation into one score and marks new qualifying setups.
The rules
HIGHER marker
The weighted score is at least +2 with a quality of 3 or more on a completed candle, and the setup is new (false on the candle before).
LOWER marker
The weighted score is at most -2 with a quality of 3 or more on a completed candle, and the setup is new.
A marker appears after the next candle opens and is drawn on the candle that completed the setup. It is a chart observation, not an instruction to trade.
How to read it
Bollinger Bands are drawn on price. A green HIGHER or red LOWER marker appears under or above the candle that completed a new qualifying setup. Zero MACD and zero total delta stay neutral.
Indicators used
- RSI
- MACD
- Bollinger %B (population deviation)
- Five candlestick patterns
- Optional chart volume
Same view with built-in indicators: Bollinger Bands (20, 2), RSI (14) and MACD (12, 26, 9) show the same ingredients with IQ Option's built-in indicators.
Default settings
| Minimum score | 2 |
|---|---|
| Minimum quality | 3 |
| Volume confirmation | optional |
| Platform advice | off |
Every value is an input in the script settings. Platform advice is off by default.
Key points
- This is the local version of the IQOptionWiki Signals score, running on the IQ Option chart itself.
- It combines RSI, MACD, Bollinger %B and five candle patterns into one weighted score.
- A marker needs a score of at least two and a quality of three on a completed candle.
- It uses only the active chart's data: no API, no Telegram, no external feed.
- Platform advice is off by default; enable it in one script at a time if you want notifications.
Limitations. The score is deterministic arithmetic, not a probability. QCS initialization can differ slightly from the Signals server's fixed 120-candle seed, so a marker can differ from the web service. Test on the Practice balance before risking real funds.
Install it in four steps
- Download and inspectDownload one .lua file and open it in a plain-text editor if you want to read it first. If you downloaded the ZIP, extract it.
- Open Chart Analysis → ScriptsIn the IQ Option traderoom, choose the Practice balance, open the chart analysis panel, select Scripts and choose Import script.
- Save and add to chartSelect the downloaded file, review the imported code, choose Save, then use the + control to add it to the chart.
- Change one input at a timeConfirm the default view first. Then adjust periods, levels or colours one setting at a time and note what changes.
Complete source code
The download and this preview resolve to the same reviewed file. SHA-256: 98702b0378074204ac968a550dd76d477bf1b1bebe0888ca1b301c8db3755855
-- SPDX-License-Identifier: MIT
-- IQOptionWiki QCS Library
-- IQ_WIKI_SCRIP_V1.1.0
--
-- Local, completed-candle adaptation of the regular iqoptionwiki.com Signals
-- confluence engine. It combines:
-- 1. RSI mean-reversion scoring
-- 2. MACD direction
-- 3. Bollinger %B mean-reversion scoring
-- 4. Five directional candle patterns (neutral Doji is omitted)
-- 5. Optional IQ Option chart-volume confirmation
--
-- Deliberate V1.1 safety corrections:
-- * Signals use the previous completed candle, never the open candle.
-- * A zero MACD histogram and a zero final score stay neutral.
-- * A marker/advice pulse appears only when a new qualifying setup starts.
-- * No external API, provider price, web confidence, timer, or expiry is used.
--
-- HIGHER and LOWER are analysis markers, not orders or outcome guarantees.
-- Test on a Practice balance and enable advice in only one script at a time.
instrument {
name = "IQ_WIKI_SCRIP_V1.1.0",
short_name = "IQ WIKI SIGNALS",
icon = "indicators:RSI",
overlay = true
}
input_group {
"1. Regular Signals engine",
rsi_period = input (14, "RSI period", input.integer, 2, 100),
macd_fast_period = input (12, "MACD fast EMA", input.integer, 2, 100),
macd_slow_period = input (26, "MACD slow EMA", input.integer, 3, 200),
macd_signal_period = input (9, "MACD signal EMA", input.integer, 2, 100),
bollinger_period = input (20, "Bollinger period", input.integer, 5, 200),
bollinger_deviation = input (2.0, "Bollinger deviations", input.double, 0.5, 5.0, 0.1, false),
volume_period = input (20, "Volume average period", input.integer, 2, 200)
}
input_group {
"2. Signal quality",
minimum_score = input (2.0, "Minimum absolute score", input.double, 0.5, 10.0, 0.5, false),
minimum_quality = input (3.0, "Minimum quality (1 to 5)", input.double, 1.0, 5.0, 0.5, false)
}
input_group {
"3. Display and advice",
bands_visible = input { default = true, name = "Show Bollinger Bands", type = input.plot_visibility },
signals_visible = input { default = true, name = "Show completed-candle signals", type = input.plot_visibility },
advice_enabled = input { default = false, name = "Enable platform advice", type = input.boolean }
}
input_group {
"Band colors",
upper_band_color = input { default = rgba(255, 108, 88, 0.55), type = input.color },
middle_band_color = input { default = rgba(255, 255, 255, 0.32), type = input.color },
lower_band_color = input { default = rgba(37, 225, 84, 0.55), type = input.color },
band_width = input { default = 1, type = input.line_width }
}
input_group {
"Signal colors",
higher_color = input { default = "#25E154", type = input.color },
lower_color = input { default = "#FF6C58", type = input.color },
signal_text_color = input { default = "#FFFFFF", type = input.color }
}
-- Indicator series. These intentionally use the chart's own IQ Option data.
rsi_value = rsi (close, rsi_period)
macd_fast = ema (close, macd_fast_period)
macd_slow = ema (close, macd_slow_period)
macd_line = macd_fast - macd_slow
macd_signal = ema (macd_line, macd_signal_period)
macd_histogram = macd_line - macd_signal
bollinger_middle = sma (close, bollinger_period)
-- QCS stdev() uses sample deviation; the Signals service uses population
-- deviation. This factor preserves the service's Bollinger calculation.
bollinger_population_factor = math.sqrt ((bollinger_period - 1) / bollinger_period)
bollinger_spread =
stdev (close, bollinger_period) *
bollinger_population_factor *
bollinger_deviation
bollinger_upper = bollinger_middle + bollinger_spread
bollinger_lower = bollinger_middle - bollinger_spread
volume_average = sma (volume, volume_period)
-- Read scalar values before using native Lua conditions.
local close_now = get_value (close, 0)
local open_now = get_value (open, 0)
local high_now = get_value (high, 0)
local low_now = get_value (low, 0)
local previous_close = get_value (close [1], 0)
local previous_open = get_value (open [1], 0)
local previous_high = get_value (high [1], 0)
local previous_low = get_value (low [1], 0)
local first_close = get_value (close [2], 0)
local first_open = get_value (open [2], 0)
local first_high = get_value (high [2], 0)
local first_low = get_value (low [2], 0)
local rsi_now = get_value (rsi_value, 50)
local macd_now = get_value (macd_line, 0)
local macd_signal_now = get_value (macd_signal, 0)
local macd_histogram_now = get_value (macd_histogram, 0)
local upper_now = get_value (bollinger_upper, 0)
local middle_now = get_value (bollinger_middle, 0)
local lower_now = get_value (bollinger_lower, 0)
local volume_now = get_value (volume, 0)
local volume_average_now = get_value (volume_average, 0)
local warmup_index =
math.max (
rsi_period + 1,
macd_slow_period + macd_signal_period,
bollinger_period,
volume_period
)
local warmup_close = get_value (close [warmup_index], 0)
local periods_are_valid =
macd_fast_period < macd_slow_period and
bollinger_deviation > 0 and
minimum_score > 0 and
minimum_quality >= 1 and
minimum_quality <= 5
local data_is_ready =
periods_are_valid and
warmup_close > 0 and
close_now > 0 and
high_now >= low_now and
upper_now > lower_now and
middle_now > 0
-- Five directional definitions mirror the local Signals service. Its Doji
-- pattern is neutral and adds zero to the score, so it is intentionally absent.
local current_range = high_now - low_now
local current_body = math.abs (close_now - open_now)
local previous_body = math.abs (previous_close - previous_open)
local first_body = math.abs (first_close - first_open)
local current_bullish = close_now > open_now
local current_bearish = close_now < open_now
local previous_bullish = previous_close > previous_open
local previous_bearish = previous_close < previous_open
local bullish_engulfing =
previous_bearish and
current_bullish and
open_now <= previous_close and
close_now >= previous_open
local bearish_engulfing =
previous_bullish and
current_bearish and
open_now >= previous_close and
close_now <= previous_open
local current_body_low = math.min (open_now, close_now)
local current_body_high = math.max (open_now, close_now)
local previous_body_low = math.min (previous_open, previous_close)
local previous_body_high = math.max (previous_open, previous_close)
local bullish_harami =
previous_body > 0 and
current_body > 0 and
current_body_high <= previous_body_high and
current_body_low >= previous_body_low and
previous_bearish and
current_bullish
local bearish_harami =
previous_body > 0 and
current_body > 0 and
current_body_high <= previous_body_high and
current_body_low >= previous_body_low and
previous_bullish and
current_bearish
local lower_shadow = current_body_low - low_now
local upper_shadow = high_now - current_body_high
local bullish_hammer =
current_range > 0 and
current_body > 0 and
lower_shadow >= current_body * 2 and
upper_shadow <= current_body
local first_midpoint = (first_open + first_close) / 2
local bullish_morning_star =
first_close < first_open and
first_body > 0 and
previous_body <= first_body * 0.5 and
current_bullish and
close_now > first_midpoint
local bearish_evening_star =
first_close > first_open and
first_body > 0 and
previous_body <= first_body * 0.5 and
current_bearish and
close_now < first_midpoint
-- Regular Signals weighted score.
local score = 0
local rsi_direction = 0
local macd_direction = 0
local bollinger_direction = 0
local pattern_direction = 0
if rsi_now >= 80 then
score = score - 2
rsi_direction = -1
elseif rsi_now >= 70 then
score = score - 1
rsi_direction = -1
elseif rsi_now <= 20 then
score = score + 2
rsi_direction = 1
elseif rsi_now <= 30 then
score = score + 1
rsi_direction = 1
end
-- Preserve the service's MACD state weighting, except exact zero is neutral.
if macd_now > macd_signal_now and macd_histogram_now > 0 then
score = score + 2
macd_direction = 1
elseif macd_now < macd_signal_now and macd_histogram_now < 0 then
score = score - 2
macd_direction = -1
elseif macd_histogram_now > 0 then
score = score + 1
macd_direction = 1
elseif macd_histogram_now < 0 then
score = score - 1
macd_direction = -1
end
local bollinger_percent_b = 0.5
if upper_now > lower_now then
bollinger_percent_b = (close_now - lower_now) / (upper_now - lower_now)
if bollinger_percent_b >= 1.0 then
score = score - 2
bollinger_direction = -1
elseif bollinger_percent_b >= 0.8 then
score = score - 1
bollinger_direction = -1
elseif bollinger_percent_b <= 0.0 then
score = score + 2
bollinger_direction = 1
elseif bollinger_percent_b <= 0.2 then
score = score + 1
bollinger_direction = 1
end
end
local pattern_score = 0
if bullish_engulfing then
pattern_score = pattern_score + 1.5
elseif bearish_engulfing then
pattern_score = pattern_score - 1.5
end
if bullish_morning_star then
pattern_score = pattern_score + 2.0
end
if bearish_evening_star then
pattern_score = pattern_score - 2.0
end
if bullish_hammer then
pattern_score = pattern_score + 1.5
end
if bullish_harami then
pattern_score = pattern_score + 1.0
elseif bearish_harami then
pattern_score = pattern_score - 1.0
end
score = score + pattern_score
if pattern_score > 0 then
pattern_direction = 1
elseif pattern_score < 0 then
pattern_direction = -1
end
-- Missing/zero chart volume is neutral so OTC/forex charts do not fail closed.
local volume_multiplier = 1.0
local volume_ratio = 1.0
if volume_now > 0 and volume_average_now > 0 then
volume_ratio = volume_now / volume_average_now
if volume_ratio >= 2.0 then
volume_multiplier = 1.5
elseif volume_ratio >= 1.5 then
volume_multiplier = 1.25
elseif volume_ratio <= 0.5 then
volume_multiplier = 0.75
end
end
local adjusted_score = score * volume_multiplier
local absolute_score = math.abs (adjusted_score)
local signal_direction = 0
if adjusted_score > 0 then
signal_direction = 1
elseif adjusted_score < 0 then
signal_direction = -1
end
local confirming_groups = 0
if signal_direction ~= 0 then
if rsi_direction == signal_direction then
confirming_groups = confirming_groups + 1
end
if macd_direction == signal_direction then
confirming_groups = confirming_groups + 1
end
if bollinger_direction == signal_direction then
confirming_groups = confirming_groups + 1
end
if pattern_direction == signal_direction then
confirming_groups = confirming_groups + 1
end
end
local signal_quality = 1.0
if absolute_score >= 6.0 then
signal_quality = 5.0
elseif absolute_score >= 4.5 then
signal_quality = 4.0
elseif absolute_score >= 3.0 then
signal_quality = 3.0
elseif absolute_score >= 1.5 then
signal_quality = 2.0
end
if confirming_groups >= 4 then
signal_quality = math.min (5.0, signal_quality + 1.0)
elseif confirming_groups >= 3 then
signal_quality = math.min (5.0, signal_quality + 0.5)
end
if volume_multiplier >= 1.25 then
signal_quality = math.min (5.0, signal_quality + 0.5)
elseif volume_multiplier <= 0.75 then
signal_quality = math.max (1.0, signal_quality - 0.5)
end
-- A raw quality of 3+ is equivalent to the service's radar requirement.
regular_higher_setup = conditional (
data_is_ready and
signal_direction == 1 and
absolute_score >= minimum_score and
signal_quality >= minimum_quality
)
regular_lower_setup = conditional (
data_is_ready and
signal_direction == -1 and
absolute_score >= minimum_score and
signal_quality >= minimum_quality
)
-- Confirm the previous completed candle and suppress repeated adjacent setups.
confirmed_regular_higher = conditional (
get_value (regular_higher_setup [1], false) and
not get_value (regular_higher_setup [2], false)
)
confirmed_regular_lower = conditional (
get_value (regular_lower_setup [1], false) and
not get_value (regular_lower_setup [2], false)
)
if bands_visible then
plot (bollinger_upper, "Upper Bollinger Band", upper_band_color, band_width)
plot (bollinger_middle, "Bollinger Middle", middle_band_color, band_width)
plot (bollinger_lower, "Lower Bollinger Band", lower_band_color, band_width)
end
if signals_visible then
plot_shape (
confirmed_regular_higher,
"Regular Signals HIGHER",
shape_style.triangleup,
shape_size.small,
higher_color,
shape_location.belowbar,
-1,
"HIGHER",
signal_text_color
)
plot_shape (
confirmed_regular_lower,
"Regular Signals LOWER",
shape_style.triangledown,
shape_size.small,
lower_color,
shape_location.abovebar,
-1,
"LOWER",
signal_text_color
)
end
-- QCS advice is a platform notification state only; it does not place trades.
if advice_enabled and
get_value (confirmed_regular_higher, false) and
not get_value (confirmed_regular_lower, false) then
advise (advice.buy)
elseif advice_enabled and
get_value (confirmed_regular_lower, false) and
not get_value (confirmed_regular_higher, false) then
advise (advice.sell)
else
advise (advice.neutral)
end
More momentum scripts
- Momentum
- Own panel
- Beginner
Double Momentum 20 3
Marks the candle where the fast Momentum(3) line crosses zero in the direction of the slower Momentum(20) line. The slow line gives the trend side, the fast line gives the timing.
Indicators: Momentum (20) · Momentum (3)
- Momentum
- On price
- Intermediate
Elder Impulse
Marks the first candle where both trend (EMA 13) and momentum (MACD histogram) turn the same way, following Alexander Elder's Impulse System colours. A marker appears only when the state changes, not on every green or red candle.
Indicators: EMA (13) · MACD histogram (12, 26, 9)
- Momentum
- On price
- Beginner
EMA Momentum
Marks the candle that completes two events: price closes across the EMA(20) and the Momentum(20) line crosses zero, within a few candles of each other. Both must still be true on the marked candle.
Indicators: EMA (20) · Momentum (20)
Download all 56 scripts as one ZIP · MIT License, provided “as is”, without warranty. IQOptionWiki is independent of the IQ Option platform operator. Nothing here is investment advice or a guarantee of results.