
Cette stratégie est une stratégie de suivi de la tendance qui combine la régression de Nadaraya-Watson et le canal ATR pour identifier la direction de la tendance et les points d’entrée. Lorsque le prix se déplace vers le bas, faire plus; quand le prix se déplace vers le haut, faire la paix.
Tout d’abord, la stratégie utilise la régression nucléaire de Nadaraya-Watson pour calculer la courbe de régression de deux périodes de retard différentes, puis compare l’intersection des deux courbes de régression pour juger de la direction de la tendance. Plus précisément, la courbe de régression de la période h et de la période h-lag est calculée séparément et est prise en compte lorsque la courbe de la période h est traversée par la courbe de la période h.
Deuxièmement, la stratégie utilise le canal ATR pour déterminer le point d’entrée. La trajectoire ascendante est la courbe de régression plus le multiple de l’ATR de phase n et la trajectoire descendante est la courbe de régression moins le multiple de l’ATR de phase n. La courbe ascendante est vue et entrée lorsque le prix franchit la courbe ascendante et la courbe descendante est vue et entrée.
Enfin, un mécanisme de stop-loss est mis en place. Si le prix est continuellement stopLossBars racine K inférieur au prix d’entrée, le stop-loss sort.
Cette stratégie, combinée à une analyse de régression et à une rupture de canal, permet de saisir avec plus de précision la direction et la force des tendances du marché. Comparée à l’utilisation d’indicateurs de tendance tels que les moyennes mobiles, cette méthode réduit les faux signaux et améliore la stabilité de la stratégie.
De plus, le canal ATR a mis en place des points d’entrée raisonnables pour éviter les entrées erronées à proximité des points de retournement de tendance. Le mécanisme de stop-loss contrôle également efficacement les pertes individuelles.
Par conséquent, cette stratégie présente les avantages d’une forte capacité d’identification des tendances, d’une entrée de marché plus précise et d’un risque de perte de liquidité plus contrôlable.
Le plus grand risque de cette stratégie réside dans le fait que le prix peut être en train de faire un renversement ou un rassemblement au moment de la rupture de l’ATR, ce qui peut entraîner une entrée inappropriée ou une sortie rapide après l’entrée.
En outre, les courbes de régression et les voies ATR nécessitent une optimisation des paramètres. Si les paramètres sont mal définis, l’analyse de la régression n’est pas efficace ou si l’amplitude ATR est trop grande ou trop petite, cela affectera l’efficacité de la stratégie.
On peut envisager de combiner les indicateurs de tendance et les signaux de retournement, tels que le VOLUME, le MACD, etc., pour améliorer la stabilité et l’exactitude de la stratégie.
La fonction de noyau dans l’analyse de la régression peut également être ajustée, par exemple en considérant le noyau d’Epanechnikov, pour voir si une meilleure adéquation est obtenue.
Les cycles et les multiplications d’ATR des canaux ATR nécessitent également des tests et des optimisations répétés pour trouver la meilleure combinaison de paramètres.
Cette stratégie utilise l’analyse de régression et la méthode de rupture de canal pour identifier la direction et la force de la tendance, l’entrée de jeu à des points raisonnables et la mise en place d’un stop-loss, ce qui permet une stratégie de suivi de la tendance stable. Il y a encore beaucoup de place pour l’optimisation des sous-stratégies, ce qui vaut la peine d’être testé et amélioré.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Custom Strategy with Stop Loss and EMA", overlay=true)
src = input(close, title='Source')
h = input(10, title='Lookback Window', tooltip='The number of bars used for the estimation.')
r = input(10, title='Relative Weighting', tooltip='Relative weighting of time frames.')
x_0 = input(50, title='Start Regression at Bar', tooltip='Bar index on which to start regression.')
lag = input(2, title='Lag', tooltip='Lag for crossover detection.')
stopLossBars = input(3, title='Stop Loss Bars', tooltip='Number of bars to check for stop loss condition.')
emaPeriod = input(46, title='EMA Period', tooltip='Period for Exponential Moving Averages.')
lenjeje = input(32, title='ATR Period', tooltip='Period to calculate upper and lower band')
coef = input(2.7, title='Multiplier', tooltip='Multiplier to calculate upper and lower band')
// Function for Nadaraya-Watson Kernel Regression
kernel_regression1(_src, _size, _h) =>
_currentWeight = 0.0
_cumulativeWeight = 0.0
for i = 0 to _size + x_0
y = _src[i]
w = math.pow(1 + (math.pow(i, 2) / ((math.pow(_h, 2) * 2 * r))), -r)
_currentWeight += y * w
_cumulativeWeight += w
[_currentWeight, _cumulativeWeight]
// Calculate Nadaraya-Watson Regression
[currentWeight1, cumulativeWeight1] = kernel_regression1(src, h, h)
yhat1 = currentWeight1 / cumulativeWeight1
[currentWeight2, cumulativeWeight2] = kernel_regression1(src, h-lag, h-lag)
yhat2 = currentWeight2 / cumulativeWeight2
// Calculate Upper and Lower Bands
upperjeje = yhat1 + coef * ta.atr(lenjeje)
lowerjeje = yhat1 - coef * ta.atr(lenjeje)
// Plot Upper and Lower Bands
plot(upperjeje, color=color.rgb(0, 247, 8), title="Upper Band", linewidth=2)
plot(lowerjeje, color=color.rgb(255, 0, 0), title="Lower Band", linewidth=2)
// Calculate EMAs
emaLow = ta.ema(low, emaPeriod)
emaHigh = ta.ema(high, emaPeriod)
// Plot EMAs
plot(emaLow, color=color.rgb(33, 149, 243, 47), title="EMA (Low)", linewidth=2)
plot(emaHigh, color=color.rgb(255, 153, 0, 45), title="EMA (High)", linewidth=2)
// Long Entry Condition
longCondition = low < lowerjeje
strategy.entry("Long", strategy.long, when=longCondition)
// Stop Loss Condition
stopLossCondition = close[1] < strategy.position_avg_price and close[2] < strategy.position_avg_price and close[3] < strategy.position_avg_price
strategy.close("Long", when=stopLossCondition)
// Close and Reverse (Short) Condition
shortCondition = high > upperjeje
strategy.close("Long", when=shortCondition)
strategy.entry("Short", strategy.short, when=shortCondition)