사이즈블록 전략은 대각선에 표시된 가격 변화의 비율 또는 틱 오차를 기반으로 하는 거래 전략이다. 이는 차트에서 지역 트렌드와 반전 지점을 명확하게 보여줄 수 있다. 이것은 가격 방향을 추적하는 데 매우 유용한 도구이다.
계산은 차트에서 줄로 표시되는 가격 움직임의 비율 또는 치크 오차 (
행은 기본 중선, 상위와 하위 경계로 구성됩니다.
기본 중간 선은 이전 행의 상위 또는 하위 경계선과 같습니다 (값이 한 시간 간격에서 빠르게 변하면 현재 행의 기본 중간 선은 이전 행의 상위 경계선보다 크거나 가격 움직임 방향에 따라 동일한 수의 오차로 이전 행의 하위 경계선보다 작습니다). 계산의 시작에서 기본 중간 선은 첫 번째 행의 초기 값과 같습니다.
새로운 행을 만드는 규칙:
만약 닫는 것이 상위 한계보다 높고 닫는 것이 > 열리면 상위 한계는 점차 상승하고, 하위 한계도 상승하지만 덜 증가합니다.
만약 하위 한계 ≤ 하위 한계 그리고 닫기 < 열리면 하위 한계도 점차 낮아지고 상위 한계도 낮아지지만 더 낮아집니다.
특정 오차를 조정하면 차트에서 지역 트렌드와 역전 지점을 명확하게 볼 수 있습니다. 이것은 가격 방향을 추적하는 매우 유용한 도구입니다.
가격 변화 추세를 시각화하고 지지와 저항을 명확하게 식별합니다.
직사각형 선은 튀어나오는 힘과 후퇴의 범위를 명확히 보여줍니다.
대각선의 기울기는 다른 강도의 경향을 식별하기 위해 필요에 따라 조정 할 수 있습니다.
상대적으로 큰 지원과 저항을 찾을 수 있습니다.
가격 리듬의 변화를 쉽게 볼 수 있고 그에 따라 포지션 크기를 조정할 수 있습니다.
직사각형 선은 후속 가격 움직임을 완전히 정확하게 예측할 수 없습니다.
진동의 차이에 주목해야 합니다. 직선선이 실제 가격과 다를 수 있습니다.
격리된 전략으로 사용할 수 없으며 주요 추세를 결정하기 위해 다른 지표를 통합해야합니다.
부적절한 매개 변수 조정으로 인해 거래가 너무 자주 발생할 수 있습니다.
추세를 맹목적으로 추종하는 대신 추락할 때 잠재적인 역행에 주의해야 합니다.
포지션 크기를 적당히 줄이고 주요 트렌드 내에서 보조 판단으로 다른 지표를 참조 할 수 있습니다.
위치 관리 모듈을 추가하여 다른 트렌드 단계에서 위치를 동적으로 조정할 수 있습니다.
변동성이 증가할 때 포지션을 줄이기 위해 변동성 지표를 포함할 수 있습니다.
단 한번의 손실을 통제하기 위해 마감 비율에 따라 손해를 멈추는 것을 설정할 수 있습니다.
가격 차이가 발생하면 거래를 일시 중지하는 필터를 추가할 수 있습니다.
다른 강도의 트렌드 변화를 식별하기 위해 대각선 경사를 여러 수준으로 나눌 수 있습니다.
역동적으로 위치를 조정하고, 스톱과 필터를 설정함으로써, 더 안정적으로 가격 트렌드를 추적할 수 있습니다.
사이즈블록 전략은 직관적으로 가격 트렌드 변화를 표시하고 지원, 저항 및 브레이크 아웃 수준을 명확하게 식별하기 위해 대각선을 사용합니다. 그러나 판단을 위해 대각선에만 의존할 수 없으며 다른 지표의 분석을 통합하고 위험을 관리해야합니다. 이것은 거래자가 시장 리듬을 더 잘 파악하는 데 도움이되는 매우 귀중한 보조 도구입니다. 최적화는 전략을 더 견고하고 효율적으로 만들 수 있으며 큰 응용 잠재력을 가지고 있습니다.
/*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! ;> // *********************