La stratégie Sizeblock est une stratégie de trading basée sur le pourcentage ou l'écart de tick des changements de prix affichés dans les lignes diagonales. Elle peut clairement montrer les tendances locales et les points d'inversion sur le graphique.
Le calcul est effectué sur la base du pourcentage ou de l'écart de cote de la variation des prix (indiqué dans le paramètre
La ligne se compose de la ligne médiane de base, des limites supérieure et inférieure:
La ligne médiane de base est égale aux limites supérieures ou inférieures de la ligne précédente (si le prix change rapidement dans un intervalle de temps, alors la ligne médiane de base de la ligne actuelle est supérieure à la limite supérieure de la ligne précédente ou inférieure à la limite inférieure de la ligne précédente d'un nombre égal de déviations selon le sens du mouvement des prix).
Le paramètre
La règle pour construire une nouvelle ligne:
Si la clôture ≥ la limite supérieure et la clôture > ouverte, la limite supérieure augmentera progressivement et la limite inférieure augmentera également, mais moins.
Si la limite inférieure ≤ la limite inférieure et la limite de fermeture < ouverte, la limite inférieure baissera progressivement et la limite supérieure baissera également, mais moins.
En ajustant certains écarts, vous pouvez voir clairement la tendance locale et les points d'inversion sur le graphique.
Visualiser les tendances des variations de prix et identifier clairement les supports et les résistances.
Les lignes diagonales montrent clairement la force des éruptions et la gamme des retraits.
La pente des lignes diagonales peut être ajustée au besoin pour identifier des tendances de force différente.
Peut trouver un soutien et une résistance relativement importants pour les éruptions.
Il est facile de voir les changements de rythme des prix et d'ajuster la taille de la position en conséquence.
Les lignes diagonales ne peuvent pas prédire complètement avec précision les mouvements de prix ultérieurs.
Il faut surveiller les divergences dans les tendances où les lignes diagonales peuvent diverger des prix réels.
Ne peut pas être utilisé comme une stratégie isolée, il faut intégrer d'autres indicateurs pour déterminer la tendance majeure.
Des ajustements de paramètres inappropriés peuvent entraîner une négociation trop fréquente.
Il faut se méfier des potentiels retours en arrière pendant les retraits au lieu de courir aveuglément après les tendances mécaniquement.
Peut réduire modérément le dimensionnement des positions et se référer à d'autres indicateurs comme jugement auxiliaire dans les grandes tendances.
Peut ajouter des modules de gestion de position pour ajuster dynamiquement les positions à différentes étapes de tendance.
Peut intégrer des indicateurs de volatilité pour réduire les positions lorsque la volatilité augmente.
Peut définir un stop loss basé sur le pourcentage de retrait pour contrôler les pertes uniques.
Peut ajouter des filtres pour mettre en pause la négociation lorsque des divergences de prix se produisent.
Peut diviser les pentes diagonales en plusieurs niveaux pour identifier les changements de tendance de force différente.
En ajustant dynamiquement les positions, en définissant des arrêts et des filtres, vous pouvez suivre plus régulièrement les tendances des prix.
La stratégie Sizeblock utilise des lignes diagonales pour afficher intuitivement les changements de tendance des prix et identifier clairement les niveaux de support, de résistance et de rupture. Mais elle ne peut pas se fier uniquement aux lignes diagonales pour le jugement, elle doit incorporer l'analyse d'autres indicateurs et gérer les risques. C'est un outil auxiliaire très précieux pour aider les traders à mieux comprendre le rythme du marché.
/*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! ;> // *********************