Repaints Chewie's Super Trend, Hull Average, Donchian Trend Ribbon Trading System for ThinkorSwim

Repaints

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

LOVE this indicator. Anyway to make it so that the current trends levels show on the right extension? Meaning all the previous trend bars throughout the day are gone?
 
LOVE this indicator. Anyway to make it so that the current trends levels show on the right extension? Meaning all the previous trend bars throughout the day are gone?
New trend levels are created when there is a new Hull reversal point created. Glad to hear you love it.
 
Hey Chewie. Love your work. Could you please make a scanner and watchlist column for your indicator? Thank you!
There is a lot in it and the scanner says it’s too complex to scan. I would try to scan from one of the individual indicators.
 
...the scanner says it’s too complex to scan...
@chewie76 @AnimalMother The following step-by-step outlines how to successfully create a scan when TOS says "it's too complex to scan"...
  1. Open the Hull SuperTrend System code in your preferred text editor
  2. Change all "plots" to "def" (except if part of a Script or an Input)
  3. Delete all corresponding plot formatting code
  4. Add desired Scan Query using plot statement
Below is a sample excerpt of the conversion:

#200 DAY MOVING AVERAGE​
def price1 = close;​
def displace = 0;​
input lengthAvgEXP = 200;​
Delete the plot and replace with def
plot def AvgExp = ExpAverage(price1[-displace], lengthAvgExp);​
Delete all plot formatting code
AvgExp.SetDefaultColor(Color.white);
AvgExp.setlineweight(2);
Add desired Scan Query
plot bullscan = close > open and close > AvgExp and AvgExp > AvgExp[1];​
#plot bearscan = close < open and close < AvgExp and AvgExp < AvgExp[1];​


Complete conversion of Chewie's SuperTrend/Hull Average/Donchian Trend Ribbon Trading System:

Rich (BB code):
# filename: Hull_SuperTrend_System_SCAN

#Hull_SuperTrend_Trading_System
# assembled by Chewie 4/10/2022
# many thanks to all the other noted contributors to this system.

# SuperTrend Yahoo Finance Replica - Modified from Modius SuperTrend
# Modified Modius ver. by RConner7
# Modified by Barbaros to replicate look from TradingView version
# Modified by Barbaros to add EMA cross for bubbles and alerts
# Modified by Barbaros to update bar color painting
# v3.3

#input Target_Bubbles = yes;
#input Entry_SL_Bubbles = yes;
#input labels = yes;
#input alertON = no;
input Bands = no;
input EMA1 = 10;
input EMA2 = 20;
input AvgType = AverageType.HULL;
input STAtrMult = 2.75;
input nATR = 12;

def ATR = ATR("length" = nATR, "average type" = AvgType);
def UP_Band_Basic = HL2 + (STAtrMult * ATR);
def LW_Band_Basic = HL2 + (-STAtrMult * ATR);
def UP_Band = if ((UP_Band_Basic < UP_Band[1]) or (close[1] > UP_Band[1])) then UP_Band_Basic else UP_Band[1];
def LW_Band = if ((LW_Band_Basic > LW_Band[1]) or (close[1] < LW_Band[1])) then LW_Band_Basic else LW_Band[1];

def ST = if ((ST[1] == UP_Band[1]) and (close < UP_Band)) then UP_Band
else if ((ST[1] == UP_Band[1]) and (close > UP_Band)) then LW_Band
else if ((ST[1] == LW_Band[1]) and (close > LW_Band)) then LW_Band
else if ((ST[1] == LW_Band) and (close < LW_Band)) then UP_Band
else LW_Band;

def EMA1Val = MovAvgExponential(close, EMA1);
def EMA2Val = MovAvgExponential(close, EMA2);
def EMADirection = if EMA1Val > EMA2Val then 1 else if EMA1Val < EMA2Val then -1 else 0;

def Long = if close > ST then ST else Double.NaN;
def Short = if close < ST then ST else Double.NaN;

def LongTrigger = IsNaN(Long[1]) and !IsNaN(Long);
def ShortTrigger = IsNaN(Short[1]) and !IsNaN(Short);

def LongDot = if LongTrigger then ST else Double.NaN;
def ShortDot = if ShortTrigger then ST else Double.NaN;

#
# Hull Moving Average Concavity and Turning Points
#
# Author: Seth Urion (Mahsume)
# Version: 2020-05-01 V4
#
# Now with support for ToS Mobile - disabled
#

declare upper;

input HMA_Length = 60;
input lookback = 3;
input arrows = no;

def price = HL2;
def HMA = HullMovingAvg(price = price, length = HMA_Length);
def delta = HMA[1] - HMA[lookback + 1];
def delta_per_bar = delta / lookback;
def next_bar = HMA[1] + delta_per_bar;
def concavity = if HMA > next_bar then 1 else -1;

def turning_point = if concavity[1] != concavity then HMA else Double.NaN;

def MA_Max = if HMA[-1] < HMA and HMA > HMA[1] then HMA else Double.NaN;
def MA_Min = if HMA[-1] > HMA and HMA < HMA[1] then HMA else Double.NaN;

#def BuySetup = HMA > HMA[1] and HMA[1] < HMA[2];
#def SellSetup =  HMA < HMA[1] and HMA[1] > HMA[2];

#plot sell = if arrows and turning_point and concavity == -1 then high else Double.NaN;
#sell.SetDefaultColor(Color.DARK_ORANGE);
#sell.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
#sell.SetLineWeight(3);
#sell.hide();

#plot buy = if arrows and turning_point and concavity == 1 then low else Double.NaN;
#buy.SetDefaultColor(Color.CYAN);
#buy.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
#buy.SetLineWeight(3);
#buy.hide();

def divergence = HMA - next_bar;


###################
#
# 2020-05-01
#
# MOBILE TOS SUPPORT
#
# Each color of the HMA needs to be a separate plot as ToS Mobile
# lacks the ability to assign colors the way ToS Desktop does.
# I recommend a plain colored HMA behind the line
# Set the line color of the HMA above to gray or some neutral
#
# CCD_D -> ConCave Down and Decreasing
# CCD_I -> ConCave Down and Increasing
# CCU_D -> ConCave Up and Decreasing
# CCU_I -> ConCave Up and Increasing
#
###################
#plot CCD_D = if concavity == -1 and HMA < HMA[1] then HMA else Double.NaN;
#CCD_D.SetDefaultColor(Color.RED);
#CCD_D.SetLineWeight(1);
#CCD_D.hide();

#plot CCD_I = if concavity == -1 and HMA >= HMA[1] then HMA else Double.NaN;
#CCD_I.SetDefaultColor(Color.DARK_ORANGE);
#CCD_I.SetLineWeight(1);
#CCD_I.hide();

#plot CCU_D = if concavity == 1 and HMA <= HMA[1] then HMA else Double.NaN;
#CCU_D.SetDefaultColor(Color.DARK_GREEN);
#CCU_D.SetLineWeight(1);
#CCU_D.hide();

#plot CCU_I = if concavity == 1 and HMA > HMA[1] then HMA else Double.NaN;
#CCU_I.SetDefaultColor(Color.GREEN);
#CCU_I.SetLineWeight(1);
#CCU_I.hide();

#Hull Label

#AddLabel(yes and labels and CCD_D, "HULL:SELL", color.RED);
#AddLabel(yes and labels and CCU_I, "HULL:BUY", color.green);
#AddLabel(yes and labels and CCU_D, "HULL:WEAK SELL", color.dark_green);
#AddLabel(yes and labels and CCD_I, "HULL:WEAK BUY", color.DARK_ORANGE);

#Target lines
# created by chewie

rec line = if IsNaN(MA_Min) then line[1] else MA_Min[0];
def L_stoploss = if IsNaN(MA_Min) then line else Double.NaN;
def LSL = (if IsNaN(L_stoploss[1]) then L_stoploss else Double.NaN);

rec line2 = if IsNaN(MA_Max) then line2[1] else MA_Max[0];
def S_stoploss = if IsNaN(MA_Max) then line2 else Double.NaN;
def SSL = (if IsNaN(S_stoploss[1]) then S_stoploss else Double.NaN);

#Short Entry
rec line3 = if IsNaN(Long) then line3[1] else Long[0];
def S_Entry = if IsNaN(Long) then line3 else Double.NaN;
def SE = (if IsNaN(S_Entry[1]) then S_Entry else Double.NaN);

#Long Entry
rec line4 = if IsNaN(Short) then line4[1] else Short[0];
def L_Entry = if IsNaN(Short) then line4 else Double.NaN;
def LE = (if IsNaN(L_Entry[1]) then L_Entry else Double.NaN);


#HalfX Long
def x1a_Long =  (L_Entry + (L_Entry - L_stoploss) / 2) ;

#OneX Long
def x1_Long = if x1a_Long > line4 then (L_Entry + (L_Entry - L_stoploss)) else Double.NaN;

#TwoX Long
def x2_Long = x1_Long + (L_Entry - L_stoploss) ;
def X2L = (if IsNaN(x2_Long[1]) then x2_Long else Double.NaN);

#ThreeX Long
def x3_Long = x2_Long + (L_Entry - L_stoploss) ;
def X3L = (if IsNaN(x3_Long[1]) then x3_Long else Double.NaN);

#FourX Long
def x4_Long = x3_Long + (L_Entry - L_stoploss) ;
def X4L = (if IsNaN(x4_Long[1]) then x4_Long else Double.NaN);


#HalfX Short
def x1a_Short = (S_Entry - (S_stoploss - S_Entry) / 2);

#OneX Short
def x1_Short = if x1a_Short < line3 then (S_Entry - (S_stoploss - S_Entry)) else Double.NaN;

#TwoX Short
def x2_Short = x1_Short - (S_stoploss - S_Entry);
def X2S = (if IsNaN(x2_Short[1]) then x2_Short else Double.NaN);

#ThreeX Short
def x3_Short = x2_Short - (S_stoploss - S_Entry);
def X3S = (if IsNaN(x3_Short[1]) then x3_Short else Double.NaN);

#FourX Short
def x4_Short = x3_Short - (S_stoploss - S_Entry);
def X4S = (if IsNaN(x4_Short[1]) then x4_Short else Double.NaN);

#LinearRegCh100 RegressionDivergence - Trigger Lines - Trend Cross
# From Lizard Indicators Link: https://www.lizardindicators.com/trigger-lines-cross-vs-thrust/
# Line #1 - Fast = LinReg (80)
# Line #2 - Slow = EXPEMA[LinReg (80)]

input LinRegLength = 80;
input EMAlength = 20;
input ColorOn = yes;

#Definitions
def price1 = close;
def displace = 0;
def LinReg = Inertia(price1[-displace], LinRegLength);
def EMA_LR = ExpAverage(LinReg[-displace], EMAlength);
def Body = (open + close) / 2;

# Defining Long/Short Filters (these instructions determine entries / exits)
# Entry Requirements
def Long_Entry = close > LinReg and close > EMA_LR and Body > LinReg and Body > EMA_LR and close > high[1] and Body > Body[1];
# LinReg > LinReg[1] and
def Long_Stay_In = close > LinReg and close > EMA_LR;
def Long_Exit = (close < LinReg or close < EMA_LR) or Long_Stay_In == 0;
def Long_State = if Long_Entry then 1 else if Long_Exit then 0 else Long_State[1];
def Long1 = Long_State;

# Exit Requirements
def Short_Entry = close < LinReg and close < EMA_LR and Body < LinReg and Body < EMA_LR and close < low[1] and Body < Body[1];
# LinReg < LinReg[1] and
def Short_Stay_In = close < LinReg and close < EMA_LR;
def Short_Exit = (close > LinReg or close > EMA_LR) or Short_Stay_In == 0;
def Short_State = if Short_Entry then 1 else if Short_Exit then 0 else Short_State[1];
def Short1 = Short_State;

#Adding Linear Regression averages
def LR = LinReg;
def EMA_LinReg = EMA_LR;

#Regression Bands

input deviations = 1.618;  #set your deviation units here.
input length = 500; #set your channel lookback period here.

def stdDeviation = StDevAll(price, length);
def HighBand = if Bands then EMA_LinReg + deviations * stdDeviation else Double.NaN;
def LowBand = if Bands then EMA_LinReg - deviations * stdDeviation else Double.NaN;

#200 DAY MOVING AVERAGE

def price1 = close;
def displace = 0;
input lengthAvgEXP = 200;

def AvgExp = ExpAverage(price[-displace], lengthAvgEXP);
AvgExp.SetDefaultColor(Color.white);
AvgExp.setlineweight(2);

plot bullscan = close > open and close > AvgExp and AvgExp > AvgExp[1];
#plot bearscan = close < open and close < AvgExp and AvgExp < AvgExp[1];


Rich (BB code):
# filename: Donchian_Trend_Ribbon_SCAN

# donchian_trend_ribbon_0e

# convert - donchian trend ribbon
# halcyonguy
# 22-04-07

# 00e
# can chg secondary colors ( 1 , -1) to yellow or diff shades

# 00d
# add histogram , sum of color numbers

# https://usethinkscript.com/threads/convert-tradingview-donchian-trend-ribbon.10822/
# Convert Tradingview Donchian Trend Ribbon
# chewie76  4/4
# Can someone convert the Donchian Trend Ribbon into TOS?
# --------------------------------
# https://www.tradingview.com/script/PxLqmP8o-Donchian-Trend-Ribbon/
#I think you all know Donchian Channels . so I am not going to write about it.
#https://www.tradingview.com/scripts/donchianchannels/
#With this indicator I tried to create Donchian Trend Ribbon by using Donchian Channels .

# How it works ?
# - it calculates main trend direction by using the length that is user-defined. so you can change it as you wish
# - then it calculates trend direction for each 9 lower lengths. if you set the length = 20 then the lengths are 19, 18,...11
# - and it checks if the trend directions that came from lower lengths is same or not with main trend direction.
# - it changes the trend color of the ribbon.
# -----------------------------

#declare lower;

input Donchian_Channel_Period = 20;
def dlen = if Donchian_Channel_Period < 10 then 10 else Donchian_Channel_Period;
input show_data_rows = yes;
input show_sum_histo = yes;
def na = double.nan;

input secondary_colors = { default yellow , green_red };
input show_full_height_of_histogram = yes;
def z = if show_full_height_of_histogram and !isnan(close) then 0 else na;

script dchannel {
  input len = 0;
  def hh = highest(high, len);
  def ll = lowest(low, len);
  def trend = if barnumber() == 1 then 0 else if close > hh[1] then 1 else if close < ll[1] then -1 else trend[1];
  plot z = trend;
}

script dchannelalt {
  input len = 0;
  input maintrend = 0;
  def hh = highest(high, len);
  def ll = lowest(low, len);
  def trend = if barnumber() == 1 then 0 else if close > hh[1] then 1 else if close < ll[1] then -1 else trend[1];
 
 def maincolor =
  if maintrend == 1 then if trend == 1 then 2 else 1
  else if maintrend == -1 then if trend == -1 then -2 else -1
  else 0;

  plot color = maincolor;
#  plot tr = trend;
}

def maintrend = dchannel(dlen);

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

# input secondary_colors = { default yellow , green_red };
def seccolor;
switch (secondary_colors) {
case yellow:
  seccolor = 1;
case green_red:
  seccolor = 2;
}

#   colors 
# 2 - up trend - green
# 1 - up trend - dark green
# 0 no trend
# -1 - down trend - dark red
# -2 - down trend - red

DefineGlobalColor("up2", color.green);
DefineGlobalColor("up1", color.dark_green);
DefineGlobalColor("none", color.dark_gray);
DefineGlobalColor("dwn1", color.dark_red);
DefineGlobalColor("dwn2", color.red);
# GlobalColor("up1")
DefineGlobalColor("alt1", color.yellow);
# GlobalColor("alt1")
#----------------------------------------

input bottom_row = 0;
def rowstart = if bottom_row <> 0 then bottom_row
  else if ( show_data_rows and show_sum_histo ) then 25
  else 0;

input rowskip = 5;
input square_size = 4;

#plot( 5, color = dchannelalt(dlen - 0, maintrend), style = plot.style_columns, histbase= 0)
def c01 = dchannelalt(dlen - 0, maintrend);
def row01 = if isnan(close) then double.nan else (rowstart + ( 1 * rowskip));

def c02 = dchannelalt(dlen - 1, maintrend);
def row02 = if isnan(close) then double.nan else (rowstart + ( 2 * rowskip));

def c03 = dchannelalt(dlen - 2, maintrend);
def row03 = if isnan(close) then double.nan else (rowstart + ( 3 * rowskip));

def c04 = dchannelalt(dlen - 3, maintrend);
def row04 = if isnan(close) then double.nan else (rowstart + ( 4 * rowskip));

def c05 = dchannelalt(dlen - 4, maintrend);
def row05 = if isnan(close) then double.nan else (rowstart + ( 5 * rowskip));

def c06 = dchannelalt(dlen - 5, maintrend);
def row06 = if isnan(close) then double.nan else (rowstart + ( 6 * rowskip));

def c07 = dchannelalt(dlen - 6, maintrend);
def row07 = if isnan(close) then double.nan else (rowstart + ( 7 * rowskip));

def c08 = dchannelalt(dlen - 7, maintrend);
def row08 = if isnan(close) then double.nan else (rowstart + ( 8 * rowskip));

def c09 = dchannelalt(dlen - 8, maintrend);
def row09 = if isnan(close) then double.nan else (rowstart + ( 9 * rowskip));

def c10 = dchannelalt(dlen - 9, maintrend);
def row10 = if isnan(close) then double.nan else (rowstart + ( 10 * rowskip));

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

# add up color numbers, to come up with a 'trend' number , 20 to -20
def colorsum = ( c01 + c02 + c03 + c04 + c05 + c06 + c07 + c08 + c09 + c10 );

# plot a histogram of colorsum.
# it uses absvalue( ), so it is positive numbers, 0 to 20
#input vert1 = 0;  + vert1
def zc = if show_sum_histo then (absvalue(colorsum)) else na;

plot bullscan = colorsum >= 19;
#plot bearscan = colorsum <= -19;


Hope this helps...

Good Luck and Good Trading :cool:
 
Last edited:
I'm watching micro futures with this. I notice a lot of the buy/sell trigger candles close way above or below entry line. Some pull back to magenta line many don't, they keep moving.
Do most of you still wait until the candle closes and just use higher/lower target lines and not chance just the break?
Also, what if any results does anyone have using this as a strategy?
 
@chewie76 I have never been able to get the sound alerts to work on this.

Not sure if anyone else has my same problem with the sound alerts. I added this to the bottom of the script. The longdot and shortdot seem to be the entries.

# Alert
Alert(long, "long", Alert.Bar, Sound.Chimes);
Alert(short, "short", Alert.Bar, Sound.Chimes);
# Alert
Alert(longdot, "longdot", Alert.Bar, Sound.Chimes);
Alert(shortdot, "shortdot", Alert.Bar, Sound.Chimes);
# Alert
Alert(ma_max, "mamax", Alert.Bar, Sound.Chimes);
Alert(ma_min, "mamin", Alert.Bar, Sound.Chimes);
# Alert
Alert(sell, "sell", Alert.Bar, Sound.Chimes);
Alert(buy, "buy", Alert.Bar, Sound.Chimes);
# Alert
Alert(S_entry, "Se", Alert.Bar, Sound.Chimes);
Alert(l_entry, "le", Alert.Bar, Sound.Chimes);
# Alert
Alert(long_entry, "longentry", Alert.Bar, Sound.Chimes);
Alert(short_entry, "Shortentry", Alert.Bar, Sound.Chimes);
 
Last edited:
I'm watching micro futures with this. I notice a lot of the buy/sell trigger candles close way above or below entry line. Some pull back to magenta line many don't, they keep moving.
Do most of you still wait until the candle closes and just use higher/lower target lines and not chance just the break?
Also, what if any results does anyone have using this as a strategy?
I've noticed sometimes the breakout candle close is far from the entry level. I've done both, place my entry and let price break it (which is taking a bigger risk), and I've also waited for price to come back to the entry line. Sometimes it retraces back, sometimes it does not. So, it depends on your tolerance for risk.
 
@chewie76 I have never been able to get the sound alerts to work on this.

Not sure if anyone else has my same problem with the sound alerts. I added this to the bottom of the script. The longdot and shortdot seem to be the entries.

# Alert
Alert(long, "long", Alert.Bar, Sound.Chimes);
Alert(short, "short", Alert.Bar, Sound.Chimes);
# Alert
Alert(longdot, "longdot", Alert.Bar, Sound.Chimes);
Alert(shortdot, "shortdot", Alert.Bar, Sound.Chimes);
# Alert
Alert(ma_max, "mamax", Alert.Bar, Sound.Chimes);
Alert(ma_min, "mamin", Alert.Bar, Sound.Chimes);
# Alert
Alert(sell, "sell", Alert.Bar, Sound.Chimes);
Alert(buy, "buy", Alert.Bar, Sound.Chimes);
# Alert
Alert(S_entry, "Se", Alert.Bar, Sound.Chimes);
Alert(l_entry, "le", Alert.Bar, Sound.Chimes);
# Alert
Alert(long_entry, "longentry", Alert.Bar, Sound.Chimes);
Alert(short_entry, "Shortentry", Alert.Bar, Sound.Chimes);
That is strange. I hear the alerts fine.
 
@chewie76 I have set up 4 different micro futures to test the strategy. I looked through code but I'm no coder as I was trying to figure out how to adjust take profit and stop loss to better mimic study targets. Any quick tips?

Second, is there a way to stop it from any after hours trading and close all trades at end of day so no margin is triggered?

Lastly, you mentioned the Hull Avg or the Donchian Ribbon is not in the strategy. Of course the donchain ribbon is a big part of the strategy, is there something any of us can do to help or is that is just not practical and/or possible?

Thank you for your time and efforts, this looks amazing and I want to give it all I can.
 
@chewie76 I have set up 4 different micro futures to test the strategy. I looked through code but I'm no coder as I was trying to figure out how to adjust take profit and stop loss to better mimic study targets. Any quick tips?

Second, is there a way to stop it from any after hours trading and close all trades at end of day so no margin is triggered?

Lastly, you mentioned the Hull Avg or the Donchian Ribbon is not in the strategy. Of course the donchain ribbon is a big part of the strategy, is there something any of us can do to help or is that is just not practical and/or possible?

Thank you for your time and efforts, this looks amazing and I want to give it all I can.
The strategy is set to take profit if it retraces from certain targets. I'm sure there is room for improvement on the strategy code. Even though it is supposed to close trades if it crosses the Hull or the stop loss, I've noticed that sometimes it doesn't. I'm not sure why. I'm not sure how to get the Hull avg and Donchian added into the strategy. It seems pretty complex to get it to work. I'm not sure if it is possible. If your chart is set to not include after hours, that should work. I'm interested in hearing your results. Thanks.
 
If I get a signal, I enter the trade regardless of time. Notice it hit 4x target and the regression line.

Thank you! Did you have any successful trades today? Wish I wasn't tied up with work today.. your system made it way too easy on NVDA today.
 
Last edited:
@chewie76 Thanks for sharing the information. I tried to setup the chart based on the notes you provide. My chart does not looks like the screen shots you have posted. Did I miss any settings. I tried to expand the chart too but no luck.....

Here is the link of attachments.
 

Not the exact question you're looking for?

Start a new thread and receive assistance from our community.

87k+ Posts
398 Online
Create Post

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