Here is a study that I created. It's all original. I think it helps give some perspective to what the price is doing. If someone wants to translate it into another language, please feel free to do so. If anyone has any suggestions, or wants some modifications, let me know. If anyone wants to modify the study, feel free to do so.
If anyone has observations or suggestions about how to trade this study, feel free to post a follow up.
The basis of this study is very simple, it's the highest high or lowest low of the last 10 bars, BUT
starting from 3 bars back. It's very simple. That is the foundation of the study. Everything else is just accessories. The code comments explain the signals shown on the chart and what they mean, and how they were derived.
A core principle of how I trade is to take profit whenever a good opportunity presents itself. Personally, I find this practice suits me, and works well for me. It often means that I miss out on some profit, but it also means that I'm constantly locking in profit, and often am able to get back in at a fairly good, if not better price.
I think this study has aspects of that perspective. I call it a price channel, because that is how it looks. The study also keeps track of recent PRIOR highs and lows. So it shows not only the current high and low, but the prior high and low. This differentiates it from something like Bollinger bands.
Code:
#Created by tradescripter
#Last Update May 20, 2011
#Green arrows pointing down are price highs.
#Red arrows pointing up are price lows
#Price highs and lows are determined by a few different methods.
#One method is to assume a price high or low if the length of the bar is greater than the average
#bar length, plus one standard deviation. In other words, if there is an unusually big price
#move on one bar, a price high or low is assumed.
#A price high and a price low may not be a trend peak or bottom.
#Many of the price high and low signals are one bar early. Take that into account.
#As soon as you get an signal, you must decide whether it's trend peak/bottom or not
#If you think it's not the end of a trend place an exit order to take profit just over the current high
#or under the current low. If you don't get a fill almost immediately on the next bar, you must
#adjust your exit to a smaller profit within seconds, or use a market order to take profit.
#If the price high or low is a trend peak or bottom, the price probably won't go higher for a peak
#or lower for the bottom. So you must decide on a strategy for taking profits.
#Whether you take profit immediately on a signal, or wait for the next bar, either way you will loose out on some
#profit. You must decide when it's better to take profit, at the signal, or just after the signal.
#There is often a price high when the price first hits a prior high after being under the high
#for a while. That potential price high is shown by a magenta arrow down over the high of the bar.
#A potential price low, bowncing off support of a prior low, is a blue arrow.
#Stop losses are shown by squares. The stop losses turn out to also be points of price highs
#and lows. A long stop loss is show by a red square. The long stop loss is often a price low however.
#You must use your discretion on how to trade it.
#A price high signal, and a stop loss signal often occur on the same bar. That may be a double
#confirmation that the price is at a high. You must use your discretion.
#Prior highs and low are also shown The prior highs and lows are the "Stepped" horizontal lines.
#So you can keep track of recent prior highs and lows.
#I have not back-tested this study. I have no idea if it is any good or not.
input length=10;
def o=open;
def c=close;
def h=high;
def l=low;
def hh=h>h[1];
def ll=l<l[1];
def ClsUp=c>o;
def ClsDwn=c<o;
def BarLngth=h-l;
def AvgBarLngth=average(BarLngth,20);
def Threshhold=AvgBarLngth+StDev(BarLngth,20);
def ClsHigher=c>c[1];
def ClsLower=c<c[1];
def HiestHi=highest(close[3],length);
def LwestLw=lowest(close[3],length);
rec LastHi=if HiestHi>HiestHi[1] then HiestHi[1] else LastHi[1];
rec LastLw=if LwestLw<LwestLw[1] then LwestLw[1] else LastLw[1];
def ClsOvrHi=close>HiestHi;
def ClsUndrLw=close<LwestLw;
def ClsUndrLastHi=close<LastHi;
def ClsOvrLastLw=close>LastLw;
def Hi1 = !ClsOvrHi[2] and ClsOvrHi[1] and ClsOvrHi and ClsHigher;
def Hi2 = BarLngth>Threshhold and ClsUp;
def Lw1 = !ClsUndrLw[2] and ClsUndrLw[1] and ClsUndrLw and ClsLower;
def Lw2 = BarLngth>Threshhold and ClsDwn;
def HiSig=Hi1 or Hi2;
def LwSig=Lw1 or Lw2;
def LwOvrSupport=l>LwestLw;
def HiUndrSupport=h<HiestHi;
plot PriceHigh = if HiSig then high else double.nan;
PriceHigh.SetPaintingStrategy(PaintingStrategy.boolean_arrow_down);
PriceHigh.SetDefaultColor(color.uptick);
plot PriceLow = if LwSig then low else double.nan;
PriceLow.SetPaintingStrategy(PaintingStrategy.boolean_arrow_up);
PriceLow.SetDefaultColor(color.red);
def BreaksSpprt=LwOvrSupport[3] and LwOvrSupport[2] and LwOvrSupport[1] and l<=LwestLw;
def BreaksRzist=HiUndrSupport[3] and HiUndrSupport[2] and HiUndrSupport[1] and h>HiestHi;
plot FirstSupportBreak=if BreaksSpprt then l else double.nan;
FirstSupportBreak.SetPaintingStrategy(PaintingStrategy.boolean_arrow_up);
FirstSupportBreak.SetDefaultColor(color.blue);
plot FirstResistanceBreak=if BreaksRzist then h else double.nan;
FirstResistanceBreak.SetPaintingStrategy(PaintingStrategy.boolean_arrow_down);
FirstResistanceBreak.SetDefaultColor(color.magenta);
plot HighestHigh=HiestHi;
HighestHigh.SetLineWeight(2);
HighestHigh.SetDefaultColor(color.light_red);
plot LowestLow=LwestLw;
LowestLow.SetLineWeight(2);
LowestLow.SetDefaultColor(color.light_green);
plot LastHigh=LastHi;
LastHigh.SetPaintingStrategy(PaintingStrategy.Horizontal);
plot LastLow=LastLw;
LastLow.SetPaintingStrategy(PaintingStrategy.Horizontal);
plot LongStopLossHit=if !ClsUndrLastHi[1] and ClsUndrLastHi then l else double.nan;
LongStopLossHit.SetPaintingStrategy(PaintingStrategy.LINE_VS_SQUARES);
LongStopLossHit.SetDefaultColor(color.red);
plot ShortStopLossHit=if !ClsOvrLastLw[1] and ClsOvrLastLw then h else double.nan;;
ShortStopLossHit.SetPaintingStrategy(PaintingStrategy.LINE_VS_SQUARES);
ShortStopLossHit.SetDefaultColor(color.green);