> For the complete documentation index, see [llms.txt](https://docs.synergysignal.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.synergysignal.io/how-signals-work.md).

# how signals work

## The Signal Pipeline

Every bar, the indicator runs through the following pipeline to determine whether to plot a long (green dot) or short (red dot):

1. Calculate each pillar independently
2. Compute the confluence score (how many agree)
3. Apply filters (chop zone, regime, curl protection, Volatility gate)
4. Resolve conflicts (if long + short both qualify)
5. Apply position state machine (cooldown, flip logic)
6. Plot the dot

{% stepper %}
{% step %}

### Step 1: Individual Pillar Conditions

Each pillar produces a true/false output:

| Pillar         | Long True When                                         | Short True When                                         |
| -------------- | ------------------------------------------------------ | ------------------------------------------------------- |
| Expansion Wave | Bullish expansion active (`bullOK`)                    | Bearish expansion active (`bearOK`)                     |
| Momentum       | Recovering from Oversold zone, rising, above its MA    | Rejecting from Overbought zone, falling, below its MA   |
| Order Flow     | Order Flow slope is positive (rising over last 5 bars) | Order Flow slope is negative (falling over last 5 bars) |
| Divergence     | Valid bullish divergence detected recently             | Valid bearish divergence detected recently              |

The **Volatility line** does not add to the score — it acts as a binary gate that can block an otherwise valid signal.
{% endstep %}

{% step %}

### Step 2: Confluence Score

The scores are summed:

```
Long Score  = Expansion Wave(long)  + Momentum(long)  + Order Flow(long)  + Divergence score (0–3)
Short Score = Expansion Wave(short) + Momentum(short) + Order Flow(short) + Divergence score (0–3)
```

The **Divergence pillar** is "soft" — it can contribute 1, 2, or 3 points depending on how many divergence types are detected (Momentum div, Expansion div, Order Flow div). Its absence never blocks an entry.

The **Base Min Score** setting determines how many points are required. With **Score Pillars** (auto-scale) enabled, the minimum is automatically capped to the number of available pillars.
{% endstep %}

{% step %}

### Step 3: Filters Applied

Even if the score threshold is met, these filters can block the signal:

#### Chop Zone Block

If the Momentum line is between Chop Zone Low (35) and Chop Zone High (65) → **signal blocked**.

#### Regime Filter

If the Regime Filter is enabled (Noise Filter section):

* Long requires `bullOK` (Expansion Wave is bullish)
* Short requires `bearOK` (Expansion Wave is bearish)

#### Curl Protection

* If Momentum is rising for 2 bars AND above its MA AND Order Flow is rising → **shorts blocked**
* If Momentum is falling for 2 bars AND below its MA AND Order Flow is falling → **longs blocked**

#### Volatility Gate

* Long requires Volatility line is not overbought (≥80) and is rising or was recently oversold
* Short requires Volatility line is not oversold (≤20) and is falling or was recently overbought

#### Momentum Trend Filter (optional)

If the **Momentum Trend Filter** is enabled (Momentum Filter (Pivots) section), signals are gated to only fire in the direction the smoothed Momentum derivative is pointing.
{% endstep %}

{% step %}

### Step 4: Conflict Resolution

On rare occasions, both long and short conditions are true on the same bar. The indicator resolves this:

1. **Higher score wins.** Long score > short score → take long. Short score > long score → take short.
2. **On a tie:** If Momentum ≥ 50, prefer long. If Momentum < 50, prefer short.

Only one dot can fire per bar.
{% endstep %}

{% step %}

### Step 5: Position State Machine

The indicator tracks a virtual position state:

* `pos = 1` → currently long
* `pos = -1` → currently short
* `pos = 0` → flat (starting state)

Rules:

* A **long entry** can only fire if currently flat or short
* A **short entry** can only fire if currently flat or long
* After any flip, a **cooldown timer** starts. No new signal fires until the set number of bars has elapsed.
  {% endstep %}

{% step %}

### Step 6: Plot Mode

Two modes are available via **Only plot on state change** (Signals section):

| Mode           | When Dot Appears                                 |
| -------------- | ------------------------------------------------ |
| ✅ On (default) | Only on the bar where the signal flips direction |
| ❌ Off          | Every bar the signal condition is true           |

The default "on flip only" mode produces cleaner charts with discrete entry markers. The "every bar" mode is useful for understanding how long a condition persists or for debugging settings.
{% endstep %}
{% endstepper %}

## Visual Summary

```
GREEN DOT at the bottom of the panel = Long entry signal
RED DOT at the top of the panel      = Short entry signal
```

Each dot represents a moment when all active filters aligned and the score threshold was met in that direction. The dot marks the **first bar** of that condition (when using state-change mode).
