-
Notifications
You must be signed in to change notification settings - Fork 18
/
supertrend.pinescript
128 lines (102 loc) · 5.63 KB
/
supertrend.pinescript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
//@version=4
strategy("SuperTrend Strategy", overlay=true, default_qty_value=5, currency=currency.USD, default_qty_type=strategy.percent_of_equity, initial_capital=10000, max_bars_back=4000)
//===== TIMEFRAME ==========================================================================//
from_month = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
from_day = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
from_year = input(defval = 2019, title = "From Year", minval = 2017)
to_month = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
to_day = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
to_year = input(defval = 9999, title = "To Year", minval = 2017)
start = timestamp(from_year, from_month, from_day, 00, 00)
finish = timestamp(to_year, to_month, to_day, 23, 59)
window() => time >= start and time <= finish ? true : false
//===== INPUTS ==========================================================================//
factor = input(3, title="ATR Factor")
period = input(10, minval = 1, maxval = 100, title="ATR Period")
up = (high + low) / 2 - (factor * atr(period))
down = (high + low) / 2 + (factor * atr(period))
trend_up = 0.0
trend_up := close[1] > trend_up[1] ? max(up, trend_up[1]) : up
trend_down = 0.0
trend_down := close[1] < trend_down[1] ? min(down, trend_down[1]) : down
trend = 0.0
trend := close > trend_down[1] ? 1 : close < trend_up[1] ? -1 : nz(trend[1], 1)
tsl = trend == 1 ? trend_up : trend_down
line_color = trend == 1 ? "green" : "red"
long_signal = trend == 1 and trend[1] == -1
short_signal = trend == -1 and trend[1] == 1
background = input(title = "Background On/Off ?", type = input.bool, defval = true)
use_sl = input(title = "Use Stop Loss ?", type = input.bool, defval = false)
initial_sl_pct = input(defval = 15.0, minval = 0.0, title="Stop Loss %")
//===== PLOTS ==========================================================================//
// Line
line_plot = plot(tsl, color = trend == 1 ? color.green : color.red, linewidth = 2, title = "Trend Line")
// Labels
plotshape(long_signal and window() ? up : na, title = "Buy", text = "Buy", location = location.absolute, style = shape.labelup, size = size.tiny, color = color.green, textcolor = color.white, transp = 0)
plotshape(short_signal and window() ? down : na, title = "Sell", text = "Sell", location = location.absolute, style = shape.labeldown, size = size.tiny, color = color.red, textcolor = color.white, transp = 0)
// Circles
plotshape(long_signal and window() ? up : na, title = "Uptrend starts", location = location.absolute, style = shape.circle, size = size.tiny, color = color.green, transp = 0)
plotshape(short_signal and window() ? down : na, title = "Downtrend starts", location = location.absolute, style = shape.circle, size = size.tiny, color = color.red, transp = 0)
// Background
long_fill = background ? (trend == 1 ? color.green : na) : na
short_fill = background ? (trend == -1 ? color.red : na) : na
candle_plot = plot(ohlc4, title = "Price Line", color = trend == 1 ? long_fill : short_fill, transp = 90, linewidth = 2)
fill(candle_plot, line_plot, title = "Long Background", color = long_fill)
fill(candle_plot, line_plot, title = "Short Background", color = short_fill)
//===== GLOBAL ==========================================================================//
var entry_price = 0.0
var updated_entry_price = 0.0
var sl_price = 0.0
has_open_trade() => strategy.position_size != 0
has_no_open_trade() => strategy.position_size == 0
is_long() => strategy.position_size > 0 ? true : false
is_short() => strategy.position_size < 0 ? true : false
plot(use_sl ? has_no_open_trade() ? close : sl_price : na, color = has_no_open_trade() ? na : color.blue, title = "Stop Loss")
strategy_close() =>
if (is_long())
strategy.close("Long")
if (is_short())
strategy.close("Short")
strategy_long() =>
strategy.entry("Long", strategy.long)
strategy_short() =>
strategy.entry("Short", strategy.short)
sl_pct = initial_sl_pct
if (long_signal or is_long() and not (short_signal or is_short()))
sl_pct := initial_sl_pct * -1
//===== STRATEGY ==========================================================================//
crossed_sl = false
if (is_long() and use_sl)
crossed_sl := close <= sl_price
if (is_short() and use_sl)
crossed_sl := close >= sl_price
terminate_operation = window() and has_open_trade() and crossed_sl
if (terminate_operation and not (long_signal or short_signal)) // Do not close position if trend is flipping anyways.
entry_price := 0.0
updated_entry_price := entry_price
sl_price := 0.0
strategy_close()
start_operation = window() and (long_signal or short_signal)
if (start_operation)
entry_price := close
updated_entry_price := entry_price
sl_price := entry_price + (entry_price * sl_pct) / 100
if (long_signal)
strategy_long()
if (short_signal)
strategy_short()
//===== TRAILING ==========================================================================//
if (is_long() and use_sl)
strategy_pct = (close - updated_entry_price) / updated_entry_price * 100.00
if (strategy_pct > 1)
sl_pct := sl_pct + strategy_pct - 1.0
new_sl_price = updated_entry_price + (updated_entry_price * sl_pct) / 100
sl_price := max(sl_price, new_sl_price)
updated_entry_price := sl_price
if (is_short() and use_sl)
strategy_pct = (close - updated_entry_price) / updated_entry_price * 100.00
if (strategy_pct < -1)
sl_pct := sl_pct + strategy_pct + 1.0
new_sl_price = updated_entry_price + (updated_entry_price * sl_pct) / 100
sl_price := min(sl_price, new_sl_price)
updated_entry_price := sl_price