La stratégie utilise le filtre de prévision Voss et l’indicateur de ligne de tendance instantanée d’Ehlers pour identifier les points de retournement cycliques du marché et permettre des transactions quantifiées. Le filtre de Voss permet d’émettre des signaux d’achat/vente à l’avance, tandis que l’indicateur de ligne de tendance instantanée est utilisé pour déterminer la direction de la tendance globale et réduire les erreurs du filtre de Voss dans le marché en tendance.
Le filtre de prédiction de Voss est tiré de l’article de John F. Ehlers intitulé A Peek Into The Future. La formule de calcul du filtre est la suivante:
_filt = 0.5 * _s3 * _x1 + _f1 * _s2 * _filt[1] - _s1 * _filt[2]
_voss = _x2 * _filt - _sumC
Parmi eux,_x1 est la différence d’un degré entre les prix;_x2 est le facteur de lissage;_s1、_s2、_s3 est le paramètre de filtration;_f1 est le paramètre de la période;_filt est le résultat du filtrage;_Pour la sortie finale:
Ce filtre peut être considéré comme un filtre de lissage, qui met l’accent sur les informations des cycles actuels et passés, émettant ainsi des signaux d’achat/vente à l’avance. En raison des délais de groupe intrinsèques, il peut émettre des signaux prédictifs avant les autres indicateurs, comme si l’aigle voyait dans l’aigle du futur.
L’indicateur de ligne de tendance instantanée est calculé par la formule suivante:
_it = (_a-((_a*_a)/4.0))*_src+0.5*_a*_a*_src[1]-(_a-0.75*_a*_a)*_src[2]+2*(1-_a)*nz(_it[1])+-(1-_a)*(1-_a)*nz(_it[2])
L’indicateur trace en temps réel une ligne de tendance qui correspond le mieux au prix et permet de déterminer avec précision la direction et la force de la tendance.
Voss génère un signal d’achat lorsqu’il est inversé négativement et que le résultat du filtre est passé.
Voss produit un signal de vente lorsqu’il passe du positif au négatif et qu’il passe par le filtre inférieur.
En outre, un signal de transaction n’est émis que lorsque l’indicateur de ligne de tendance instantanée confirme la direction de la tendance. Cela permet de filtrer les signaux erronés que le filtre Voss peut émettre dans un marché en tendance.
Le risque peut être réduit par:
Cette stratégie peut être optimisée dans les domaines suivants:
La stratégie intègre le filtre Voss et les indicateurs de tendance, permettant d’identifier efficacement les points de retournement cyclique du marché. En optimisant les paramètres, en contrôlant les risques, la stratégie permet d’obtenir un système de négociation quantifié stable. Elle peut être largement utilisée dans les variétés qui ont une cyclicité évidente et qui ont montré de bons résultats de négociation dans les retours.
/*backtest
start: 2023-08-19 00:00:00
end: 2023-09-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// A Peek Into the Future
// John F. Ehlers
// TASC Aug 2019
// Created by e2e4mfck for tradingview.com
// Modified by © Bitduke
//@version=4
//strategy("Voss Strategy (Filter + IT)", overlay=false, calc_on_every_tick=false,pyramiding=0, default_qty_type=strategy.cash,default_qty_value=1000, currency=currency.USD, initial_capital=1000,commission_type=strategy.commission.percent, commission_value=0.075)
// voss filter
source = input(close, type = input.source)
period = input(20, type = input.integer)
predict = input(4, type = input.integer)
bandwidth = input(0.25, type = input.float)
// it trendline
src = input(hl2, title="Source IT")
a = input(0.07, title="Alpha", step=0.01)
fr = input(false, title="Fill Trend Region")
ebc = input(false, title="Enable barcolors")
hr = input(false, title="Hide Ribbon")
voss_filter (_period, _predict, _bandwidth, _source) =>
float _filt = 0, float _sumC = 0, float _voss = 0
_PI = 2 * asin(1)
_order = 3 * _predict
_f1 = cos(2 * _PI / _period)
_g1 = cos(_bandwidth * 2 * _PI / _period)
_s1 = 1 / _g1 - sqrt(1 / (_g1 * _g1) - 1)
_s2 = 1 + _s1
_s3 = 1 - _s1
_x1 = _source - _source[2]
_x2 = (3 + _order) / 2
for _i = 0 to (_order - 1)
_sumC := _sumC + ((_i + 1) / _order) * _voss[_order - _i]
if bar_index <= _order
_filt := 0
_voss := 0
else
_filt := 0.5 * _s3 * _x1 + _f1 * _s2 * _filt[1] - _s1 * _filt[2]
_voss := _x2 * _filt - _sumC
[_voss, _filt]
[Voss, Filt] = voss_filter(period, predict, bandwidth, source)
instantaneous_trendline (_src, _a, _freq, _ebc, _hr) =>
_it = 0.0
_it := (_a-((_a*_a)/4.0))*_src+0.5*_a*_a*_src[1]-(_a-0.75*_a*_a)*_src[2]+2*(1-_a )*nz(_it[1], ((_src+2*_src[1]+_src[2])/4.0))-(1-_a)*(1-_a)*nz(_it[2], ((_src+2*_src[1]+_src[2])/4.0))
_lag = 2.0*_it-nz(_it[2])
[_it, _lag]
[it, lag] = instantaneous_trendline(src, a, fr, ebc, hr)
// - - - - - - - - - - //
plot(Filt, title = "Filter", style = plot.style_line, color = color.red, linewidth = 2)
plot(Voss, title = "Voss", style = plot.style_line, color = color.blue, linewidth = 2)
hline(0.0, title = "Zero", linestyle = hline.style_dashed, color = color.black, linewidth = 1)
plot(hr? na:it, title="IT Trend", color= fr? color.gray : color.red, linewidth=1)
plot(hr? na:lag, title="IT Trigger", color=fr? color.gray : color.blue, linewidth=1)
// Strategy Logic
longCondition = lag < it and crossover(Voss,Filt)
shortCondition = it > lag and crossover(Filt,Voss)
strategy.entry("Voss_Short", strategy.short, when=shortCondition)
strategy.entry("Voss_Long", strategy.long, when=longCondition)
// === Backtesting Dates === thanks to Trost
testPeriodSwitch = input(true, "Custom Backtesting Dates")
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, testStartHour, 0)
testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(2, "Backtest Stop Month")
testStopDay = input(29, "Backtest Stop Day")
testStopHour = input(0, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, testStopHour, 0)
testPeriod() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
testPeriod_1 = testPeriod()
isPeriod = true
// === /END
if not isPeriod
strategy.cancel_all()
strategy.close_all()