# Chapter 8. Formatting Output: Part I

You might have noticed how good all the built-in studies look when applied to chart. But so far we only learned how to display plots as plain lines, except for chapter 6 where we gave you a hint on how to display a plot as Boolean points:

`plot Crossover = Average(close, 5) crosses Average (close, 20);Crossover.SetPaintingStrategy(PaintingStrategy.BOOLEAN_POINTS);`

This notation perfectly shows the common syntax for some of the Look and Feel functions. These functions will surely add the finished look to your plots. But first things first, let us study the syntax using the `SetPaintingStrategy` function from the script above as an example. Calling this function will command thinkScript® to change representation of the values from line to points or arrows or histogram or many other shapes. In the script above, we declared the “Crossover” plot – so, to change the way it is displayed, its name is going to be the first thing we type. After that, we put a dot and call the function by typing SetPaintingStrategy. And finally, we specify arguments for this function in parentheses; luckily, there is only one argument which happens to be a PaintingStrategy constant – and don’t forget the semicolon after the closing parenthesis. In the example above, we chose the Boolean points (with `PaintingStrategy.BOOLEAN_POINTS`) constant – it will put a dot at the Close price of those bars at which the crossover condition is true (i.e., where the 5 period SMA crosses the 20 period SMA).

There are several other ways of representing Boolean values. Consider using BOOLEAN_ARROW_DOWN and BOOLEAN_ARROW_UP painting strategies. These can be especially useful in a script like this one:

`plot isAbove = Average(close, 5) crosses above Average (close, 20);plot isBelow = Average(close, 5) crosses below Average (close, 20);isAbove.SetPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP);isBelow.SetPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN);`

Now you will see an up arrow below those bars at which the shorter moving average crosses above the longer one and down arrow above those bars when it crosses below.

There are also numerous ways to display the numerical plots. First of all, the line can be complemented with points, squares, or triangles which would definitely focus your attention on the values the line has at each bar (for this purpose, use LINE_VS_POINTS, LINE_VS_SQUARES, or LINE_VS_TRIANGLES). You can even discard the line and use only these basic shapes: POINTS, SQUARES, or TRIANGLES constants should be used then. Some values need to be represented as a histogram, use the HISTOGRAM constants for those. There are several other interesting painting strategies; the full list can be found here.

If you, however, prefer to keep the line, there are many options to make it look differently. For example, the `SetStyle` function. Consider the following script:

`plot avg = ExpAverage(close, 15);avg.SetStyle(Curve.SHORT_DASH);`

Now the EMA line will be displayed as a short-dashed curve. The `SetStyle` function accepts `Curve` constants, the full list and descriptions can be found here.

`SetLineWeight` function is very simple to use: specify a number from 1 to 5 as an argument and it will define the width of the plot line in pixels:

`plot avg = ExpAverage(close, 15);avg.SetLineWeight(3);`

Sometimes there are situations where you need to hide a plot; there are two functions to help you with that: `Hide` and `SetHiding`. First function will hide the plot by default while the second will only hide it dynamically, i.e., upon some condition:

`plot SMA5 = Average(close, 5);plot SMA10 = Average(close, 10);plot SMA15 = Average(close, 15);SMA10.hide();SMA15.setHiding(getAggregationPeriod() < AggregationPeriod.DAY);`

In this example, plot `SMA10` plot is hidden by default and the `SMA15` is hidden on intraday charts only.

In previous chapter we promised to tell you more about colors that can be used when drawing plots. You can color plots using any of the following functions: `SetDefaultColor`, `AssignValueColor`, or `AssignNormGradientColor`. `SetDefaultColor` is used to add a specific solid color to the whole plot. `AssignValueColor` is used to draw the plot with different colors depending on specified conditions. `AssignNormGradientColor` is used to color the plot in the gradient manner depending on values.

Before we move on to examples showing how to use these functions, let’s see how to specify which colors we will need. First way is to use a predefined Color constant, e.g, Color.RED (this is what we actually did in the previous chapter when assigning colors to strategy signals). Second way is to use functions `Color` and `DefineColor`: the former draws the plot with colors named by the latter function. Another way is to use the `GetColor` function which accepts a number as an argument and returns the respective color from the palette; this palette can be found here. For those who find our palettes insufficient, we have the `CreateColor` function which accepts three numerical arguments used as RGB values in order to create whichever color you might think of. And finally, function `TakeValueColor` will color the plot the same way as another plot; this is especially useful when colors of the plot change dynamically.

Now that you are provided you with a whole lot of functions, let’s see how they work together:

`plot UpperBand = close * 1.1;plot LowerBand = close *0.9;plot Middle = close;Middle.DefineColor("Highest", Color.RED);Middle.DefineColor("Lowest", CreateColor(250, 150, 25));LowerBand.SetDefaultColor(GetColor(5));UpperBand.AssignValueColor(LowerBand.TakeValueColor());Middle.AssignNormGradientColor(14, Middle.color("Highest"), Middle.color("Lowest"));`

So, we started with drawing two bands of the Close price-based envelope: two bands shifted up and down by 10 percent from the `Middle` band which is the Close price plot. After that, we used the `DefineColor` function to define two named colors for the `Middle` plot: `Highest` and `Lowest`. The `Highest` color is defined by this function using the Color constant: `Color.RED`. In order to specify the value of `Lowest` color, we had the `CreateColor` function translate RGB value (250, 150, 25) into argument of the `DefineColor` function. After that we used the `SetDefaultColor` function to paint the `LowerBand` in a solid color taken from the dynamic palette by the `GetColor` function – and made sure that `UpperBand` would be colored the same (by using functions `AssignValueColor` and `TakeValueColor`). And still the result was not colorful enough to us – so, we decided to add gradient coloring to the Middle plot with `Highest` color for highest values and `Lowest` color for lowest ones.

Of course, we do not expect you to use all these functions in a single script, however, you may try. Also, if you feel tired of the plots, let’s move on to next chapter as there are several other ways to output values for you study.