|
|
| indicator("4CCP + 6CBP Pattern Detector + 30minute bars (Asia/Manila)", overlay=true, max_boxes_count=500, max_lines_count=500, max_labels_count=500)
|
|
|
|
|
| is_1m = timeframe.period == "1"
|
|
|
|
|
| o = open
|
| h = high
|
| l = low
|
| c = close
|
|
|
|
|
| f_two(n) => n < 10 ? "0" + str.tostring(n) : str.tostring(n)
|
|
|
|
|
| manilaTimeStr(offset) =>
|
|
|
| hh = hour(time[offset], "Asia/Manila")
|
| mm = minute(time[offset], "Asia/Manila")
|
| f_two(hh) + ":" + f_two(mm)
|
|
|
|
|
|
|
|
|
|
|
|
|
| isBull(c_, o_) => c_ > o_
|
| isBear(c_, o_) => c_ < o_
|
|
|
|
|
| getBodyCoords(_o, _c) =>
|
| _top = math.max(_o, _c)
|
| _bot = math.min(_o, _c)
|
| _mid = (_top + _bot) / 2
|
| [_top, _bot, _mid]
|
|
|
|
|
|
|
|
|
| t1_1 = isBull(c[3], o[3]) and
|
| isBear(c[2], o[2]) and c[2] < o[3] and
|
| isBull(c[1], o[1]) and c[1] > o[2] and c[1] > c[3] and
|
| isBull(c, o) and c > c[1] and c > o[2] and c > c[3]
|
|
|
|
|
| t1_2 = isBull(c[3], o[3]) and
|
| isBear(c[2], o[2]) and c[2] < o[3] and
|
| isBull(c[1], o[1]) and c[1] > c[2] and c[1] < o[2] and
|
| isBull(c, o) and c > c[1] and c > o[2] and c > c[3]
|
|
|
|
|
| t2_1 = isBear(c[3], o[3]) and
|
| isBull(c[2], o[2]) and c[2] > o[3] and
|
| isBear(c[1], o[1]) and c[1] < o[2] and c[1] < c[3] and
|
| isBear(c, o) and c < c[1] and c < o[2] and c < c[3]
|
|
|
|
|
| t2_2 = isBear(c[3], o[3]) and
|
| isBull(c[2], o[2]) and c[2] > o[3] and
|
| isBear(c[1], o[1]) and c[1] < c[2] and c[1] > o[2] and
|
| isBear(c, o) and c < c[1] and c < o[2] and c < c[3]
|
|
|
|
|
| var box[] boxes = array.new_box()
|
| var line[] lines = array.new_line()
|
| var label[] labs = array.new_label()
|
|
|
|
|
| drawBoxAndLine(cond, baseBarOffset, extendBars, colorFill) =>
|
| if is_1m and cond
|
| [top, bot, mid] = getBodyCoords(open[baseBarOffset], close[baseBarOffset])
|
| x1 = bar_index - baseBarOffset
|
| x2 = x1 + extendBars
|
|
|
| bx = box.new(left = x1, right = x2, top = top, bottom = bot,
|
| bgcolor = color.new(colorFill, 70), border_color = colorFill)
|
| ln = line.new(x1 = x1, y1 = mid, x2 = x2, y2 = mid,
|
| color = colorFill, width = 1, style = line.style_dotted)
|
|
|
| array.push(boxes, bx)
|
| array.push(lines, ln)
|
|
|
|
|
| ts = manilaTimeStr(baseBarOffset)
|
| tLabel = label.new( x1, top,ts, style = label.style_label_down,textcolor = color.rgb(0, 0, 0), color = color.new(colorFill, 100),size = size.small )
|
| array.push(labs, tLabel)
|
|
|
|
|
| drawBoxAndLine(t1_1, 2, 5, color.rgb(0, 192, 255))
|
| drawBoxAndLine(t1_2, 2, 5, color.rgb(0, 38, 255))
|
| drawBoxAndLine(t2_1, 2, 5, color.rgb(255, 64, 64))
|
| drawBoxAndLine(t2_2, 2, 5, color.rgb(255, 128, 0))
|
|
|
|
|
|
|
| get_mid(_o, _c) => (_o + _c) / 2
|
|
|
|
|
|
|
| bear_bull1 = c[5] > o[5]
|
| bear_bull2 = c[4] > o[4] and c[4] > c[5]
|
| bear_bear3 = c[3] < o[3] and c[3] < o[4]
|
| bear_bull4 = c[2] > c[3] and c[2] < o[3]
|
| bear_bear5 = c[1] < o[2] and c[1] < c[3] and c[1] < o[4]
|
| bear_bear6 = c < o and c < o[5] and c < c[1]
|
|
|
| bearish_6CBP = bear_bull1 and bear_bull2 and bear_bear3 and bear_bull4 and bear_bear5 and bear_bear6
|
|
|
| o4_bear = o[2]
|
| c4_bear = c[2]
|
| h4_bear = h[2]
|
| l4_bear = l[2]
|
| mid4_bear = get_mid(o4_bear, c4_bear)
|
|
|
|
|
| bull_bear1 = c[5] < o[5]
|
| bull_bear2 = c[4] < o[4] and c[4] < c[5]
|
| bull_bull3 = c[3] > o[3] and c[3] > o[4]
|
| bull_bear4 = c[2] < c[3] and c[2] > o[3]
|
| bull_bull5 = c[1] > o[2] and c[1] > c[3] and c[1] > o[4]
|
| bull_bull6 = c > o and c > o[5] and c > c[1]
|
|
|
| bullish_6CBP = bull_bear1 and bull_bear2 and bull_bull3 and bull_bear4 and bull_bull5 and bull_bull6
|
|
|
| o4_bull = o[2]
|
| c4_bull = c[2]
|
| h4_bull = h[2]
|
| l4_bull = l[2]
|
| mid4_bull = get_mid(o4_bull, c4_bull)
|
|
|
|
|
|
|
| if bearish_6CBP
|
|
|
| label.new(bar_index[2], h4_bear, "6CBPβ", style=label.style_diamond, color=color.new(color.red, 0), textcolor=color.new(#000000, 0), size=size.tiny)
|
|
|
|
|
| box.new(left=bar_index[2], right=bar_index[2] + 10, top=math.max(o4_bear, c4_bear), bottom=math.min(o4_bear, c4_bear),bgcolor=color.new(color.red, 85),border_color=color.new(color.red, 0))
|
|
|
|
|
| line.new(bar_index[2], mid4_bear, bar_index[2] + 10, mid4_bear, color=color.new(color.red, 0), width=1 )
|
|
|
|
|
| label.new(bar_index[2], h4_bear, manilaTimeStr(2), style = label.style_label_down, textcolor = color.rgb(0, 0, 0), color = color.new(color.red, 100), size = size.small)
|
|
|
|
|
|
|
| if bullish_6CBP
|
|
|
| label.new(bar_index[2], l4_bull, text="6CBPβ",style=label.style_diamond,color=color.new(color.lime, 0),textcolor=color.new(#000000, 0), size=size.tiny )
|
|
|
|
|
| box.new(left=bar_index[2], right=bar_index[2] + 10, top=math.max(o4_bull, c4_bull),bottom=math.min(o4_bull, c4_bull), bgcolor=color.new(color.lime, 85), border_color=color.new(color.lime, 0) )
|
|
|
|
|
| line.new( bar_index[2], mid4_bull, bar_index[2] + 10, mid4_bull, color=color.new(color.lime, 0), width=1 )
|
|
|
|
|
| label.new( bar_index[2], l4_bull, manilaTimeStr(2),style = label.style_label_up, textcolor = color.rgb(0, 0, 0),color = color.new(color.lime, 100), size = size.small)
|
|
|
|
|
|
|
|
|
| showSeconds = input.bool(false, "Show seconds (HH:MM:SS)", inline="s")
|
| labelBg = input.color(color.new(#363a45, 100), "Label background")
|
| labelTxtColor = input.color(color.rgb(0, 0, 0), "Label text color")
|
|
|
|
|
| f_dayname(_d) =>_d == dayofweek.monday ? "mon" : _d == dayofweek.tuesday ? "tue" :_d == dayofweek.wednesday ? "wed" :_d == dayofweek.thursday ? "thu" :_d == dayofweek.friday ? "fri" : _d == dayofweek.saturday ? "sat" : "sun"
|
|
|
| f_monthname(_m) => _m == 1 ? "jan" : _m == 2 ? "feb" :_m == 3 ? "mar" :_m == 4 ? "apr" : _m == 5 ? "may" : _m == 6 ? "jun" : _m == 7 ? "jul" :_m == 8 ? "aug" : _m == 9 ? "sep" : _m == 10 ? "oct" : _m == 11 ? "nov" : "dec"
|
|
|
|
|
| t_now_manila = timenow + (13 * 60 * 60 * 1000)
|
|
|
|
|
| hh = hour(t_now_manila)
|
| min_ = minute(t_now_manila)
|
| sec_ = second(t_now_manila)
|
| dofw = dayofweek(t_now_manila)
|
| mon = month(t_now_manila)
|
| dy = dayofmonth(t_now_manila)
|
| yr = year(t_now_manila)
|
|
|
|
|
| ff_two(n) => n < 10 ? "0" + str.tostring(n) : str.tostring(n)
|
|
|
|
|
| timeStr = showSeconds ? ff_two(hh) + ":" + ff_two(min_) + ":" + ff_two(sec_) : ff_two(hh) + ":" + ff_two(min_) + " utc8"
|
|
|
| dateStr = f_dayname(dofw) + "/" + f_monthname(mon) + " " + ff_two(dy) + "/" + str.tostring(yr)
|
|
|
| lblText = timeStr + " " + "\n " + dateStr
|
|
|
|
|
| var label lbl = na
|
|
|
| if barstate.islast
|
| if na(lbl)
|
| lbl := label.new( bar_index - 5 , close, lblText, xloc=xloc.bar_index, yloc=yloc.price, style=label.style_label_left, color=labelBg, textcolor=labelTxtColor, size=size.small )
|
| else
|
| label.set_xy(lbl, bar_index, close)
|
| label.set_text(lbl, lblText)
|
| label.set_color(lbl, labelBg)
|
| label.set_textcolor(lbl, labelTxtColor)
|
| label.set_size(lbl, size.small)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| len = input.int(30, "Number of CLOSED 30m candles", minval=1)
|
| offset = input.int(5, "Offset from right edge (bars)")
|
| spacing = 3
|
|
|
|
|
| bullColor = input.color(color.new(#dbdbdb, 0), "Bull Candle Color")
|
| bearColor = input.color(color.new(#2e2e2e, 0), "Bear Candle Color")
|
| wickColor = input.color(#2e2e2e, "Wick Color")
|
| borderCol = input.color(#2e2e2e, "Border Color")
|
|
|
|
|
| [o30, h30, l30, c30] = request.security(syminfo.tickerid, "30", [open, high, low, close], barmerge.gaps_on)
|
|
|
|
|
| isNew30Boundary = ta.change(time("30"))
|
|
|
|
|
| var float[] bufO = array.new_float(len, na)
|
| var float[] bufH = array.new_float(len, na)
|
| var float[] bufL = array.new_float(len, na)
|
| var float[] bufC = array.new_float(len, na)
|
|
|
|
|
| if array.size(bufO) != len
|
| bufO := array.new_float(len, na)
|
| bufH := array.new_float(len, na)
|
| bufL := array.new_float(len, na)
|
| bufC := array.new_float(len, na)
|
|
|
|
|
| if isNew30Boundary
|
| closedO = o30[1]
|
| closedH = h30[1]
|
| closedL = l30[1]
|
| closedC = c30[1]
|
|
|
| if not na(closedO) and not na(closedC)
|
| array.unshift(bufO, closedO)
|
| array.unshift(bufH, closedH)
|
| array.unshift(bufL, closedL)
|
| array.unshift(bufC, closedC)
|
|
|
| if array.size(bufO) > len
|
| array.pop(bufO)
|
| array.pop(bufH)
|
| array.pop(bufL)
|
| array.pop(bufC)
|
|
|
|
|
| var bool didPrefill = false
|
| if not didPrefill
|
| maxScanBars = 2000
|
| var float[] tO = array.new_float()
|
| var float[] tH = array.new_float()
|
| var float[] tL = array.new_float()
|
| var float[] tC = array.new_float()
|
|
|
| for i = 1 to maxScanBars
|
| if bar_index - i < 0
|
| break
|
| if time("30")[i] != time("30")[i+1]
|
| co = o30[i+1]
|
| ch = h30[i+1]
|
| cl = l30[i+1]
|
| cc = c30[i+1]
|
| if not na(co) and not na(cc)
|
| array.push(tO, co)
|
| array.push(tH, ch)
|
| array.push(tL, cl)
|
| array.push(tC, cc)
|
| if array.size(tO) >= len
|
| break
|
|
|
| if array.size(tO) > 0
|
| bufO := array.new_float()
|
| bufH := array.new_float()
|
| bufL := array.new_float()
|
| bufC := array.new_float()
|
| for j = array.size(tO) - 1 to 0 by -1
|
| array.push(bufO, array.get(tO, j))
|
| array.push(bufH, array.get(tH, j))
|
| array.push(bufL, array.get(tL, j))
|
| array.push(bufC, array.get(tC, j))
|
| while array.size(bufO) < len
|
| array.push(bufO, na)
|
| array.push(bufH, na)
|
| array.push(bufL, na)
|
| array.push(bufC, na)
|
| didPrefill := true
|
|
|
|
|
| tf_sec = 30 * 60
|
| curr30_open_time = math.floor(time / 1000 / tf_sec) * tf_sec * 1000
|
|
|
| var float liveO = na
|
| var float liveH = na
|
| var float liveL = na
|
| var float liveC = na
|
|
|
| if na(liveO) or time == curr30_open_time
|
| liveO := open
|
| liveH := high
|
| liveL := low
|
|
|
| liveH := math.max(liveH, high)
|
| liveL := math.min(liveL, low)
|
| liveC := close
|
|
|
|
|
| var box[] bodies = array.new_box()
|
| var line[] wicks = array.new_line()
|
|
|
| if barstate.isfirst
|
|
|
| for i = 0 to len
|
| array.push(bodies, na)
|
| array.push(wicks, na)
|
|
|
|
|
| anchor = bar_index
|
| for i = 0 to len
|
| _o = i == 0 ? liveO : array.get(bufO, i - 1)
|
| _h = i == 0 ? liveH : array.get(bufH, i - 1)
|
| _l = i == 0 ? liveL : array.get(bufL, i - 1)
|
| _c = i == 0 ? liveC : array.get(bufC, i - 1)
|
|
|
| if na(_o) or na(_c)
|
| continue
|
|
|
| hi = math.max(_o, _c)
|
| lo = math.min(_o, _c)
|
|
|
| xL = anchor + offset + (len - i + 1) * spacing
|
| xR = xL + 2
|
| xM = xL + 1
|
|
|
| _bg = _c >= _o ? bullColor : bearColor
|
|
|
|
|
| body = array.get(bodies, i)
|
| if na(body)
|
| body := box.new(xL, hi, xR, lo, border_color=borderCol, bgcolor=_bg)
|
| array.set(bodies, i, body)
|
| else
|
| box.set_left(body, xL)
|
| box.set_right(body, xR)
|
| box.set_top(body, hi)
|
| box.set_bottom(body, lo)
|
| box.set_bgcolor(body, _bg)
|
|
|
|
|
| wick = array.get(wicks, i)
|
| if na(wick)
|
| wick := line.new(xM, _h, xM, _l, width=1, color=wickColor)
|
| array.set(wicks, i, wick)
|
| else
|
| line.set_x1(wick, xM)
|
| line.set_x2(wick, xM)
|
| line.set_y1(wick, _h)
|
| line.set_y2(wick, _l)
|
|
|