Streamer Watermark

Affix to your TradingView charts watermarks of custom text, chart ticker, and/or timeframe

TradingView Link

Add this useful indicator to your TradingView chart with the link below. Always free and open source!

  • Before going to TradingView check out the description and screenshots below
TradingView Link

Streamer Watermark

This TradingView indicator doesn’t help you trade but it makes your charts look super clean and professional in images and live streams! This indicator works by displaying two tables. The first table has day of the week, date, and free form text. The second table has ticker symbol and timeframe of the current chart.

Everything about the tables and the cells is completely controllable by the user! Here is a breakdown of how customizable the user can make this indicator:

Table:

  • Toggle each table to be displayed on or off
  • Move each table into 9 different locations around the chart
  • Move each table separately
  • Table background color and transparency
  • Table border color and transparency
  • Table border width
  • Table frame width

Cells:

  • Each cell can be individually toggled on or off (the table will resize dynamically)
  • Cell text color and transparency
  • Text size with 6 different options
  • Date format with 12 different formats

Input Text:

  • Text
  • Emoji
  • Text & emojis
  • ASCII characters
  • Symbols
  • Anything that can be copied and pasted
  • Any combination of the above

Notes

Use text size “Auto” if viewing the same chart on desktop and on smartphone (Auto makes the text scale based upon screen size)

Screenshots

Code

// © Infinity_Trading_
// Last Modified: 6/20/2022

//@version=5
indicator(title="Streamer Watermark", shorttitle="_Watermark", overlay=true)

// Purpose: Displays two tables. The first table displays day of the week, date, and a free form text box where the user can insert any text.
//          The second table displays the ticker symbol and the current chart timeframe.

// Usage: Everything on this indicator can be adjusted! Tables can be turned on and off, moved to 9 different locations around the screen, background color, border color,
//        border width, and frame width for each individual table.
//        Each of the cells can be individually toggled on and off for complete control of look of the users chart. The text in the cells can be individually controlled
//        by text color and text size. And the date text can be formatted to 12 unique date formats.


// https://www.tradingview.com/pine-script-docs/en/v5/concepts/Time.html


///////////////////////////////////////////////////////////////////////////////// INPUTS

var string GP2 = "Date Table"
i_tbl_toggle =              input.bool(defval=true, title="Date Table", group=GP2)
i_tbl_bg_color =            input.color(defval=color.rgb(149, 152, 161, 100), title="  Background", group=GP2, inline="table_color") //  rgb(149,152,161)
i_tbl_border_color =        input.color(defval=color.rgb(30, 39, 46, 100), title="  Border", group=GP2, inline="table_color") // Black Pearl
// Convert boolean to int
i_tbl_weekday_toggle =      input.bool(defval=true, title="Wkday Cell", group=GP2, inline="weekday") ? 1 : 0
i_tbl_weekday_text_color =  input.color(defval=color.rgb(241, 242, 246, 0), title="", group=GP2, inline="weekday") // Anti-Flash White
i_tbl_weekday_text_size =   input.string(defval="Normal", title="Size", options=["Tiny", "Small", "Normal", "Large", "Huge", "Auto"], group=GP2, inline="weekday")
// Convert boolean to int
i_tbl_date_toggle =         input.bool(defval=true, title="Date Cell ", group=GP2, inline="date") ? 1 : 0
i_tbl_date_text_color =     input.color(defval=color.rgb(241, 242, 246, 0), title="", group=GP2, inline="date")
i_tbl_date_text_size =      input.string(defval="Normal", title="Size", options=["Tiny", "Small", "Normal", "Large", "Huge", "Auto"], group=GP2, inline="date")
i_tbl_date_format =         input.string(defval="MM/dd/yyyy", title="  Date Format     ", options=["MM/dd/yyyy", "MM.dd.yyyy", "MM-dd-yyyy", "dd/MM/yyyy", "dd.MM.yyyy", "dd-MM-yyyy", "M/d/yyyy", "M.d.yyyy", "M-d-yyyy", "d/M/yyyy", "d.M.yyyy", "d-M-yyyy"], group=GP2)
// Convert boolean to int
i_tbl_input_toggle =        input.bool(defval=true, title="Input Cell ", group=GP2, inline="input") ? 1 : 0
i_tbl_input_text_color =    input.color(defval=color.rgb(241, 242, 246, 0), title="", group=GP2, inline="input")
i_tbl_input_text_size =     input.string(defval="Normal", title="Size", options=["Tiny", "Small", "Normal", "Large", "Huge", "Auto"], group=GP2, inline="input")
i_tbl_input_text =          input.string(defval="your text here", title="  Input Text", group=GP2)
i_tbl_frame_width =         input.int(defval=2, title="  Frame Width  ", minval=1, maxval=20, group=GP2)
i_tbl_border_width =        input.int(defval=1, title="  Border Width  ", minval=1, maxval=20, group=GP2)

string  i_tableYpos = input.string(defval="bottom", title="  Position", inline="11", options=["top", "middle", "bottom"], group=GP2)
string  i_tableXpos = input.string(defval="left", title="", inline="11", options=["left", "center", "right"], group=GP2)

var string GPT = "Ticker Table"
i_tkr_tbl_toggle =              input.bool(defval=true, title="Ticker Table", group=GPT)
i_tkr_tbl_bg_color =            input.color(defval=color.rgb(149, 152, 161, 100), title="  Background  ", group=GPT, inline="ticker_color") //  rgb(149,152,161)
i_tkr_tbl_border_color =        input.color(defval=color.rgb(30, 39, 46, 100), title="  Border", group=GPT, inline="ticker_color") // Black Pearl
// Convert boolean to int
i_tkr_tbl_symbol_toggle =       input.bool(defval=true, title="Ticker Cell  ", group=GPT, inline="symbol") ? 1 : 0
i_tkr_tbl_symbol_text_color =   input.color(defval=color.rgb(241, 242, 246, 0), title="", group=GPT, inline="symbol") // Anti-Flash White
i_tkr_tbl_symbol_text_size =    input.string(defval="Normal", title="Size", options=["Tiny", "Small", "Normal", "Large", "Huge", "Auto"], group=GPT, inline="symbol")
// Convert boolean to int
i_tkr_tbl_timeframe_toggle =    input.bool(defval=true, title="Timeframe Cell", group=GPT, inline="timeframe") ? 1 : 0
i_tkr_tbl_timeframe_text_color =input.color(defval=color.rgb(241, 242, 246, 0), title="", group=GPT, inline="timeframe") // Anti-Flash White
i_tkr_tbl_timeframe_text_size = input.string(defval="Normal", title="Size", options=["Tiny", "Small", "Normal", "Large", "Huge", "Auto"], group=GPT, inline="timeframe")
i_tkr_tbl_frame_width =         input.int(defval=2, title="  Frame Width", minval=1, maxval=20, group=GPT)
i_tkr_tbl_border_width =        input.int(defval=1, title="  Border Width", minval=1, maxval=20, group=GPT)

string  i_tkr_tableYpos = input.string(defval="bottom", title="  Position", inline="11", options=["top", "middle", "bottom"], group=GPT)
string  i_tkr_tableXpos = input.string(defval="right", title="", inline="11", options=["left", "center", "right"], group=GPT)


///////////////////////////////////////////////////////////////////////////////// HELPER FUNCTIONS


// Function that converts string inputs to text size code
dayofweek_text_function(t) =>
    switch dayofweek(t, "America/New_York")
        1 => "Sunday"
        2 => "Monday"
        3 => "Tuesday"
        4 => "Wednesday"
        5 => "Thursday"
        6 => "Friday"
        7 => "Saturday"

// Function that converts string inputs to text size code
text_size_function(string_size) =>
    switch string_size
        "Tiny" => size.tiny
        "Small" => size.small
        "Normal" => size.normal
        "Large" => size.large
        "Huge" => size.huge
        "Auto" => size.auto

// Function that converts string timeframe.period to include minute or hour abbreviation
timeframe_text_function(int_period) =>
    switch int_period
        "1" => "1m"
        "2" => "2m"
        "3" => "3m"
        "4" => "4m"
        "5" => "5m"
        "10" => "10m"
        "15" => "15m"
        "30" => "30m"
        "60" => "1h"
        "120" => "2h"
        "240" => "4h"
        "480" => "8h"
        "720" => "12h"
        => int_period


///////////////////////////////////////////////////////////////////////////////// TABLE

// Convert text size strings to code
tbl_weekday_text_size = text_size_function(i_tbl_weekday_text_size)
tbl_date_text_size = text_size_function(i_tbl_date_text_size)
tbl_input_text_size = text_size_function(i_tbl_input_text_size)
tkr_tbl_symbol_text_size = text_size_function(i_tkr_tbl_symbol_text_size)
tkr_tbl_timeframe_text_size = text_size_function(i_tkr_tbl_timeframe_text_size)

// Number of cells in tables
date_cells = i_tbl_weekday_toggle + i_tbl_date_toggle + i_tbl_input_toggle
ticker_cells = i_tkr_tbl_symbol_toggle + i_tkr_tbl_timeframe_toggle


// Display table only on last bar to reduce computation time
if barstate.islast

    // Date table creation and cell insertion
    if i_tbl_toggle

        // Create dynamically sized table based upon number of inputs checked
        var table dateTable = table.new(position = i_tableYpos + "_" + i_tableXpos, columns = 1, rows = date_cells, bgcolor = i_tbl_bg_color, frame_width = i_tbl_frame_width, frame_color = i_tbl_border_color, border_width = i_tbl_border_width, border_color = i_tbl_border_color)

        if date_cells == 3
            // Populate cells in table
            // Weekday Cell
            table.cell(dateTable, 0, 0, text=str.tostring(dayofweek_text_function(time)), text_color=i_tbl_weekday_text_color, text_size=tbl_weekday_text_size)
            // Date Cell
            table.cell(dateTable, 0, 1, text=str.format("{0,date," + i_tbl_date_format + "}", time), text_color=i_tbl_date_text_color, text_size=tbl_date_text_size)
            // Input Cell
            table.cell(dateTable, 0, 2, text=str.tostring(i_tbl_input_text), text_color=i_tbl_input_text_color, text_size=tbl_input_text_size)

        if date_cells == 2

            if i_tbl_weekday_toggle == 1 and i_tbl_date_toggle == 1
                // Weekday Cell
                table.cell(dateTable, 0, 0, text=str.tostring(dayofweek_text_function(time)), text_color=i_tbl_weekday_text_color, text_size=tbl_weekday_text_size)
                // Date Cell
                table.cell(dateTable, 0, 1, text=str.format("{0,date," + i_tbl_date_format + "}", time), text_color=i_tbl_date_text_color, text_size=tbl_date_text_size)

            if i_tbl_date_toggle == 1 and i_tbl_input_toggle == 1
                // Date Cell
                table.cell(dateTable, 0, 0, text=str.format("{0,date," + i_tbl_date_format + "}", time), text_color=i_tbl_date_text_color, text_size=tbl_date_text_size)
                // Input Cell
                table.cell(dateTable, 0, 1, text=str.tostring(i_tbl_input_text), text_color=i_tbl_input_text_color, text_size=tbl_input_text_size)

            if i_tbl_weekday_toggle == 1 and i_tbl_input_toggle == 1
                // Weekday Cell
                table.cell(dateTable, 0, 0, text=str.tostring(dayofweek_text_function(time)), text_color=i_tbl_weekday_text_color, text_size=tbl_weekday_text_size)
                // Input Cell
                table.cell(dateTable, 0, 1, text=str.tostring(i_tbl_input_text), text_color=i_tbl_input_text_color, text_size=tbl_input_text_size)

        if date_cells == 1

            if i_tbl_weekday_toggle == 1
                // Weekday Cell
                table.cell(dateTable, 0, 0, text=str.tostring(dayofweek_text_function(time)), text_color=i_tbl_weekday_text_color, text_size=tbl_weekday_text_size)

            if i_tbl_date_toggle == 1
                // Date Cell
                table.cell(dateTable, 0, 0, text=str.format("{0,date," + i_tbl_date_format + "}", time), text_color=i_tbl_date_text_color, text_size=tbl_date_text_size)

            if i_tbl_input_toggle == 1
                // Input Cell
                table.cell(dateTable, 0, 0, text=str.tostring(i_tbl_input_text), text_color=i_tbl_input_text_color, text_size=tbl_input_text_size)


    // Ticker table creation and cell insertion
    if i_tkr_tbl_toggle

        // Create dynamically sized table based upon number of inputs checked
        var table tickerTable = table.new(position = i_tkr_tableYpos + "_" + i_tkr_tableXpos, columns = ticker_cells, rows = 1, bgcolor = i_tkr_tbl_bg_color, frame_width = i_tkr_tbl_frame_width, frame_color = i_tkr_tbl_border_color, border_width = i_tkr_tbl_border_width, border_color = i_tkr_tbl_border_color)

        if ticker_cells == 2

            // Populate cells in table
            table.cell(tickerTable, column = 0, row = 0, text=str.tostring(syminfo.ticker), text_color=i_tkr_tbl_symbol_text_color, text_size=tkr_tbl_symbol_text_size)
            table.cell(tickerTable, column = 1, row = 0, text=str.tostring(timeframe_text_function(timeframe.period)), text_color=i_tkr_tbl_timeframe_text_color, text_size=tkr_tbl_timeframe_text_size)

        if ticker_cells == 1

            // Populate cell in table
            if i_tkr_tbl_symbol_toggle == 1
                table.cell(tickerTable, column = 0, row = 0, text=str.tostring(syminfo.ticker), text_color=i_tkr_tbl_symbol_text_color, text_size=tkr_tbl_symbol_text_size)
            else
                table.cell(tickerTable, column = 0, row = 0, text=str.tostring(timeframe_text_function(timeframe.period)), text_color=i_tkr_tbl_timeframe_text_color, text_size=tkr_tbl_timeframe_text_size)

You May Also Like

essential