Repaints Ants — Momentum, Volume and Price (MVP)

Repaints

petech

Member
I saw this very interesting custom indicator on TradingView.
https://www.tradingview.com/script/uEaFv7tm-Ants-Momentum-Volume-and-Price-MVP/

2xK3Vsa.jpg


I haven't got the slightest clue how to code this myself in TOS, but I think it is generally understood that we want to buy stocks that are under institutional accumulation. This indicator from TV seems to attempt to spot stocks that likely being accumulated by institutions. So I hope someone here who knows how to code would also find this concept of interest and want to code a script based upon the logic below.

Also I've already done a search on this site to see if something similar already existed, if it does, I missed finding it.

From the original author on TV....

The Ants indicator is based on the research of David Ryan, three-time winner of the U.S. Investing Championship. David came up with the idea for the indicator while managing the New USA Growth Fund at William O’Neil + Company. David was interested to understand what drove some stocks higher once they were extended from their most recent base, while others had only moderate moves up.

What David found during his research was that stocks making the biggest moves often had consistent buying on volume over a period of 12 to 15 trading days. Stocks with these characteristics may be under institutional accumulation, where it may take days to weeks to fill a position.

Momentum, Volume And Price ( MVP )

The Ants indicator looks for the following:

‎ ‎ ‎ ‎■ Momentum - The stock is up at least 12 of the past 15 days.
‎ ‎ ‎ ‎■ Volume - The volume has increased over the past 15 days by 20% to 25%.
‎ ‎ ‎ ‎■ Price - The price is up at least 20% over the past 15 days.
 
Solution
here is my version of MVP
it draws squares above the candles, depending on 3 conditions.

momentum up is when close is > previous close, for the min bars, within a max series.
volume up is determined when volume average(15) > (volume average(50) * 20%)
price up is determined when price average(15) > (price average(50) * 6%). ( i changed it from 20% to 6%, because price rarely rose 20%, )

can show a color legend to the right of last candle.
a gray horizontal line is drawn when the momentum condition is true.

test data,
...can draw colored squares below the candles, for each condition.
...can show price average lines
...a separate study will show volume average lines

Ruby:
# mvp_01

# -----------------
# halcyonguy
# 21-08-25
#...
I've gotten momentum part to work. Now to see if I can figure out the rest.

Code:
# plot squares
def square_count = sum(close > close[1], 15) >= 12;
plot square = if square_count>0 then close()+(close()/10) else double.nan;
square.setpaintingStrategy(paintingStrategy.squares);
square.setDefaultColor(color.green);
square.SetlineWeight(1);

# add chart bubbles
def bubble_location = close()+(close()/10);
addchartbubble (square_count>0, bubble_location, “MVP: Price Higher”, color.green, yes);
 
I've gotten momentum part to work. Now to see if I can figure out the rest.

Code:
# plot squares
def square_count = sum(close > close[1], 15) >= 12;
plot square = if square_count>0 then close()+(close()/10) else double.nan;
square.setpaintingStrategy(paintingStrategy.squares);
square.setDefaultColor(color.green);
square.SetlineWeight(1);

# add chart bubbles
def bubble_location = close()+(close()/10);
addchartbubble (square_count>0, bubble_location, “MVP: Price Higher”, color.green, yes);
that is a good try. but it doesn't look to the future to see if the current bar is in the first few bars of a series.
i will post what i have in a couple hours. sorry got busy with other things. will try to finish it tonight.
 
At this point I've done as much as I know how. Anything more is beyond my 2 week coding experience...lol. See below. Ignore the non bubble text and trend lines. Those are just my personal notes for other things.

AQ0mCvp.jpg


Code:
def bars = 15;
def location = close()+(close()/10);

# Momentum
def momentum = sum(close > close[1], bars) >= 12;

# Volume
def volume_now = volume;
def volume_before = volume_now[bars]+((volume_now[bars])/5);

# Price change
def price_now = close();
def price_before = price_now[bars]+((price_now[bars])/5);

### Add Chart Bubbles
# M
addchartbubble (momentum>0, location, “M”, color.orange, yes);

# MP
addchartbubble (momentum>0 AND price_now>price_before, location, “MP”, color.orange, yes);

# MV
addchartbubble (momentum>0 AND volume_now>volume_before, location, “MV”, color.orange, yes);

# MVP
addchartbubble (momentum>0 AND price_now>price_before AND volume_now>volume_before, location, “MVP”, color.orange, yes);
 
here is preliminary code, BUT, it is just for finding the momentum portion, the blue squares.
i will keep working on it, and add the price and volume sections.

Ruby:
# mvp_ants_00f_cleanedup_momen

# -------------
# halcyonguy
# 21-08-16
# -------------
# 00f add preliminary code for vol , price
#  add cloud under bars
#   add , yellow cloud if 40% of the min exist and 1st bar is < qty bars from last bar

# 00e fixed errors on last few bars , added  while ....
# 00d momentum works

 #--------------------------------------------------

# Ants - Momentum, Volume and Price (MVP)
 #https://usethinkscript.com/threads/ants-%E2%80%94-momentum-volume-and-price-mvp.7497/
#I saw this very interesting custom indicator on TradingView.

# — Momentum, Volume And Price ( MVP ) —

# The Ants indicator looks for the following:
#  1... Momentum - The stock is up at least 12 of the past 15 days.
#  2... Volume - The volume has increased over the past 15 days by 20% to 25%.
#  3... Price - The price is up at least 20% over the past 15 days.

# colored squares, above the candles:
#  Gray - Momen requirement met.
#  Blue - Momen and price requirement met.
#  Yellow - Momen and vol requirement met.
#  Green - Momen and vol and price requirement met.

#  What Does It Mean If More Than 15 Ants Are Shown?
#It is possible that two or more consecutive series of Ants overlap. For example, you may have one series of 15 bars that meet all the MVP requirements. Somewhere within that series, another run of 15 bars may begin that also meets the MVP requirements. In situations such as this, once each run of 15 Ants is displayed, the total number of consecutive Ants shown will be greater than 15.

#/////////////////////////////////////

def na = Double.NaN;
def bn = barnumber();

# ======================================

input OOOOOO_Momentum_OOOOOOO = yes;
# MVP
# 1... Momentum - The stock is up at least 12 of the past 15 days.
#  it tests if current bar close > previous close
#  if this triggers, there should be at a minimum of 'min' bars in a row.

input momentum_qty = 15;
input momentum_min = 12;
def chgup = close > close[1];

input show_momen_price_moves_up = yes;
#test plot , each price move up

input momentum_squares_price_offset = 0.001;
def vert = momentum_squares_price_offset;

plot z = if show_momen_price_moves_up and chgup then low * (1-(1*vert)) else na;
#z.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
z.SetPaintingStrategy(PaintingStrategy.squares);
z.SetDefaultColor(Color.GREEN);
z.SetLineWeight(2);


#  min series , when there are 'min' quantity of bars or greater, within a 'qty' set of bars.
#   ex. if there are 12 min bars, within 15 qty bars.

AddLabel(1, "MVP momen qtys " + momentum_min + "/" + momentum_qty, Color.cyan);

# nested fold.
#  test if  x min bars, or more, are true , out of  y qty bars
#  loop1 , start at current bar, loops to future bars.
#  loop2 , on each bar of loop1, it looks back at 'momentum_qty' quantity of bars and counts the times chgup is true.
#    when done, if the count is > momentum_min, then a 1 is passed on to loop1.
#    if momupx > 0, then at least 1 valid series was found, to go across the bar.

#   add this to remove errors on last few bars, when bar is within (min-1) bars to the last bar,
#     while  !isnan( getvalue(close, -loop1) )

def momupx = fold loop1 = 0 to momentum_qty
with one
while  !isnan( getvalue(close, -loop1) )
do one + if (fold loop2 = 0 to momentum_qty
         with two
         do two + if GetValue(chgup , (-loop1 + loop2) ) then 1 else 0) >= momentum_min then 1 else 0;

# was there at least 1 min series found ?
def momup = if momupx > 0 then 1 else 0;

input show_price_gain_uparrows = yes;
# show counts of min series
plot mx = if show_price_gain_uparrows then momupx else na;
mx.SetPaintingStrategy(PaintingStrategy.VALUES_ABOVE);
mx.SetDefaultColor(Color.WHITE);


# draw colored squares above candles
# plot squares when a momentum cond is true
plot y = if momup then ( high * (1 + (1*vert))) else na;
y.SetDefaultColor(Color.CYAN);
y.SetPaintingStrategy(PaintingStrategy.SQUARES);
y.SetLineWeight(4);


# line under bars
def lineoffset = 1.0;
def mom_line = if !momup[1] and momup then (low * lineoffset) else if momup then mom_line[1] else na;

plot ddd = mom_line;
ddd.setlineweight(4);
ddd.SetDefaultColor(Color.cyan);

#

i think this is TWTR 30min
hluqAEV.jpg
 
Last edited:
@halcyonguy
BTW I asked the author of the tradingview indicator to clarify what he meant about the volume being 20% greater than 15 days ago, and since I wasn't sure. This is what he replied with....

You want the 15 day average daily volume to be 20% or greater than the preceding 50 day average.
 
@halcyonguy
BTW I asked the author of the tradingview indicator to clarify what he meant about the volume being 20% greater than 15 days ago, and since I wasn't sure. This is what he replied with....

You want the 15 day average daily volume to be 20% or greater than the preceding 50 day average.

hmmm , preceding...
i wonder if he means compare 15avg to the 50avg?
or
calc the 15avg. then go back 16 bars and calc the 50avg, so the 50 precedes the 15..?

i'm thinking the 2nd one.
 
hmmm , preceding...
i wonder if he means compare 15avg to the 50avg?
or
calc the 15avg. then go back 16 bars and calc the 50avg, so the 50 precedes the 15..?

i'm thinking the 2nd one.

Now that I think of it, you can read his comment multiple ways. I'll message him on Twitter and ask him to clarify further.
 
hmmm , preceding...
i wonder if he means compare 15avg to the 50avg?
or
calc the 15avg. then go back 16 bars and calc the 50avg, so the 50 precedes the 15..?

i'm thinking the 2nd one.
He has't responded to me yet, and he might not respond at all. Meanwhile I was looking at a different tweet of his, talking about a different indicators of his and I think this image below shows context of what he means by the 50 avg. So my guess is that when he replied earlier to me/us and mentioned the 15 avg and the 50 avg, I think he meant the 15 avg and the 50 avg as of the last bar.

L1kiy3d.jpg
 
here is my version of MVP
it draws squares above the candles, depending on 3 conditions.

momentum up is when close is > previous close, for the min bars, within a max series.
volume up is determined when volume average(15) > (volume average(50) * 20%)
price up is determined when price average(15) > (price average(50) * 6%). ( i changed it from 20% to 6%, because price rarely rose 20%, )

can show a color legend to the right of last candle.
a gray horizontal line is drawn when the momentum condition is true.

test data,
...can draw colored squares below the candles, for each condition.
...can show price average lines
...a separate study will show volume average lines

Ruby:
# mvp_01

# -----------------
# halcyonguy
# 21-08-25
# -----------------

# Momentum, Volume and Price (MVP)
 #https://usethinkscript.com/threads/ants-%E2%80%94-momentum-volume-and-price-mvp.7497/
#I saw this very interesting custom indicator on TradingView.
#https://www.tradingview.com/script/uEaFv7tm-Ants-Momentum-Volume-and-Price-MVP/
#The Ants indicator is based on the research of David Ryan, three-time winner of the U.S. Investing Championship. David came up with the idea for the indicator while managing the New USA Growth Fund at William O’Neil + Company. David was interested to understand what drove some stocks higher once they were extended from their most recent base, while others had only moderate moves up.

#What David found during his research was that stocks making the biggest moves often had consistent buying on volume over a period of 12 to 15 trading days. Stocks with these characteristics may be under institutional accumulation, where it may take days to weeks to fill a position.

# — Momentum, Volume And Price ( MVP ) —

# The Ants indicator looks for the following:
#  1... Momentum - The stock is up at least 12 of the past 15 days.
#  2... Volume - The volume has increased over the past 15 days by 20% to 25%.
#  3... Price - The price is up at least 20% over the past 15 days.

# colored squares, above the candles:
#  Gray - Momen requirement met.
#  Blue - Momen and price requirement met.
#  Yellow - Momen and vol requirement met.
#  Green - Momen and vol and price requirement met.

#/////////////////////////////////////

def na = Double.NaN;
def bn = barnumber();

# ======================================

input OOOOOO_Momentum_OOOOOOO = yes;
# MVP
# 1... Momentum - The stock is up at least 12 of the past 15 days.
#  it tests if current bar close > previous close

input series_max = 15;
input series_min = 12;
def momen_max = series_max;
def momen_min = series_min;
#input momentum_qty = 15;
#input momentum_min = 12;

def chgup = close > close[1];

def squares_price_offset = 0.02;
def vert = squares_price_offset;

#  min series , when there are 'min' quantity of bars or greater, within a 'qty' set of bars.
#   ex. if there are 12 min bars, within 15 qty bars.

AddLabel(1, "MVP qtys " + momen_min + "/" + momen_max, Color.cyan);

# --------------------------------
# nested fold.
#  test if  x min bars, or more, are true , out of  y qty bars
#  loop1 , start at current bar, loops to future bars.
#  loop2 , on each bar of loop1, it looks back at 'momentum_qty' quantity of bars and counts the times chgup is true.
#    when done, if the count is > momentum_min, then a 1 is passed on to loop1.
#    if momupx > 0, then at least 1 valid series was found, to go across the bar.

#   add this to remove errors on last few bars, when bar is within (min-1) bars to the last bar,
#     while  !isnan( getvalue(close, -loop1) )

def momupx = fold loop1 = 0 to momen_max
with one
while  !isnan( getvalue(close, -loop1) )
do one + if (fold loop2 = 0 to momen_max
         with two
         do two + if GetValue(chgup , (-loop1 + loop2) ) then 1 else 0) >= momen_min then 1 else 0;

# was there at least 1 min series found ?
def momup = if momupx > 0 then 1 else 0;

# line under bars
#def offset1 = 0.999;
def offset1 = 1.0;
def htper = 0.2;
def cldht = round( (htper/100) * close, 1 );
def cldtop = if !momup[1] and momup then (low * offset1) else if momup then cldtop[1] else na;
def cldbot = cldtop - cldht;
# addcloud(cldtop, cldbot, color.cyan, color.cyan);

input momen_series_horz_line = yes;
plot ddd = if momen_series_horz_line then cldtop else na;
ddd.setlineweight(2);
ddd.SetDefaultColor(Color.light_gray);


# ======================================
# ======================================

input OOOOOO_Volume_OOOOOOO = yes;

# 2... Volume - The volume has increased over the past 15 days by 20% to 25%.
#  the 15 day average daily volume is 20% or greater than the 50 day average.

input volume_increase_percent = 20.0;
def vip = volume_increase_percent/100;

#input vol_qty = 15;
#input vol_min = 12;
#def vol_max = series_max;
#def vol_min = series_min;

input vol_avg_short_len = 15;
input vol_avg_long_len = 50;
def vol_avgshort = average(volume, vol_avg_short_len);
def vol_avglong = average(volume, vol_avg_long_len);


# compare vol15avg to (vol50avg * x%)
def volupx = if ( vol_avgshort > (vol_avglong * (1 + vip)) ) then 1 else 0;
def volup = volupx;

# ======================================

input OOOOOO_Price_OOOOOOO = yes;

# 3... Price - The price is up at least 20% over the past 15 days.

#input price_increase_percent = 20.0;
input price_increase_percent = 6.0;
def prp = price_increase_percent/100;


#input pr_max = 15;
#input pr_min = 12;
def pr_max = series_max;
def pr_min = series_min;

input price_avg_short_len = 15;
input price_avg_long_len = 50;
def pr_avgshort = average(close, price_avg_short_len);
def pr_avglong = average(close, price_avg_long_len);

def prupx =  if ( pr_avgshort > (pr_avglong * (1 + prp)) ) then 1 else 0;
def prup = prupx;

# //////////////////////////////////////
# //////////////////////////////////////

# draw squares, above candles, when a cond is true
#  -- when candle is part of a min momen series

# colored squares, above the candles:
#  Gray - Momen requirement met.
#  Blue - Momen and price requirement met.
#  Yellow - Momen and vol requirement met.
#  Green  - Momen and vol and price requirement met.



def mom = (momup and !volup and !prup);
def mompr = (momup and !volup and prup);
def momvol = (momup and volup and !prup);
def momvolpr = (momup and volup and prup);

#def sqr = (momup or volup or prup);
def sqr = (mom or mompr or momvol or momvolpr);

# //////////////////////////////////////

# plot a square above candles
plot t = if sqr then (high * (1 + (1*vert))) else na;
t.DefineColor("cmom", color.light_gray);
t.DefineColor("cmompr", color.blue);
t.DefineColor("cmomvol", color.yellow);
t.DefineColor("cmomvolpr", color.green);
t.DefineColor("cnon", color.current);
t.AssignValueColor(
      if momvolpr then t.color("cmomvolpr")
 else if momvol then t.color("cmomvol")
 else if mompr then t.color("cmompr")
 else if mom then t.color("cmom")
 else t.color("cnon"));
t.SetPaintingStrategy(PaintingStrategy.SQUARES);
t.SetLineWeight(4);

# -------------------------------------


# legend
input show_color_legend = yes;
input legend_bar_offset = 4;
input legend_vert_percent = 97;
def v = (legend_vert_percent/100) * (close[legend_bar_offset]);

def k = !isnan(close[legend_bar_offset]) and isnan(close[(legend_bar_offset-1)]);
addchartbubble(show_color_legend and k, v, "Gray - Momen", color.light_gray, yes);
addchartbubble(show_color_legend and k, v, "Blue - Momen, price", color.blue, yes);
addchartbubble(show_color_legend and k, v, "Yellow - Momen, vol", color.yellow, yes);
addchartbubble(show_color_legend and k, v, "Green - Momen, vol, price", color.green, yes);



# test data , show test squares below the candles
input test_momen_series_quantities = no;
# show counts of momen min series
plot mx = if test_momen_series_quantities then momupx else na;
mx.SetPaintingStrategy(PaintingStrategy.VALUES_below);
mx.SetDefaultColor(Color.WHITE);

input test_momen_up_lower_gray = no;
plot my = if (test_momen_up_lower_gray and momup) then (low * (1 - (1*vert))) else na;
my.SetDefaultColor(Color.light_gray);
my.SetPaintingStrategy(PaintingStrategy.SQUARES);
my.SetLineWeight(4);

input test_volume_up_lower_purple = no;
plot vy = if (test_volume_up_lower_purple and volup) then (low * (1 - (2*vert))) else na;
vy.SetDefaultColor(Color.magenta);
vy.SetPaintingStrategy(PaintingStrategy.SQUARES);
vy.SetLineWeight(4);

input test_price_up_lower_blue = no;
plot py = if (test_price_up_lower_blue and prup) then (low * (1 - (3*vert))) else na;
py.SetDefaultColor(Color.blue);
py.SetPaintingStrategy(PaintingStrategy.SQUARES);
py.SetLineWeight(4);

input test_all_up = no;
plot all = if (test_all_up and momvolpr) then (low * (1 - (4*vert))) else na;
all.SetDefaultColor(Color.green);
all.SetPaintingStrategy(PaintingStrategy.SQUARES);
all.SetLineWeight(4);


input test_price_average_lines = no;
plot prs = if test_price_average_lines then pr_avgshort else na;
plot prl = if test_price_average_lines then pr_avglong else na;
prs.SetDefaultColor(Color.green);
prl.SetDefaultColor(Color.magenta);
#

volume average lines, for testing
Code:
# volavg_01
input vol_avgshortlen = 15;
input vol_avglonglen = 50;
def vol_avgshort = average(volume, vol_avgshortlen);
def vol_avglong = average(volume, vol_avglonglen);
plot z1 = vol_avgshort;
plot z2 = vol_avglong;
z1.SetDefaultColor(Color.yellow);
z2.SetDefaultColor(Color.cyan);
#

1dgD4G7.jpg

hal_mvp hal_fold
 
Last edited:
Solution
He has't responded to me yet, and he might not respond at all. Meanwhile I was looking at a different tweet of his, talking about a different indicators of his and I think this image below shows context of what he means by the 50 avg. So my guess is that when he replied earlier to me/us and mentioned the 15 avg and the 50 avg, I think he meant the 15 avg and the 50 avg as of the last bar.

L1kiy3d.jpg
This is great... thanks for putting this all together. My opinion on how to read price/volume action is that you would want the volume to expand by 20-25% during the 15-day period compared to the previous long term trend. In this case, we're comparing the long term trend of 50-day simple moving average. To me, that means we should be comparing against the average 50-day volume from 16 bars ago. Otherwise you're calculating against a rising tide which skews the analysis. It's simple mod to this code by changing line 117 to:
def volupx = if ( vol_avgshort > (vol_avglong[16] * (1 + vip)) ) then 1
I just added the [16] lookback so the longer term average is from 16 bars ago. So anyone can decide how they'd like to analyze this and adjust the code accordingly. Thanks again for doing all the heavy lifting!!!!!!
 
Converted to scan. Should be self explanatory. This is also meant to be pasted as a study to be used in condition wizard after. You will load up the "Study" and then select which set of conditions you want and then select the IS TRUE conditional in the wizard.
Code:
# -----------------
# halcyonguy
# 21-08-25
# -----------------
# Conversion to scan on 3.20.22 by WTF_Dude

# Momentum, Volume and Price (MVP)
 #https://usethinkscript.com/threads/ants-%E2%80%94-momentum-volume-and-price-mvp.7497/
#I saw this very interesting custom indicator on TradingView.
#https://www.tradingview.com/script/uEaFv7tm-Ants-Momentum-Volume-and-Price-MVP/
#The Ants indicator is based on the research of David Ryan, three-time winner of the U.S. Investing Championship. David came up with the idea for the indicator while managing the New USA Growth Fund at William O’Neil + Company. David was interested to understand what drove some stocks higher once they were extended from their most recent base, while others had only moderate moves up.

#What David found during his research was that stocks making the biggest moves often had consistent buying on volume over a period of 12 to 15 trading days. Stocks with these characteristics may be under institutional accumulation, where it may take days to weeks to fill a position.

# — Momentum, Volume And Price ( MVP ) —

# The Ants indicator looks for the following:
#  1... Momentum - The stock is up at least 12 of the past 15 days.
#  2... Volume - The volume has increased over the past 15 days by 20% to 25%.
#  3... Price - The price is up at least 20% over the past 15 days.

# colored squares, above the candles:
#  Gray - Momen requirement met.
#  Blue - Momen and price requirement met.
#  Yellow - Momen and vol requirement met.
#  Green - Momen and vol and price requirement met.

#/////////////////////////////////////

def na = Double.NaN;
def bn = barnumber();

# ======================================

#input OOOOOO_Momentum_OOOOOOO = yes;
# MVP
# 1... Momentum - The stock is up at least 12 of the past 15 days.
#  it tests if current bar close > previous close

input series_max = 15;
input series_min = 12;
def momen_max = series_max;
def momen_min = series_min;
#input momentum_qty = 15;
#input momentum_min = 12;

def chgup = close > close[1];

def squares_price_offset = 0.02;
def vert = squares_price_offset;

#  min series , when there are 'min' quantity of bars or greater, within a 'qty' set of bars.
#   ex. if there are 12 min bars, within 15 qty bars.

#AddLabel(1, "MVP qtys " + momen_min + "/" + momen_max, Color.cyan);

# --------------------------------
# nested fold.
#  test if  x min bars, or more, are true , out of  y qty bars
#  loop1 , start at current bar, loops to future bars.
#  loop2 , on each bar of loop1, it looks back at 'momentum_qty' quantity of bars and counts the times chgup is true.
#    when done, if the count is > momentum_min, then a 1 is passed on to loop1.
#    if momupx > 0, then at least 1 valid series was found, to go across the bar.

#   add this to remove errors on last few bars, when bar is within (min-1) bars to the last bar,
#     while  !isnan( getvalue(close, -loop1) )

def momupx = fold loop1 = 0 to momen_max
with one
while  !isnan( getvalue(close, -loop1) )
do one + if (fold loop2 = 0 to momen_max
         with two
         do two + if GetValue(chgup , (-loop1 + loop2) ) then 1 else 0) >= momen_min then 1 else 0;

# was there at least 1 min series found ?
def momup = if momupx > 0 then 1 else 0;

# line under bars
#def offset1 = 0.999;
def offset1 = 1.0;
def htper = 0.2;
def cldht = round( (htper/100) * close, 1 );
def cldtop = if !momup[1] and momup then (low * offset1) else if momup then cldtop[1] else na;
def cldbot = cldtop - cldht;
# addcloud(cldtop, cldbot, color.cyan, color.cyan);

#input momen_series_horz_line = yes;
#def ddd = if momen_series_horz_line then cldtop else na;
#ddd.setlineweight(2);
#ddd.SetDefaultColor(Color.light_gray);


# ======================================
# ======================================

#input OOOOOO_Volume_OOOOOOO = yes;

# 2... Volume - The volume has increased over the past 15 days by 20% to 25%.
#  the 15 day average daily volume is 20% or greater than the 50 day average.

input volume_increase_percent = 20.0;
def vip = volume_increase_percent/100;

#input vol_qty = 15;
#input vol_min = 12;
#def vol_max = series_max;
#def vol_min = series_min;

input vol_avg_short_len = 15;
input vol_avg_long_len = 50;
def vol_avgshort = average(volume, vol_avg_short_len);
def vol_avglong = average(volume, vol_avg_long_len);


# compare vol15avg to (vol50avg * x%)
def volupx = if ( vol_avgshort > (vol_avglong * (1 + vip)) ) then 1 else 0;
def volup = volupx;

# ======================================

#input OOOOOO_Price_OOOOOOO = yes;

# 3... Price - The price is up at least 20% over the past 15 days.


#input price_increase_percent = 6.0;

# by default the original coder had it at only 6% and used a system of price average change which isn't part of the original conditions. Can revert to line above if needed.
input price_increase_percent = 20.0;
def prp = price_increase_percent/100;


#input pr_max = 15;
#input pr_min = 12;
def pr_max = series_max;
def pr_min = series_min;

#input price_avg_short_len = 15;
#input price_avg_long_len = 50;
#def pr_avgshort = average(close, price_avg_short_len);
#def pr_avglong = average(close, price_avg_long_len);

# original
#def prupx =  if ( pr_avgshort > (pr_avglong * (1 + prp)) ) then 1 else 0;

def prupx =  if ( close > (close[pr_max]* (1 + prp)) ) then 1 else 0;


def prup = prupx;

# //////////////////////////////////////
# //////////////////////////////////////


# 12 out of 15 bars up
plot BarMomentumOnly = (momup and !volup and !prup);

# price up 20 perccent and 12 out of 15 bars up
plot PriceUpBarMomentum = (momup and !volup and prup);

# 20%+ volume increase over 50d average and 12 out of 15 bars up
plot VolumeIncreaseandBarsMomentum = (momup and volup and !prup);

# All conditions met
plot MVPallconditionsmet = (momup and volup and prup);
 
... This indicators gives the signal after 12 or 15 days depends on what you are looking at... if it detects momentum condition for 12 or 15 days then it will gives the signal and back paint all the bars. So it is no value as such. I would recommend that find these stocks that already meets MVP condition and keep a watchlist and when it pulls back and rise again then you can decide to take a position or not.
 
Last edited by a moderator:
@Santhosh ... This indicators gives the signal after 12 or 15 days depends on what you are looking at... if it detects momentum condition for 12 or 15 days then it will gives the signal and back paint all the bars. So it is no value as such. I would recommend that find these stocks that already meets MVP condition and keep a watchlist and when it pulls back and rise again then you can decide to take a position or not.
I just took the time to carefully read each of your sentences. It BACK PAINTS ALL THE BARS, something I had no idea about. This helps to explain why my SCAN (to find stocks when the first GRAY Square appears) yielded no results. Thank you
 

Join useThinkScript to post your question to a community of 21,000+ developers and traders.

Similar threads

Not the exact question you're looking for?

Start a new thread and receive assistance from our community.

87k+ Posts
375 Online
Create Post

Similar threads

Similar threads

The Market Trading Game Changer

Join 2,500+ subscribers inside the useThinkScript VIP Membership Club
  • Exclusive indicators
  • Proven strategies & setups
  • Private Discord community
  • ‘Buy The Dip’ signal alerts
  • Exclusive members-only content
  • Add-ons and resources
  • 1 full year of unlimited support

Frequently Asked Questions

What is useThinkScript?

useThinkScript is the #1 community of stock market investors using indicators and other tools to power their trading strategies. Traders of all skill levels use our forums to learn about scripting and indicators, help each other, and discover new ways to gain an edge in the markets.

How do I get started?

We get it. Our forum can be intimidating, if not overwhelming. With thousands of topics, tens of thousands of posts, our community has created an incredibly deep knowledge base for stock traders. No one can ever exhaust every resource provided on our site.

If you are new, or just looking for guidance, here are some helpful links to get you started.

What are the benefits of VIP Membership?
VIP members get exclusive access to these proven and tested premium indicators: Buy the Dip, Advanced Market Moves 2.0, Take Profit, and Volatility Trading Range. In addition, VIP members get access to over 50 VIP-only custom indicators, add-ons, and strategies, private VIP-only forums, private Discord channel to discuss trades and strategies in real-time, customer support, trade alerts, and much more. Learn all about VIP membership here.
How can I access the premium indicators?
To access the premium indicators, which are plug and play ready, sign up for VIP membership here.
Back
Top