この戦略は,インパクトの爆発を特定するために価格アクションのオーダーブロックを特定し,買い/売るシグナルが現れたときに市場に参入する.オーダーブロックは機関参加と重要な市場力を表している.したがって,オーダーブロック信号はトレンド価格アクションにつながる可能性が高い.
オーダーブロックには,2種類のオーダーブロックがあります.バリーッシュとベアッシュ.バリーッシュオーダーブロックは,連続した緑色のキャンドルが続く最後の赤いキャンドルで定義されます.ベアッシュオーダーブロックは,連続した赤色のキャンドルが続く最後の緑色のキャンドルです.
注文ブロックを特定するには,次の条件が同時に満たされなければならない.
ろうそくの色の変化 - ろうそくの色が前のろうそくから現在のろうそくに変化する (例えば,赤から緑,または緑から赤).これは,機関が前のトレンドを終了し,新しい潜在的なトレンドを開始していることを示唆する.
後で一貫した方向性 - 次のキャンドルは,パラメータに指定された期間 (例えば,潜在的な上昇ブロックの後にすべての緑色のキャンドル) の数で同じ色の方向性を保持します.これは新しい傾向を確認します.
ブレイクアウトが
3つの基準がすべて正しい場合,オーダーブロック信号が識別されます.
買い信号は上昇オーダーブロックの検出時に生成される. 売り信号は下落オーダーブロックの識別時に発生する.
オーダーフロー信号の不確実性を考慮すると,この戦略はすぐに市場に参入しない.これはトレーダーに警告し,代わりにオーダーブロックレベルに近い価格制限オーダーを配置することを可能にします.これは制御されたエントリーとリスク管理を提供します.
オーダーブロックは,機関的な貨幣流と実質的なボリュームを表現する.それらは市場力の変化を示し,潜在的なブレイクアウト方向への初期の手がかりを提供します.これは適切なタイミングでトレンドに従うことを容易にする.
キャンドル数,ブレイクアウトパーセントなどを制御するパラメータは,変化する市場状況と取引スタイルに最適化するために調整できます. これにより適応性が向上します.
シグナルを自動入力せず,代わりにリミットオーダーを使用することで,トレーダーはエントリーレベルを定義し,リスクを制御することができます.失敗したシグナルは単に満たされていないリミットオーダーにつながります.リスクは抑えられています.
オーダーブロックがゾーンを表示しているため,価格がレベルを再確認することは一般的です.シグナルは直接エントリーとして見るべきではありません.さらなるタイミング判断が必要です.
パラメータが正しく設定されていない場合,範囲限定市場では偽信号が出現する可能性があります.トレーダーは信号の適用に慎重に行動する必要があります.盲目最適化を避ける必要があります.
信号の品質に関する人間の判断に不一致性がある場合,性能が異なることがあります.
MACD や RSI などの追加指標をシグナルが市場状況を測定しているように見えるときに組み込む.これは悪いパラメータ設定から悪いシグナルをフィルターします.
パラメータは,異なる市場や楽器に合わせてテストされ,調整され,より適性を高める. 変動性とリスク耐性に基づいて自動調整するために適応性設定も実装できます.
現在,この戦略は信号アラートとしてのみ機能している.信号の制限順序入力を自動化し,出口の停止を実装するために論理を追加することができる.これは自動化を増やし,人間の判断への依存を減らす.
この戦略は,オーダーフローの収束を検知することで,表面の下にある隠れたモメントの動きを明らかにする.単純なトレンドフォローと比較して,ターニングポイントを特定する予測能力を持っています.最適化とリスク制御技術と組み合わせると,効果的なトレンド取引システムになることができます.それでも,トレーダーは悪い信号に注意して,各信号の品質を評価する必要があります.さらなる努力は主観的裁量によるバイアスを最小限に抑えるための自動化を強化することに焦点を当てるべきです.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © TradingSecrets and wugamlo // This experimental Indicator helps identifying instituational Order Blocks. // Often these blocks signal the beginning of a strong move, but there is a significant probability that these price levels will be revisited at a later point in time again. // Therefore these are interesting levels to place limit orders (Buy Orders for Bullish OB / Sell Orders for Bearish OB). // // A Bullish Order block is defined as the last down candle before a sequence of up candles. (Relevant price range "Open" to "Low" is marked) / Optionally full range "High" to "Low" // A Bearish Order Block is defined as the last up candle before a sequence of down candles. (Relevant price range "Open" to "High" is marked) / Optionally full range "High" to "Low" // // In the settings the number of required sequential candles can be adjusted. // Furthermore a %-threshold can be entered. It defines which %-change the sequential move needs to achieve in order to identify a relevant Order Block. // Channels for the last Bullish/Bearish Block can be shown/hidden. // // In addition to the upper/lower limits of each Order Block, also the equlibrium (average value) is marked as this is an interesting area for price interaction. // // Alerts added: Alerts fire when an Order Block is detected. The delay is based on the "Relevant Periods" input. Means with the default setting "5" the alert will trigger after the // number of consecutive candles is reached. //@version=4 strategy("[Backtest] Order Block Finder", overlay = true) colors = input(title = "Color Scheme", defval="DARK", options=["DARK", "BRIGHT"]) periods = input(5, "Relevant Periods to identify OB") // Required number of subsequent candles in the same direction to identify Order Block threshold = input(0.0, "Min. Percent move to identify OB", step = 0.1) // Required minimum % move (from potential OB close to last subsequent candle to identify Order Block) usewicks = input(false, "Use whole range [High/Low] for OB marking?" ) // Display High/Low range for each OB instead of Open/Low for Bullish / Open/High for Bearish showbull = input(false, "Show latest Bullish Channel?") // Show Channel for latest Bullish OB? showbear = input(false, "Show latest Bearish Channel?") // Show Channel for latest Bearish OB? showdocu = input(false, "Show Label for documentation tooltip?") // Show Label which shows documentation as tooltip? info_pan = input(false, "Show Latest OB Panel?") // Show Info Panel with latest OB Stats //strategy inputs plot_offset = input( type=input.bool,defval = false, title = 'Plot Offset?') stoploss_percent = input(type=input.float, defval = 1, title = 'Stop Loss [%]') takeprofit_percent = input(type=input.float, defval = 2, title = 'Take Profit [%]') pyramiding = input( type=input.bool,defval = true, title = 'Pyramiding') ob_period = periods + 1 // Identify location of relevant Order Block candle absmove = ((abs(close[ob_period] - close[1]))/close[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 = close[ob_period] < open[ob_period] // Determine potential Bullish OB candle (red candle) int upcandles = 0 for i = 1 to periods upcandles := upcandles + (close[i] > open[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_high = OB_bull? usewicks? high[ob_period] : open[ob_period] : na // Determine OB upper limit (Open or High depending on input) OB_bull_low = OB_bull? low[ob_period] : na // Determine OB lower limit (Low) OB_bull_avg = (OB_bull_high + OB_bull_low)/2 // Determine OB middle line // Bearish Order Block Identification bearishOB = close[ob_period] > open[ob_period] // Determine potential Bearish OB candle (green candle) int downcandles = 0 for i = 1 to periods downcandles := downcandles + (close[i] < open[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_high = OB_bear? high[ob_period] : na // Determine OB upper limit (High) OB_bear_low = OB_bear? usewicks? low[ob_period] : open[ob_period] : na // Determine OB lower limit (Open or Low depending on input) OB_bear_avg = (OB_bear_low + OB_bear_high)/2 // Determine OB middle line //@TradingSecrets: Option to disable the offset in order to allign signals with Backtest if not plot_offset ob_period := 0 // Plotting plotshape(OB_bull, title="Bullish OB", style = shape.triangleup, color = bullcolor, textcolor = bullcolor, size = size.tiny, location = location.belowbar, offset = -ob_period, text = "Bullish OB") // Bullish OB Indicator bull1 = plot(OB_bull_high, title="Bullish OB High", style = plot.style_linebr, color = bullcolor, offset = -ob_period, linewidth = 3) // Bullish OB Upper Limit bull2 = plot(OB_bull_low, title="Bullish OB Low", style = plot.style_linebr, color = bullcolor, offset = -ob_period, linewidth = 3) // Bullish OB Lower Limit fill(bull1, bull2, color=bullcolor, transp = 0, title = "Bullish OB fill") // Fill Bullish OB plotshape(OB_bull_avg, title="Bullish OB Average", style = shape.cross, color = bullcolor, size = size.normal, 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 = "Bearish OB") // Bearish OB Indicator bear1 = plot(OB_bear_low, title="Bearish OB Low", style = plot.style_linebr, color = bearcolor, offset = -ob_period, linewidth = 3) // Bearish OB Lower Limit bear2 = plot(OB_bear_high, title="Bearish OB High", style = plot.style_linebr, color = bearcolor, offset = -ob_period, linewidth = 3) // Bearish OB Upper Limit fill(bear1, bear2, color=bearcolor, transp = 0, title = "Bearish OB fill") // Fill Bearish OB plotshape(OB_bear_avg, title="Bearish OB Average", style = shape.cross, color = bearcolor, size = size.normal, location = location.absolute, offset = -ob_period) // Bullish OB Average var line linebull1 = na // Bullish OB average var line linebull2 = na // Bullish OB open var line linebull3 = na // Bullish OB low var line linebear1 = na // Bearish OB average var line linebear2 = na // Bearish OB high var line linebear3 = na // Bearish OB open if OB_bull and showbull line.delete(linebull1) linebull1 := line.new(x1 = bar_index, y1 = OB_bull_avg, x2 = bar_index - 1, y2 = OB_bull_avg, extend = extend.left, color = bullcolor, style = line.style_solid, width = 1) line.delete(linebull2) linebull2 := line.new(x1 = bar_index, y1 = OB_bull_high, x2 = bar_index - 1, y2 = OB_bull_high, extend = extend.left, color = bullcolor, style = line.style_dashed, width = 1) line.delete(linebull3) linebull3 := line.new(x1 = bar_index, y1 = OB_bull_low, x2 = bar_index - 1, y2 = OB_bull_low, extend = extend.left, color = bullcolor, style = line.style_dashed, width = 1) if OB_bear and showbear line.delete(linebear1) linebear1 := line.new(x1 = bar_index, y1 = OB_bear_avg, x2 = bar_index - 1, y2 = OB_bear_avg, extend = extend.left, color = bearcolor, style = line.style_solid, width = 1) line.delete(linebear2) linebear2 := line.new(x1 = bar_index, y1 = OB_bear_high, x2 = bar_index - 1, y2 = OB_bear_high, extend = extend.left, color = bearcolor, style = line.style_dashed, width = 1) line.delete(linebear3) linebear3 := line.new(x1 = bar_index, y1 = OB_bear_low, x2 = bar_index - 1, y2 = OB_bear_low, 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!') // Print latest Order Blocks in Data Window var latest_bull_high = 0.0 // Variable to keep latest Bull OB high var latest_bull_avg = 0.0 // Variable to keep latest Bull OB average var latest_bull_low = 0.0 // Variable to keep latest Bull OB low var latest_bear_high = 0.0 // Variable to keep latest Bear OB high var latest_bear_avg = 0.0 // Variable to keep latest Bear OB average var latest_bear_low = 0.0 // Variable to keep latest Bear OB low // Assign latest values to variables if OB_bull_high > 0 latest_bull_high := OB_bull_high if OB_bull_avg > 0 latest_bull_avg := OB_bull_avg if OB_bull_low > 0 latest_bull_low := OB_bull_low if OB_bear_high > 0 latest_bear_high := OB_bear_high if OB_bear_avg > 0 latest_bear_avg := OB_bear_avg if OB_bear_low > 0 latest_bear_low := OB_bear_low // Plot invisible characters to be able to show the values in the Data Window plotchar(latest_bull_high, char = ' ', location = location.abovebar, color = #777777, transp = 100, size = size.tiny, title = "Latest Bull High") plotchar(latest_bull_avg, char = ' ', location = location.abovebar, color = #777777, transp = 100, size = size.tiny, title = "Latest Bull Avg") plotchar(latest_bull_low, char = ' ', location = location.abovebar, color = #777777, transp = 100, size = size.tiny, title = "Latest Bull Low") plotchar(latest_bear_high, char = ' ', location = location.abovebar, color = #777777, transp = 100, size = size.tiny, title = "Latest Bear High") plotchar(latest_bear_avg, char = ' ', location = location.abovebar, color = #777777, transp = 100, size = size.tiny, title = "Latest Bear Avg") plotchar(latest_bear_low, char = ' ', location = location.abovebar, color = #777777, transp = 100, size = size.tiny, title = "Latest Bear Low") //InfoPanel for latest Order Blocks draw_InfoPanel(_text, _x, _y, font_size)=> var label la_panel = na label.delete(la_panel) la_panel := label.new( x=_x, y=_y, text=_text, xloc=xloc.bar_time, yloc=yloc.price, color=color.new(#383838, 5), style=label.style_label_left, textcolor=color.white, size=font_size) info_panel_x = time_close + round(change(time) * 100) info_panel_y = close title = "LATEST ORDER BLOCKS" row0 = "-----------------------------------------------------" row1 = ' Bullish - High: ' + tostring(latest_bull_high, '#.##') row2 = ' Bullish - Avg: ' + tostring(latest_bull_avg, '#.##') row3 = ' Bullish - Low: ' + tostring(latest_bull_low, '#.##') row4 = "-----------------------------------------------------" row5 = ' Bearish - High: ' + tostring(latest_bear_high, '#.##') row6 = ' Bearish - Avg: ' + tostring(latest_bear_avg, '#.##') row7 = ' Bearish - Low: ' + tostring(latest_bear_low, '#.##') panel_text = '\n' + title + '\n' + row0 + '\n' + row1 + '\n' + row2 + '\n' + row3 + '\n' + row4 + '\n\n' + row5 + '\n' + row6 + '\n' + row7 + '\n' if info_pan draw_InfoPanel(panel_text, info_panel_x, info_panel_y, size.normal) // === Label for Documentation/Tooltip === chper = time - time[1] chper := change(chper) > 0 ? chper[1] : chper // === Tooltip text === var vartooltip = "Indicator to help identifying instituational Order Blocks. Often these blocks signal the beginning of a strong move, but there is a high probability, that these prices will be revisited at a later point in time again and therefore are interesting levels to place limit orders. \nBullish Order block is the last down candle before a sequence of up candles. \nBearish Order Block is the last up candle before a sequence of down candles. \nIn the settings the number of required sequential candles can be adjusted. \nFurthermore a %-threshold can be entered which the sequential move needs to achieve in order to validate a relevant Order Block. \nChannels for the last Bullish/Bearish Block can be shown/hidden." // === Print Label === var label l_docu = na label.delete(l_docu) if showdocu l_docu := label.new(x = time + chper * 35, y = close, text = "DOCU OB", color=color.gray, textcolor=color.white, style=label.style_label_center, xloc = xloc.bar_time, yloc=yloc.price, size=size.tiny, textalign = text.align_left, tooltip = vartooltip) // @TradingSecrets: Generate entry and exit orders based on the signals entryLongSignal = OB_bull entryShortSignal = OB_bear if not pyramiding entryLongSignal := entryLongSignal and not strategy.position_size entryShortSignal := entryShortSignal and not strategy.position_size if entryLongSignal strategy.entry("Long Entry", strategy.long) //strategy.exit("Long Exit Loss", "Long Entry", stop = close * (1 - stoploss_percent*0.01)) if entryShortSignal strategy.entry("Short Entry", strategy.short) //strategy.exit("Short Exit Loss", "Short Entry", stop = close * (1 + stoploss_percent*0.01)) strategy.initial_capital = 50000 //Close Position by market order if strategy.position_size > 0 and strategy.openprofit/nz(strategy.initial_capital + strategy.netprofit) >= takeprofit_percent*0.01 //If I m in a long position and my take profit got hit close it by market order strategy.close("Long Entry", comment = "Long Exit Profit") if strategy.position_size < 0 and strategy.openprofit/nz(strategy.initial_capital + strategy.netprofit) >= takeprofit_percent*0.01 strategy.close("Short Entry", comment = "Short Exit Profit") if strategy.position_size > 0 and strategy.openprofit/nz(strategy.initial_capital + strategy.netprofit) <= -stoploss_percent*0.01 //If I m in a long position and my take profit got hit close it by market order strategy.close("Long Entry", comment = "Long Exit Loss") if strategy.position_size < 0 and strategy.openprofit/nz(strategy.initial_capital + strategy.netprofit) <= -stoploss_percent*0.01 strategy.close("Short Entry", comment = "Short Exit Loss")