Strategi terobosan momentum berdasarkan blok pesanan


Tanggal Pembuatan: 2024-02-26 11:54:02 Akhirnya memodifikasi: 2024-02-26 11:54:02
menyalin: 0 Jumlah klik: 1077
1
fokus pada
1617
Pengikut

Strategi terobosan momentum berdasarkan blok pesanan

Ringkasan

Strategi ini dilakukan dengan mengidentifikasi blok order dalam harga untuk mencari kisaran harga yang memiliki momentum terobosan, dan memasuki pasar ketika sinyal beli dan jual muncul. Blok order menandai area di mana lembaga berpartisipasi, yang merupakan manifestasi kekuatan pasar yang lebih besar. Oleh karena itu, ketika sinyal blok order muncul, ada kemungkinan lebih tinggi untuk perubahan harga yang berorientasi.

Prinsip Strategi

Identifikasi blok pesanan

Blok pesanan terbagi menjadi dua jenis, yaitu Blok pesanan bertopeng dan Blok pesanan kosong. Blok pesanan bertopeng didefinisikan sebagai Blok pesanan bertopeng yang diikuti oleh Blok pesanan bertopeng yang diikuti oleh Blok pesanan bertopeng yang diikuti oleh Blok pesanan bertopeng yang diikuti oleh Blok pesanan bertopeng yang diikuti oleh Blok pesanan bertopeng yang diikuti oleh Blok pesanan bertopeng yang diikuti oleh Blok pesanan bertopeng yang diikuti oleh Blok pesanan bertopeng yang diikuti oleh Blok pesanan bertopeng yang diikuti oleh Blok pesanan bertopeng yang diikuti oleh Blok pesanan bertopeng yang diikuti oleh Blok pesanan bertopeng yang diikuti oleh Blok pesanan bertopeng yang diikuti oleh Blok pesanan bertopeng yang diikuti oleh Blok pesanan bertopeng yang diikuti oleh Blok pesanan bertopeng yang diikuti oleh Blok pesanan bertopeng yang diikuti oleh Blok pesanan bertopeng yang diikuti oleh Blok pesanan bertopeng.

Untuk mengidentifikasi blok pesanan, beberapa persyaratan harus dipenuhi:

  1. Perubahan warna garis K: dari garis K sebelumnya ke garis K saat ini, warna garis K berubah (misalnya dari merah menjadi hijau, atau dari hijau menjadi merah). Ini menunjukkan tren yang mungkin ada sebelum lembaga berakhir, siap untuk memulai tren baru.

  2. Garis-garis K berikutnya berwarna sama: setelah mencapai akar yang ditentukan oleh parameter period, garis-garis K berikutnya tetap memiliki arah warna yang sama (misalnya, semua garis K hijau di belakang blok pesanan multihead). Ini menunjukkan bahwa tren baru diperkuat dan dikonfirmasi.

  3. Penurunan lebih dari ambang batas: Penurunan lebih dari ambang batas yang ditetapkan pada parameter ((default0)) dari harga pembukaan blok pesanan ke harga penutupan K-line berikutnya. Ini memastikan bahwa tren baru memiliki kekuatan dan pengaruh yang cukup.

Ketika ketiga kondisi di atas terpenuhi secara bersamaan, maka dapat dipastikan bahwa sebuah sinyal order block dapat diidentifikasi.

Penciptaan sinyal perdagangan

Ketika identifikasi blok multi-headed order, menghasilkan sinyal beli; Ketika identifikasi blok kosong-headed order, menghasilkan sinyal jual

Mengingat ketidakpastian sinyal blok pesanan dan kemungkinan pengujian ulang, strategi ini tidak masuk ke pasar secara langsung saat sinyal blok pesanan muncul, tetapi mengingatkan pedagang dengan cara seperti garis garis, alarm, dll. Pedagang dapat memilih untuk menempatkan harga batas yang sesuai di sekitar area harga blok pesanan dan menunggu harga untuk memasuki tren setelah dipicu.

Keunggulan Strategis

Menggunakan informasi aliran pesanan untuk mengidentifikasi volume

Blok pesanan menandai keterlibatan dana lembaga dan volume transaksi yang besar, yang mewakili konversi kekuatan pasar. Oleh karena itu, sinyal blok pesanan memiliki tingkat prediktabilitas dan akurasi tertentu, yang dapat menangkap arah terobosan potensial lebih awal. Ini memberikan posisi dan waktu yang menguntungkan untuk menaiki tren.

Parameter kebijakan dapat disesuaikan

Parameter strategi termasuk jumlah K-line historis, amplitudo momentum terobosan, dan lain-lain dapat disesuaikan dengan parameter, sehingga dapat dioptimalkan untuk berbagai lingkungan pasar dan gaya pedagang, meningkatkan adaptasi strategi.

Risiko yang Dapat Dikendalikan

Strategi ini tidak benar-benar masuk ke pasar ketika sinyal blok pesanan muncul, tetapi mengatur alarm dan membangun posisi dengan cara keluar dari batas harga. Dengan cara ini, pedagang dapat mengontrol titik masuk dan risiko tertentu. Bahkan jika sinyal blok pesanan salah, itu hanya akan menyebabkan batas harga tidak dipicu, dan risikonya dapat dikendalikan.

Risiko Strategis

Sinyal order block lebih mungkin untuk diuji ulang

Karena blok pesanan menandai satu interval, kemungkinan besar harga berikutnya akan kembali ke interval tersebut. Oleh karena itu, sinyal blok pesanan tidak dapat dianggap sebagai sinyal masuk standar, tetapi digunakan sebagai informasi peringatan dini, yang memerlukan penjual sendiri untuk menilai waktu masuk lebih lanjut.

Setting parameter yang tidak tepat dapat menyebabkan sinyal yang salah

Pengaturan parameter untuk blok pesanan (jumlah garis K sejarah, penurunan amplitudo, dll.) Jika tidak tepat, akan mudah menghasilkan sinyal palsu di interval Sideways normal. Ini membutuhkan sensitivitas dan penilaian tertentu dari pedagang terhadap pasar, untuk menghindari optimasi parameter secara membabi buta.

Setiap sinyal harus dinilai secara manual.

Karena sinyal order block tidak 100 persen dapat diandalkan, pedagang perlu melakukan analisis lebih lanjut untuk menilai keandalan sinyal saat ini saat menerima sinyal, yang meningkatkan jumlah pekerjaan manual tertentu. Pertimbangan yang berbeda tentang kualitas sinyal juga dapat menyebabkan perbedaan dalam kinerja perdagangan.

Arah optimasi strategi

Kombinasi dengan indikator lain untuk memfilter sinyal palsu

Bila sinyal order block muncul, arah dan kekuatan tren dapat dinilai dalam kombinasi dengan indikator lain, misalnya dalam kombinasi dengan MACD, RSI, dan lain-lain, untuk menyaring sinyal kesalahan yang disebabkan oleh pengaturan parameter, meningkatkan akurasi sinyal.

Pengaturan Parameter Optimasi

Berbagai pasar dan berbagai jenis perdagangan dapat menguji dan mengoptimalkan parameter seperti jumlah K-line, nilai tipis dan tipis, dan lain-lain agar lebih sesuai dengan lingkungan pasar saat ini. Anda juga dapat mengatur fungsi penyesuaian sendiri parameter, menyesuaikan secara otomatis sesuai dengan volatilitas pasar dan preferensi risiko.

Mengembangkan mekanisme masuk dan keluar otomatis

Strategi saat ini hanya sebagai alat isyarat sinyal, pedagang perlu menentukan sendiri kapan masuk. Kami dapat mengembangkan mekanisme pesanan otomatis untuk segmen harga blok pesanan, yang masuk secara otomatis ketika kondisi tertentu terpenuhi; dan menggabungkan metode seperti stop loss untuk mengatur logika keluar, mengurangi persyaratan penilaian manual, meningkatkan tingkat otomatisasi strategi.

Meringkaskan

Strategi ini memberikan posisi dan waktu yang menguntungkan untuk melakukan terobosan harga yang naik tren dengan mengidentifikasi secara efektif kisaran harga dalam konsentrasi arus pesanan dan mengeksplorasi informasi dinamis yang tersimpan di pasar. Dibandingkan dengan metode yang hanya mengikuti tren, strategi blok pesanan memiliki kemampuan dan inisiatif untuk mengenali kepala.

Kode Sumber Strategi
/*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")