OPEN-SOURCE SCRIPT
MTF Stochastic Phase Fusion [FibonacciFlux]

Six Stochastic timeframes fused into a tactical and a structural wave, with a decaying pulse on their crossings - published with a re-run of the backtest the pulse is built on, which finds no edge, a move that is over before the marker prints, and a holdout that was searched.
WHAT IT DRAWS
Stochastic %K is computed inside each of six timeframes (15m, 1H, 4H, 1D, 1W, 1M). Four of them are weighted into a tactical wave, three into a structural wave, and the spread between the two is the thing the indicator is about. A phase-plane term treats centred %K as a real axis and scaled %K velocity as a quadrature axis; the length of the weighted unit-vector sum becomes the tactical coherence area behind the waves. On the price pane, a golden or dead cross of tactical over structural drops a GC or DC label with a Type letter, and that pulse decays over a symbol-specific life - 120 minutes on BTC, 60 on ETH - fading out as it expires. If the adverse excursion since the cross passes a threshold, a TAIL marker appears.
THE PULSE'S EVIDENCE, RE-RUN
This is the first script I have published where the original backtest could actually be repeated. It was run on BTCUSDT and ETHUSDT 15m, train 2024-07 to 2025-12 and a one-shot holdout 2026-01 to 2026-07, and Binance serves that whole span, so it was re-run on 84,426 bars per symbol rather than taken on trust. Four things came out, and none of them supports the claim.
NO EDGE SURVIVES A PROPER NULL
Across 236 (cell, statistic, threshold) tests on two instruments and two chart timeframes, against a circular-shift null of 200 to 400 draws, ZERO reach p <= 0.05 - where about 12 would be expected by chance alone. The median p is 0.632. Nothing passes a multiple-testing correction because nothing passes without one.
The single result that once looked significant, a BTCUSDT mean of +4.98bp at p = 0.049, was a draw-count artifact. At 40 draws the achievable p values are multiples of 1/41, so 0.049 is literally one draw away from nothing; re-run at 1000 draws under three seeds the same test gives 0.055, 0.069 and 0.065, and it vanishes at every neighbouring horizon.
THE MOVE IS OVER BEFORE THE MARKER PRINTS
This is the part that replicates in every cell tested, and it is the honest description of the thing. Measuring the same horizon ending at the cross against the one starting at it:
BTCUSDT golden +31.03bp before +4.09bp after 88.4% already spent
BTCUSDT dead +29.80bp before -1.73bp after 94.5% already spent
ETHUSDT golden +36.72bp before -2.02bp after 94.8% already spent
ETHUSDT dead +44.40bp before -2.34bp after 95.0% already spent
Between 88% and 95% of the round trip associated with a crossing has already happened when the marker appears. Note the dead crosses too: on both symbols price has risen roughly 30 to 44bp into a dead cross. That is what a crossover of two smoothed multi-timeframe stochastics does - it reports, it does not anticipate.
THE HOLDOUT WAS SEARCHED
The quoted "~58% holdout win rate" is 54.63% in the shipped configuration. 58% appears only as one cell of a 56-cell grid of pulse life against coherence gate, evaluated on the holdout itself, whose maximum is 77.42%. A holdout you search is a second training set, and that is the finding most damaging to the original methodology - more so than any single number in it.
Two related corrections. The header said the losing side's adverse excursion grew from about 0.7% to about 1.1%; measured it goes 0.668% to 0.773%. And it said the holdout mean "flipped negative"; in the shipped configuration the BTCUSDT holdout mean is +3.72bp, positive.
THE PULSE-LIFE DEFAULTS ARE NOT MEASURED OPTIMA
The 60-minute ETH pulse life returns -1.58bp at exactly that horizon - a loss - ranking fifth of the ten horizons swept in its own cell, where the best is +6.91bp at 480 minutes. The 120-minute BTC life ranks fourth of ten. And which horizon looks best is uncorrelated between the two symbols, Spearman -0.03, so the horizon profile describes this sample rather than the indicator. Both defaults are kept so the chart matches the research it came from, and both tooltips now say this.
WHAT ABOUT THE TAIL MARKER
It is a description of drawdown that has already happened, not a warning about drawdown to come. TAIL-flagged pulses average -140.32bp, and randomly placed pulses carrying the same flag average -144.04bp, p = 0.634. Conditioning on a large adverse excursion selects losing trades by arithmetic; the flag adds nothing. Worse for the threshold's stated justification, on BTCUSDT - the instrument it was calibrated from - real pulses have a THINNER left tail than the null at every level tested.
WHAT THE PULSE ACTUALLY DOES ON A CHART
Over 84,155 scored bars of BTCUSDT 15m at the shipped defaults there are 639 golden and 638 dead crosses. A long pulse is running on 5.1% of bars and a short pulse on 5.1%, so some pulse is live on 8.1% of bars - and on 2.1% of bars a long pulse and a short pulse are running at the same time, because they are independent state machines and neither cancels the other. ETHUSDT gives 821 and 820 crosses, 6.3% pulse-active, 0.9% overlapping. The TAIL state, the one the header calls the failure mode, is on for 0.2% of bars on BTCUSDT and 0.1% on ETHUSDT.
The alert floor of 65 on tactical coherence is not a tight filter: coherence sits above it on 31.7% of BTCUSDT bars and 29.2% of ETHUSDT bars, with a median of 49.2 and 47.7 respectively.
WHAT CHANGED IN THIS VERSION
The largest dead-code removal in this series of publications, none of which touches a plotted value.
A settings toggle promised a "state table" that did not exist anywhere in the file - no table, no cell - and the three helper functions written for it were the last three lines of the script. Gone.
Every %D value was unused. Both state functions returned a %D line, all twelve request.security calls carried it, and not one of the twelve was ever read. That made the "%D smoothing" input completely inert: swept from 1 to 30 across 420,775 bar comparisons on two symbols it changed no plotted series by any amount at all and left the pulse count identical. The input and the twelve unread series are gone, which also takes a third series off each of twelve higher-timeframe requests.
Three more computed-and-never-used values went with them: the structural coherence, the wave spread, and the maximum favourable excursion tracked for both pulse sides. Maximum ADVERSE excursion stays, because the caution and TAIL states read it.
The Type A to B upgrade markers and their two alerts are gone, because they cannot fire. An upgrade needs the structural wave to cross 50 while a pulse is still alive - but the structural wave is built from 1D, 1W and 1M legs and a pulse lives eight bars on BTC or four on ETH, so its median change over an entire pulse life is exactly 0.000 on both symbols. Measured: 0 upgrades in 1,070 BTCUSDT pulses, of which 546 started as Type A, and 1 upgrade in 1,518 ETHUSDT pulses. Two plotshapes, two alert conditions and a documented taxonomy for an event that fires once in 2,588 pulses. The Type letter on the GC/DC label is reachable and stays.
The HTF data mode defaulted to "Developing HTF", the repainting one. With six requested timeframes reaching up to 1M, an open monthly bar keeps moving the structural wave for weeks. The default is Confirmed only now, and the tooltip says the word repaints. One thing worth knowing: on historical bars the two modes differ only in the 15m leg, because that is the chart timeframe - the higher-timeframe legs resolve to the same completed bar either way.
924 box-drawing characters, a Unicode minus and three arrow glyphs became ASCII, an MPL header was added, and the title dropped its version suffix for the handle.
WHAT THE MEASUREMENTS COVER
BTCUSDT and ETHUSDT 15m from Binance, 2024-04 to 2026-08, 84,426 bars per symbol, which spans the original train and holdout windows entirely. No other instrument, no other timeframe, no transaction costs. The pulse-life defaults of 120 and 60 minutes came from the original screen; the 90-minute fallback for every other symbol did not, and its tooltip says so.
One warm-up note that bites on real charts: the structural wave needs 16 monthly bars before it exists, so this indicator plots nothing at all on any symbol with less than about sixteen months of monthly history, however much intraday history the chart has.
HOW THE NUMBERS WERE CHECKED
The whole computation was reimplemented outside Pine and cross-checked against this chart's Data Window: 24 quantities on 10 bars, 240 values - both waves, tactical coherence, all six raw sensors, three velocities, both cross flags, both pulse-active flags, both adverse-excursion trackers and both decay intensities. The captured bars include a golden cross, a dead cross and several bars inside a live pulse, so the pulse state machine and the MAE tracking were exercised rather than assumed. All 240 values round to the exact two decimals TradingView prints, worst raw difference 4.9e-3.
That check earned its keep. A first version of the reimplementation was wrong in a way that is invisible almost everywhere: a higher-timeframe request updates on the chart bar that closes WITH the higher-timeframe bar, not one period later. Using "always the previous closed bar" is correct on three of every four 15-minute bars against a 1H leg and wrong on the fourth. It produced a 9.09-point error on the 1H sensor at 22:45 and exactly zero error at 22:30, and only the live comparison caught it.
Open source under MPL 2.0. Nothing here is a forecast, a signal service, or a claim of profitability.
WHAT IT DRAWS
Stochastic %K is computed inside each of six timeframes (15m, 1H, 4H, 1D, 1W, 1M). Four of them are weighted into a tactical wave, three into a structural wave, and the spread between the two is the thing the indicator is about. A phase-plane term treats centred %K as a real axis and scaled %K velocity as a quadrature axis; the length of the weighted unit-vector sum becomes the tactical coherence area behind the waves. On the price pane, a golden or dead cross of tactical over structural drops a GC or DC label with a Type letter, and that pulse decays over a symbol-specific life - 120 minutes on BTC, 60 on ETH - fading out as it expires. If the adverse excursion since the cross passes a threshold, a TAIL marker appears.
THE PULSE'S EVIDENCE, RE-RUN
This is the first script I have published where the original backtest could actually be repeated. It was run on BTCUSDT and ETHUSDT 15m, train 2024-07 to 2025-12 and a one-shot holdout 2026-01 to 2026-07, and Binance serves that whole span, so it was re-run on 84,426 bars per symbol rather than taken on trust. Four things came out, and none of them supports the claim.
NO EDGE SURVIVES A PROPER NULL
Across 236 (cell, statistic, threshold) tests on two instruments and two chart timeframes, against a circular-shift null of 200 to 400 draws, ZERO reach p <= 0.05 - where about 12 would be expected by chance alone. The median p is 0.632. Nothing passes a multiple-testing correction because nothing passes without one.
The single result that once looked significant, a BTCUSDT mean of +4.98bp at p = 0.049, was a draw-count artifact. At 40 draws the achievable p values are multiples of 1/41, so 0.049 is literally one draw away from nothing; re-run at 1000 draws under three seeds the same test gives 0.055, 0.069 and 0.065, and it vanishes at every neighbouring horizon.
THE MOVE IS OVER BEFORE THE MARKER PRINTS
This is the part that replicates in every cell tested, and it is the honest description of the thing. Measuring the same horizon ending at the cross against the one starting at it:
BTCUSDT golden +31.03bp before +4.09bp after 88.4% already spent
BTCUSDT dead +29.80bp before -1.73bp after 94.5% already spent
ETHUSDT golden +36.72bp before -2.02bp after 94.8% already spent
ETHUSDT dead +44.40bp before -2.34bp after 95.0% already spent
Between 88% and 95% of the round trip associated with a crossing has already happened when the marker appears. Note the dead crosses too: on both symbols price has risen roughly 30 to 44bp into a dead cross. That is what a crossover of two smoothed multi-timeframe stochastics does - it reports, it does not anticipate.
THE HOLDOUT WAS SEARCHED
The quoted "~58% holdout win rate" is 54.63% in the shipped configuration. 58% appears only as one cell of a 56-cell grid of pulse life against coherence gate, evaluated on the holdout itself, whose maximum is 77.42%. A holdout you search is a second training set, and that is the finding most damaging to the original methodology - more so than any single number in it.
Two related corrections. The header said the losing side's adverse excursion grew from about 0.7% to about 1.1%; measured it goes 0.668% to 0.773%. And it said the holdout mean "flipped negative"; in the shipped configuration the BTCUSDT holdout mean is +3.72bp, positive.
THE PULSE-LIFE DEFAULTS ARE NOT MEASURED OPTIMA
The 60-minute ETH pulse life returns -1.58bp at exactly that horizon - a loss - ranking fifth of the ten horizons swept in its own cell, where the best is +6.91bp at 480 minutes. The 120-minute BTC life ranks fourth of ten. And which horizon looks best is uncorrelated between the two symbols, Spearman -0.03, so the horizon profile describes this sample rather than the indicator. Both defaults are kept so the chart matches the research it came from, and both tooltips now say this.
WHAT ABOUT THE TAIL MARKER
It is a description of drawdown that has already happened, not a warning about drawdown to come. TAIL-flagged pulses average -140.32bp, and randomly placed pulses carrying the same flag average -144.04bp, p = 0.634. Conditioning on a large adverse excursion selects losing trades by arithmetic; the flag adds nothing. Worse for the threshold's stated justification, on BTCUSDT - the instrument it was calibrated from - real pulses have a THINNER left tail than the null at every level tested.
WHAT THE PULSE ACTUALLY DOES ON A CHART
Over 84,155 scored bars of BTCUSDT 15m at the shipped defaults there are 639 golden and 638 dead crosses. A long pulse is running on 5.1% of bars and a short pulse on 5.1%, so some pulse is live on 8.1% of bars - and on 2.1% of bars a long pulse and a short pulse are running at the same time, because they are independent state machines and neither cancels the other. ETHUSDT gives 821 and 820 crosses, 6.3% pulse-active, 0.9% overlapping. The TAIL state, the one the header calls the failure mode, is on for 0.2% of bars on BTCUSDT and 0.1% on ETHUSDT.
The alert floor of 65 on tactical coherence is not a tight filter: coherence sits above it on 31.7% of BTCUSDT bars and 29.2% of ETHUSDT bars, with a median of 49.2 and 47.7 respectively.
WHAT CHANGED IN THIS VERSION
The largest dead-code removal in this series of publications, none of which touches a plotted value.
A settings toggle promised a "state table" that did not exist anywhere in the file - no table, no cell - and the three helper functions written for it were the last three lines of the script. Gone.
Every %D value was unused. Both state functions returned a %D line, all twelve request.security calls carried it, and not one of the twelve was ever read. That made the "%D smoothing" input completely inert: swept from 1 to 30 across 420,775 bar comparisons on two symbols it changed no plotted series by any amount at all and left the pulse count identical. The input and the twelve unread series are gone, which also takes a third series off each of twelve higher-timeframe requests.
Three more computed-and-never-used values went with them: the structural coherence, the wave spread, and the maximum favourable excursion tracked for both pulse sides. Maximum ADVERSE excursion stays, because the caution and TAIL states read it.
The Type A to B upgrade markers and their two alerts are gone, because they cannot fire. An upgrade needs the structural wave to cross 50 while a pulse is still alive - but the structural wave is built from 1D, 1W and 1M legs and a pulse lives eight bars on BTC or four on ETH, so its median change over an entire pulse life is exactly 0.000 on both symbols. Measured: 0 upgrades in 1,070 BTCUSDT pulses, of which 546 started as Type A, and 1 upgrade in 1,518 ETHUSDT pulses. Two plotshapes, two alert conditions and a documented taxonomy for an event that fires once in 2,588 pulses. The Type letter on the GC/DC label is reachable and stays.
The HTF data mode defaulted to "Developing HTF", the repainting one. With six requested timeframes reaching up to 1M, an open monthly bar keeps moving the structural wave for weeks. The default is Confirmed only now, and the tooltip says the word repaints. One thing worth knowing: on historical bars the two modes differ only in the 15m leg, because that is the chart timeframe - the higher-timeframe legs resolve to the same completed bar either way.
924 box-drawing characters, a Unicode minus and three arrow glyphs became ASCII, an MPL header was added, and the title dropped its version suffix for the handle.
WHAT THE MEASUREMENTS COVER
BTCUSDT and ETHUSDT 15m from Binance, 2024-04 to 2026-08, 84,426 bars per symbol, which spans the original train and holdout windows entirely. No other instrument, no other timeframe, no transaction costs. The pulse-life defaults of 120 and 60 minutes came from the original screen; the 90-minute fallback for every other symbol did not, and its tooltip says so.
One warm-up note that bites on real charts: the structural wave needs 16 monthly bars before it exists, so this indicator plots nothing at all on any symbol with less than about sixteen months of monthly history, however much intraday history the chart has.
HOW THE NUMBERS WERE CHECKED
The whole computation was reimplemented outside Pine and cross-checked against this chart's Data Window: 24 quantities on 10 bars, 240 values - both waves, tactical coherence, all six raw sensors, three velocities, both cross flags, both pulse-active flags, both adverse-excursion trackers and both decay intensities. The captured bars include a golden cross, a dead cross and several bars inside a live pulse, so the pulse state machine and the MAE tracking were exercised rather than assumed. All 240 values round to the exact two decimals TradingView prints, worst raw difference 4.9e-3.
That check earned its keep. A first version of the reimplementation was wrong in a way that is invisible almost everywhere: a higher-timeframe request updates on the chart bar that closes WITH the higher-timeframe bar, not one period later. Using "always the previous closed bar" is correct on three of every four 15-minute bars against a 1H leg and wrong on the fourth. It produced a 9.09-point error on the 1H sensor at 22:45 and exactly zero error at 22:30, and only the live comparison caught it.
Open source under MPL 2.0. Nothing here is a forecast, a signal service, or a claim of profitability.
Script open-source
Nello spirito di TradingView, l'autore di questo script lo ha reso open source, in modo che i trader possano esaminarne e verificarne la funzionalità. Complimenti all'autore! Sebbene sia possibile utilizzarlo gratuitamente, ricordiamo che la ripubblicazione del codice è soggetta al nostro Regolamento.
FibonacciFlux: Pushing indicator boundaries. Crafting sophisticated, surprising tools via ambitious R&D.
Declinazione di responsabilità
Le informazioni e le pubblicazioni non sono intese come, e non costituiscono, consulenza o raccomandazioni finanziarie, di investimento, di trading o di altro tipo fornite o approvate da TradingView. Per ulteriori informazioni, consultare i Termini di utilizzo.
Script open-source
Nello spirito di TradingView, l'autore di questo script lo ha reso open source, in modo che i trader possano esaminarne e verificarne la funzionalità. Complimenti all'autore! Sebbene sia possibile utilizzarlo gratuitamente, ricordiamo che la ripubblicazione del codice è soggetta al nostro Regolamento.
FibonacciFlux: Pushing indicator boundaries. Crafting sophisticated, surprising tools via ambitious R&D.
Declinazione di responsabilità
Le informazioni e le pubblicazioni non sono intese come, e non costituiscono, consulenza o raccomandazioni finanziarie, di investimento, di trading o di altro tipo fornite o approvate da TradingView. Per ulteriori informazioni, consultare i Termini di utilizzo.