Strategi Sizeblock adalah strategi perdagangan berdasarkan peratusan atau penyimpangan tanda tanda dari perubahan harga yang dipaparkan dalam baris diagonal. Ia dapat menunjukkan dengan jelas trend tempatan dan titik pembalikan pada carta. Ini adalah alat yang sangat berguna untuk mengesan arah harga.
Pengiraan ini adalah berdasarkan peratusan atau penyimpangan tik pergerakan harga (ditunjukkan dalam parameter
Baris ini terdiri daripada garis tengah asas, had atas dan bawah:
Garis tengah asas adalah sama dengan had atas atau bawah baris sebelumnya (jika harga berubah dengan cepat dalam satu selang masa, maka garis tengah asas baris semasa adalah lebih besar daripada had atas baris sebelumnya atau kurang daripada had bawah baris sebelumnya dengan bilangan penyimpangan yang sama bergantung kepada arah pergerakan harga).
Parameter
Peraturan untuk membina baris baru:
Jika penutupan ≥ had atas dan penutupan > terbuka, had atas secara beransur-ansur akan bergerak ke atas, dan had bawah juga akan bergerak ke atas tetapi kurang.
Jika rendah ≤ had bawah dan menutup < terbuka, had bawah akan secara beransur-ansur bergerak ke bawah, dan had atas juga akan bergerak ke bawah tetapi kurang.
Dengan menyesuaikan penyimpangan tertentu, anda boleh melihat dengan jelas trend tempatan dan titik pembalikan pada carta.
Memandangkan trend perubahan harga dan mengenal pasti sokongan dan rintangan dengan jelas.
Garis diagonal jelas menunjukkan kekuatan breakouts dan julat pullbacks.
Kemiringan garis diagonal boleh diselaraskan mengikut keperluan untuk mengenal pasti trend kekuatan yang berbeza.
Dapat mencari sokongan dan rintangan yang agak besar untuk pecah.
Mudah untuk melihat perubahan dalam irama harga dan menyesuaikan saiz kedudukan dengan sewajarnya.
Garis diagonal tidak dapat meramalkan pergerakan harga seterusnya dengan tepat.
Perlu melihat perbezaan dalam trend di mana garis diagonal mungkin menyimpang dari harga sebenar.
Tidak boleh digunakan sebagai strategi yang terpencil, perlu menggabungkan penunjuk lain untuk menentukan trend utama.
Penyesuaian parameter yang tidak betul boleh membawa kepada perdagangan yang terlalu kerap.
Perlu berhati-hati terhadap potensi pembalikan semasa penarikan balik daripada menghalau trend secara automatik.
Boleh mengurangkan saiz kedudukan secara sederhana dan merujuk kepada penunjuk lain sebagai penilaian tambahan dalam trend utama.
Boleh menambah modul pengurusan kedudukan untuk menyesuaikan kedudukan secara dinamik dalam peringkat trend yang berbeza.
Boleh menggabungkan penunjuk turun naik untuk mengurangkan kedudukan apabila turun naik meningkat.
Boleh menetapkan stop loss berdasarkan peratusan pengeluaran untuk mengawal kerugian tunggal.
Boleh menambah penapis untuk menghentikan perdagangan apabila perbezaan harga berlaku.
Boleh membahagikan cerun diagonal ke dalam pelbagai tahap untuk mengenal pasti perubahan trend yang berbeza kekuatan.
Dengan menyesuaikan kedudukan secara dinamik, menetapkan berhenti dan penapis, boleh lebih mantap mengesan trend harga.
Strategi Sizeblock menggunakan garis diagonal untuk secara intuitif memaparkan perubahan trend harga dan dengan jelas mengenal pasti tahap sokongan, rintangan dan pecah. Tetapi tidak boleh hanya bergantung pada garis diagonal untuk penghakiman, perlu menggabungkan analisis dari penunjuk lain dan menguruskan risiko. Ini adalah alat tambahan yang sangat berharga untuk membantu peniaga memahami irama pasaran dengan lebih baik. Pengoptimuman dapat menjadikan strategi lebih mantap dan cekap dengan potensi aplikasi yang besar.
/*backtest start: 2023-10-06 00:00:00 end: 2023-11-05 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 // ********************************************************************************** // This code is invented and written by @StCogitans. // The idea presented in this code and the rights to this code belong to @StCogitans. // © https://www.tradingview.com/u/StCogitans // // Description. // Sizeblock - a price change strategy in the form of diagonal rows. // ********************************************************************************** // STRATEGY string NAME = 'Sizeblock' string ACRONYM = 'SB' bool OVERLAY = true int PYRAMIDING = 0 string QTY_TYPE = strategy.percent_of_equity float QTY_VALUE = 100 float CAPITAL = 100 string COM_TYPE = strategy.commission.percent float COM_VALUE = 0.1 bool ON_CLOSE = false bool BAR_MAGNIFIER = false bool OHLC = true strategy(NAME, ACRONYM, OVERLAY, pyramiding=PYRAMIDING, default_qty_type=QTY_TYPE, default_qty_value=QTY_VALUE, initial_capital=CAPITAL, commission_type=COM_TYPE, commission_value=COM_VALUE, process_orders_on_close=ON_CLOSE, use_bar_magnifier=BAR_MAGNIFIER, fill_orders_on_standard_ohlc=OHLC) // ARGUMENTS // Datetime DTstart = input(timestamp("01 Jan 2000 00:00 +0000"), 'Start time', group='Datetime') DTfinish = input(timestamp("01 Jan 2080 23:59 +0000"), 'Finish time', group='Datetime') DTperiod = true // Main dev_source = input.string('Close', title='Source', options=["Close", "HighLow"], tooltip='Price data for settlement.', group='Main') dev_type = input.string('Percentage', title='Deviation', options=['Percentage', 'Ticks'], tooltip='The type of deviation to calculate.', group='Main') dev_value = input.float(1, title='Quantity', minval=0.001, step=0.01, tooltip='Quantity to be calculated.', group='Main') dev_back = input.float(2, title='U-turn', minval=0.001, step=0.01, tooltip='Quantity for reversal.', group='Main') mode = input.string('Limit', title='Positions', options=['Limit', 'Market'], tooltip='Limit or market orders.', group='Main') direct = input.string('All', title='Direction', options=['All', 'Buy', 'Sell'], tooltip='The type of positions to be opened.', group='Main') swapping = input.bool(false, title='Swapping', tooltip='Swap points to open a new position.', group='Main') // CALCULATION SYSTEM Assembling(s, t, v, vb) => float a = open float b = close float c = s == "HighLow" ? math.round_to_mintick(high) : math.round_to_mintick(b) float d = s == "HighLow" ? math.round_to_mintick(low) : math.round_to_mintick(b) float x = math.round_to_mintick(a) x := nz(x[1], x) float _v = t == "Ticks" ? syminfo.mintick * v : v float _vb = t == "Ticks" ? syminfo.mintick * vb : vb float h = t == "Ticks" ? math.round_to_mintick(x + _v) : math.round_to_mintick(x * (1 + _v / 100)) float l = t == "Ticks" ? math.round_to_mintick(x - _v) : math.round_to_mintick(x * (1 - _v / 100)) h := nz(h[1], h) l := nz(l[1], l) if t == "Ticks" if c >= h and b > a while c >= h x := h h := math.round_to_mintick(h + _v) l := math.round_to_mintick(x - _vb) if d <= l and b < a while d <= l x := l l := math.round_to_mintick(l - _v) h := math.round_to_mintick(x + _vb) else if t == "Percentage" if c >= h and b > a while c >= h x := h h := math.round_to_mintick(h * (1 + _v / 100)) l := math.round_to_mintick(x * (1 - _vb / 100)) if d <= l and b < a while d <= l x := l l := math.round_to_mintick(l * (1 - _v / 100)) h := math.round_to_mintick(x * (1 + _vb / 100)) [x, h, l] [lx, lh, ll] = Assembling(dev_source, dev_type, dev_value, dev_back) // PLOT // Lines plot_up = plot(lh, color=color.new(color.green, 50), style=plot.style_line, linewidth=1) plot_main = plot(lx, color=color.new(color.silver, 50), style=plot.style_line, linewidth=1) plot_down = plot(ll, color=color.new(color.red, 50), style=plot.style_line, linewidth=1) // Areas fill(plot_up, plot_main, lh, lx, color.new(color.teal, 80), color.new(color.teal, 80)) fill(plot_main, plot_down, lx, ll, color.new(color.maroon, 80), color.new(color.maroon, 80)) // TRADING // Alert variables int Action = -1 int PosType = -1 int OrderType = -1 float Price = -1.0 // Direction variables bool ifBuy = direct == "All" or direct == "Buy" ? true : false bool ifSell = direct == "All" or direct == "Sell" ? true : false // Market entries if (strategy.closedtrades + strategy.opentrades == 0 or mode == "Market") and DTperiod if ((swapping and lx < nz(lx[1], lx)) or (not swapping and lx > nz(lx[1], lx))) and ifBuy Action := 1 PosType := 1 OrderType := 1 Price := math.round_to_mintick(close) strategy.entry('Long', strategy.long) if ((swapping and lx > nz(lx[1], lx)) or (not swapping and lx < nz(lx[1], lx))) and ifSell Action := 2 PosType := 2 OrderType := 1 Price := math.round_to_mintick(close) strategy.entry('Short', strategy.short) // Closing positions by market if DTperiod and mode == "Market" if direct == "Buy" and strategy.position_size > 0 if swapping and lx > nz(lx[1], lx) Action := 2 PosType := 3 OrderType := 1 Price := math.round_to_mintick(close) strategy.close('Long', comment='Close') if not swapping and lx < nz(lx[1], lx) Action := 2 PosType := 3 OrderType := 1 Price := math.round_to_mintick(close) strategy.close('Long', comment='Close') if direct == "Sell" and strategy.position_size < 0 if swapping and lx < nz(lx[1], lx) Action := 1 PosType := 3 OrderType := 1 Price := math.round_to_mintick(close) strategy.close('Short', comment='Close') if not swapping and lx > nz(lx[1], lx) Action := 1 PosType := 3 OrderType := 1 Price := math.round_to_mintick(close) strategy.close('Short', comment='Close') // Limit entries and exits if swapping and DTperiod and mode == "Limit" if strategy.position_size < 0 Action := 1 PosType := 1 OrderType := 2 Price := ll if ifBuy strategy.entry('Long', strategy.long, limit=ll) else PosType := 3 strategy.exit('Exit', limit=ll) if strategy.position_size > 0 Action := 2 PosType := 2 OrderType := 2 Price := lh if ifSell strategy.entry('Short', strategy.short, limit=lh) else PosType := 3 strategy.exit('Exit', limit=lh) if strategy.closedtrades + strategy.opentrades > 0 and strategy.position_size == 0 if ifBuy Action := 1 PosType := 1 OrderType := 2 Price := ll strategy.entry('Long', strategy.long, limit=ll) if ifSell Action := 2 PosType := 2 OrderType := 2 Price := lh strategy.entry('Short', strategy.short, limit=lh) if not swapping and DTperiod and mode == "Limit" if strategy.position_size < 0 Action := 1 PosType := 1 OrderType := 2 Price := lh if ifBuy strategy.entry('Long', strategy.long, stop=lh) else PosType := 3 strategy.exit('Exit', stop=lh) if strategy.position_size > 0 Action := 2 PosType := 2 OrderType := 2 Price := ll if ifSell strategy.entry('Short', strategy.short, stop=ll) else PosType := 3 strategy.exit('Exit', stop=ll) if strategy.closedtrades + strategy.opentrades > 0 and strategy.position_size == 0 if ifBuy Action := 1 PosType := 1 OrderType := 2 Price := lh strategy.entry('Long', strategy.long, stop=lh) if ifSell Action := 2 PosType := 2 OrderType := 2 Price := ll strategy.entry('Short', strategy.short, stop=ll) // Everything is closed and canceled if not DTperiod strategy.cancel_all() strategy.close_all(comment='Close') // Alerts // Convert to string variables string Action_Txt = Action == 1 ? "Buy" : Action == 2 ? "Sell" : na string PosType_Txt = PosType == 1 ? "Long" : PosType == 2 ? "Short" : PosType == 3 ? "Flat" : na string OrderType_Txt = OrderType == 1 ? "Market" : OrderType == 2 ? "Limit" : na string Price_Txt = Price > 0 ? str.tostring(Price) : na // Output if not (Action == nz(Action[1], Action) and Price == nz(Price[1], Price) and OrderType == nz(OrderType[1], OrderType)) and DTperiod alert('{"pair": "' + syminfo.ticker + '", "direction": "' + Action_Txt + '", "entertype": "' + OrderType_Txt + '", "position": "' + PosType_Txt + '", "price": "' + Price_Txt + '"}') // ********************* // Good job, Soldier! ;> // *********************