Order Block Finder

DasanC · study · 107 行 · 点赞 6,034 · TradingView 原页

本页源码来自 TradingView 公开发布的开源脚本,版权归原作者所有, 请遵循其原始许可(Pine 脚本常见 CC BY-NC-SA / MPL-2.0 / MIT)。 本项目仅用于研究检索与许可范围内的移植。

Pine Script

//@version=4
study("Order Block Finder", overlay = true)       
tip1 = "Indicator to help identify instituational Order Blocks (OB). OBs often signal the beginning of a strong move. There is a high probability that OB price levels will be revisited in the future and are interesting levels to place limit orders. Bullish Order block is the last down candle before a sequence of up candles. Bearish Order Block is the last up candle before a sequence of down candles."
tip2 = "!Experimental!\nFind Order Blocks from different timeframes. Channels prices are accurate, but arrow position is not. Most useful when selecting a timeframe higher than the chart."
tip3 = "Required number of subsequent candles in the same direction to identify Order Block"
tip4 = "Measured from from potential OB close to close of first candle in sequence"
dummy = input(true,"Hover over ( ! ) for documentation", tooltip = tip1)
colors    = input("LIGHT","Color Scheme", options=["DARK", "LIGHT"])
//res = input("","Order Block Timeframe",input.resolution,tooltip=tip2)
periods   = input(7,     "Relevant Periods to identify OB",tooltip=tip3)    // Required number of subsequent candles in the same direction to identify Order Block
threshold = input(0.0,   "Min. Percent move for valid OB", step = 0.1, tooltip=tip4)      // Required minimum % move (from potential OB close to last subsequent candle to identify Order Block)
bull_channels =  input(2, "Number of Bullish Channels to show")             // Num of channels
bear_channels = input(2, "Number of Bearish Channels to show")              // Num of channels
 
 
//Data Curation
res = ""
[copen,chigh,clow,cclose] = security(syminfo.tickerid,res,[open,high,low,close],barmerge.gaps_on, barmerge.lookahead_off)
 
 
ob_period = periods + 1                                                     // Identify location of relevant Order Block candle
absmove   = ((abs(cclose[ob_period] - cclose[1]))/cclose[ob_period]) * 100     // Calculate absolute percent move from potential OB to last candle of subsequent candles
relmove   = absmove >= threshold                                            // Identify "Relevant move" by comparing the absolute move to the threshold
 
// Color Scheme
bullcolor = colors == "DARK"? color.white : color.green
bearcolor = colors == "DARK"? color.blue : color.red
 
// Bullish Order Block Identification
bullishOB = cclose[ob_period] < copen[ob_period]                              // Determine potential Bullish OB candle (red candle)
 
int upcandles  = 0
for i = 1 to periods
    upcandles := upcandles + (cclose[i] > copen[i]? 1 : 0)                    // Determine color of subsequent candles (must all be green to identify a valid Bearish OB)
 
OB_bull      = bullishOB and (upcandles == (periods)) and relmove           // Identification logic (red OB candle & subsequent green candles)
OB_bull_chigh = OB_bull? chigh[ob_period] : na                                // Determine OB upper limit (Open or High depending on input)
OB_bull_clow  = OB_bull? clow[ob_period]  : na                                // Determine OB clower limit (Low)
OB_bull_avg  = (OB_bull_chigh + OB_bull_clow)/2                               // Determine OB middle line
 
 
// Bearish Order Block Identification
bearishOB = cclose[ob_period] > copen[ob_period]                              // Determine potential Bearish OB candle (green candle)
 
int downcandles  = 0
for i = 1 to periods
    downcandles := downcandles + (cclose[i] < copen[i]? 1 : 0)                // Determine color of subsequent candles (must all be red to identify a valid Bearish OB)
 
OB_bear      = bearishOB and (downcandles == (periods)) and relmove         // Identification logic (green OB candle & subsequent green candles)
OB_bear_chigh = OB_bear? chigh[ob_period] : na                                // Determine OB upper limit (High)
OB_bear_clow  = OB_bear? clow[ob_period] : na                                 // Determine OB clower limit (Open or Low depending on input)
OB_bear_avg  = (OB_bear_clow + OB_bear_chigh)/2                               // Determine OB middle line
 
 
// Plotting
plotshape(OB_bull, title="Bullish OB", style = shape.triangleup,   color = bullcolor, textcolor = bullcolor, size = size.tiny, location = location.belowbar, offset = -ob_period, text = "Bull")     // Bullish OB Indicator
bull1 = plot(OB_bull_chigh, title="Bullish OB High", style = plot.style_linebr, color = bullcolor, offset = -ob_period, linewidth = 2)                                               // Bullish OB Upper Limit
bull2 = plot(OB_bull_clow,  title="Bullish OB Low",  style = plot.style_linebr, color = bullcolor, offset = -ob_period, linewidth = 2)                                               // Bullish OB Lower Limit
fill(bull1, bull2, color=bullcolor, transp = 50, title = "Bullish OB fill")                                                                                                          // Fill Bullish OB
plotshape(OB_bull_avg, title="Bullish OB Average", style = shape.cross,   color = bullcolor, size = size.small, location = location.absolute, offset = -ob_period)                 // Bullish OB Average
 
 
plotshape(OB_bear, title="Bearish OB", style = shape.triangledown, color = bearcolor, textcolor = bearcolor,  size = size.tiny, location = location.abovebar, offset = -ob_period, text = "Bear")     // Bearish OB Indicator
bear1 = plot(OB_bear_clow,  title="Bearish OB Low",  style = plot.style_linebr, color = bearcolor, offset = -ob_period, linewidth = 2)                                                // Bearish OB Lower Limit
bear2 = plot(OB_bear_chigh, title="Bearish OB High", style = plot.style_linebr, color = bearcolor, offset = -ob_period, linewidth = 2)                                                // Bearish OB Upper Limit
fill(bear1, bear2, color=bearcolor, transp = 50, title = "Bearish OB fill")                                                                                                           // Fill Bearish OB
plotshape(OB_bear_avg, title="Bearish OB Average", style = shape.cross,   color = bearcolor, size = size.small, location = location.absolute, offset = -ob_period)                  // Bullish OB Average
 
var LineBullAvg = array.new_line()
var LineBullHigh = array.new_line()
var LineBullLow = array.new_line()
var LineBearAvg = array.new_line()
var LineBearHigh = array.new_line()
var LineBearLow = array.new_line()
 
sync = time_close(res)
 
if OB_bull and bull_channels>0
    if array.size(LineBullAvg) == bull_channels
        line.delete(array.get(LineBullAvg,0))
        array.remove(LineBullAvg,0)
        line.delete(array.get(LineBullHigh,0))
        array.remove(LineBullHigh,0)
        line.delete(array.get(LineBullLow,0))
        array.remove(LineBullLow,0)
    
    array.push(LineBullAvg,line.new(x1 = sync, xloc=xloc.bar_time, y1 = OB_bull_avg, x2 = sync[1], y2 = OB_bull_avg, extend = extend.left, color = bullcolor, style = line.style_solid, width = 1))
    array.push(LineBullHigh,line.new(x1 = sync, xloc=xloc.bar_time,y1 = OB_bull_chigh, x2 = sync[1], y2 = OB_bull_chigh, extend = extend.left, color = bullcolor, style = line.style_dashed, width = 1))
    array.push(LineBullLow,line.new(x1 = sync, xloc=xloc.bar_time, y1 = OB_bull_clow, x2 = sync[1], y2 = OB_bull_clow, extend = extend.left, color = bullcolor, style = line.style_dashed, width = 1))
 
if OB_bear and bear_channels>0
    if array.size(LineBearAvg) == bear_channels
        line.delete(array.get(LineBearAvg,0))
        array.remove(LineBearAvg,0)
        line.delete(array.get(LineBearHigh,0))
        array.remove(LineBearHigh,0)
        line.delete(array.get(LineBearLow,0))
        array.remove(LineBearLow,0)
    
    array.push(LineBearAvg,line.new(x1 = sync, xloc=xloc.bar_time, y1 = OB_bear_avg, x2 = sync[1], y2 = OB_bear_avg, extend = extend.left, color = bearcolor, style = line.style_solid, width = 1))
    array.push(LineBearHigh,line.new(x1 = sync, xloc=xloc.bar_time, y1 = OB_bear_chigh, x2 = sync[1], y2 = OB_bear_chigh, extend = extend.left, color = bearcolor, style = line.style_dashed, width = 1))
    array.push(LineBearLow,line.new(x1 = sync, xloc=xloc.bar_time, y1 = OB_bear_clow, x2 = sync[1], y2 = OB_bear_clow, extend = extend.left, color = bearcolor, style = line.style_dashed, width = 1))
 
 
// Alerts for Order Blocks Detection
alertcondition(OB_bull, title='New Bullish OB detected', message='New Bullish OB detected - This is NOT a BUY signal!')
alertcondition(OB_bear, title='New Bearish OB detected', message='New Bearish OB detected - This is NOT a SELL signal!')

← 返回列表