A estratégia Sizeblock é uma estratégia de negociação baseada na porcentagem ou desvio de tick das mudanças de preço exibidas em linhas diagonais. Ela pode mostrar claramente tendências locais e pontos de reversão no gráfico. Esta é uma ferramenta muito útil para rastrear a direção do preço.
O cálculo baseia-se na percentagem ou no desvio de marca do movimento dos preços (indicado no parâmetro
A linha consiste na linha média de base, nos limites superior e inferior:
A linha média básica é igual aos limites superior ou inferior da linha anterior (se o preço mudar rapidamente num intervalo de tempo, então a linha média básica da linha corrente é maior que o limite superior da linha anterior ou menor que o limite inferior da linha anterior por um número igual de desvios dependendo da direção do movimento dos preços).
O parâmetro
Regra para a construção de uma nova linha:
Se o fechamento ≥ o limite superior e o fechamento > aberto, o limite superior subirá gradualmente e o limite inferior também subirá, mas menos.
Se o limite inferior ≤ o limite inferior e fechar < aberto, o limite inferior descerá gradualmente, e o limite superior também descerá, mas menos.
Ao ajustar certos desvios, você pode ver claramente a tendência local e os pontos de reversão no gráfico.
Visualizar as tendências de mudança de preços e identificar claramente o suporte e a resistência.
As linhas diagonais mostram claramente a força das rupturas e a amplitude das retrações.
A inclinação das linhas diagonais pode ser ajustada conforme necessário para identificar tendências de diferentes intensidades.
Pode encontrar um apoio e resistência relativamente grandes para a fuga.
É fácil observar as alterações no ritmo dos preços e ajustar o tamanho da posição em conformidade.
As linhas diagonais não podem prever com total precisão os movimentos subsequentes dos preços.
É necessário estar atento às divergências nas tendências em que as linhas diagonais podem divergir dos preços reais.
Não pode ser utilizada como uma estratégia isolada, é necessário incorporar outros indicadores para determinar a tendência principal.
Os ajustamentos inadequados dos parâmetros podem conduzir a negociações excessivamente frequentes.
Precisa de se preocupar com possíveis reversões durante os recuos em vez de perseguir cegamente as tendências mecanicamente.
Pode reduzir moderadamente o dimensionamento das posições e referir-se a outros indicadores como juízo auxiliar dentro das principais tendências.
Pode adicionar módulos de gestão de posições para ajustar dinamicamente as posições em diferentes fases de tendência.
Pode incorporar indicadores de volatilidade para reduzir posições quando a volatilidade aumenta.
Pode definir o stop loss com base na percentagem de drawdown para controlar perdas individuais.
Pode adicionar filtros para pausar a negociação quando ocorrem divergências de preços.
Pode dividir inclinações diagonais em vários níveis para identificar mudanças de tendência de diferentes intensidades.
Ao ajustar dinâmicamente as posições, definir paradas e filtros, pode acompanhar as tendências dos preços de forma mais constante.
A estratégia Sizeblock utiliza linhas diagonais para exibir de forma intuitiva as mudanças da tendência de preços e identificar claramente os níveis de suporte, resistência e ruptura. Mas não pode depender apenas de linhas diagonais para julgamento, precisa incorporar análise de outros indicadores e gerenciar riscos. Esta é uma ferramenta auxiliar muito valiosa para ajudar os traders a entender melhor o ritmo do mercado. A otimização pode tornar a estratégia mais robusta e eficiente com grande potencial de aplicação.
/*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! ;> // *********************