# Dual-Aggregate TMO ((T)rue (M)omentum (O)scillator)
# Idea by Mobius via OneNote
#Created by KHPro | Modified for dual aggregation
# V09.2025
declare lower;
input length = 14;
input calcLength = 5;
input smoothLength = 3;
input agg2 = AggregationPeriod.FIVE_MIN; # Secondary timeframe
# --- Primary TMO (Current Chart Timeframe) ---
def o1 = open;
def c1 = close;
def data1 = fold i1 = 0 to length
with s1
do s1 + (if c1 > getValue(o1, i1)
then 1
else if c1 < getValue(o1, i1)
then -1
else 0);
def ema1 = ExpAverage(data1, calcLength);
plot Main1 = ExpAverage(ema1, smoothLength);
plot Signal1 = ExpAverage(Main1, smoothLength);
Main1.AssignValueColor(if Main1 > Signal1 then Color.GREEN else Color.RED);
Signal1.AssignValueColor(if Main1 > Signal1 then Color.GREEN else Color.RED);
Main1.SetLineWeight(2);
Signal1.SetLineWeight(1);
Signal1.HideBubble();
Signal1.HideTitle();
addCloud(Main1, Signal1, Color.GREEN, Color.RED);
# --- Secondary TMO (User-defined Aggregation) ---
def o2 = open(period = agg2);
def c2 = close(period = agg2);
def data2 = fold i2 = 0 to length
with s2
do s2 + (if c2 > getValue(o2, i2)
then 1
else if c2 < getValue(o2, i2)
then -1
else 0);
def ema2 = ExpAverage(data2, calcLength);
plot Main2 = ExpAverage(ema2, smoothLength);
plot Signal2 = ExpAverage(Main2, smoothLength);
Main2.AssignValueColor(if Main2 > Signal2 then Color.GREEN else Color.RED);
Signal2.AssignValueColor(if Main2 > Signal2 then Color.GREEN else Color.RED);
Main2.SetLineWeight(2);
Signal2.SetLineWeight(1);
Signal2.HideBubble();
Signal2.HideTitle();
addCloud(Main2, Signal2, Color.GREEN, Color.RED);
# --- Reference Lines ---
plot zero = if IsNaN(close) then Double.NaN else 0;
zero.SetDefaultColor(Color.GRAY);
zero.HideBubble();
zero.HideTitle();
plot ob = if IsNaN(close) then Double.NaN else Round(length * 0.7);
plot os = if IsNaN(close) then Double.NaN else -Round(length * 0.7);
ob.SetDefaultColor(Color.GRAY);
os.SetDefaultColor(Color.GRAY);
ob.HideBubble();
ob.HideTitle();
os.HideBubble();
os.HideTitle();
addCloud(ob, length, Color.LIGHT_RED, Color.LIGHT_RED, no);
addCloud(-length, os, Color.LIGHT_GREEN, Color.LIGHT_GREEN);