une stratégie commerciale basée sur la théorie des vagues d'Elliott - page 28

 
Aussi, à propos des calculs. J'ai récemment pensé à la nécessité d'utiliser la fonction de densité de la distribution normale, mais je n'ai pas encore commencé. J'ai également réfléchi à la manière de le faire, que ce soit en utilisant une fonction délicate ou une méthode tabulaire, j'étais plus enclin à remplir le tableau dans Excel avec des incréments d'un millième (ou d'un dix millième) et à le sauvegarder dans un fichier txt contenant le code mq4 pour remplir un grand tableau. Maintenant, grâce à Vladislav, il économise aussi les ressources du CPU.
Dans l'ensemble, j'ai appris beaucoup de choses utiles. :)
 
<br/ translate="no">L'un de vos axiomes est qu'il existe une trajectoire vraie (c'est-à-dire unique), qui est déterminée par le processus d'optimisation. Comment une seule trajectoire peut-elle donner lieu à plusieurs canaux ?


Désolé encore pour les réponses tardives. Lorsqu'on fait une approximation d'une trajectoire, on ne peut jamais savoir à quel point une approximation décrit mieux la trajectoire elle-même, si elles sont dans le même intervalle de confiance. Et par conséquent, toutes les approximations qui se situent dans l'intervalle de confiance peuvent être considérées comme équivalentes. En principe, c'est le cas. Pour faire une prévision à partir d'un ensemble d'approximations possibles (en général, aucune approximation ne satisfait aux critères de sélection, car les limites d'erreur sont fixées), il est préférable de choisir la "meilleure", pour ainsi dire. En étudiant l'algorithme, je me suis rendu compte d'une autre particularité : bien que les approximations soient différentes, les prévisions sont les mêmes dans la grande majorité des cas. Je vous rappelle une fois de plus que la trajectoire elle-même n'est pas nécessaire et que je ne la recherche pas. Concernant les canaux - le caractère unique des canaux est lié au "degré de détail" (appelons-le ainsi) des structures étudiées. Ainsi, s'il existe des tendances, nous pouvons identifier les zones de pullback et estimer les probabilités de fin de tendance, de rupture des zones de retournement, etc. Ou simplement pour identifier les zones d'incertitude, quand il est préférable de ne pas entrer sur le marché. En outre, vous devez toujours garder à l'esprit les limites de la taille de l'échantillon, sinon le résultat aura un taux d'incertitude trop élevé.

Bonne chance et bonnes tendances.
 
Cher Vladislav !

J'ai un malentendu concernant le calcul du coefficient de Hurst.
Dans le cas de la régression linéaire, nous avons 2 variantes de calcul de S et R.

Variante 1.
S - nous pouvons le calculer comme la somme des différences d'écart sur toute la longueur de la ligne de régression linéaire.
Cela signifie que :

S=0.0 ;
for (n=0 ; n<Période ; n++) { S+ = MathPow( Close[n] - (a+b*n) , 2) ; }
S=MathSqrt( S / Période ) ;

Et nous pouvons calculer R comme la différence entre l'écart maximal et minimal le long de la ligne entière de la régression linéaire.
C'est-à-dire :

pMax=0,0 ; pMin=0,0 ;
for (n=0 ; n<Période ; n++)
{
dc=Close[n] - (a+b*n) ;
if ( dc > pMax) pMax = dc ;
if ( dc < pMin) pMin = dc
}
R=MathAbs( pMax - pMin) ;

Option 2.
Nous pouvons calculer S par rapport à la dernière barre en utilisant iStdDev( ) à partir de l'ensemble des indicateurs techniques standard. Mais dans ce cas, nous aurons S calculé par rapport à la dernière barre, ce qui est équivalent au calcul de S par rapport à la valeur au milieu d'une ligne de régression linéaire.

Et R - comme la différence entre les valeurs maximale et minimale dans la projection horizontale :

pMax=High[Highest(NULL,0,MODE_HIGH,Period,i)] ;
pMin=Low[Lowest(NULL,0,MODE_Low,Period,i)] ;

ce qui n'est pas tout à fait correct, il serait plus correct d'utiliser MODE_CLOSE si nous utilisons initialement Close.

D'après ce que j'ai compris, c'est la deuxième variante qui est utilisée dans votre cas ? Ou dois-je me tromper ?

Ma question est donc la suivante : quelle variante est la plus correcte pour un calcul plus précis du coefficient de Hurst ?

Merci d'avance pour votre réponse - Alexander.
 
Toutes les approximations qui se situent dans l'intervalle de confiance peuvent être considérées comme équivalentes.

Merci, Vladislav, je n'avais pas pris ce point en compte. Mais c'est vraiment vrai. Cela signifie qu'en fait, nous n'obtenons pas plusieurs canaux, mais une gamme entière délimitée par des lignes avec l'angle maximum et minimum.
Il faut toujours garder à l'esprit les limites de la taille de l'échantillon, sinon le résultat sera trop incertain.

Je ne suis pas sûr de l'incertitude dont vous parlez. Cependant, l'autre chose est claire pour moi. L'échantillon doit définir un canal de régression, et un canal de régression est un canal de tendance. Si nous regroupons à la fois la tendance et le plat dans un échantillon, un tel échantillon ne nous apporterait presque rien d'utile. Nous sommes donc confrontés au problème de la division du marché en phases et, surtout, à celui de l'identification de la tendance et de l'aplatissement dès les premiers stades, c'est-à-dire sur le marché réel. À mon avis, il s'agit d'une tâche très délicate.
 
Privet,
Kartinka mne napomnila standartnyj indikator kanalov, vot i spomnil svoju razrabotku kokda iskal filter dlia ods4iota kokda na4inajetsia bolshyjje volny Elliota - po Standart Deviation formule :



Vot kod mojevo indikatora :

//+------------------------------------------------------------------+
//|                                                   StdDevChan.mq4 |
//|                           Copyright © 2005, Arunas Pranckevicius |
//|                                      irc://irc.omnitel.net/forex |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Arunas Pranckevicius(T-1000), Lithuania"
#property link      "irc://irc.omnitel.net/forex"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 White
#property indicator_color3 Blue

//---- input parameters
extern int       PriceBars=350;
extern int       Shift;
extern bool      Comments=false;

double Support[];
double StdDev[];
double Resistance[];

//---- buffers
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void SetObject(string ObjName,int ObjType,datetime ObjTime1,double ObjPrice1,datetime ObjTime2=0,double ObjPrice2=0,color ObjColor=Red,int ObjSize=1,int ObjStyle=STYLE_SOLID,datetime ObjTime3=0,double ObjPrice3=0)
{

if (ObjectFind(ObjName) != -1) ObjectDelete(ObjName);
ObjectCreate(ObjName, ObjType, 0,ObjTime1 , ObjPrice1, ObjTime2, ObjPrice2, ObjTime3, ObjPrice3);
ObjectSet(ObjName,OBJPROP_COLOR,ObjColor); 
ObjectSet(ObjName,OBJPROP_STYLE,ObjStyle); 
ObjectSet(ObjName,OBJPROP_WIDTH,ObjSize); 
}


int init()
  {
//---- indicators
   IndicatorBuffers(3);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Resistance);
   SetIndexDrawBegin(0,0);
   SetIndexEmptyValue(0,0);
   SetIndexShift(0,0);
   SetIndexLabel(0,"Standart Deviation Support-");
//----
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,StdDev);
   SetIndexDrawBegin(1,0);
   SetIndexEmptyValue(1,0);
   SetIndexShift(1,0);
   SetIndexLabel(1,"Standart Deviation");
//----
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,Support);
   SetIndexDrawBegin(2,0);
   SetIndexEmptyValue(2,0);
   SetIndexShift(2,0);
   SetIndexLabel(2,"Standart Deviation Resistance+");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counter,counter2;
   double DevAvg=0;
   double DevPlus1=0;
   double DevMinus1=0;
   double DevPlusStart=0;
   double DevMinusStart=0;
   double DevAvgStart=0;
   double DevPlusEnd=0;
   double DevMinusEnd=0;
   double DevAvgEnd=0;
   double DevPlus2=0;
   double DevMinus2=0;
   double DevAvg1=0;
   double DevAvg2=0;
   double PriceDiff;
   double deviance,Max,Min;
   int DrawBegin = Shift;   
   int DrawEnd;
   int counted_bars=IndicatorCounted();
   DrawEnd=Bars-counted_bars;
   
   if ( DrawEnd < DrawBegin + PriceBars) DrawEnd = DrawBegin + PriceBars;
   
   if (Bars < (PriceBars * 2 + Shift)) return(0);
   
   for (counter=DrawBegin-1;counter<=DrawEnd;counter++)
   {
   deviance=iMA(Symbol(),Period(),PriceBars,0,MODE_SMA,PRICE_MEDIAN,counter);
   Max=High [Highest (NULL,0,MODE_HIGH,PriceBars,counter)];
   Min=Low [Lowest (NULL,0,MODE_LOW,PriceBars,counter)];
   //DevAvg=MathPow((Max + Min + deviance) / 3,2);  
   DevAvg=(Max + Min + deviance) / 3;  

   for (counter2=(PriceBars + counter);counter2 >=counter;counter2--)
   {
   PriceDiff = (Max + Min + Open[counter2]) / 3;
   deviance+= MathPow((PriceDiff - DevAvg),2);   
   }

   // Calculate average deviation
   deviance = deviance / (PriceBars + 1);
   DevAvg = MathSqrt(deviance/Point) * Point; 

   // Calculate deviation channel starting/current average deviation prices
   DevAvg1 = (DevPlus1 + DevMinus1 + (Max + Min + Open[PriceBars + counter]) / 3) / 3;

   // Calculate deviation channel +/- starting points
   DevPlus1 = (Min+Max + Open[PriceBars + counter]) / 3 + DevAvg;
   DevMinus1 = (Min+Max + Open[PriceBars + counter]) / 3 - DevAvg;     

  // Calculate deviation channel current +/- points
   DevPlus2 = (Max + DevAvg1) / 2 + DevAvg;
   DevMinus2 = (Min + DevAvg1) / 2 - DevAvg;

   DevAvg2 = (DevPlus2 + DevMinus2 + (Max + Min + DevAvg1) / 3) / 3;
   
   Resistance[counter]=DevMinus2;
   Support[counter]=DevPlus2;
   StdDev[counter]=DevAvg2;   
   //if (counter == DrawEnd && Symbol() == "EURUSD" ) Print ("DevMinus2=",DevMinus2," DevPlus2=",DevPlus2," DevAvg2=",DevAvg2);

   if (counter == DrawBegin)
   {
   DevPlusEnd=Resistance[counter];
   DevMinusEnd=Support[counter];
   DevAvgEnd=StdDev[counter];
//   if (Symbol() == "EURUSD" ) Print ("DrawBegin=",DrawBegin," DrawEnd=",DrawEnd," DevMinus2=",DevMinus2," DevPlus2=",DevPlus2," DevAvg2=",DevAvg2);
   }      
   
   if (counter == DrawBegin + PriceBars)
   {
   DevPlusStart=Resistance[counter];
   DevMinusStart=Support[counter];
   DevAvgStart=StdDev[counter];
   }      

   }
//----

   if (Comments) Comment(Symbol()," DevAvg=",DevAvg," DevAvgStart=",DevAvgStart," DevAvgEnd=",DevAvgEnd," DevPlusStart=",DevPlusStart," DevPlusEnd=",DevPlusEnd," DevMinusStart=",DevMinusStart," DevMinusEnd=",DevMinusEnd);
   //Draw channel
   SetObject(Symbol()+"_StdDev+",OBJ_TREND,Time[PriceBars + Shift],DevPlusStart,Time[Shift],DevPlusEnd,Blue,1,STYLE_SOLID);
   ObjectSetText(Symbol()+"_StdDev+","Standart Deviation Resistance", 8, "Arial", Green);
   SetObject(Symbol()+"_StdDev-",OBJ_TREND,Time[PriceBars + Shift],DevMinusStart,Time[Shift],DevMinusEnd,Red,1,STYLE_SOLID);
   ObjectSetText(Symbol()+"_StdDev-","Standart Deviation Support", 8, "Arial", Green);
   SetObject(Symbol()+"_StdDevAvg",OBJ_TREND,Time[PriceBars + Shift],DevAvgStart,Time[Shift],DevAvgEnd,White,1,STYLE_SOLID);
   ObjectSetText(Symbol()+"_StdDevAvg","Standart Deviation Average", 8, "Arial", Green);
   
   return(0);
  }
//+------------------------------------------------------------------+
 
2 ANG3110 En fait, j'ai déjà répondu à cette question ci-dessus. Je vais répondre à nouveau - la dernière - parce que je suis aussi paresseux ;). L'écart-type doit être calculé par rapport à l'approximation et aux prix réellement obtenus. Si vous approchez les prix de clôture par un muving, alors il devrait être la différence entre Klose et la valeur du muving sur chaque barre. Et vous pouvez utiliser l'algorithme standard - iStdDev( ). Si par un canal de régression linéaire, alors entre la valeur de la ligne de régression et le klose. Si c'est par autre chose, alors la différence est entre la valeur de la fonction d'approximation et la valeur effectivement obtenue. Si vous vous rapprochez d'autre chose, comme la rentabilité des transactions, vous devez alors sélectionner d'autres variables. Je n'utilise pas iStdDev( ) dans mes calculs.

ce qui n'est pas tout à fait correct, il serait plus correct d'utiliser MODE_CLOSE si nous utilisons initialement Close.

La clé ici est la suivante : si l'on compte initialement par Close

2Yurixx En ce qui concerne l'incertitude - si le nombre de degrés de liberté d'un échantillon est insuffisant, sa convergence ne peut être estimée de manière fiable, et vous pouvez donc appliquer à un échantillon divergent des méthodes d'analyse statistique qui ne sont applicables qu'à des échantillons convergents. Par conséquent, le résultat est incertain.

PS Ici, le terme "échantillon" a été utilisé pour signifier une distribution. C'est-à-dire qu'il serait plus correct de dire "le nombre de degrés de liberté d'un échantillon affecte le degré de fiabilité dans la détermination de la convergence d'une distribution valide pour cet échantillon". Les méthodes valables pour des distributions convergentes peuvent être appliquées à des distributions divergentes (ou à des distributions sans fait de convergence connu).

Bonne chance et bonne chance avec les tendances.
 
Privet,

Vot po4emu ja dal kod svojevo indikatora - ras4ioty idut po vsem parametram :

   deviance=iMA(Symbol(),Period(),PriceBars,0,MODE_SMA,PRICE_MEDIAN,counter) ; Max=High [Plus haut (NULL,0,MODE_HIGH,PriceBars,counter)] ; Min=Low [Plus bas (NULL,0,MODE_LOW,PriceBars,counter)] ; DevAvg=(Max + Min + deviance) / 3 ;



Un indicateur intelligent et un graphique probant :-D

 
Cher Vladislav ! <br/ translate="no">
J'ai un malentendu sur le calcul du coefficient de Hurst.
Dans le cas d'une régression linéaire, nous avons 2 variantes de calcul de S et R.


Voilà une question intéressante :)
Supposons que nous ayons un canal de régression linéaire, par exemple ascendant, qui satisfasse le critère de convergence RMS. D'une part, si le canal est ascendant, alors le RMS calculé sur les barres incluses dans celui-ci tendra vers 1,0 (car le décalage est évident). D'autre part, si nous calculons RMS par rapport à la ligne de régression (en supprimant ainsi le décalage), alors RMS tendra vers 0,5, car RMS est proche de la distribution normale. Je pense que tout le monde devrait vérifier par lui-même (c'est beaucoup plus intéressant de cette façon).
 
Je n'ai pas pu résister et j'ai modifié le script de Solandr. L'extraction RMS incluse est plus correcte en utilisant iStdDevOnArray intégré, puisque la division par (nombre de puissances-1) n'est raisonnable que pour les échantillons jusqu'à 30 éléments.
//+------------------------------------------------------------------+
//|                                                     Herst-II.mq4 |
//|                             solandr (обработал напильником Rosh) |
//|                       http://www.metaquotes.ru/forum/6839/page11 |
//+------------------------------------------------------------------+
#property copyright "solandr (обработал напильником Rosh)"
#property link      "http://www.metaquotes.ru/forum/6839/page11"
#property show_inputs

extern int start_bar=500;
extern int end_bar=0;

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
double viborka[];
int size_of_array,i;

size_of_array=start_bar-end_bar+1;
ArrayResize(viborka, size_of_array);
for(i=size_of_array-1;i>=0;i--) viborka[i]=Open[i+end_bar];

double S_A=iMAOnArray(viborka,0,size_of_array,0,MODE_SMA,0);
Print("Среднее арифметическое выборки = ",DoubleToStr(S_A,8));

double S=iStdDevOnArray(viborka,0,size_of_array,MODE_SMA,0,0);

Print("СКО выборки (размах) = ",DoubleToStr(S,8));

double pMax=viborka[ArrayMaximum(viborka)];
double pMin=viborka[ArrayMinimum(viborka)];

double R=pMax-pMin;
Print("pMin = ",pMin," pMax = ",pMax, " R = ",R);

double Hrst;
if( (R>0)&&(S>0)) Hrst = MathLog(R/S)/MathLog(size_of_array*0.5);
Print("Хёрст = ",DoubleToStr(Hrst ,8));
  
  return(0);
}
//+------------------------------------------------------------------+



La recherche d'Extremum est basée sur des données brutes, et non sur des positions et des ruptures.

Le critère est donc quelque peu différent :

2006.05.28 14:53:08 Herst EURUSD,M15 : removed<br/ translate="no"> 2006.05.28 14:53:08 Herst EURUSD,M15 : Hearst = 0.27582880
2006.05.28 14:53:08 Herst EURUSD,M15 : pMin = 1.2691 pMax = 1.2892 R = 0.0201
28 14:53:08 Herst EURUSD,M15 : RMS d'échantillonnage (spread) = 0.00438062
2006.05.28 14:53:08 Herst EURUSD,M15 : Variance d'échantillonnage = 0.00001919
2006.05.28 14:53:08 Herst EURUSD,M15 : Moyenne d'échantillonnage = 1.27924631
2006.05.28 14:53:06 Herst EURUSD,M15 : chargé correctement
2006.05.28 14:52:59 Herst-II EURUSD,M15 : retiré
2006.05.28 14:52:59 Herst-II EURUSD,M15 : Hurst = 0.26196806
2006.05.28 14:52:59 Herst-II EURUSD,M15 : pMin = 1.2696 pMax = 1.2882 R = 0.0186
2006.05.28 14:52:59 Herst-II EURUSD,M15 : Echantillon RMS (spread) = 0.00437625
2006.05.28 14:52:59 Herst-II EURUSD,M15 : Echantillon Mean = 1.27924631
2006.05.28 14:52:59 Herst-II EURUSD,M15 : chargé correctement
2006.05.28 14:52:54 Compilation 'Herst-II'

 
Cher Vladislav !
Merci pour votre réponse complète.