Stack two arrows instead of overlaying them?

RickK

Active member
Anyone, is there a way to keep the signal arrows from laying over the top of one another? I seem to remember a script from a long time ago that had one down arrow just above the candle (lets say red) and another down arrow (white) just above the red candle.
 
Solution
@RickKennedy

Thinkscript has two types of arrow painting strategies—Boolean arrows and regular arrows. The Boolean arrows can only be set at the high / low of the candle. The regular arrows can be plotted wherever one wants them. You can learn more about the different types of painting strategies here: https://tlc.thinkorswim.com/center/reference/thinkScript/Constants/PaintingStrategy

With that in mind, here is an example code that will offset the cyan arrow only when both cond1 and cond2 are true at the same time.

ZG1Fat5.png


Code:
# +------------------------------------------------------------+
# |       Example code to dynamically offset arrow plots       |
# |                        Robert...

BenTen

Administrative
Staff member
Staff
VIP
Don't know if that is possible, but there are alternatives. You can change the background of the candle color or display the arrows as a lower study.
 

horserider

Well-known member
VIP
Just winging it as I cannot locate study where I had this.
So try playing with it and see if can get it to work.

Def offset = x;
plot x = xyz - offset;
plot y = xyz2 - 2 * offset;

or maybe

def offset = x;
plot x = xyz [offset]
 

codydog

Active member
@RickKennedy - try this, you can fuss with it to do what you want exactly

input z = 2.51;
input offset = 5;
plot hiz = if zscore > z then high + offset * ticksize() else double.nan;
plot lowz = if zscore < -z then low - offset * ticksize() else double.nan;
hiz.assignvaluecolor(color.red);
lowz.assignvaluecolor(color.blue);
hiz.SetPaintingStrategy(PaintingStrategy.POINTS);
lowz.SetPaintingStrategy(PaintingStrategy.POINTS);
hiz.setlineweight(4);
lowz.setlineweight(4);
hiz.hidebubble();
lowz.hidebubble();
 

OBW

Member
@RickKennedy

Thinkscript has two types of arrow painting strategies—Boolean arrows and regular arrows. The Boolean arrows can only be set at the high / low of the candle. The regular arrows can be plotted wherever one wants them. You can learn more about the different types of painting strategies here: https://tlc.thinkorswim.com/center/reference/thinkScript/Constants/PaintingStrategy

With that in mind, here is an example code that will offset the cyan arrow only when both cond1 and cond2 are true at the same time.

ZG1Fat5.png


Code:
# +------------------------------------------------------------+
# |       Example code to dynamically offset arrow plots       |
# |                        Robert Payne                        |
# |               https://funwiththinkscript.com               |
# +------------------------------------------------------------+
def cond1 = high == Highest(high, 13) and high == GetValue(Highest(high, 13), -12);
def cond2 = high == Highest(high, 5) and high == GetValue(Highest(high, 5), -4);

def avgRng = Average(high - low, 21) / 3;
def offset = if cond1 and cond2 then avgRng * 2 else 0;

plot arrow1 = if cond1 then high else Double.NaN;
arrow1.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
arrow1.SetDefaultColor(Color.LIME);
arrow1.SetLineWeight(5);
plot arrow2 = if cond2 then high + offset else Double.NaN;
arrow2.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
arrow2.SetDefaultColor(Color.CYAN);
arrow2.SetLineWeight(5);
 
Solution

zeek

Active member
2019 Donor
I currently have two studies that both plots down/up arrows and was wondering if it`s possible to use an offset on one of the studies so that the arrows doesn't overlay each other. The arrow plots for each study can be seen below,

study1
Code:
plot pUP = major == 1;
pUP.SetPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP);
pUP.SetDefaultColor(Color.GREEN);
pUP.SetLineWeight(2);

plot pDown = major == -1;
pDown.SetPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN);
pDown.SetDefaultColor(Color.RED);
pDown.SetLineWeight(2);

study 2
Code:
# Arrows below based on the following
#AddChartBubble(ConditionUp4 && ConditionUp5, Volume, concat("Buy @ $", Close), Color.Green, Yes);
#AddChartBubble(ConditionUp1 && ConditionUp2 && ConditionUp3, Volume, concat("Buy @ $", Close), Color.Green, Yes);
#AddChartBubble(ConditionDown1 && ConditionDown4 && ConditionDown5, Volume, concat("Sell @ $", Close), Color.Red, Yes);
#AddChartBubble(ConditionDown1 && ConditionDown2 && ConditionDown3,  Volume, concat("Sell @ $", Close), Color.Red, Yes);

# buy and sell signals

def Buy45 = ConditionUp4 && ConditionUp5;
plot bullish45 = Buy45;
bullish45.SetPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP);
bullish45.SetDefaultColor(Color.CYAN);
bullish45.SetLineWeight(3);

def Buy123 = ConditionUp1 && ConditionUp2 && ConditionUp3;
plot bullish123 = Buy123;
bullish123.SetPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP);
bullish123.SetDefaultColor(Color.CYAN);
bullish123.SetLineWeight(3);

def Bearish145i = ConditionDown1 && ConditionDown4 && ConditionDown5;
plot bearish145 = Bearish145i;
bearish145.SetPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN);
bearish145.SetDefaultColor(Color.CYAN);
bearish145.SetLineWeight(3);

def Bearish123i = ConditionDown1 && ConditionDown2 && ConditionDown3;
plot bearish123 = Bearish123i;
bearish123.SetPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN);
bearish123.SetDefaultColor(Color.CYAN);
bearish123.SetLineWeight(3);
 

RickK

Active member
@zeek the arrow offset code in post#8 should work for you.

Yes @zeek , the thing that helped me the most was knowing that I couldn't do anything with boolean arrow up/down. It had to be the numeric one. Also, when I finally used it, I had to set the arrow offset as an input that could be modified for every chart because the distance from the candle on a /CL chart was different than a /GC or a /RTY chart. Below is an example how I've used it:

Code:
#...this script seems to provide better fractal signals than the other script
# added alarms for buy/sell fractal signals - RickK 2021/09/08

### define inputs
input price = close;
input audioalarm = yes;
input arrow_offset = .06;  #might need to be modified for every instrument's charts

### define a Buy Fractal setup
def buy_fractal_setup_is_true = high[2] < high[1];
def buy_fractal_peak_is_true = high > high[1] && high > high[-1];
def buy_fractal_confirm_is_true = high[-1] > high[-2];

### define a Sell Fractal setup
def sell_fractal_setup_is_true = low[2] > low[1];
def sell_fractal_peak_is_true = low < low[1] && low < low[-1];
def sell_fractal_confirm_is_true = low[-1] < low[-2];

### plot details (for some reason the original coder set "buy" with a down arrow
#   above the candle and the "sell" is a Up arrow below the candle.  I just left
# that way)
plot buy_fractal = if buy_fractal_setup_is_true and buy_fractal_peak_is_true and buy_fractal_confirm_is_true then price + arrow_offset else double.NaN;
buy_fractal.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
buy_fractal.SetDefaultColor(Color.magenta);

plot sell_fractal = if sell_fractal_setup_is_true and sell_fractal_peak_is_true and sell_fractal_confirm_is_true then close - arrow_offset  else double.NaN;
sell_fractal.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
sell_fractal.SetDefaultColor(Color.cyan);

### alarms

alert (audioalarm and buy_fractal, "!..BUY..!", alert.bar, sound.DING);

alert (audioalarm and sell_fractal, "!..SELL..!", alert.bar, sound.ding);
#end
 

Similar threads

Top