Stratégie d'achat/vente dynamique de rupture de volume de fluctuation


Date de création: 2023-12-26 11:15:31 Dernière modification: 2023-12-26 11:15:31
Copier: 0 Nombre de clics: 634
1
Suivre
1623
Abonnés

Stratégie d’achat/vente dynamique de rupture de volume de fluctuation

Aperçu

Cette stratégie utilise des jugements de volatilité en fonction des volumes d’achat et de vente sur des périodes de temps personnalisées, un filtrage en combinaison avec le VWAP périphérique et les bandes de broyage, et un suivi de tendance à haute probabilité. En introduisant un mécanisme d’arrêt et de perte dynamique, il est possible de contrôler efficacement les risques unilatéraux.

Principe de stratégie

  1. Calculer l’indicateur de volume d’achat et de vente sur une période de temps personnalisée
  • BV: quantité achetée, quantité créée par l’achat d’un point bas
  • SV: Le volume de ventes, le volume généré par les ventes de pointe.
  1. Traitement des ventes
  • Utilisation de l’EMA à 20 cycles pour lisser
  • Séparation positive et négative des ventes et des achats après traitement
  1. Déterminer la direction de l’indicateur
  • Un indicateur plus grand que 0 est positif, moins de 0 est négatif.
  1. Le VWAP et le jugement de Brin
  • Le prix est au-dessus du VWAP et l’indicateur est optimiste sur les signaux
  • Le prix est en dessous du VWAP et l’indicateur est en baisse en signe de courte durée
  1. Arrêt et arrêt dynamique
  • Pourcentage de stop loss par ATR par jour

Avantages stratégiques

  1. Les volumes d’achat et de vente peuvent refléter la dynamique réelle du marché et capturer l’énergie potentielle d’une tendance
  2. La courbe VWAP détermine la direction de la tendance du grand cycle, la courbe de Brin détermine le signal de rupture
  3. ATR dynamique avec un arrêt-stop-loss pour un maximum de profit et pour éviter les surréglages

Risque stratégique

  1. Il y a une certaine erreur dans les données sur les ventes et les achats, ce qui peut conduire à une erreur de jugement.
  2. Un seul indicateur, combiné à des jugements, peut générer de faux signaux
  3. Les paramètres de la ceinture de Brin sont mal configurés, ce qui réduit la portée de la percée.

Orientation de l’optimisation de la stratégie

  1. Optimisation de l’indicateur de volume d’achat et de vente sur plusieurs périodes
  2. Filtrer les indicateurs auxiliaires tels que l’augmentation du volume des transactions
  3. Ajustez dynamiquement le paramètre de la bande de Brin pour améliorer l’efficacité de la percée

Résumer

Cette stratégie exploite pleinement la prévisibilité des volumes d’achat et de vente, en plus de générer des signaux de haute probabilité avec VWAP et les bandes de Brent, et est une stratégie de trading quantitatif efficace et stable qui contrôle efficacement le risque grâce à un arrêt dynamique et à un arrêt de perte. L’efficacité devrait être plus évidente avec l’optimisation continue des paramètres et des règles.

Code source de la stratégie
/*backtest
start: 2022-12-19 00:00:00
end: 2023-12-25 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © original author ceyhun
//@ exlux99 update

//@version=5
strategy('Buying Selling Volume Strategy', format=format.volume, precision=0, overlay=false)

weekly_vwap = request.security(syminfo.tickerid, "W", ta.vwap(hlc3))

vi = false
customTimeframe = input.timeframe("60", group="Entry Settings")

allow_long = input.bool(true, group="Entry Settings")
allow_short = input.bool(false, group="Entry Settings")

xVolume = request.security(syminfo.tickerid, customTimeframe, volume)
xHigh = request.security(syminfo.tickerid, customTimeframe, high)
xLow = request.security(syminfo.tickerid, customTimeframe, low)
xClose = request.security(syminfo.tickerid, customTimeframe, close)

BV = xHigh == xLow ? 0 : xVolume * (xClose - xLow) / (xHigh - xLow)
SV = xHigh == xLow ? 0 : xVolume * (xHigh - xClose) / (xHigh - xLow)

vol = xVolume > 0 ? xVolume : 1
TP = BV + SV
BPV = BV / TP * vol
SPV = SV / TP * vol
TPV = BPV + SPV

tavol20 = request.security(syminfo.tickerid, customTimeframe, ta.ema(vol, 20))
tabv20= request.security(syminfo.tickerid, customTimeframe, ta.ema(BV, 20))
tasv20= request.security(syminfo.tickerid, customTimeframe, ta.ema(SV, 20))
VN = vol / tavol20
BPN = BV / tabv20 * VN * 100
SPN = SV / tasv20 * VN * 100
TPN = BPN + SPN

xbvp = request.security(syminfo.tickerid, customTimeframe,-math.abs(BPV))
xbpn = request.security(syminfo.tickerid, customTimeframe,-math.abs(BPN))
xspv = request.security(syminfo.tickerid, customTimeframe,-math.abs(SPV))
xspn = request.security(syminfo.tickerid, customTimeframe,-math.abs(SPN))

BPc1 = BPV > SPV ? BPV : xbvp
BPc2 = BPN > SPN ? BPN : xbpn
SPc1 = SPV > BPV ? SPV : xspv
SPc2 = SPN > BPN ? SPN : xspn
BPcon = vi ? BPc2 : BPc1
SPcon = vi ? SPc2 : SPc1


minus = BPcon + SPcon
plot(minus, color = BPcon > SPcon  ? color.green : color.red , style=plot.style_columns) 

length = input.int(20, minval=1, group="Volatility Settings")
src = minus//input(close, title="Source")
mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev", group="Volatility Settings")
xtasma = request.security(syminfo.tickerid, customTimeframe, ta.sma(src, length))
xstdev = request.security(syminfo.tickerid, customTimeframe, ta.stdev(src, length))
basis = xtasma
dev = mult * xstdev
upper = basis + dev
lower = basis - dev
plot(basis, "Basis", color=#FF6D00, offset = 0)
p1 = plot(upper, "Upper", color=#2962FF, offset = 0)
p2 = plot(lower, "Lower", color=#2962FF, offset = 0)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))

// Original a
longOriginal = minus > upper and BPcon > SPcon and close > weekly_vwap
shortOriginal = minus > upper and BPcon < SPcon and close< weekly_vwap



high_daily = request.security(syminfo.tickerid, "D", high)
low_daily  = request.security(syminfo.tickerid, "D", low)
close_daily = request.security(syminfo.tickerid, "D", close)

true_range = math.max(high_daily - low_daily, math.abs(high_daily - close_daily[1]), math.abs(low_daily - close_daily[1]))
atr_range = ta.sma(true_range*100/request.security(syminfo.tickerid, "D", close), 14)

ProfitTarget_Percent_long = input.float(100.0, title='TP Multiplier for Long entries ', step=0.5, step=0.5, group='Dynamic Risk Management')
Profit_Ticks_long = close + (close * (atr_range * ProfitTarget_Percent_long))/100
LossTarget_Percent_long = input.float(1.0, title='SL Multiplier for Long entries', step=0.5, group='Dynamic Risk Management')
Loss_Ticks_long = close - (close * (atr_range * LossTarget_Percent_long ))/100

ProfitTarget_Percent_short = input.float(100.0, title='TP Multiplier for Short entries ', step=0.5, step=0.5, group='Dynamic Risk Management')
Profit_Ticks_short = close - (close * (atr_range*ProfitTarget_Percent_short))/100
LossTarget_Percent_short = input.float(5.0, title='SL Multiplier for Short entries', step=0.5, group='Dynamic Risk Management')
Loss_Ticks_short = close + (close * (atr_range*LossTarget_Percent_short))/100



var longOpened_original = false
var int timeOfBuyLong = na
var float tpLong_long_original = na
var float slLong_long_original = na
long_entryx = longOriginal

longEntry_original = long_entryx and not longOpened_original 


if longEntry_original
    longOpened_original := true
    tpLong_long_original := Profit_Ticks_long
    slLong_long_original := Loss_Ticks_long
    timeOfBuyLong := time
    //lowest_low_var_sl := lowest_low

     
tpLong_trigger = longOpened_original[1] and ((close > tpLong_long_original) or (high > tpLong_long_original)) //or high > lowest_low_var_tp
slLong_Trigger = longOpened_original[1] and ((close < slLong_long_original) or (low < slLong_long_original)) //or low < lowest_low_var_sl

longExitSignal_original =   shortOriginal or tpLong_trigger or slLong_Trigger 


if(longExitSignal_original)
    longOpened_original := false
    tpLong_long_original := na
    slLong_long_original := na


if(allow_long)
    strategy.entry("long", strategy.long, when=longOriginal) 
    strategy.close("long", when= longExitSignal_original) //or shortNew

if(allow_short)
    strategy.entry("short", strategy.short, when=shortOriginal ) 
    strategy.close("short", when= longOriginal) //or shortNew