사이즈블록 전략

저자:차오장, 날짜: 2023-11-06 09:20:34
태그:

img

전반적인 설명

사이즈블록 전략은 대각선에 표시된 가격 변화의 비율 또는 틱 오차를 기반으로 하는 거래 전략이다. 이는 차트에서 지역 트렌드와 반전 지점을 명확하게 보여줄 수 있다. 이것은 가격 방향을 추적하는 데 매우 유용한 도구이다.

원칙

계산은 차트에서 줄로 표시되는 가격 움직임의 비율 또는 치크 오차 (Deviation 매개 변수에서 표시) 에 기초합니다.

행은 기본 중선, 상위와 하위 경계로 구성됩니다.

  • 기본 중간 선은 이전 행의 상위 또는 하위 경계선과 같습니다 (값이 한 시간 간격에서 빠르게 변하면 현재 행의 기본 중간 선은 이전 행의 상위 경계선보다 크거나 가격 움직임 방향에 따라 동일한 수의 오차로 이전 행의 하위 경계선보다 작습니다). 계산의 시작에서 기본 중간 선은 첫 번째 행의 초기 값과 같습니다.

  • Quantity 매개 변수는 가격 움직임의 방향에 따라 상위 또는 하위 한도의 오차를 결정하고, U-turn 매개 변수는 가격 움직임의 방향을 변경하는 오차를 결정합니다.

새로운 행을 만드는 규칙:

  • 만약 닫는 것이 상위 한계보다 높고 닫는 것이 > 열리면 상위 한계는 점차 상승하고, 하위 한계도 상승하지만 덜 증가합니다.

  • 만약 하위 한계 ≤ 하위 한계 그리고 닫기 < 열리면 하위 한계도 점차 낮아지고 상위 한계도 낮아지지만 더 낮아집니다.

특정 오차를 조정하면 차트에서 지역 트렌드와 역전 지점을 명확하게 볼 수 있습니다. 이것은 가격 방향을 추적하는 매우 유용한 도구입니다.

장점

  • 가격 변화 추세를 시각화하고 지지와 저항을 명확하게 식별합니다.

  • 직사각형 선은 튀어나오는 힘과 후퇴의 범위를 명확히 보여줍니다.

  • 대각선의 기울기는 다른 강도의 경향을 식별하기 위해 필요에 따라 조정 할 수 있습니다.

  • 상대적으로 큰 지원과 저항을 찾을 수 있습니다.

  • 가격 리듬의 변화를 쉽게 볼 수 있고 그에 따라 포지션 크기를 조정할 수 있습니다.

위험성

  • 직사각형 선은 후속 가격 움직임을 완전히 정확하게 예측할 수 없습니다.

  • 진동의 차이에 주목해야 합니다. 직선선이 실제 가격과 다를 수 있습니다.

  • 격리된 전략으로 사용할 수 없으며 주요 추세를 결정하기 위해 다른 지표를 통합해야합니다.

  • 부적절한 매개 변수 조정으로 인해 거래가 너무 자주 발생할 수 있습니다.

  • 추세를 맹목적으로 추종하는 대신 추락할 때 잠재적인 역행에 주의해야 합니다.

포지션 크기를 적당히 줄이고 주요 트렌드 내에서 보조 판단으로 다른 지표를 참조 할 수 있습니다.

최적화

  • 위치 관리 모듈을 추가하여 다른 트렌드 단계에서 위치를 동적으로 조정할 수 있습니다.

  • 변동성이 증가할 때 포지션을 줄이기 위해 변동성 지표를 포함할 수 있습니다.

  • 단 한번의 손실을 통제하기 위해 마감 비율에 따라 손해를 멈추는 것을 설정할 수 있습니다.

  • 가격 차이가 발생하면 거래를 일시 중지하는 필터를 추가할 수 있습니다.

  • 다른 강도의 트렌드 변화를 식별하기 위해 대각선 경사를 여러 수준으로 나눌 수 있습니다.

역동적으로 위치를 조정하고, 스톱과 필터를 설정함으로써, 더 안정적으로 가격 트렌드를 추적할 수 있습니다.

요약

사이즈블록 전략은 직관적으로 가격 트렌드 변화를 표시하고 지원, 저항 및 브레이크 아웃 수준을 명확하게 식별하기 위해 대각선을 사용합니다. 그러나 판단을 위해 대각선에만 의존할 수 없으며 다른 지표의 분석을 통합하고 위험을 관리해야합니다. 이것은 거래자가 시장 리듬을 더 잘 파악하는 데 도움이되는 매우 귀중한 보조 도구입니다. 최적화는 전략을 더 견고하고 효율적으로 만들 수 있으며 큰 응용 잠재력을 가지고 있습니다.


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

더 많은