
La stratégie de prix relatif est une stratégie de négociation quantitative basée sur l’anomalie du volume de transactions et les fluctuations de prix. Cette stratégie permet de juger si le volume de transactions est anormal en comparant le volume de transactions actuel avec la relation entre le volume de transactions historiques et le volume moyen.
La logique de base de la stratégie de relative quantité de prix est basée sur deux indicateurs: le volume relatif et la zone de fluctuation des prix.
Tout d’abord, nous calculons la moyenne mobile simple du volume des transactions sur les 20 derniers cycles comme étant le volume des transactions historiques. Ensuite, nous définissons un paramètre multiplicateur (par exemple, 1,5 fois) et nous considérons que le volume des transactions est anormal lorsque le volume des transactions actuelles est supérieur à 1,5 fois le volume des transactions moyennes.
Ensuite, nous calculons l’amplitude réelle moyenne (ATR) des 14 derniers cycles comme mesure de la fluctuation des prix. Nous calculons également le décalage standard de l’amplitude réelle moyenne. Si l’amplitude réelle actuelle se situe entre la valeur moyenne et un décalage standard négatif, nous considérons que la fluctuation des prix est dans une plage relativement stable.
Lorsque les deux conditions ci-dessus sont remplies simultanément, c’est-à-dire qu’il y a plus de signaux, plus de positions ouvertes. Lors de la tenue d’une position, le point le plus bas est le double de l’ATR en tant que point d’arrêt, le point le plus élevé est le double de l’ATR en tant que point d’arrêt.
Le plus grand avantage d’une stratégie de prix relatif réside dans la capture des tendances de prix entraînées par un volume de transactions anormal. Lorsque le volume de transactions augmente, cela représente un changement d’attitude des acteurs du marché, ce qui est souvent le signe d’une percée des prix et de la formation de nouvelles tendances. La stratégie permet de déterminer efficacement le moment de l’anomalie du volume de transactions en comparant le volume de transactions avec la valeur moyenne historique.
D’autre part, la stratégie prend en compte la volatilité des prix, ce qui permet aux signaux de se produire pendant les périodes de relative stabilité des prix. Cela évite le risque de pertes énormes causées par la poursuite de la hausse lors de fortes fluctuations.
Le plus grand risque de cette stratégie est que l’indicateur de volume de transactions ne peut pas déterminer à cent pour cent la nouvelle tendance, l’augmentation du volume de transactions peut être une fausse rupture et le prix peut être rapidement inversé. Dans ce cas, la stratégie est exposée à de plus grandes pertes.
Pour réduire les pertes, il est possible d’ajuster les paramètres de la quantité de cuivre par rapport à la quantité de cuivre, de définir des critères plus stricts pour juger de l’anomalie du volume des transactions. Ou d’ajouter d’autres indicateurs de jugement, tels que l’augmentation de l’analyse du volume des transactions, pour déterminer si la croissance du volume des transactions correspond au montant des transactions.
Cette stratégie peut être optimisée dans les domaines suivants:
L’ajout d’autres indicateurs de jugement, tels que les fluctuations, les volumes de transactions, etc., rend le signal de volume anormal plus fiable.
Les paramètres ATR peuvent être optimisés pour différents types d’actions, afin de déterminer plus précisément les intervalles de stabilité des prix.
L’ajout d’algorithmes d’apprentissage automatique permettant de juger positivement les anomalies de volume de transactions plutôt que de les comparer simplement avec les moyennes historiques.
L’utilisation de modèles d’apprentissage en profondeur pour déterminer les prévisions de fluctuation des prix, et pas seulement sur la base de l’ATR historique
La stratégie de la quantité relative capte l’anomalie du volume des transactions en tant que signal caractéristique et émet un signal de transaction combiné avec un jugement de stabilité des prix. La stratégie est simple et pratique, elle est plus efficace pour suivre le volume anormal des transactions en actions.
/*backtest
start: 2022-12-21 00:00:00
end: 2023-12-27 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/
// © DojiEmoji (kevinhhl)
//@version=4
strategy("[KL] Relative Volume + ATR Strategy",overlay=true,pyramiding=1)
ENUM_LONG = "Long"
// Timeframe {
backtest_timeframe_start = input(defval = timestamp("01 Apr 2016 13:30 +0000"), title = "Backtest Start Time", type = input.time)
USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)")
backtest_timeframe_end = input(defval = timestamp("01 May 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time)
within_timeframe = true
// }
len_volat = input(14,title="Length of ATR to determine volatility")
ATR_volat = atr(len_volat)
avg_ATR_volat = sma(ATR_volat, len_volat)
std_ATR_volat = stdev(ATR_volat, len_volat)
// }
// Trailing stop loss {
ATR_X2_TSL = atr(input(14,title="Length of ATR for trailing stop loss")) * input(2.0,title="ATR Multiplier for trailing stop loss",type=input.float)
TSL_source = low
var stop_loss_price = float(0)
TSL_line_color = color.green, TSL_transp = 100
if strategy.position_size == 0 or not within_timeframe
TSL_line_color := color.black
stop_loss_price := TSL_source - ATR_X2_TSL
else if strategy.position_size > 0
stop_loss_price := max(stop_loss_price, TSL_source - ATR_X2_TSL)
TSL_transp := 0
plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// }
// Signals for entry {
_avg_vol = sma(volume,input(20, title="SMA(volume) length (for relative comparison)"))
_relative_vol = _avg_vol * input(1.5,title="Multiple of avg vol to consider relative volume as being high",type=input.float)
__lowerOfOpenClose = min(open,close)
_wickRatio_lower = (__lowerOfOpenClose - low) / (high - low)
entry_signal1 = volume > _relative_vol
entry_signal2 = ATR_volat < avg_ATR_volat + std_ATR_volat and ATR_volat > avg_ATR_volat - std_ATR_volat
// }
alert_per_bar(msg)=>
prefix = "[" + syminfo.root + "] "
suffix = "(P=" + tostring(close) + "; atr=" + tostring(ATR_volat) + ")"
alert(tostring(prefix) + tostring(msg) + tostring(suffix), alert.freq_once_per_bar)
// MAIN:
if within_timeframe
if strategy.position_size > 0 and strategy.position_size[1] > 0 and (stop_loss_price/stop_loss_price[1]-1) > 0.005
alert_per_bar("TSL raised to " + tostring(stop_loss_price))
// EXIT :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // placed before entry, will re-enter if stopped out
exit_msg = close <= strategy.position_avg_price ? "stop loss" : "take profit"
if strategy.position_size > 0 and TSL_source <= stop_loss_price
strategy.close(ENUM_LONG, comment=exit_msg)
// ENTRY :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if entry_signal1 and entry_signal2// and entry_signal3
entry_msg = strategy.position_size > 0 ? "adding" : "initial"
strategy.entry(ENUM_LONG, strategy.long, comment=entry_msg)
// CLEAN UP:
if strategy.position_size == 0
stop_loss_price := float(0)