Nous souhaitons attirer l'attention des contributeurs de nos forums que la législation française requiert que vous indiquiez si vous avez une position ouverte dans un instrument sur lequel vous émettez une opinion. Veuillez respecter cette recommandation faite par l’AMF (Autorité des Marchés Financiers) . Pour plus d'information : lire ce PDF.
Vous n 'êtes très probablement pas sans connaître l'indicateur TRIX ,je l'évoquais hier sur l'autre file ;
je trouve , avec une période 8 , les résultats remarquables ( il est préconisé de 9 à 12 ) ; surtout en cas de sinusoïde ( tendances bien marquées )
ce n'est pas le plus en avance aux retournements mais il vient confirmer cela et son lissage assure le suivi de la tendance :
"Il permet de filtrer les mouvements insignifiants au sein d’une tendance, selon la sensibilité choisie au moyen de la sélection du nombre de périodes. "
Trix = (EMA3 (cours de clôture du jour) - EMA3 (cours de clôture du jour précédent)) / EMA3 (cours de clôture du jour précédent)
Un premier résultat incomplet sur TFish à partir des cours journaliers du CAC40, premier semestre de 2016. Mais je n’ai pas encore d’évaluation.
Le graph du haut représente les prix médians journaliers (noir) price = (H + L)/2 (on aperçois parfois un peu de gris, ce sont les cours de clôture). En magenta, les canaux construits avec les plus hauts et les plus bas sur 10 périodes.
Le graph en dessous représente les mêmes canaux aplatis et recalés pour avoir une largeur de 2. La courbe noire, ce sont les prix normalisés et la bleue son lissage par une EMA avec une période de 5.
Le dernier graph représente la transformation de Fisher (en noire le résultat brut et en rouge le résultat avec un lissage par une EMA avec une période de 3). La courbe lissée (rouge) est la grandeur de sortie du programme d’Ehlers. Je n’ai pas représenté le trigger (fish décalée d’un pas) mais j’ai utilisé son croisement avec fish pour les décisions de prises de positions (il y en a 23 sur le semestre).
Le lignes verticales sur les trois graphs correspondent aux prises de position. vert : on clôture la précédente et on achète un long, rouge : on clôture la précédente et on achète un short !
A première vue, c’est difficile de savoir si on peut en tirer quelque chose. Pour cela il faut en faire une évaluation quantitative (points engrangés, drawdown, etc.) sur une durée plus longue. J’ai un problème actuellement en données journalière mais ça viendra.
J’ai suivi (sauf erreur) l’algo d’Ehlers. Pour l’EMA de prix normalisé, où il a utilisé deux périodes (3 ou 5), j’ai choisi 5 pour réduire le nombre de positions.
Phg, non je ne sais pas, j'ai vu que Ehlers l'utilisait souvent alors que d'autres trouve le cours de cloture plus représentatif.
Pour Kalman, j'ai vu ce que tu avais affiché un moment mais en le parcourant rapidement je n'ai pas pu savoir ce que ça pouvait faire. Quand au Kalman sur le site hk-lisse, la sortie Kalman est une simple EMA bricolée pour réduire son retard, comme Ehlers aime bien le faire. Je n'ai jamais vu qu'il avait fait un filtre de kalman, mais tout est possible ...
Tiens un mémoire de HEC Montreal sur l'utilisation du filtre de Kalman en finance
//---- initialization of variables
Sqrt100=MathSqrt(K/100);
K100=K/100.0;
//---- initialization of the vertical shift
dPriceShift=_Point*PriceShift;
//---- set IndBuffer[] dynamic array as an indicator buffer
SetIndexBuffer(0,IndBuffer,INDICATOR_DATA);
//---- shifting the indicator horizontally by Shift
PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
//---- performing the shift of the beginning of the indicator drawing
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,31);
//---- setting the indicator values that won't be visible on a chart
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- initializations of a variable for the indicator short name
//---- set ColorBuffer[] dynamic array as an indicator buffer
SetIndexBuffer(1,ColorBuffer,INDICATOR_COLOR_INDEX);
//---- performing the shift of the beginning of the indicator drawing
PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
string shortname;
StringConcatenate(shortname,"KalmanFilter(",DoubleToString(K,2),")");
//--- creation of the name to be displayed in a separate sub-window and in a tooltip
IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//--- determination of accuracy of displaying the indicator values
IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//---- initialization end
}
//+------------------------------------------------------------------+
//| KalmanFilter iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, // number of bars in history at the current tick
const int prev_calculated,// number of bars calculated at previous call
const datetime &time[],
const double &open[],
const double& high[], // price array of maximums of price for the indicator calculation
const double& low[], // price array of minimums of price for the indicator calculation
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---- checking the number of bars to be enough for the calculation
if(rates_total<min_rates_total)return(0);
//---- declaration of local variables
int first,bar;
double Velocity,Distance,Error;
static double Velocity_;
//----
if(prev_calculated>rates_total || prev_calculated<=0) // checking for the first start of the indicator calculation
{
first=1; // starting index for calculation of all bars
//---- initialization of coefficients
IndBuffer[first-1]=PriceSeries(IPC,first-1,open,low,high,close);
Velocity_=0.0;
}
else first=prev_calculated-1; // starting index for calculation of new bars
//---- restore values of the variables
Velocity=Velocity_;
//---- main indicator calculation loop
for(bar=first; bar<rates_total; bar++)
{
//---- store values of the variables before running at the current bar
if(rates_total!=prev_calculated && bar==rates_total-1)
{
Velocity_=Velocity;
}
if(Signal==Trend)
{
if(IndBuffer[bar-1]>IndBuffer[bar]) ColorBuffer[bar]=0;
else ColorBuffer[bar]=1;
}
else
{
if(Velocity>0) ColorBuffer[bar]=1;
else ColorBuffer[bar]=0;
}
}
//----
return(rates_total);
}
//+------------------------------------------------------------------+
//| Getting values of a price series |
//+------------------------------------------------------------------+
double PriceSeries(uint applied_price,// Applied price
uint bar, // Index of shift relative to the current bar for a specified number of periods back or forward
const double &Open[],
const double &Low[],
const double &High[],
const double &Close[])
{
//----
switch(applied_price)
{
//---- price constants from the ENUM_APPLIED_PRICE enumeration
case PRICE_CLOSE: return(Close[bar]);
case PRICE_OPEN: return(Open [bar]);
case PRICE_HIGH: return(High [bar]);
case PRICE_LOW: return(Low[bar]);
case PRICE_MEDIAN: return((High[bar]+Low[bar])/2.0);
case PRICE_TYPICAL: return((Close[bar]+High[bar]+Low[bar])/3.0);
case PRICE_WEIGHTED: return((2*Close[bar]+High[bar]+Low[bar])/4.0);
Un premier résultat incomplet sur TFish à partir des cours journaliers du CAC40, premier semestre de 2016. Mais je n’ai pas encore d’évaluation.
Le graph du haut représente les prix médians journaliers (noir) price = (H + L)/2 (on aperçois parfois un peu de gris, ce sont les cours de clôture). En magenta, les canaux construits avec les plus hauts et les plus bas sur 10 périodes.
Le graph en dessous représente les mêmes canaux aplatis et recalés pour avoir une largeur de 2. La courbe noire, ce sont les prix normalisés et la bleue son lissage par une EMA avec une période de 5.
Le dernier graph représente la transformation de Fisher (en noire le résultat brut et en rouge le résultat avec un lissage par une EMA avec une période de 3). La courbe lissée (rouge) est la grandeur de sortie du programme d’Ehlers. Je n’ai pas représenté le trigger (fish décalée d’un pas) mais j’ai utilisé son croisement avec fish pour les décisions de prises de positions (il y en a 23 sur le semestre).
Le lignes verticales sur les trois graphs correspondent aux prises de position. vert : on clôture la précédente et on achète un long, rouge : on clôture la précédente et on achète un short !
A première vue, c’est difficile de savoir si on peut en tirer quelque chose. Pour cela il faut en faire une évaluation quantitative (points engrangés, drawdown, etc.) sur une durée plus longue. J’ai un problème actuellement en données journalière mais ça viendra.
J’ai suivi (sauf erreur) l’algo d’Ehlers. Pour l’EMA de prix normalisé, où il a utilisé deux périodes (3 ou 5), j’ai choisi 5 pour réduire le nombre de positions.
Pas facile en effet ; les pourcentages pris ne sont pas très importants , beaucoup moins que sur une action ;
en swing indiciel sur tracker lev 2 (admettons LVC + BX4 ) une solution est peut être de changer d'UT ; utiliser jour et hebdo ; jongler entre les deux pour affiner ou lisser les prises de décisions ; en fait être majoritairement sur l'UT hebdo mais aller préciser les signaux d'achat en journalier ,signaux qui arrivent trop tard en hebdo ; l'idée est bien sûr de garder les positions ,longues ou courtes , sans tenir compte ou presque des sous vagues , pour jouer de plus vastes mouvements ; même principe sur action ;
Commentaire