FAQ

General Questions

What are Elliott waves?

We have an entire page including two videos on that!

What is EWAVES?

EWAVES is the highest quality Elliott wave engine in the world. Many of its analyses look like they were done by a human expert. But as an algorithm, it can analyze an essentially unlimited number of markets.

EWAVES’s secret sauce is that it has been trained on a massive database of carefully vetted, real world historical Elliott wave patterns. It then leverages the statistics derived from these patterns for real-time analysis.

EWAVES ranks markets by elliotticity to determine which have the clearest unfolding patterns. Elliotticity is a statistically significant stylized fact in financial markets, which will be featured in a forthcoming academic paper “Using the Elliott Wave Model to Distinguish Real from Randomly Permuted Financial Returns”.

EWAVES Live is also the world’s first Elliott Wave search engine. Its Wave Finder allows the user to scan across markets for the most reliable Elliott wave trading setups. Users can select from a list of built-in templates, or customize their own setups with flexible queries.

We recommend users have some knowledge of the wave principle, though deep knowledge is not required because EWAVES does all of the analysis work for you.

What markets does EWAVES Live cover?

EWAVES Live currently covers a selection of Commodities, Crypto, Forex, US Stock & Bond Indices, US ETFs and US Stocks. For a full list of covered assets or if you wish for additional coverage, please email us at info@ewaves.com.

Where does EWAVES Live get the raw market data that it uses in its analysis?

We are currently partnered with Trade Navigator.

When do the EWAVES Live charts update?

EWAVES Live starts updating its charts (using the latest end-of-day daily bar data) every night at 8 PM EST. It takes some time for processing, so updated charts will not be available until about 8:15 PM EST. All charts and associated data files are updated simultaneously in an atomic manner.

If you are using the site at the time the update completes, an alert will appear instructing you to refresh your browser window, in order to view new charts.

If you wish to know how up-to-date a chart is, each chart displays the date of its last data point in (1) its copyright date and (2) the last date on its horizontal date axis.

How do I interpret the labels on EWAVES Live charts?

The labels mostly use the labeling convention described in Frost & Prechter’s book Elliott Wave Principle. Impulses and diagonals use 1-2-3-4-5, zigzags and flats use A-B-C, and complex corrections use W-X-Y.

The only slightly unusual labeling are triangles, which are lowercase a-b-c-d-e. This distinction is important for two reasons:

(1) The internals of triangle waves “a” and “b” resemble the internals of flat waves “A” and “B”, so we require different labels for disambiguation. No other pattern has this issue.

(2) Sometimes, in the Wave Finder (an Elliott wave search engine; see “Wave Finder” section below for details), you may want to specify “the last wave of a correction,” which would be “C” for a zigzag or flat, but “e” for a triangle.

Why does EWAVES’ analysis sometimes differ from a particular human analyst’s opinion?

EWAVES’ wave counts will not necessarily align with any particular analyst’s market opinion. Users may review its analysis in isolation or seek to incorporate it with other sources or tools.

Why do some waves not subdivide in an ideal manner?

The reflection of social mood in freely traded markets is imperfect. Therefore, it is generally not possible to label Elliott waves without incorporating some subwaves that do not subdivide cleanly, or that appear to subdivide in ways which do not match their context.

Additionally, all market data formats contain artifacts, making the internal wave structure impossible to discern over short-term intervals. For example, a beautiful five-wave structure on an hourly chart may appear as a three-wave structure when looking at the corresponding daily bars.

To allow EWAVES to count real world data, it is allowed to “squint” over data segments in much the same way that human practitioners do. The resulting waves simply have no internal structure, i.e., they are of an “unknown” type. Their meaning comes from the larger context in which they occur.

Will EWAVES Live’s market data match what I’m seeing on another platform?

EWAVES Live identifies the data provider to the right of each chart’s title. Generally, the data should match that served by the provider precisely. It may or may not match the data served by a different provider.

There are a couple caveats:

(1) For Stocks/ETFs: EWAVES requires split adjustments on equities/ETFs but disables dividend adjustments. It does so for two reasons. First, total returns do not reflect Elliott waves as well as the direct price action. Second, many data providers model dividends using arithmetic adjustments (rather than multiplicative adjustments), which causes back adjusted prices to go negative. Negative prices cannot be converted to log scale for Elliott wave analysis.

(2) For Futures: Leaving futures data as-is does not work, because there are large gaps between successive contracts as a result of differences in the premium/discount of each contract. Attempting to simulate a continuous contract by using arithmetic offsets (the usual method that data providers use) leads to negative back adjusted prices, which cannot be converted to log scale for wave analysis. To better simulate real prices, EWAVES employs a custom back-adjustment scheme, which solves the aforementioned problems. But it also means that the data will not necessarily match the provider’s own back-adjusted prices. The data for the most recent contact will always match.

How much detail does EWAVES taken into account for analysis?

EWAVES considers a massive amount of analysis detail, but it is not unlimited. It focuses the analysis detail on where it’s most needed. The rule of thumb for this is simple: waves that are closer to the present are analyzed with more detail than waves that are in the distant past. This gives plenty of detail where it’s needed, but sometimes the tiny details of distantly-past waves will exhibit artifacts, because EWAVES cannot “see” every last movement within their internal structure.

This design decision was done or two reasons.

First, it shifts more processing time to where it’s most needed. The analysis process is extremely CPU intensive and cannot consider all available detail.

Second, it is sometimes important to not consider every detail of past waves. Sometimes the market moves in ways where the internal structure of the past is no longer valid, and so placing less emphasis on those little details allows the program to be flexible in a way required for wave analysis. For example, a wave that does not exhibit a clear zigzag structure may be interpreted best as an impulse in real time, but in retrospect may be treated as a zigzag if that is the only valid way to integrate it into a reasonable larger wave count.

Detail is also something that must be carefully considered, because sometimes large details and small details are in conflict: a single wave count may not fully satisfy both large and small detail simultaneously. This is addressed carefully in the EWAVES engine by balancing the elliotticity “weighting” of the internal structure vs the bigger picture. It is quite a complex topic because sometimes you actually want the internal substructure to be “glossed over” in favor of the bigger picture, while other times, you want the opposite behavior. Tuning EWAVES to balance between these two different approaches has been difficult and we have reached a point that is a reasonable compromise between the two.

Does EWAVES issue buy and sell signals?

No, EWAVES not designed as an automated black-box trading system. 

EWAVES is intentionally developed as a powerful screening tool that enables discretionary traders to quickly identify and rank Elliott wave patterns across thousands of markets.  As such, EWAVES incorporates the most reliable Elliott wave trading setups as templates. It also incorporates the ability for the end user to design their own setups.

Given the numerous choices a trader has to implement a trade, results of course will vary from one user to the next.

How does EWAVES change its mind?

EWAVES knows about historical Elliott wave behavior. It doesn’t know specific dates or times, of course. Rather, the aggregate, scale-invariant behavior of historical Elliott wave patterns are encoded into the program as probabilistic tendencies.

Purposefully, however, it has no memory of its own moment-to-moment forecasts. Every new data point causes the program to recalculate the wave count from scratch. This allows EWAVES to “change its mind” on-the-fly.

For markets where the top wave count is much superior to any alternative interpretations, this leads to a stable progression for an Elliott wave.

But, sometimes markets are ambiguous, and therefore there are only small differences between the top count and the top alternative count. When this occurs, the system has a hard time figuring out which is the better count (because they’re both nearly equally good options). This can sometimes result in “flip flopping” behavior between competing interpretations.

The current solution to this is simply to use your own judgement. This is an area of active research to figured out how to best address, but at the moment the core issue is intractable. It may be a matter of simply reporting to the user that some markets, at some time frames, have too much ambiguity for a stable forecast.


Elliotticity

What is Elliotticity?

Elliotticity is the degree to which a data segment adheres to the Elliott Wave Principle. It varies from 0% to 100%. Each individual Elliott wave spans a data segment with an elliotticity rating corresponding to the quality of its internal structure.

Additionally, to ensure each wave’s elliotticity has a strong meaning, each wave’s elliotticity also includes a modest amount of extra context, i.e. it mixes in some of the elliotticity of other surrounding waves. This makes perfect sense when you consider a wave that has just begun: obviously, the elliotticity of the preceding wave is what you should focus on, because the new wave has virtually no discernible structure yet.

A perhaps unexpected aspect of how EWAVES implements elliotticity is that it is scale invariant. The recent daily picture is given as much consideration as the recent weekly picture, which is given as much consideration as the recent monthly picture, and so on. In this way, elliotticity is as equally sensitive to short-term market activity as it is to long-term market activity. In other words, a wave with high elliotticity counts well at all degrees of scale, from the past to the present.

In past newsletters, we have referred to the elliotticity of the largest wave in a market as the market’s total elliotticity. As a result of time frame invariance, total elliotticity is perhaps the most generally useful single numerical value for ranking markets against one another in terms of Elliott wave conformance. If a market has high total elliotticity, then you should be able zoom all the way in, or all the way out, and the market should adhere well to the Elliott wave model at all timescales.

Total elliotticity is the default ranking method used (if sorting markets by elliotticity) when the Wave Finder is inactive. When using the Wave Finder, the elliotticity value will correspond to the wave that you find, which is much more granular and specific. That gives you the option to focus on shorter-term elliotticity rather than total, which can be more useful when the highest-degree waves are unimportant (which is generally the case, since for example you usually do not care about the multi-century picture).

Is Elliotticity a stylized fact of financial markets?

Sacha Sardo-Infirri, Ph.D, and Elliott Prechter have finished research for their upcoming paper, “Using The Elliott Wave Model To Distinguish Real From Randomly Permuted Financial Returns.” In it, they show that EWAVES can tell the difference between real market prices and randomized versions across major markets and indexes like DJIA, Nasdaq, Gold, and even Bitcoin.

The results establish elliottcity as a new statistically significant stylized fact for financial data series. This is a breakthrough in financial market theory. This evidence that financial data follow fractal patterns contradicts the long-held random walk hypothesis.

The following histogram demonstrates the differences in elliotticity between real 1-year chunks and randomized versions thereof (via permutations of fixed-period returns) across all available daily data for the Dow Jones Industrials, Dow Jones Transports, S&P 500, Nasdaq 100, Russell 2000, Spot Gold, the Dollar Index and Bitcoin. All results are out-of-sample by using custom builds of EWAVES that excluded the market-under-test from its database of iconic counts. Of course, much more detailed and granular results will be present in the paper.

What are “good” vs “bad” elliotticity values?

Elliotticity values are not percentiles (i.e. a relative rank of wave conformance), but are absolute percentages from 0% to 100% determining how conformant individual waves are to the Elliott Wave Principle. The higher the value, the better.

As of the most recent version of the EWAVES engine, you’ll find that waves with elliotticities at or above 50% are high quality, with 55% and higher absolutely the best-in-class. Below around 38% is where waves start exhibiting potentially problematic issues, including but not limited to (1) unlabeled/unknown substructure (2) contextual waves are poor quality (3) extrapolation of existing structure is highly probable to break Elliott wave rules.

In theory, Elliotticity could be as high as 100%, but that is only practically possible when using data that is artificially constructed to conform to idealized Elliott waves. Real world data rarely gets much beyond 50% conformance.

Wave Finder

What is the Wave Finder?

EWAVES Live has a built-in Wave Finder, which is the world’s first Elliott wave search engine. It is a query system for quickly finding currently-unfolding Elliott waves based on precise criteria.

There are several built-in templates that you can use directly to find Elliott wave setups, or you can modify these templates to get started on your own custom setups.

What are the Wave Finder Templates?

Templates make the Wave Finder much easier to use, by having ready-made Elliott wave setups at your fingertips. The templates appear in a drop-down menu just beneath the Wave Finder header on the left-hand-side. You can either use the template directly, or modify it to suite your needs.

Here is an example of the “Zigzag flat (early)” template with a minor modification: instead of requiring wave 4 of C to be broken on the upside, breaking the trend channel formed by wave C is sufficient. This gives us an even earlier entry than the template provides.

Is there a Wave Finder tutorial?

Yes! Go here to watch the EWAVES Live tutorial video. The video describes how to use EWAVES Live, as well as the Wave Finder query system. The video does not mention templates however, as that feature was introduced later on.

What are the Context Waves?

There are multiple types of context waves. The context wave called simply “wave” is the actual wave you’re searching for. It is the wave that will be highlighted by the Wave Finder. Many search queries only involve looking for a “wave” with particular attributes (see section “What are the Wave Attributes?” below for details). For example, to find an impulse wave, you would search for a wave with the attribute “type” set to “impulse.”

The other context waves provide the environment (aka “context”) for “wave”. You may, for example, specify attributes for the “prior” context wave. This is the wave structure that precedes the wave you’re searching for. For example, to find waves that follow triangles, you would add the context wave “prior”, and then require that “prior” have the attribute “type” set to “triangle.”

Another context wave is “parent,” which is the larger wave of which “wave” is a component. For example, if you want “wave” to occur in the context of a larger 3rd wave, you would add the context wave “parent” and then require its attribute “label” to be “3.”

The “child” context wave is the last component wave of “wave.” For example, if you were looking for an impulse wave where its 5th wave was in progress, you would add context wave “child” and set its “label” attribute to “5.”

If you wish to specify attributes for a wave larger than “parent”, the grandparent is called “parent(+1)”, the great-grandparent is “parent(+2)”, and so on. Similarly, the grandchild is called is “child(-1)”, the great-grandchild is “child(-2)”, and so on.

What are the wave attributes?
What is the “Type” wave attribute?

The pattern formed by a wave’s internal structure. For example, “impulse” for an impulse wave. You may specify multiple patterns for a wave. For example, if you’re interested in motive waves, you can specify that a wave be either “impulse” or “diagonal”.

What is the “Subtype” wave attribute?

While the “Type” attribute defines the pattern (impulse, flat, etc), “Subtype” allows the Wave Finder to represent additional pattern information beyond just the basic type.

For example, a “sideways” sub-type pattern is one that moves predominantly sideways, as opposite to a “sharp” pattern.

What is the “Label” wave attribute?

The position of a wave in a larger pattern. These should be self-explanatory, because they’re mostly identical to classical Elliott wave labels. The one exception is triangles, which use lowercase a-b-c-d-e instead of uppercase. Doing so allows the expression of “the final wave of a pattern” which would require a difference between “c” (part of a triangle) and “C” (the final wave of a zigzag or flat).

You may specify multiple labels for a wave. For example, if you’re interested in motive waves in the final position of a structure, you can specify that a wave be either “5” or “C”.

What is the “Break” wave attribute?

“Breaks” are levels that you need the Wave to hit before you want it to show up in the Wave Finder.

This is extremely useful, because some types of Elliott Wave setups require a specific price level to be broken before taking action. For example, before taking action against a completed zigzag correction (in anticipation of an impulse in the opposite direction), it may be prudent to wait for additional signs that the zigzag is complete.

An aggressive person may simply take a position without requiring any particular level to be broken, while a conservative person may require Wave B of the zigzag be broken before taking a position. An in-between person may simply want to see the price channel of the zigzag be broken.

What is the “Limit” wave attribute?

“Limits” are the opposite of “Breaks”. While “breaks” are levels you want the wave to reach, “limits” define the levels at which the wave has already moved too far to still be considered a viable setup.

For example, an impulse wave that breaks out of the preceding zigzag’s price channel might be a good candidate to take a look at, but some people may regard it as being “too late” if that impulse has already exceeded the entire price territory of the preceding zigzag.

What is the “Elliotticity” wave attribute?

This is a percentage measure (0% to 100%) describing how strongly a wave’s internal structure, plus a certain amount of its context, conforms to the Elliott Wave Principle. For details see the earlier FAQ question “What is Elliotticity?”. Elliotticity is helpful in identifying high quality waves.

What is the “Linearity” wave attribute?

This is a percentage measure (0% to 100%) describing how line-like a wave is. 100% would be a perfectly straight line, whereas 0% would entail a sideways, 2-dimensional structure. A triangle would be expected to have low linearity, while an impulse wave would be expected to have high linearity. This measure is akin to the concept of fractal dimension. Linearity is helpful in identifying strongly trending waves.

What is the “Complete” wave attribute?

This is a percentage measure (0% to 100%) describing an estimate of how close a wave is to completion, in terms of both price and time. For example, an impulse wave that is currently in its 5th wave is likely more complete than an impulse wave that is currently in its 2nd wave.

Completeness is useful to anticipate turning points, such as starting waves (those that are 0 to 5% complete), or ending waves (those that are 95% to 100% complete). It is also a useful measure that allows you to base your search on the distance a wave has already traveled. For example, you may want to identify 5th waves, but only those that are not already more than 50% complete.

What is the “Duration” wave attribute?

How long a wave has taken to unfold thus far, in days. Note that this measure does not involve any extrapolation, so it may be much less than the eventual ultimate duration of a wave.

One use of duration is to specify the size of existing wave structure. For example, you may wish to look at impulse waves that are just starting their internal 5th waves, and you want to specify a duration for waves 1 through 4. An impulse 1-2-3-4 structure spanning between 150 and 250 days provides a context that indicates the potential for a sizable 5th wave to follow.

Another use of duration is to compare trends. For example, you may wish to find waves with a duration of around 100 days, and then sort those waves by their slopes. Doing so emulates a classic momentum model, yet it uses only Elliott waves. Momentum considerations can then be combined with wave structure considerations.

What is the “Duration (Expected)” wave attribute?

The expected total number of days a wave will have lasted at completion, derived by extrapolating the current wave structure.

The expected duration is one way to measure the overall size of a wave, regardless of if it’s a brand-new wave that is only one-day into its development, or if it’s a more mature wave. If you wish to “anticipate all advances or declines of a particular total duration”, then expected duration is a great way to do that.

Expected duration combines well with restrictions on labels and wave types. For example, you may want to look for “all 3rd of a 3rd waves with an expected duration between 100 and 200 days”, which is easy to achieve by adding a label requirement of “3”, adding a context wave “parent” also with a label requirement of “3”, and setting Duration (Expected) to 100-200 days.

What is the “Magnitude (Expected)” wave attribute?

The expected percentage move of a wave from start to end, derived by extrapolating the current wave structure.

Expected magnitude can be used similarly to expected duration, in that it is a measure of the overall expected size of a wave. But, it may be preferable in some cases to use expected magnitude rather than expected duration to find waves. After all, the 1987 crash was a zigzag pattern with a large magnitude, but a short duration.

Magnitude is not the same concept as the height of a wave (the distance from its lowest to its highest price). A sideways pattern, such as a triangle or flat, may have a large height but a small magnitude. If you’re interested in searching for triangles or flats, duration is a better measure of size than magnitude is.

Magnitude is asymmetric because a 100% increase is the same log distance as a 50% decrease. We could have made it symmetric by changing the units to log-returns, but (1) that is less intuitive for most people and (2) the natural asymmetry of percentage changes is often desirable when considering stocks and ETFs.

What is the “Retrace” wave attribute?

The retracement of a wave thus far, relative to the wave that precedes it. For example, a 2nd wave that falls by 70% relative to the preceding 1st wave would have a retrace value of 70%. A 5th wave that exceeds the high of wave 4 would have a retrace value exceeding 100%.

Retrace is useful for finding waves which have made new extremes. For example, requiring a 3rd wave to have a retrace value over 100% implies that wave 3 has broken out relative to waves 1 and 2. Such a breakout is the minimal structural definition of a trend.

Retrace is also useful for the opposite purpose: finding waves which have not made new extremes. For example, requiring a 5th wave to have a retrace value under 30% implies that wave 5 still has the potential for plenty of net travel relative to wave 4.

What is the “Slope” wave attribute?

The slope of a wave thus far, measured in %-per-year from the start of the wave to the current price. Like magnitude, this value is asymmetric, since a 100% increase-per-year is the same log size as a 50% decrease-per-year.

Slope is a useful mechanism for finding high-momentum trends, regardless of where they are within the wave structure. Since it does not perform any extrapolation, this is a more classic definition of momentum than the expected slope or remaining slope attributes.

One caveat with slope is that short-term waves are much steeper than long-term waves. (This is the case because the component waves of a parent wave are each partially retraced, so they must be collectively steeper than the parent wave.) For a slope comparison to be meaningful, compare waves within the same asset class and ensure that the waves are of comparable duration.

What is the “Slope (Expected)” wave attribute?

The expected slope of a wave at completion, derived by extrapolating the current wave structure.

The expected slope is useful for finding high-momentum waves, even if their observed near-term momentum has waned. For example, wave 1 may be high momentum, but may be being partially retraced by a wave 2. While the retracement reduces the slope of the larger impulse wave of which waves 1 and 2 are a component, the retracement does not reduce the expected slope of the larger impulse wave.

Expected slope is more powerful than traditional momentum measures since it anticipates future slope rather than just measuring current slope.

What if I need a new wave attribute?

Please contact us with a detailed description of the wave attribute that you care about, and we’ll consider it for addition into the Wave Finder.

What are some example Wave Finder queries?

Example Query #1 (click image(s) to view in new fullscreen tab)

This example query looks for a newly started impulsive 3rd, 5th or C wave of an impulse or zigzag.

It does so by finding unfolding impulse waves, with label 3, 5 or C, that have retraces 50% or less of their prior waves (i.e. wave 3 has not yet surpassed 50% of wave 2 yet). The parent wave is either an impulse or a zigzag. The prior wave, which must be a corrective 2, 4 or B, must have a duration between 28 and 400 days. Both the wave and the parent wave must have an elliotticity of 50% or greater.

Note that restricting the duration of wave 2 is there because you have to restrict the duration of at least one wave or else you get waves which are far too small or large.

Below is another example scenario found in Bitcoin using the same query:


Example Query #2 (click image(s) to view in new fullscreen tab)

This example query looks for a 5th wave in progress that is showing short-term strength. Therefore, the larger impulse is nearly done.

It does so by finding unfolding impulse waves with a duration between 50 and 400 days, and a minimum elliotticity of 40%. The unfolding child wave is a 5th wave that is less than 50% complete. The unfolding grandchild wave is a 3rd wave which retraced at least 100% of its preceding wave 2.

You can optionally add a linearity requirement to the wave (say, 50% to 100%) to search for particularly strong impulse waves.

Data Files

Where data files are produced by EWAVES Live?

EWAVES Live itself has two main data files, which are used to drive the Wave Finder. The easiest way to download these files is by logging into EWAVES Live and downloading them from there.

• markets.json defines the markets for EWAVES Live, with their attendant metadata. It has no dependencies on any other files.

• waves.bin is a supplementary file (which depends on markets.json for market definitions) that is required for the Wave Finder. It defines attributes for every currently unfolding wave in every market.

Please note that the formats for these files are subject to change any time EWAVES Live is upgraded. Therefore, if you wish to take a long-term, hard dependency on EWAVES’ data output, you should probably contact us.

What is the current structure of the markets.json file?

markets.json is a JSON text file. It is so simple and self-documenting that the best way to understand it is to download the current file and simply take a look.

What is the current structure of the waves.bin file?

waves.bin is a binary file, composed of a contiguous linear array of waves, representing the set of unfolding waves across all markets. Each wave is a simple POD (plain old data) structure.

The waves are ordered thusly:

• Each wave has a market ID, which links it to a market in markets.json. The waves in waves.bin are written primarily in the order of their market IDs.

• Each wave also has a degree, with the largest degree wave being degree 0, the next-largest being 1, and so on. The waves are written secondarily in the order of their degrees.

• Finally, every single unfolding wave has a matching prior wave (for example, an unfolding wave 5 has a prior wave 4). So, waves are written in pairs, with the prior wave first, and then the actual unfolding wave after.

For example, the set of waves looks something like this:

[market 0, degree 0, prior wave]
[market 0, degree 0, wave]
[market 0, degree 1, prior wave]
[market 0, degree 1, wave]

[market 1, degree 0, prior wave]
[market 1, degree 0, wave]

The wave structure itself is best represented by the following Rust code snippet:

// Represents the pattern formed by a wave's internal structure
enum WaveType {
    Impulse,
    Diagonal,
    Zigzag,
    Flat,
    Triangle,
    DoubleZig,
    Unknown
}

// Represents the position of a wave in a larger pattern
enum WaveLabel {
    _1, _2, _3, _4, _5, // position in impulse/diagonal
     A,  B,  C,         // position in zigzag/flat
     W,  X,  Y,         // position in double-zig
     a,  b,  c,  d,  e  // position in triangle
}

// wave structure (18 bytes)
#[repr( C, packed )] #[derive( Copy, Clone, Debug )] pub struct Wave {
    market: u16, // which market this wave is a member of
    degree: u8, // largest wave is degree 0, next-largest is 1, etc.
    zoom: u8, // the smallest zoom level that can view this entire wave
    type_label: u8, // type (4-bits) | label (4-bits)
    elliotticity: u8, // % elliotticity, from 0 (0%) to 200 (100%)
    linearity: u8, // % linearity, from 0 (0%) to 200 (100%)
    complete: u8, // % complete, from 0 (0%) to 200 (100%)
    duration: f16, // years (365.2425 days) from start to now
    duration_remaining: f16, // expected years from now to end
    magnitude: f16, // log return from start to now
    magnitude_remaining: f16, // expected log return from now to end
    retrace: f16, // % retracement thus far relative to prior wave
}