Alligator + Fractals + Divergent & Squat Bars + Signal AlertsThe indicator includes Williams Alligator, Williams Fractals, Divergent Bars, Market Facilitation Index, Highest and Lowest Bars, maximum and minimum peak of Awesome Oscillator, and signal alerts based on Bill Williams' Profitunity strategy.
MFI and Awesome Oscillator
According to the Market Facilitation Index Oscillator, the Squat bar is colored blue, all other bars are colored according to the Awesome Oscillator color, except for the Fake bars, colored with a lighter AO color. In the indicator settings, you can enable the display of "Green" bars (in the "Green Bars > Show" field). In the indicator style settings, you can disable changing the color of bars in accordance with the AO color (in the "AO bars" field), including changing the color for Fake bars (in the "Fake AO bars" field).
MFI is calculated using the formula: (high - low) / volume.
A Squat bar means that, compared to the previous bar, its MFI has decreased and at the same time its volume has increased, i.e. MFI < previous bar and volume > previous bar. A sign of a possible price reversal, so this is a particularly important signal.
A Fake bar is the opposite of a Squat bar and means that, compared to the previous bar, its MFI has increased and at the same time its volume has decreased, i.e. MFI > previous bar and volume < previous bar.
A "Green" bar means that, compared to the previous bar, its MFI has increased and at the same time its volume has increased, i.e. MFI > previous bar and volume > previous bar. A sign of trend continuation. But a more significant trend confirmation or warning of a possible reversal is the Awesome Oscillator, which measures market momentum by calculating the difference between the 5 Period and 34 Period Simple Moving Averages (SMA 5 - SMA 34) based on the midpoints of the bars (hl2). Therefore, by default, the "Green" bars and their opposite "Fade" bars are colored according to the color of the Awesome Oscillator.
According to Bill Williams' Profitunity strategy, using the Awesome Oscillator, the third Elliott wave is determined by the maximum peak of AO in the range from 100 to 140 bars. The presence of divergence between the maximum AO peak and the subsequent lower AO peak in this interval also warns of a possible correction, especially if the AO crosses the zero line between these AO peaks. Therefore, the chart additionally displays the prices of the highest and lowest bars, as well as the maximum or minimum peak of AO in the interval of 140 bars from the last bar. In the indicator settings, you can hide labels, lines, change the number of bars and any parameters for the AO indicator - method (SMA, Smoothed SMA, EMA and others), length, source (open, high, low, close, hl2 and others).
Bullish Divergent bar
🟢 A buy signal (Long) is a Bullish Divergent bar with a green circle displayed above it if such a bar simultaneously meets all of the following conditions:
The high of the bar is below all lines of the Alligator indicator.
The closing price of the bar is above its middle, i.e. close > (high + low) / 2.
The low of the bar is below the low of 2 previous bars or below the low of one previous bar, and the low of the second previous bar is a lower fractal (▼). By default, Divergent bars are not displayed, the low of which is lower than the low of only one previous bar and the low of the 2nd previous bar is not a lower fractal (▼), but you can enable the display of any Divergent bars in the indicator settings (by setting the value "no" in the " field Divergent Bars > Filtration").
The following conditions strengthen the Bullish Divergent bar signal:
The opening price of the bar, as well as the closing price, is higher than its middle, i.e. Open > (high + low) / 2.
The high of the bar is below all lines of the open Alligator indicator, i.e. the green line (Lips) is below the red line (Teeth) and the red line is below the blue line (Jaw). In this case, the color of the circle above the Bullish Divergent bar is dark green.
Squat Divergent bar.
The bar following the Bullish Divergent bar corresponds to the green color of the Awesome Oscillator.
Divergence on Awesome Oscillator.
Formation of the lower fractal (▼), in which the low of the Divergent bar is the peak of the fractal.
Bearish Divergent bar
🔴 A signal to sell (Short) is a Bearish Divergent bar under which a red circle is displayed if such a bar simultaneously meets all the following conditions:
The low of the bar is above all lines of the Alligator indicator.
The closing price of the bar is below its middle, i.e. close < (high + low) / 2.
The high of the bar is higher than the high of 2 previous bars or higher than the high of one previous bar, and the high of the second previous bar is an upper fractal (▲). By default, Divergent bars are not displayed, the high of which is higher than the high of only one previous bar and the high of the 2nd previous bar is not an upper fractal (▲), but you can enable the display of any Divergent bars in the indicator settings (by setting the value "no" in the " field Divergent Bars > Filtration").
The following conditions strengthen the Bearish Divergent bar signal:
The opening price of the bar, as well as the closing price, is below its middle, i.e. open < (high + low) / 2.
The low of the bar is above all lines of the open Alligator indicator, i.e. the green line (Lips) is above the red line (Teeth) and the red line is above the blue line (Jaw). In this case, the color of the circle under the Bearish Divergent bar is dark red.
Squat Divergent bar.
The bar following the Bearish Divergent bar corresponds to the red color of the Awesome Oscillator.
Divergence on Awesome Oscillator.
Formation of the upper fractal (▲), in which the high of the Divergent bar is the peak of the fractal.
Alligator lines crossing
Bars crossing the green line (Lips) of the open Alligator indicator is the first warning of a possible correction (price rollback) if one of the following conditions is met:
If the bar closed below the Lips line, which is above the Teeth line, and the Teeth line is above the Jaw line, while the closing price of the previous bar is above the Lips line.
If the bar closed above the Lips line, which is below the Teeth line, and the Teeth line is below the Jaw line, while the closing price of the previous bar is below the Lips line.
The intersection of all open Alligator lines by bars is a sign of a deep correction and a warning of a possible trend change.
Frequent intersection of Alligator lines with each other is a sign of a sideways trend (flat).
Signal Alerts
To receive notifications about signals when creating an alert, you must select the condition "Any alert() function is call", in which case notifications will arrive in the following format:
D — timeframe, for example: D, 4H, 15m.
🟢 BDB⎾ - a signal for a Bullish Divergent bar to buy (Long), triggers once after the bar closes and includes additional signals:
/// — if Alligator is open.
⏉ — if the opening price of the bar, as well as the closing price, is above its middle.
+ Squat 🔷 - Squat bar or + Green ↑ - "Green" bar or + Fake ↓ - Fake bar.
+ AO 🟩 - if after the Divergent bar closes, the oscillator color change for the next bar corresponds the green color of the Awesome Oscillator. ┴/┬ — AO above/below the zero line. ∇ — if there is divergence on AO in the interval of 140 bars from the last bar.
🔴 BDB⎿ - a signal for a Bearish Divergent bar to sell (Short), triggers once after the bar closes and includes additional signals:
/// — if Alligator is open.
⏊ — if the opening price of the bar, as well as the closing price, is below its middle.
+ Squat 🔷 - Squat bar or + Green ↑ - "Green" bar or + Fake ↓ - Fake bar.
+ AO 🟥 - if after the Divergent bar closes, the oscillator color change for the next bar corresponds to the red color of the Awesome Oscillator. ┴/┬ — AO above/below the zero line. ∇ — if there is divergence on AO in the interval of 140 bars from the last bar.
Alert for bars crossing the green line (Lips) of the open Alligator indicator (can be disabled in the indicator settings in the "Alligator > Enable crossing lips alerts" field):
🔴 Crossing Lips ↓ - if the bar closed below the Lips line, which is above than the other lines, while the closing price of the previous bar is above the Lips line.
🟢 Crossing Lips ↑ - if the bar closed above the Lips line, which is below the other lines, while the closing price of the previous bar is below the Lips line.
The fractal signal is triggered after the second bar closes, completing the formation of the fractal, if alerts about fractals are enabled in the indicator settings (the "Fractals > Enable alerts" field):
🟢 Fractal ▲ - upper (Bearish) fractal.
🔴 Fractal ▼ — lower (Bullish) fractal.
⚪️ Fractal ▲/▼ - both upper and lower fractal.
↳ (H=high - L=low) = difference.
If you redirect notifications to a webhook URL, for example, to a Telegram bot, then you need to set the notification template for the webhook in the indicator settings in the "Webhook > Message" field (contains a tooltip with an example), in which you just need to specify the text {{message}}, which will be automatically replaced with the alert text with a ticker and a link to TradingView.
‼️ A signal is not a call to action, but only a reason to analyze the chart to make a decision based on the rules of your strategy.
***
Индикатор включает в себя Williams Alligator, Williams Fractals, Дивергентные бары, Market Facilitation Index, самый высокий и самый низкий бары, максимальный и минимальный пик Awesome Oscillator, а также оповещения о сигналах на основе стратегии Profitunity Билла Вильямса.
MFI и Awesome Oscillator
В соответствии с осциллятором Market Facilitation Index Приседающий бар окрашен в синий цвет, все остальные бары окрашены в соответствии с цветом Awesome Oscillator, кроме Фальшивых баров, которые окрашены более светлым цветом AO. В настройках индикатора вы можете включить отображение "Зеленых" баров (в поле "Green Bars > Show"). В настройках стиля индикатора вы можете выключить изменение цвета баров в соответствии с цветом AO (в поле "AO bars"), в том числе изменить цвет для Фальшивых баров (в поле "Fake AO bars").
MFI рассчитывается по формуле: (high - low) / volume.
Приседающий бар означает, что по сравнению с предыдущим баром его MFI снизился и в тоже время вырос его объем, т.е. MFI < предыдущего бара и объем > предыдущего бара. Признак возможного разворота цены, поэтому это особенно важный сигнал.
Фальшивый бар является противоположностью Приседающему бару и означает, что по сравнению с предыдущим баром его MFI увеличился и в тоже время снизился его объем, т.е. MFI > предыдущего бара и объем < предыдущего бара.
"Зеленый" бар означает, что по сравнению с предыдущим баром его MFI увеличился и в тоже время вырос его объем, т.е. MFI > предыдущего бара и объем > предыдущего бара. Признак продолжения тренда. Но более значимым подтверждением тренда или предупреждением о возможном развороте является Awesome Oscillator, который измеряет движущую силу рынка путем вычисления разницы между 5 Периодной и 34 Периодной Простыми Скользящими Средними (SMA 5 - SMA 34) по средним точкам баров (hl2). Поэтому по умолчанию "Зеленые" бары и противоположные им "Увядающие" бары окрашены в соответствии с цветом Awesome Oscillator.
По стратегии Profitunity Билла Вильямса с помощью осциллятора Awesome Oscillator определяется третья волна Эллиота по максимальному пику AO в интервале от 100 до 140 баров. Наличие дивергенции между максимальным пиком AO и следующим за ним более низким пиком AO в этом интервале также предупреждает о возможной коррекции, особенно если AO переходит через нулевую линию между этими пиками AO. Поэтому на графике дополнительно отображаются цены самого высокого и самого низкого баров, а также максимальный или минимальный пик АО в интервале 140 баров от последнего бара. В настройках индикатора вы можете скрыть метки, линии, изменить количество баров и любые параметры для индикатора AO – метод (SMA, Smoothed SMA, EMA и другие), длину, источник (open, high, low, close, hl2 и другие).
Бычий Дивергентный бар
🟢 Сигналом на покупку (Long) является Бычий Дивергентный бар над которым отображается зеленый круг, если такой бар соответствует одновременно всем следующим условиям:
Максимум бара ниже всех линий индикатора Alligator.
Цена закрытия бара выше его середины, т.е. close > (high + low) / 2.
Минимум бара ниже минимума 2-х предыдущих баров или ниже минимума одного предыдущего бара, а минимум второго предыдущего бара является нижним фракталом (▼). По умолчанию не отображаются Дивергентные бары, минимум которых ниже минимума только одного предыдущего бара и минимум 2-го предыдущего бара не является нижним фракталом (▼), но вы можете включить отображение любых Дивергентных баров в настройках индикатора (установив значение "no" в поле "Divergent Bars > Filtration").
Усилением сигнала Бычьего Дивергентного бара являются следующие условия:
Цена открытия бара, как и цена закрытия, выше его середины, т.е. Open > (high + low) / 2.
Максимум бара ниже всех линий открытого индикатора Alligator, т.е. зеленая линия (Lips) ниже красной линии (Teeth) и красная линия ниже синей линии (Jaw). В этом случае цвет круга над Бычьим Дивергентным баром окрашен в темно-зеленый цвет.
Приседающий Дивергентный бар.
Бар, следующий за Бычьим Дивергентным баром, соответствует зеленому цвету Awesome Oscillator.
Дивергенция на Awesome Oscillator.
Образование нижнего фрактала (▼), у которого минимум Дивергентного бара является пиком фрактала.
Медвежий Дивергентный бар
🔴 Сигналом на продажу (Short) является Медвежий Дивергентный бар под которым отображается красный круг, если такой бар соответствует одновременно всем следующим условиям:
Минимум бара выше всех линий индикатора Alligator.
Цена закрытия бара ниже его середины, т.е. close < (high + low) / 2.
Максимум бара выше маскимума 2-х предыдущих баров или выше максимума одного предыдущего бара, а максимум второго предыдущего бара является верхним фракталом (▲). По умолчанию не отображаются Дивергентные бары, максимум которых выше максимума только одного предыдущего бара и максимум 2-го предыдущего бара не является верхним фракталом (▲), но вы можете включить отображение любых Дивергентных баров в настройках индикатора (установив значение "no" в поле "Divergent Bars > Filtration").
Усилением сигнала Медвежьего Дивергентного бара являются следующие условия:
Цена открытия бара, как и цена закрытия, ниже его середины, т.е. open < (high + low) / 2.
Минимум бара выше всех линий открытого индикатора Alligator, т.е. зеленая линия (Lips) выше красной линии (Teeth) и красная линия выше синей линии (Jaw). В этом случае цвет круга под Медвежьим Дивергентным Баром окрашен в темно-красный цвет.
Приседающий Дивергентный бар.
Бар, следующий за Медвежьим Дивергентным баром, соответствует красному цвету Awesome Oscillator.
Дивергенция на Awesome Oscillator.
Образование верхнего фрактала (▲), у которого максимум Дивергентного бара является пиком фрактала.
Пересечение линий Alligator
Пересечение барами зеленой линии (Lips) открытого индикатора Alligator является первым предупреждением о возможной коррекции (откате цены) при выполнении одного из следующих условий:
Если бар закрылся ниже линии Lips, которая выше линии Teeth, а линия Teeth выше линии Jaw, при этом цена закрытия предыдущего бара находится выше линии Lips.
Если бар закрылся выше линии Lips, которая ниже линии Teeth, а линия Teeth ниже линии Jaw, при этом цена закрытия предыдущего бара находится ниже линии Lips.
Пересечение барами всех линий открытого Alligator является признаком глубокой коррекции и предупреждением о возможной смене тренда.
Частое пересечение линий Alligator между собой является признаком бокового тренда (флэт).
Оповещения о сигналах
Для получения уведомлений о сигналах при создании оповещения необходимо выбрать условие "При любом вызове функции alert()", в таком случае уведомления будут приходить в следующем формате:
D — таймфрейм, например: D, 4H, 15m.
🟢 BDB⎾ — сигнал Бычьего Дивергентного бара на покупку (Long), срабатывает один раз после закрытия бара и включает дополнительные сигналы:
/// — если Alligator открыт.
⏉ — если цена открытия бара, как и цена закрытия, выше его середины.
+ Squat 🔷 — Приседающий бар или + Green ↑ — "Зеленый" бар или + Fake ↓ — Фальшивый бар.
+ AO 🟩 — если после закрытия Дивергентного бара, изменение цвета осциллятора для следующего бара соответствует зеленому цвету Awesome Oscillator. ┴/┬ — AO выше/ниже нулевой линии. ∇ — если есть дивергенция на AO в интервале 140 баров от последнего бара.
🔴 BDB⎿ — сигнал Медвежьего Дивергентного бара на продажу (Short), срабатывает один раз после закрытия бара и включает дополнительные сигналы:
/// — если Alligator открыт.
⏊ — если цена открытия бара, как и цена закрытия, ниже его середины.
+ Squat 🔷 — Приседающий бар или + Green ↑ — "Зеленый" бар или + Fake ↓ — Фальшивый бар.
+ AO 🟥 — если после закрытия Дивергентного бара, изменение цвета осциллятора для следующего бара соответствует красному цвету Awesome Oscillator. ┴/┬ — AO выше/ниже нулевой линии. ∇ — если есть дивергенция на AO в интервале 140 баров от последнего бара.
Сигнал пересечения барами зеленой линии (Lips) открытого индикатора Alligator (можно отключить в настройках индикатора в поле "Alligator > Enable crossing lips alerts"):
🔴 Crossing Lips ↓ — если бар закрылся ниже линии Lips, которая выше остальных линий, при этом цена закрытия предыдущего бара находится выше линии Lips.
🟢 Crossing Lips ↑ — если бар закрылся выше линии Lips, которая ниже остальных линий, при этом цена закрытия предыдущего бара находится ниже линии Lips.
Сигнал фрактала срабатывает после закрытия второго бара, завершающего формирование фрактала, если оповещения о фракталах включены в настройках индикатора (поле "Fractals > Enable alerts"):
🟢 Fractal ▲ — верхний (Медвежий) фрактал.
🔴 Fractal ▼ — нижний (Бычий) фрактал.
⚪️ Fractal ▲/▼ — одновременно верхний и нижний фрактал.
↳ (H=high - L=low) = разница.
Если вы перенаправляете оповещения на URL вебхука, например, в бота Telegram, то вам необходимо установить шаблон оповещения для вебхука в настройках индикатора в поле "Webhook > Message" (содержит подсказку с примером), в котором в качестве текста сообщения достаточно указать текст {{message}}, который будет автоматически заменен на текст оповещения с тикером и ссылкой на TradingView.
‼️ Сигнал — это не призыв к действию, а лишь повод проанализировать график для принятия решения на основе правил вашей стратегии.
Profitunity
Awesome Oscillator + Bars count lines + EMA LineThe indicator includes an Awesome Oscillator with 2 vertical lines at a distance of 100 and 140 bars from the last bar to determine the third Elliott wave by the maximum peak of AO in the interval from 100 to 140 bars according to Bill Williams' Profitunity strategy. Additionally, a faster EMA line is displayed that calculates the difference between 5 Period and 34 Period Exponential Moving Averages (EMA 5 - EMA 34) based on the midpoints of the bars, just like AO calculates the difference between Simple Moving Averages (SMA 5 - SMA 34).
In the indicator settings, you can change the number of bars for vertical lines and any parameters for AO and EMA - method (SMA, Smoothed SMA, EMA and others), length, source (open, high, low, close, hl2 and others).
***
Индикатор включает Awesome Oscillator с 2 вертикальными линиями на расстоянии 100 и 140 баров от последнего бара, чтобы определить третью волну Эллиота по максимальному пику AO в интервале от 100 до 140 баров по стратегии Profitunity Билла Вильямса. Дополнительно отображается более быстрая линия EMA, которая вычисляет разницу между 5 Периодной и 34 Периодной Экспоненциальными Скользящими Средними (EMA 5 - EMA 34) по средним точкам баров (hl2), точно так же, как AO вычисляет разницу между Простыми Скользящими Средними (SMA 5 - SMA 34).
В настройках индикатора вы можете изменить количество баров для вертикальных линий и любые параметры для AO и EMA – метод (SMA, Smoothed SMA, EMA и другие), длину, источник (open, high, low, close, hl2 и другие).
Profitunity - Beginner [TC]This indicator aggregates the knowledges of the first level of the Trading Chaos approach by Bill Williams. It uses the Market Facilitation Index (MFI) in conjunction with the type of bar(candle) to generate strong long and strong short signals.
General information
Bars numeration
All bars or candles could be numbered with the following algorithm. If we divide the candle for 3 equal parts from high to low. The highest third have the number 1, the middle one - 2, the lowest one - 3. Hence we can define the first number as the number of the third where the price opened, second - where the price closed. For example, if the price opened at the highest third and closed at the lowest one this candle has the number 13.
Trend defining
Also candles could be divided into three groups according to the trend condition: uptrend, downtrend, sideways. If the middle of the candle's trading range is above the high of the previous candle - it's uptrend candle, if below the low of the previous candle - it's downtrend candle, sideways in other candles.
Profitunity windows
According to Bill Williams MFI has 4 windows - fake, green, fade and squat. I am not going to describe here the methodology of MFI, but one thing you should know that the most valuable windows are green and squat. Green state is an indication of the true move on the market. Squat the sign that the increase in volume have not triggered the trend continuation and reverse is about to happen.
How to use?
You can use this script as the helper in automatic defining the type of candle. Indicator shows only green (green candle color) and squat (red candle color) MFI states. Add script to any timeframe and asset chart to see labels.
The "strong long" label flashes when 3 conditions are met:
1. Squat candle
2. Candle number 13
3. Downtrend candle
"Strong short" label flashes when:
1. Squat candle
2. Candle number 31
3. Uptrend candle
This indicator helps to find the trend reversal points, can be used in conjunction with other TA tools to find the entry points.
OS AO (P-unity MACD)This is both the Awesome Oscillator (AO) as described in New Trading Dimensions ( NTD , book by Bill Williams ), and the Profitunity MACD described in the first edition of Trading Chaos.
The calculation for both is the same. In this case I added the 5 day SMA which is the blue line. The difference between the blue line and the AO is the AC which is also described in NTD and is usually plotted in a different indicator (AC).
This is the base for the following signals:
Zone Bar
2nd Wise Man
The signals are triggered and shown on the main chart screen through the use of OS Alligator . This indicator (AO) provides further insight in analyzing those signals by reading the AO, its current position and evolution directly.
OS FractalsAn up fractal is formed when a high is both preceded and followed by lower highs. A down fractal is formed when a low is both preceded and followed by higher lows.
Bill Williams uses a period of 2 (2 after and 2 before) to define a fractal. This indicator has 2 as default but lets you decide the range you want.
The indicator lets you also select alerts when price crosses an up of down fractal, which would usually mean to entry a position. This indicator works best when used with an alligator, as long signals are valid above the Balance Line and short signals are valid when triggered below the Balance Line.
Any comments for improvement are welcome.
OS HiLo TrackingIndicator plots a dynamic horizontal line for tracking the highest high and/or lowest low in your desired time-period.
You can select both the period, and whether an alert is produced when the price crosses the last highest high or lowest low.
When used when other Williams indicators, this can help you set your trailing stop for profit-taking.
OS AlligatorOS Alligator includes Bill and Justine Williams´ indicators explained both in their "New Trading Dimensions" and "Trading Chaos: Second Edition" books. This script replicates the visual alerts shown on their graphs.
OS Alligator includes:
- Fractals (with labels for easy reading)
- Divergent Bars (signaled by top and bottom triangles)
- Zone bar colors (the bar is green when both AO and AC are green, red when both are red, and black when different)
- Zone buys and sells (subsequent AO of the same color), with letter Z
- Saucer buys and sells, with letter S
- Highest High and Lowest Low tracking (for traling stop setting)
- Balance line (Teeth) crossover alerts
and of course the Alligator's Mouth (Lips, Teeth, Jaw) with SMMA.
All these functions are customizable both in periods and in color. For example if you want to modify the Fractal or HiLo periods you can do so.
You can also add alerts based on any or all indicators.
Thank you for reading. Any comments for improvement are welcome.
-ownsov
Williams Gator Oscillator 2Based on @Petros Williams Gator Oscillator script
Modifed by @PolarSolar - fix histogramm offset to original and added different colors to more understanding Gator histogramm
The Gator Oscillator histogram above zero shows the absolute difference between blue and red lines of Alligator indicator,
while histogram below zero shows the absolute difference between red and green lines.
There are green and red bars on the Gator Oscillator histograms.
A green bar appears when its value is higher than the value of the previous bar.
A red bars appears when its value is lower than the value of the previous bar.
Gator Oscillator helps to better visualize the upcoming changes in the trends: to know when Alligator sleeps, eats, fills out and is about to go to sleep.
True Williams Alligator (Timeframe Multiplier)Modified version of my original "True Williams Alligator (SMMA)" indicator that includes a multiplier to show the alligator (ie elliot wave mode) of higher timeframes. See original indicator for details.
Note: First script submission. Didn't mean to use this chart. Ugly and messy. Oops.
True Williams Alligator (Timeframe Multiplier)Modified version of the true alligator indicator (ie SMMA) that features a timeframe multiplier so that you can monitor the elliott wave of higher timeframes. (See original "True Williams Alligator" for more details.)
Note: First script submission. Didn't mean to use this chart. Also this is a duplicate post -- oops.
True Williams Alligator (SMMA)The built-in implementation of the alligator is incorrect. It uses SMA with altered input parameters to approximate the true alligator indicator.
The alligator was created with a supercomputer to model the elliott wave - it's very apart from other MA techniques. The built-in approximation (and similar techniques) and the true alligator yield very different conclusions. Hence the need for this, a true and exact implementation of "The Mighty Alligator" (Bill Williams, Trading Chaos 1, New Trading Dimensions, Trading Chaos 2).
Note: First script submission. Didn't mean to use this chart. Ugly and messy. Oops.