Recently I discovered the indicators I had made for desktop appeared on my mobile app. These are studies I had converted over from ToS and also some indicators I repurposed that I found through Webull. Basically, I had wanted a backup platform since ToS kept acting up on me.
Many studies, especially upper chart ones and ones that involve measuring divergence, did not convert properly and, thus, aren’t included. Naturally, these are all lower indicators. What also seems to be true is that the indicators I posted in the Webull app are not universal, only I can see and edit them. Anyways, maybe someone will find these useful but I’m not making any promises about them. Also, I don’t care for this devolving into an “indicators are worthless” discussion.
Including some images of desktop with markup that I had posted recently on Webull (NFA).
RIZZSTOGRAM: replicates the RSITrend found in WB in histogram form + a Slow Stochastic using Raghee Horner’s settings of 21 for K and 3 for D. Truly, a stochastic is an oscillator, first of all, but the orange dots and yellow bars basically posit that whatever momentum might have been going is being tested, IMO. The 50% line is meaningful for both indicators on a crossover event. The dots represent the K stochastic moving out of oversold / overbought conditions, not a crossover of the K and d which I don’t really care about, tbqh. The RSITrend >histogram< doesn’t look as great on mobile, unfortunately.
len = define(14, name="RSI Length") ob = define(60, name="Upper Threshold") os = define(40, name="Lower Threshold") rsi = ind.rsi(close, len) isBull = rsi >= ob isBear = rsi <= os isNeutral = not isBull and not isBear wasBull = rsi[1] >= ob wasBear = rsi[1] <= os firstNeutral = (wasBull and isNeutral) or (wasBear and isNeutral) col = firstNeutral ? #ffff00 : isBull ? #00ff80 : isBear ? #ff00ff : #808080 plt(rsi, name="RSI Histogram", type=plt.type_columns, color=col, opacity=100, base_line=50) hline(50, name="RSI Mid Line", color=#ffff00) over_bought = define(80, name="Overbought") over_sold = define(20, name="Oversold") KPeriod = define(21, name="K Period", min=1) DPeriod = define(3, name="D Period", min=1) rawK = math.stoch(close, high, low, KPeriod) SlowK = ind.ema(rawK, 3) SlowD = ind.ema(SlowK, DPeriod) hline(over_bought, name="OverBought", color=color.gray, line_type=hline.type_dotted) hline(over_sold, name="OverSold", color=color.gray, line_type=hline.type_dotted) plt(SlowK, name="SlowK", type=plt.type_line, line_width=1, color=#ffffff) plt(SlowD, name="SlowD", type=plt.type_line, line_width=2, color=#808080) UpSignal = iff(SlowK[1] <= over_sold and SlowK > over_sold, SlowK, none) // leaving oversold DownSignal = iff(SlowK[1] >= over_bought and SlowK < over_bought, SlowK, none) // leaving overbought plt(UpSignal, name="Up", type=plt.type_circles, color=#ff8800) plt(DownSignal, name="Down", type=plt.type_circles, color=#ff8800)
RAINBO DMI + SQZ: plots a histogram for the difference between the positive and negative DMI and colors it based on the strength of the ADXβI think. It’s been like 5 months now, afterall. Yet, I did spend some hours investigating the ADX across multiple charts and timeframes to estimate some decent ranges for the color coding function, however, I’m certainly no expert and don’t use the DMI regularly. I was just trying to recreate this fairly popular indicator in a way that made more sense to me.
The key (last line of code) could be rather annoying on mobile, so you might want to remove that once the color mechanic is understood. Grey basically means there is no trend. Yellow and orange might be understood to be the same. But it really seems to lag a lot so, perhaps, better for shorter time frames? It’s paired with the TTM squeeze because, why not? Of course, the usual momentum aspect of the squeeze is not there.
Slength = define(20, "Squeeze Length") SDmult = define(2.0, "StdDev Multiplier") ATRmult = define(1.5, "ATR Multiplier") SD = math.std(close, Slength) Avg = ind.sma(close, Slength) ATR = ind.atr(Slength) SDup = Avg + (SDmult * SD) ATRup = Avg + (ATRmult * ATR) Squeeze = SDup < ATRup ? 0 : none plt(Squeeze, "SQZ", type=plt.type_circles, color=color.white) len = define(14, min=1, name="DI Length") lensig = define(14, min=1, name="ADX Smoothing") up = high - high[1] down = low[1] - low plusDM = (up > down and up > 0) ? up : 0 minusDM = (down > up and down > 0) ? down : 0 trur = ind.atr(len) plus = 100 * ind.rma(plusDM, len) / (trur == 0 ? 1 : trur) minus = 100 * ind.rma(minusDM, len) / (trur == 0 ? 1 : trur) sum_dm = plus + minus dx = (sum_dm == 0) ? 0 : 100 * math.abs(plus - minus) / sum_dm adx = ind.rma(dx, lensig) diff = plus - minus col = adx < 20 ? color.gray : adx <= 25 ? (diff >= 0 ? color.yellow : color.orange) : adx <= 30 ? (diff >= 0 ? color.lime : color.red) : adx <= 40 ? (diff >= 0 ? color.teal : color.fuchsia) : adx <= 50 ? (diff >= 0 ? color.blue : color.purple) : (diff >= 0 ? color.silver : color.navy) plt( diff, name="DMI Differential", type=plt.type_columns, color=col, opacity=100, base_line=0 ) hline(0, name="π=β | ππ=β | π³π«βοΈ=π | ππΈπ=π", color=#000000)
WADDAH ATTAR EXPLOSION: I really like this one. I might have actually found this through Webull and coded it into ToSβcannot remember. Anyways, I believe I made what are some minor visual improvements. OFC, use your favorite colors for these indicators because I typically use a dark grey background. These should be compatible with black backgrounds, too, but will probably look bad on lighter ones.
Sensitivity = define(150, name="Sensitivity") FastEMALength = define(20, name="Fast EMA Length") SlowEMALength = define(40, name="Slow EMA Length") ChannelLength = define(20, name="BB Length") StdevMultiplier = define(2.0, name="BB Stdev Mult") tr = math.max(high - low, math.abs(high - close[1]), math.abs(low - close[1])) RMA_TR = ind.ema(tr, 100) // Webull: EMA = RMA DEAD_ZONE = RMA_TR * 3.7 fastMA = ind.ema(close, FastEMALength) slowMA = ind.ema(close, SlowEMALength) macd_now = fastMA - slowMA fastMA_prev = ind.ema(close[1], FastEMALength) slowMA_prev = ind.ema(close[1], SlowEMALength) macd_prev = fastMA_prev - slowMA_prev t1 = (macd_now - macd_prev) * Sensitivity bb_basis = ind.sma(close, ChannelLength) bb_stdev = math.std(close, ChannelLength) bb_upper = bb_basis + StdevMultiplier * bb_stdev bb_lower = bb_basis - StdevMultiplier * bb_stdev e1 = bb_upper - bb_lower trendUp = t1 >= 0 ? t1 : none trendDown = t1 < 0 ? -t1 : none colorUp = trendUp < trendUp[1] ? #ffff00 : #00ff80 colorDown = trendDown < trendDown[1] ? #400040 : #800080 plt(DEAD_ZONE, type=plt.type_area, color=#808000, name="Dead Zone") plt(trendUp, type=plt.type_columns, line_width=1, color=colorUp, name="Up") plt(trendDown, type=plt.type_columns, line_width=1, color=colorDown, name="Down") plt(e1, type=plt.type_line, line_width=2, color=#ffffff, name="Explosion Line")
BANKER FLO: This performs a similar function to the slow stochastic but with, IDK, more signaling? However, that “signaling” looks and works better in ToS and it’s actually still a bit of an “interpretive” indicator, for me, and moreso after being converted into Webull. But maybe some will find it useful.
SmoothingLength = define(13, name="Smoothing Length") lowestLow = math.lowest(low, 27) highestHigh = math.highest(high, 27) range = highestHigh - lowestLow safeRange = (range == 0) ? 0.000001 : range wmCal = (close - lowestLow) / safeRange * 100 xsa1 = ind.ema(wmCal, 5) xsa2 = ind.ema(xsa1, 3) fundtrend = (3 * xsa1 - 2 * xsa2 - 50) * 1.032 + 50 typ = (2 * close + high + low + open) / 5 lowestTyp = math.lowest(typ, 34) highestTyp = math.highest(typ, 34) bbRange = highestTyp - lowestTyp safeBBRange = (bbRange == 0) ? 0.000001 : bbRange bullbear = (typ - lowestTyp) / safeBBRange * 100 bullbearline = ind.ema(bullbear, SmoothingLength) hist = fundtrend - bullbearline // ---- banker entry/exit on zero line ---- // cross ABOVE: fundtrend crosses above bullbearline AND bullbearline < 25 bankerEntry = fundtrend > bullbearline and fundtrend[1] <= bullbearline[1] and bullbearline < 25 // cross BELOW: fundtrend crosses below bullbearline AND bullbearline > 75 bankerExit = fundtrend < bullbearline and fundtrend[1] >= bullbearline[1] and bullbearline > 75 plt(bankerEntry ? 0 : none, type=plt.type_circles, color=#ffffff, // cyan base_line=0, name="BankerEntry") plt(bankerExit ? 0 : none, type=plt.type_circles, color=#202020, // magenta base_line=0, name="BankerExit") posHist = hist > 0 ? hist : none negHist = hist < 0 ? hist : none posColor = hist > hist[1] ? #00ff80 : hist < hist[1] ? #004020 : color.white negColor = hist < hist[1] ? #ff00ff : #400040 plt(posHist, type=plt.type_columns, color=posColor, base_line=0, name="HistogramPos") plt(negHist, type=plt.type_columns, color=negColor, base_line=0, name="HistogramNeg")
NET FLO: this indicator is wild and really looks like a bunch of “unusual whales” swimming across the chart (in appearance, only, not actual block trades..). Figuring out how to code the shape of the waveform was arduous but rather important to it’s interpretive nature. It got shelved for a long time and almost did not materialize. But if you are looking to code indicators, you might try feeding this one into the a.i. as the novel layering might give it some methods to advance more complex indicators.
The original version was meant to be used intraday but it seems useful on longer timeframes, too. I added some crossover elements, just as a visual cue, not really sure how meaningful that is. The original version assigned importance when two lines come close together INTRADAY, which, in this version, would be akin to the waveform becoming thin. It seems that is meant to be a wait for direction moment: will the lines revert or continue to reverse the trend? Be careful of entering too early, imo.
Some other things I’ve found meaningful are when a waveform BEGINS to taper and when a dominant waveform expands BEYOND it’s previous peak. Your mileage will vary. I do use this in ToS intraday but only alongside other indicators.
smoothingPeriod = define(10, "Smoothing Period", min=1) lookbackPeriod = define(75, "Lookback Period", min=1) separationFactor = define(2.0, "Separation Factor") color_Bull = #00ff80 color_Bear = #ff00ff color_Blank = #000000 // change this color to match background stockPriceSmoothed = ind.ema(close, smoothingPeriod) stockPriceMax = math.highest(stockPriceSmoothed, lookbackPeriod) stockPriceMin = math.lowest(stockPriceSmoothed, lookbackPeriod) priceRange = stockPriceMax - stockPriceMin midPoint = iff(priceRange != 0, (stockPriceMax + stockPriceMin) / 2, stockPriceSmoothed) verticalRangeMin = stockPriceMin * 0.9 verticalRangeMax = stockPriceMax * 1.1 verticalRange = verticalRangeMax - verticalRangeMin priceChange = stockPriceSmoothed - stockPriceSmoothed[1] rawNetBull = iff(priceRange != 0, priceChange / priceRange, 0) rawNetBear = -rawNetBull smoothedNetBull = ind.ema(rawNetBull, smoothingPeriod) smoothedNetBear = ind.ema(rawNetBear, smoothingPeriod) BullMax = math.highest(smoothedNetBull, lookbackPeriod) BullMin = math.lowest(smoothedNetBull, lookbackPeriod) BearMax = math.highest(smoothedNetBear, lookbackPeriod) BearMin = math.lowest(smoothedNetBear, lookbackPeriod) scaledNetBull = iff( BullMax != BullMin, midPoint + (smoothedNetBull - BullMin) * verticalRange * separationFactor / (BullMax - BullMin), stockPriceSmoothed ) scaledNetBear = iff( BearMax != BearMin, midPoint + (smoothedNetBear - BearMin) * verticalRange * separationFactor / (BearMax - BearMin), stockPriceSmoothed ) upper = math.max(scaledNetBull, scaledNetBear) lower = math.min(scaledNetBull, scaledNetBear) BullCrossAboveBear = scaledNetBull > scaledNetBear and scaledNetBull[1] <= scaledNetBear[1] BullCrossBelowBear = scaledNetBull < scaledNetBear and scaledNetBull[1] >= scaledNetBear[1] bullCross = iff(BullCrossAboveBear, scaledNetBull, none) bearCross = iff(BullCrossBelowBear, scaledNetBear, none) plt(scaledNetBull, "+++", type=plt.type_area, color=color_Bull) plt(scaledNetBear, "---", type=plt.type_area, color=color_Bear) // workaround to block non-informative, lower boundary space plt(lower, "change to BG color", color=color_Blank, type=plt.type_area) plt(bullCross, name="ana", type=plt.type_cross, line_width=2, color=#ffff00) plt(bearCross, name="kata", type=plt.type_circles, color=#ffff00)
https://preview.redd.it/cdev1z5rkdtg1.jpg?width=1223&format=pjpg&auto=webp&s=520244fcacf7fbc78b5a61bea1317726d610d6fa
https://preview.redd.it/d0b4azztkdtg1.jpg?width=1280&format=pjpg&auto=webp&s=29d4a79d7042fd4993010ba92a750af64e4d6c1c
https://preview.redd.it/4ini6bhvkdtg1.jpg?width=1283&format=pjpg&auto=webp&s=476b5625848bab32fdf9d0718c690331c54c7686
https://preview.redd.it/d20enpzwkdtg1.jpg?width=1330&format=pjpg&auto=webp&s=1805af556fe64c3a247a2fee91fdd940176a6a40
https://preview.redd.it/irvan7lxkdtg1.jpg?width=1334&format=pjpg&auto=webp&s=7a68206cfb647f321e1642e6fd0cc9d9bf3345c8
https://preview.redd.it/mry8xy8ykdtg1.jpg?width=1282&format=pjpg&auto=webp&s=465a70d286b605d9d0e70e8e6ded61eca630b6dd
https://preview.redd.it/v6ci23nykdtg1.jpg?width=1281&format=pjpg&auto=webp&s=c7fdc639dce88c756647d83dc1326e26d4b47428