
L’idée centrale de cette stratégie est d’utiliser les pivots pour effectuer des transactions quantitatives. Elle recherche les hauts et les bas pivots importants et effectue des transactions inversées lorsque les prix franchissent ces points critiques.
La stratégie définit d’abord les fonctions pivotHighSig() et pivotLowSig() pour trouver les hauts et les bas de l’axe. Ces deux fonctions recherchent les hauts et les bas de l’axe correspondants à gauche et à droite.
Concernant les hauts de l’axe, il cherche des hauts plus élevés sur la gauche et des hauts plus bas sur la droite. Ainsi, le haut de l’axe se trouve dans une position relativement plus élevée.
Après avoir trouvé le haut et le bas de l’axe, la stratégie sélectionne un autre point central de l’axe, c’est-à-dire un point important dans l’axe. Cela est réalisé en définissant plusieurs variables historiques de haut et bas de l’axe, telles que ph1, ph2 et autres.
Finalement, un renversement est effectué lorsque le prix dépasse le pivot de l’axe central.
Cette stratégie quantitative axée sur les pôles présente les avantages suivants:
Cette stratégie comporte aussi des risques:
Cette stratégie peut également être optimisée dans les directions suivantes:
Cette stratégie a globalement bien fonctionné, l’idée centrale étant de trouver des pivots importants et de faire des transactions inverses lors de leur percée. En l’optimisant davantage, cette stratégie peut obtenir des signaux plus stables et plus fiables, ce qui permet de générer de bons revenus.
/*backtest
start: 2023-02-13 00:00:00
end: 2024-02-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Pivot of Pivot Reversal Strategy [QuantNomad]", shorttitle = "PoP Reversal Strategy [QN]", overlay=true)
// Inputs
leftBars = input(4, title = 'PP Left Bars')
rightBars = input(2, title = 'PP Right Bars')
atr_length = input(14, title = 'ATR Length')
atr_mult = input(0.1, title = 'ATR Mult')
// Pivot High Significant Function
pivotHighSig(left, right) =>
pp_ok = true
atr = atr(atr_length)
for i = 1 to left
if (high[right] < high[right+i] + atr * atr_mult)
pp_ok := false
for i = 0 to right-1
if (high[right] < high[i] + atr * atr_mult)
pp_ok := false
pp_ok ? high[right] : na
// Pivot Low Significant Function
pivotLowSig(left, right) =>
pp_ok = true
atr = atr(atr_length)
for i = 1 to left
if (low[right] > low[right+i] - atr * atr_mult)
pp_ok := false
for i = 0 to right-1
if (low[right] > low[i] - atr * atr_mult)
pp_ok := false
pp_ok ? low[right] : na
swh = pivotHighSig(leftBars, rightBars)
swl = pivotLowSig (leftBars, rightBars)
swh_cond = not na(swh)
hprice = 0.0
hprice := swh_cond ? swh : hprice[1]
le = false
le := swh_cond ? true : (le[1] and high > hprice ? false : le[1])
swl_cond = not na(swl)
lprice = 0.0
lprice := swl_cond ? swl : lprice[1]
se = false
se := swl_cond ? true : (se[1] and low < lprice ? false : se[1])
// Pivots of pivots
ph1 = 0.0
ph2 = 0.0
ph3 = 0.0
pl1 = 0.0
pl2 = 0.0
pl3 = 0.0
pphprice = 0.0
pplprice = 0.0
ph3 := swh_cond ? nz(ph2[1]) : nz(ph3[1])
ph2 := swh_cond ? nz(ph1[1]) : nz(ph2[1])
ph1 := swh_cond ? hprice : nz(ph1[1])
pl3 := swl_cond ? nz(pl2[1]) : nz(pl3[1])
pl2 := swl_cond ? nz(pl1[1]) : nz(pl2[1])
pl1 := swl_cond ? lprice : nz(pl1[1])
pphprice := swh_cond and ph2 > ph1 and ph2 > ph3 ? ph2 : nz(pphprice[1])
pplprice := swl_cond and pl2 < pl1 and pl2 < pl3 ? pl2 : nz(pplprice[1])
if (le)
strategy.entry("PP_RevLE", strategy.long, comment="PP_RevLE", stop=pphprice + syminfo.mintick)
if (se)
strategy.entry("PP_RevSE", strategy.short, comment="PP_RevSE", stop=pplprice - syminfo.mintick)
// Plotting
plot(lprice, color = color.red, transp = 55)
plot(hprice, color = color.green, transp = 55)
plot(pplprice, color = color.red, transp = 0, linewidth = 2)
plot(pphprice, color = color.green, transp = 0, linewidth = 2)