
La stratégie utilise plusieurs moyennes mobiles (VWMA), l’indice directionnel moyen (ADX) et l’indicateur de mouvement (DMI) pour capturer les opportunités dans le marché. En combinant plusieurs indicateurs techniques tels que le mouvement des prix, la direction de la tendance et le volume des transactions, la stratégie vise à trouver des points d’entrée où la tendance haussière est forte et dynamique, tout en contrôlant strictement les risques.
La stratégie multi-capital Bitcoin VWMA-ADX est capable de capturer des opportunités de hausse dans le marché Bitcoin en tenant compte de plusieurs indicateurs techniques tels que la tendance des prix, la dynamique et le volume des transactions. En même temps, les mesures de contrôle des risques strictes et les conditions de placement claires permettent de mieux contrôler les risques de la stratégie. Cependant, la stratégie présente également certaines limites, telles que l’insuffisance d’adaptation aux changements de l’environnement du marché et la stratégie d’arrêt des pertes à optimiser.
/*backtest
start: 2024-03-01 00:00:00
end: 2024-03-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Q_D_Nam_N_96
//@version=5
strategy("Long BTC Strategy", overlay=true,
default_qty_type = strategy.percent_of_equity,
default_qty_value = 100, initial_capital = 1000, currency = currency.USD)
Volume_Quartile(vol) =>
qvol1 = ta.percentile_linear_interpolation(vol, 60,15)
qvol2 = ta.percentile_linear_interpolation(vol, 60,95)
vol > qvol1 and vol < qvol2
smma(src, length) =>
smma = 0.0
smma := na(smma[1]) ? ta.sma(src, length) : (smma[1] * (length - 1) + src) / length
smma
ma(source, length, type) =>
switch type
"SMA" => ta.sma(source, length)
"EMA" => ta.ema(source, length)
"RMA" => ta.rma(source, length)
"WMA" => ta.wma(source, length)
"VWMA" => ta.vwma(source, length)
"HMA" => ta.hma(source, length)
"SMMA" => smma(source, length)
DMI(len, lensig) =>
up = ta.change(high)
down = -ta.change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
trur = ta.rma(ta.tr, len)
plus = fixnan(100 * ta.rma(plusDM, len) / trur)+11
minus = fixnan(100 * ta.rma(minusDM, len) / trur)-11
sum = plus + minus
adx = 100 * ta.vwma(math.abs(plus - minus-11) / (sum == 0 ? 1 : sum), lensig)
[adx, plus, minus]
cond1 = Volume_Quartile(volume*hlcc4)
ma1 = ma(close,9, "VWMA")
// plot(ma1, color = color.blue)
ma2 = ma(close,14, "VWMA")
// plot(ma2, color = color.orange)
n = switch timeframe.period
"240" => 0.997
=> 0.995
ma3 = (0.1*ma(ta.highest(close,89),89, "VWMA") +
0.9*ma(ta.lowest(close,89),89, "VWMA"))*n
plot(ma3, color = color.white)
[adx, plus, minus] = DMI(7, 10)
cond2 = adx > 18 and plus - math.abs(minus) > 15
var int count = 0
if barstate.isconfirmed and strategy.position_size != 0
count += 1
else
count := 0
p_roc = 0
if timeframe.period == '240'
p_roc := 14
else
p_roc := 10
longCondition = ta.crossover(ma1, ma2) and (close > open ? close > ma3 : open > ma3) and ((ma3 - ma3[1])*100/ma3[1] >= -0.2) and ((close-close[p_roc])*100/close[p_roc] > -2.0)
float alpha = 0.0
float sl_src = high[1]
if (longCondition and cond1 and cond2 and strategy.position_size == 0)
strategy.entry("buy", strategy.long)
if timeframe.period == '240'
alpha := 0.96
strategy.exit("exit-buy","buy", stop = sl_src*alpha)
// line.new(bar_index, sl_src*alpha, bar_index+5, sl_src*alpha, width = 2, color = color.white)
else if timeframe.period == '30'
alpha := 0.985
strategy.exit("exit-buy","buy", stop = sl_src*alpha)
// line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
else if timeframe.period == '45'
alpha := 0.985
strategy.exit("exit-buy","buy", stop = sl_src*alpha)
// line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
else if timeframe.period == '60'
alpha := 0.98
strategy.exit("exit-buy","buy", stop = sl_src*alpha)
// line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
else if timeframe.period == '120'
alpha := 0.97
strategy.exit("exit-buy","buy", stop = sl_src*alpha)
// line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
else if timeframe.period == '180'
alpha := 0.96
strategy.exit("exit-buy","buy", stop = sl_src*alpha)
// line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
else if timeframe.period == 'D'
alpha := 0.95
strategy.exit("exit-buy","buy", stop = sl_src*alpha)
// line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
else
alpha := 0.93
strategy.exit("exit-buy","buy", stop = sl_src*alpha)
// line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
period = switch timeframe.period
"240" => 90
"180" => 59
"120" => 35
"30" => 64
"45" => 40
"60" => 66
"D" => 22
=> 64
if (count > period or close < ma3)
strategy.close('buy', immediately = true)