Strategi Blok Trend


Tarikh penciptaan: 2023-11-06 09:20:34 Akhirnya diubah suai: 2023-11-06 09:20:34
Salin: 1 Bilangan klik: 612
1
fokus pada
1617
Pengikut

Strategi Blok Trend

Gambaran keseluruhan

Strategi blok trend adalah strategi perdagangan berdasarkan peratusan perubahan harga atau titik lompatan. Ia dapat memaparkan trend tempatan dan titik-titik perubahan dengan jelas pada carta. Ini adalah alat yang sangat berguna untuk mengesan arah harga.

Prinsip

Kaedah ini dikira berdasarkan peratusan perubahan harga atau bias titik lompatan (dinyatakan dalam parameter bias tiub tiub tiub) dan ditunjukkan dalam bentuk garisan diagonal pada carta.

Setiap baris terdiri daripada garis tengah, garis had atas dan garis had bawah:

  • Garis tengah rujukan adalah sama dengan batas atas atau bawah pada baris sebelumnya atau seterusnya (jika harga berubah dengan cepat dalam selang masa, maka garis tengah rujukan pada baris semasa akan lebih besar daripada batas atas baris sebelumnya atau lebih kecil daripada batas bawah baris seterusnya dengan satu jumlah yang sama, bergantung kepada arah perubahan harga). Pada permulaan pengiraan, garis tengah rujukan adalah sama dengan nilai awal baris pertama.

  • Parameter pengaliran pengaliran pengaliran pengaliran pengaliran pengaliran pengaliran pengaliran pengaliran pengaliran pengaliran

Peraturan untuk membina baris baru:

  • Jika harga penutupan ≥ garisan atas dan harga penutupan> harga pembukaan, garisan atas akan bergerak ke atas secara beransur-ansur, garisan bawah juga akan bergerak ke atas tetapi dengan ketara yang lebih kecil.

  • Jika harga minimum ≤ garis bawah dan harga penutupan < harga pembukaan, garis bawah akan bergerak ke bawah secara beransur-ansur, garis atas juga akan bergerak ke bawah tetapi dengan ketara yang lebih kecil.

Dengan menyesuaikan bias, anda dapat melihat dengan jelas trend dan titik-titik perubahan tempatan pada carta. Ini adalah alat yang sangat berguna untuk mengesan pergerakan harga.

Analisis kelebihan

  • Untuk memvisualisasikan trend perubahan harga dan mengenal pasti sokongan dan rintangan.

  • Garis sudut dapat dengan jelas menunjukkan kekuatan penembusan dan ruang lingkup pengulangan.

  • Trend yang berbeza-beza intensiti boleh dikenal pasti dengan menyesuaikan kemiringan pada garisan sudut.

  • Ia adalah satu cara untuk mencari sokongan yang lebih besar dan memecahkannya.

  • Ia boleh dilihat dengan mudah dengan perubahan kadar harga dan dengan itu anda boleh menyesuaikan kedudukan anda.

Analisis risiko

  • Garis sudut tidak dapat meramalkan pergerakan harga seterusnya dengan tepat.

  • Ia perlu diwaspadai bahawa terdapat perbezaan dalam trend, yang mungkin berbeza dengan garis sudut dan harga sebenar.

  • Tidak boleh digunakan sebagai strategi bersendirian, ia perlu digabungkan dengan petunjuk lain untuk menilai trend besar.

  • Perlu diingat bahawa penyesuaian parameter yang tidak betul boleh menyebabkan perdagangan yang terlalu kerap.

  • Kemungkinan perlu berjaga-jaga apabila dipanggil semula, tidak boleh dilacak secara membabi buta oleh mesin.

Anda boleh mengurangkan saiz kedudukan anda dengan betul, sambil merujuk kepada petunjuk lain sebagai penilaian tambahan, untuk beroperasi di bawah trend besar.

Arah pengoptimuman

  • Anda boleh menambah modul pengurusan kedudukan untuk menyesuaikan kedudukan secara dinamik pada tahap trend yang berbeza.

  • Ia boleh digabungkan dengan indikator kadar turun naik untuk menurunkan kedudukan apabila turun naik meningkat.

  • Anda boleh menetapkan titik henti untuk mengawal kerugian tunggal berdasarkan kadar penarikan balik.

  • Anda boleh menambah penapis untuk menghentikan perdagangan jika harga tidak sesuai.

  • Anda boleh membahagikan kemiringan sudut dengan pelbagai peringkat untuk mengenal pasti perubahan trend dengan intensiti yang berbeza.

Dengan menyesuaikan kedudukan secara dinamik, anda boleh menjejaki trend harga dengan lebih stabil dengan menetapkan keadaan berhenti dan penapis.

ringkaskan

Strategi blok trend menggunakan garis diagonal untuk memaparkan perubahan trend harga secara langsung, dapat mengenal pasti tahap rintangan dan penembusan yang menyokong. Tetapi tidak boleh bergantung pada penilaian yang berasingan dari garis diagonal, perlu ditambah dengan analisis komprehensif dengan petunjuk lain, sambil mengawal risiko. Ini adalah alat tambahan yang sangat berharga, dapat membantu pedagang memahami lebih baik irama pasaran.

Kod sumber strategi
/*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! ;>
// *********************