-
Notifications
You must be signed in to change notification settings - Fork 0
/
strategy-multi-st.pine
91 lines (75 loc) · 4.7 KB
/
strategy-multi-st.pine
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
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Ossy1717
//@version=4
strategy("(Strategy) Multi-ST (trailing stop)", overlay = true, initial_capital = 1000, default_qty_value = 1000, default_qty_type = strategy.cash, process_orders_on_close=true)
tradeDirection = input(defval = "All", title = "Long, Short or All Setups?", options = ["All", "Longs", "Shorts"])
fromDate = input(title="From Date", type=input.time, defval=timestamp("01 Jan 2021 00:00 -0400"))
showTrailingStopLine = input(defval = "No", title = "Show Trailing Stop Line", options = ["Yes", "No"])
trailingStopPerc = input(defval = 1, title = "Trailing SL %", minval = .1, maxval = 100, step = .1) / 100
showBackgroundFill = input(defval = "No", title = "Show Background Fill", options = ["Yes", "No"])
atrPeriod1 = input(12, "ATR Length 1")
factor1 = input(3, "Factor 1")
showST1 = input(defval = "Yes", title = "Show ST1", options = ["Yes", "No"])
atrPeriod2 = input(10, "ATR Length 2")
factor2 = input(1, "Factor 2")
showST2 = input(defval = "Yes", title = "Show ST2", options = ["Yes", "No"])
atrPeriod3 = input(11, "ATR Length 3")
factor3 = input(2, "Factor 3")
showST3 = input(defval = "Yes", title = "Show ST3", options = ["Yes", "No"])
[supertrend1, direction1] = supertrend(factor1, atrPeriod1)
[supertrend2, direction2] = supertrend(factor2, atrPeriod2)
[supertrend3, direction3] = supertrend(factor3, atrPeriod3)
// Middle candle body
bodyMiddle = plot((open + close) / 2, display=display.none)
// First
upTrend1 = plot(direction1 < 0 and showST1 == "Yes" ? supertrend1 : na, "Up Trend", color = color.green, style=plot.style_linebr)
downTrend1 = plot(direction1 > 0 and showST1 == "Yes" ? supertrend1 : na, "Down Trend", color = color.red, style=plot.style_linebr)
fill(bodyMiddle, upTrend1, color.new(color.green, showBackgroundFill == "Yes" ? 90 : 100), fillgaps=false)
fill(bodyMiddle, downTrend1, color.new(color.red, showBackgroundFill == "Yes" ? 90 : 100), fillgaps=false)
// Second
upTrend2 = plot(direction2 < 0 and showST1 == "Yes" ? supertrend2 : na, "Up Trend", color = color.green, style=plot.style_linebr)
downTrend2 = plot(direction2 > 0 and showST1 == "Yes" ? supertrend2 : na, "Down Trend", color = color.red, style=plot.style_linebr)
fill(bodyMiddle, upTrend2, color.new(color.green, showBackgroundFill == "Yes" ? 90 : 100), fillgaps=false)
fill(bodyMiddle, downTrend2, color.new(color.red, showBackgroundFill == "Yes" ? 90 : 100), fillgaps=false)
// Third
upTrend3 = plot(direction3 < 0 and showST1 == "Yes" ? supertrend3 : na, "Up Trend", color = color.green, style=plot.style_linebr)
downTrend3 = plot(direction3 > 0 and showST1 == "Yes" ? supertrend3 : na, "Down Trend", color = color.red, style=plot.style_linebr)
fill(bodyMiddle, upTrend3, color.new(color.green, showBackgroundFill == "Yes" ? 90 : 100), fillgaps=false)
fill(bodyMiddle, downTrend3, color.new(color.red, showBackgroundFill == "Yes" ? 90 : 100), fillgaps=false)
// Trading logic
timePeriod = time >= fromDate
notInTrade = strategy.position_size == 0
upTrend = direction1 < 0 and direction2 < 0 and direction3 < 0
downTrend = direction1 > 0 and direction2 > 0 and direction3 > 0
goLong = notInTrade and timePeriod and upTrend and (tradeDirection == "All" or tradeDirection == "Longs")
goShort = notInTrade and timePeriod and downTrend and (tradeDirection == "All" or tradeDirection == "Shorts")
longStopPrice = 0.0
shortStopPrice = 0.0
longStopPrice := if (strategy.position_size > 0)
stopValue = low * (1 - trailingStopPerc)
max(stopValue, longStopPrice[1])
else
0
shortStopPrice := if (strategy.position_size < 0)
stopValue = high * (1 + trailingStopPerc)
min(stopValue, shortStopPrice[1])
else
999999
// Long entries
strategy.entry(id = "long", long = strategy.long, when = goLong)
strategy.exit("exit", "long", stop=longStopPrice)
// Short entries
strategy.entry(id = "short", long = strategy.short, when = goShort)
strategy.exit("exit", "short", stop=shortStopPrice)
// Plot stop loss values for confirmation
longTrailingStopLine = plot(series=(showTrailingStopLine == "Yes" and strategy.position_size > 0) ? longStopPrice : na,
color=color.orange, style=plot.style_stepline,
linewidth=1, title="Long Trail Stop")
shortTrailingStopLine = plot(series=(showTrailingStopLine == "Yes" and strategy.position_size < 0) ? shortStopPrice : na,
color=color.orange, style=plot.style_stepline,
linewidth=1, title="Short Trail Stop")
// Entry line
entryPlot = plot(low, color=color.rgb(0, 0, 0, 100), style=plot.style_linebr, linewidth=1)
// SL area fill
fill(longTrailingStopLine, entryPlot, color=color.orange, fillgaps=false)
fill(entryPlot, shortTrailingStopLine, color=color.orange, fillgaps=false)