-
Notifications
You must be signed in to change notification settings - Fork 45
/
spy.txt
448 lines (357 loc) · 15.9 KB
/
spy.txt
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © binancash
//@version=5
indicator("Snag - SPY", overlay=true)
pctHigh = input.float(title='Highest %', defval=10.0)
pctLow = input.float(title='Lowest %', defval=-8.0)
f_RoundUp(number, decimals) =>
factor = math.pow(10, decimals)
math.ceil(number * factor) / factor
f_nDecimals(_in) =>
n = int(na), s = str.tostring(_in), p = str.pos(s, ".")
n := na(str.tonumber(s)) ? int(na) : na(p) ? 0 :
str.length(str.substring(s, p + 1))
_n = f_nDecimals(close)
// Trend Up Strong
// Close Cross Up EMA 13, or Close Cross Up EMA 50 or Close Cross Up EMA 200
// Mark as Begin Up Trend
// Wait for EMA 13 Cross Up EMA 48 🡪 Confirm Strong Uptrend 🡪 BUY
// EMA 48 CROSS UP EMA 200 🡪 STRONGER UPTREND
// Trend Down Strong
// Close Cross Down EMA 13, or Close Cross Down EMA 50 or Close Cross Down EMA 200
// Mark as Begin Down Trend
// Wait for EMA 13 Cross Down EMA 48 🡪 Confirm Strong Downtrend 🡪 SELL
// EMA 48 CROSS DOWN EMA 200 🡪 STRONGER DOWNTREND
wma13 = ta.wma(close, 13)
plot(wma13, title="WMA13", color=color.blue)
wma48 = ta.wma(close, 48)
plot(wma48, title="WMA48", color=color.yellow)
wma200 = ta.wma(close, 200)
plot(wma200, title="WMA200", color=color.white)
crossUpWMA13 = ta.crossover(close, wma13)
crossDownWMA13 = ta.crossunder(close, wma13)
crossUpWMA48 = ta.crossover(close, wma48)
crossDownWMA48 = ta.crossunder(close, wma48)
crossUpWMA200 = ta.crossover(close, wma200)
crossDownWMA200 = ta.crossunder(close, wma200)
crossUpWMA13_48 = ta.crossover(wma13, wma48)
crossDownWMA13_48 = ta.crossunder(wma13, wma48)
crossUpWMA48_200 = ta.crossover(wma48, wma200)
crossDownWMA48_200 = ta.crossunder(wma48, wma200)
var price_wmacrossup_arr = array.new_float()
var price_wmacrossdown_arr = array.new_float()
if crossUpWMA48_200
price_wmacrossdown_arr := array.new_float()
array.push(price_wmacrossup_arr, close)
else if crossDownWMA48_200
price_wmacrossup_arr := array.new_float()
array.push(price_wmacrossdown_arr, close)
//price_up = 0.0
//price_down = 0.0
//if array.size(price_wmacrossup_arr) > 0
// price_up := array.get(price_wmacrossup_arr, array.size(price_wmacrossup_arr)-1)
//else if array.size(price_wmacrossdown_arr) > 0
// price_down := array.get(price_wmacrossdown_arr, array.size(price_wmacrossdown_arr)-1)
var bool isUpTrend = false
var bool isDownTrend = false
if crossUpWMA13 and isUpTrend == false
isUpTrend := true
isDownTrend := false
else if crossUpWMA48 and isUpTrend == false
isUpTrend := true
isDownTrend := false
else if crossUpWMA200 and isUpTrend == false
isUpTrend := true
isDownTrend := false
if crossDownWMA13 and isDownTrend == false
isUpTrend := false
isDownTrend := true
else if crossDownWMA48 and isDownTrend == false
isUpTrend := false
isDownTrend := true
else if crossDownWMA200 and isDownTrend == false
isUpTrend := false
isDownTrend := true
var int trendUp = 0
var int trendDown = 0
txtMarkTrend = ''
txtOrder = 'N/A'
if isUpTrend
if crossUpWMA13_48
trendUp := 1
trendDown := 0
if crossUpWMA48_200
trendUp := 2
trendDown := 0
if isDownTrend
if crossDownWMA13_48
trendUp := 0
trendDown := 1
if crossDownWMA48_200
trendUp := 0
trendDown := 2
if isUpTrend
txtMarkTrend := 'Begin Up Trend'
if trendUp == 1
txtMarkTrend := 'Confirm Strong Uptrend'
txtOrder := 'BUY'
else if trendUp == 2
txtMarkTrend := 'STRONGER UPTREND'
txtOrder := 'BUY'
else if isDownTrend
txtMarkTrend := 'Begin Down Trend'
if trendDown == 1
txtMarkTrend := 'Confirm Strong Downtrend'
txtOrder := 'SELL'
else if trendDown == 2
txtMarkTrend := 'STRONGER DOWNTREND'
txtOrder := 'SELL'
// setting % period
pctTop = 5.0
pctBottom = -5.0
if str.format("{0}", timeframe.period) == '5'
pctTop := 2.5
pctBottom := -2.5
else if str.format("{0}", timeframe.period) == '180'
pctTop := 10.0
pctBottom := -10.0
else if str.format("{0}", timeframe.period) == 'D'
pctTop := 15.0
pctBottom := -15.0
txtBottom = ''
txtTop = ''
is_bottom_wma200 = false
is_top_wma200 = false
pct_low_wma200 = 0.0
pct_high_wma200 = 0.0
if low < wma200
pct_low_wma200 := f_RoundUp((low - wma200)/wma200*100, 2)
if pct_low_wma200 <= pctBottom
txtBottom := 'BOTTOM'
is_bottom_wma200 := true
else if high > wma200
pct_high_wma200 := f_RoundUp((high - wma200)/wma200*100, 2)
if pct_high_wma200 >= pctTop
txtTop := 'TOP'
is_top_wma200 := true
if barstate.islast
var table panel = table.new("bottom_right", 6, 30)
table.cell(panel, 0, 1, "TREND", bgcolor = color.yellow, text_color=color.black, width=18, text_halign=text.align_left)
table.cell(panel, 1, 1, txtMarkTrend, bgcolor = color.yellow, text_color=color.black, width=30, text_halign=text.align_left)
table.cell(panel, 0, 2, "ORDER", bgcolor = color.yellow, text_color=color.black, width=18, text_halign=text.align_left)
table.cell(panel, 1, 2, txtOrder, bgcolor = color.yellow, text_color=color.black, width=30, text_halign=text.align_left)
if low < wma200
table.cell(panel, 0, 3, "EMA200%", bgcolor = color.yellow, text_color=color.black, width=18, text_halign=text.align_left)
table.cell(panel, 1, 3, str.format("{0}% {1}", pct_low_wma200, txtBottom), bgcolor = color.yellow, text_color=color.black, width=30, text_halign=text.align_left)
predictBottomPrice = wma200 + pctBottom/100*wma200
table.cell(panel, 0, 4, "PREDICT BOTTOM PRICE", bgcolor = color.yellow, text_color=color.black, width=18, text_halign=text.align_left)
table.cell(panel, 1, 4, str.format("{0}", predictBottomPrice), bgcolor = color.yellow, text_color=color.black, width=30, text_halign=text.align_left)
else if high > wma200
table.cell(panel, 0, 3, "EMA200%", bgcolor = color.yellow, text_color=color.black, width=18, text_halign=text.align_left)
table.cell(panel, 1, 3, str.format("{0}% {1}", pct_high_wma200, txtTop), bgcolor = color.yellow, text_color=color.black, width=30, text_halign=text.align_left)
predictTopPrice = wma200 + pctTop/100*wma200
table.cell(panel, 0, 4, "PREDICT TOP PRICE", bgcolor = color.yellow, text_color=color.black, width=18, text_halign=text.align_left)
table.cell(panel, 1, 4, str.format("{0}", predictTopPrice), bgcolor = color.yellow, text_color=color.black, width=30, text_halign=text.align_left)
// Alert CALL PUT
var time_wmacrossup_arr = array.new_int()
var time_wmacrossdown_arr = array.new_int()
if trendUp == 1 or trendUp == 2
time_wmacrossdown_arr := array.new_int()
if array.size(time_wmacrossup_arr) == 0
array.push(time_wmacrossup_arr, time)
else if trendDown == 1 or trendDown == 2
time_wmacrossup_arr := array.new_int()
if array.size(time_wmacrossdown_arr) == 0
array.push(time_wmacrossdown_arr, time)
is_alert_wmacrossup = false
is_alert_wmacrossdown = false
var has_wmacrossup_arr = array.new_bool()
var has_wmacrossdown_arr = array.new_bool()
if array.size(time_wmacrossup_arr) > 0
if time == array.get(time_wmacrossup_arr, array.size(time_wmacrossup_arr)-1)
is_alert_wmacrossup := true
array.push(has_wmacrossup_arr, true)
else if array.size(time_wmacrossdown_arr) > 0
if time == array.get(time_wmacrossdown_arr, array.size(time_wmacrossdown_arr)-1)
is_alert_wmacrossdown := true
array.push(has_wmacrossdown_arr, true)
alertcondition(is_alert_wmacrossdown, title='ENTER PUT', message='Get out Call and Enter PUT')
alertcondition(is_alert_wmacrossup, title='ENTER CALL', message='Get out Put and Enter CALL')
/////////////////////////////////////////////////////////////////////////////////////////////
// alert TOP - BOTTOM START
var time_top_arr = array.new_int()
var time_bottom_arr = array.new_int()
if is_top_wma200
time_bottom_arr := array.new_int()
if array.size(time_top_arr) == 0
array.push(time_top_arr, time)
else if is_bottom_wma200
time_top_arr := array.new_int()
if array.size(time_bottom_arr) == 0
array.push(time_bottom_arr, time)
is_alert_top = false
is_alert_bottom = false
var has_top_arr = array.new_bool()
var has_bottom_arr = array.new_bool()
if array.size(time_top_arr) > 0
if time == array.get(time_top_arr, array.size(time_top_arr)-1)
is_alert_top := true
array.push(has_top_arr, true)
else if array.size(time_bottom_arr) > 0
if time == array.get(time_bottom_arr, array.size(time_bottom_arr)-1)
is_alert_bottom := true
array.push(has_bottom_arr, true)
alertcondition(is_alert_bottom, title='ENTER BOTTOM', message='BOTTOM - Get out PUT and Enter CALL')
alertcondition(is_alert_top, title='ENTER TOP', message='TOP - Get out CALL and Enter PUT')
// alert TOP - BOTTOM END
/////////////////////////////////////////////////////////////////////////////////////////////
// RSI
rsi = ta.rsi(close, 9)
rsiWMA = ta.wma(rsi, 125)
cci = ta.cci(close, 10)
////////////////////////////////BEGIN SUP RES
// Time Frame 1 = TF1
TF1 = timeframe.period
stockschart = syminfo.type == 'stock'
futureschart = syminfo.type == 'futures'
indexchart = syminfo.type == 'index'
f_resInMinutes() =>
if stockschart or futureschart or indexchart
_resInMinutes = timeframe.multiplier * (timeframe.isseconds ? 1. / 60 : timeframe.isminutes ? 1. : timeframe.isdaily ? 60. * 16 : timeframe.isweekly ? 60. * 7 * 5 : timeframe.ismonthly ? 60. * 7 * 21 : na)
_resInMinutes
else
_resInMinutes = timeframe.multiplier * (timeframe.isseconds ? 1. / 60 : timeframe.isminutes ? 1. : timeframe.isdaily ? 60. * 24 : timeframe.isweekly ? 60. * 24 * 7 : timeframe.ismonthly ? 60. * 24 * 30.4375 : na)
_resInMinutes
f_tfResInMinutes(_res) =>
request.security(syminfo.tickerid, _res, f_resInMinutes())
TF1InMinutes = f_tfResInMinutes(TF1)
currentTFInMinutes = f_resInMinutes()
chartOnLowerTF1 = currentTFInMinutes <= TF1InMinutes
TF1_inH = str.tostring(TF1InMinutes / 60)
TF1_text = if stockschart or futureschart
TF1InMinutes >= 60 and TF1InMinutes < 960 ? TF1_inH + 'h' : TF1InMinutes < 60 ? TF1 + 'm' : TF1
else
TF1InMinutes >= 60 and TF1InMinutes < 1440 ? TF1_inH + 'h' : TF1InMinutes < 60 ? TF1 + 'm' : TF1
barsinTF1 = TF1InMinutes / currentTFInMinutes
TF1_bar_index = math.ceil(1 * barsinTF1)
TF1_bar_index_range = math.ceil(3 * barsinTF1)
var TF1_High_index = math.abs(ta.highestbars(high, nz(TF1_bar_index_range, 1)))[TF1_bar_index] + TF1_bar_index
var TF1_Low_index = math.abs(ta.lowestbars(low, nz(TF1_bar_index_range, 1)))[TF1_bar_index] + TF1_bar_index
if TF1_bar_index + TF1_bar_index_range > 4999
TF1_High_index := 4999
TF1_Low_index := 4999
f_tfUp(_TF_High, _TF_Vol, _TF_VolMA) =>
_TF_High[3] > _TF_High[4] and _TF_High[4] > _TF_High[5] and _TF_High[2] < _TF_High[3] and _TF_High[1] < _TF_High[2] and _TF_Vol[3] > _TF_VolMA[3]
f_tfDown(_TF_Low, _TF_Vol, _TF_VolMA) =>
_TF_Low[3] < _TF_Low[4] and _TF_Low[4] < _TF_Low[5] and _TF_Low[2] > _TF_Low[3] and _TF_Low[1] > _TF_Low[2] and _TF_Vol[3] > _TF_VolMA[3]
f_tfSources(_res, _source) =>
request.security(syminfo.tickerid, _res, _source)
// S/R = Time Frame 1 = TF1
TF1_Vol = f_tfSources(TF1, volume)
TF1_VolMA = ta.wma(TF1_Vol, 6)
TF1_High = f_tfSources(TF1, high)
TF1_Low = f_tfSources(TF1, low)
TF1_Open = f_tfSources(TF1, open)
TF1_Close = f_tfSources(TF1, close)
TF1_Up = f_tfUp(TF1_High, TF1_Vol, TF1_VolMA)
TF1_Down = f_tfDown(TF1_Low, TF1_Vol, TF1_VolMA)
TF1_CalcFractalUp() =>
TF1_FractalUp = 0.0
TF1_FractalUp := TF1_Up ? TF1_High[3] : TF1_FractalUp[1]
TF1_FractalUp
TF1_CalcFractalDown() =>
TF1_FractalDown = 0.0
TF1_FractalDown := TF1_Down ? TF1_Low[3] : TF1_FractalDown[1]
TF1_FractalDown
TF1_FractalUp = request.security(syminfo.tickerid, TF1, TF1_CalcFractalUp())
TF1_FractalDown = request.security(syminfo.tickerid, TF1, TF1_CalcFractalDown())
// Zones - Current Time Frame = Time Frame 1 = TF1
// Fractal Up Zones
TF1_CalcFractalUpZone() =>
TF1_FractalUpZone = 0.0
TF1_FractalUpZone := TF1_Up and TF1_Close[3] >= TF1_Open[3] ? TF1_Close[3] : TF1_Up and TF1_Close[3] < TF1_Open[3] ? TF1_Open[3] : TF1_FractalUpZone[1]
TF1_FractalUpZone
TF1_FractalUpZone = request.security(syminfo.tickerid, TF1, TF1_CalcFractalUpZone())
TF1_ResistanceZone = TF1_FractalUpZone
// Fractal Down Zones
TF1_CalcFractalDownZone() =>
TF1_FractalDownZone = 0.0
TF1_FractalDownZone := TF1_Down and TF1_Close[3] >= TF1_Open[3] ? TF1_Open[3] : TF1_Down and TF1_Close[3] < TF1_Open[3] ? TF1_Close[3] : TF1_FractalDownZone[1]
TF1_FractalDownZone
TF1_FractalDownZone = request.security(syminfo.tickerid, TF1, TF1_CalcFractalDownZone())
TF1_SupportZone = TF1_FractalDownZone
//////////////////////////////////END SUP RES
/////////////////////////////////BEGIN cross
bigdrop = rsi + 8 < rsi[1] and close > wma48
plotshape(bigdrop, title="Big Drop", style=shape.square, location=location.abovebar, color=color.white, size=size.tiny)
bottomsupport = close > TF1_SupportZone[0] and close > close[1] and rsi > rsi[1] + 10
plotshape(bottomsupport, title="Big Bottom", style=shape.xcross, location=location.belowbar, color=color.yellow, size=size.tiny)
// Alert Exit CALL PUT
var time_exitup_arr = array.new_int()
var time_exitdown_arr = array.new_int()
if bigdrop
time_exitdown_arr := array.new_int()
if array.size(time_exitup_arr) == 0
array.push(time_exitup_arr, time)
else if bottomsupport
time_exitup_arr := array.new_int()
if array.size(time_exitdown_arr) == 0
array.push(time_exitdown_arr, time)
is_alert_exitup = false
is_alert_exitdown = false
if array.size(time_exitup_arr) > 0 and array.size(has_wmacrossup_arr) > 0
if time == array.get(time_exitup_arr, array.size(time_exitup_arr)-1)
is_alert_exitup := true
has_wmacrossup_arr := array.new_bool()
else if array.size(time_exitdown_arr) > 0 and array.size(has_wmacrossdown_arr) > 0
if time == array.get(time_exitdown_arr, array.size(time_exitdown_arr)-1)
is_alert_exitdown := true
has_wmacrossdown_arr := array.new_bool()
alertcondition(is_alert_exitdown, title='EXIT PUT', message='Exit PUT')
alertcondition(is_alert_exitup, title='EXIT CALL', message='Exit CALL')
fast_length = 12
slow_length = 26
signal_length = 9
fast_ma = ta.ema(close, fast_length)
slow_ma = ta.ema(close, slow_length)
macd = fast_ma - slow_ma
signal = ta.ema(macd, signal_length)
macd_crossover = ta.crossover(macd, -40)
var bool is_macd_corssover = false
var bool is_macd_corssunder = false
if macd_crossover
is_macd_corssover := true
is_macd_corssunder := false
macd_crossunder = ta.crossunder(macd, 55)
if macd_crossunder
is_macd_corssover := false
is_macd_corssunder := true
highest = ta.highest(high, 48)
pct_low = f_RoundUp((close - highest)/highest*100, 2)
var bool is_lowest = false
var bool is_highest = false
if pct_low <= pctLow and close < wma200
pct_lowest = f_RoundUp((close - wma200)/wma200*100, 2)
if pct_lowest <= pctBottom and is_macd_corssover
is_lowest := true
is_highest := false
if close > wma200
is_lowest := false
is_bottom = false
if is_lowest and bottomsupport
is_bottom := true
plotshape(is_bottom, title="Bottom", style=shape.diamond, location=location.belowbar, color=color.yellow, size=size.tiny)
lowest = ta.lowest(low, 48)
pct_high = f_RoundUp((close - lowest)/lowest*100, 2)
if pct_high >= pctHigh and close > wma200
pct_highest = f_RoundUp((close - wma200)/wma200*100, 2)
if pct_highest >= pctTop and is_macd_corssunder
is_highest := true
is_lowest := false
//if close < wma200
// is_highest := false
is_top = false
if is_highest and bigdrop
is_top := true
plotshape(is_top, title="TOP", style=shape.diamond, location=location.abovebar, color=color.white, size=size.tiny)
// alert top - bottom