L'apprentissage automatique dans la négociation : théorie, modèles, pratique et algo-trading - page 2064

 
Aleksey Nikolayev:

Recherchez Di - le carré moyen des incréments pour la i-ème minute de la journée. Divisez ensuite tous les incréments par leur di=sqrt(Di) correspondant. Additionnez les incréments au carré et recherchez les déviations par rapport au SB dans la nouvelle série. Le prix est faussé, mais l'heure ne change pas.

Quel est l'intérêt de 2 mois pour chaque minute ? Les changements à chaque minute seront faibles, et les calculs seront importants. Soit une minute en arrière, soit un mois en arrière et un mois en avant. Code pour la première mesure.

for(int i = 1,i<= 43200*2, i++);
{
Di+=pow((iClose(NULL,1,i) - iOpen(NULL,1,i)),2)/i ;
}
di=sqrt(Di);

Nouvelle rangée

for(int i = 1,i<= 43200*2, i++);
{
NewClose[i]=iClose(NULL,1,i)/di;
NewOpen[i]=iOpen(NULL,1,i)/di ;
}

Est-ce correct ?

 
Valeriy Yastremskiy:

Est-ce exact ?


Je ne pense pas.

J'ai compris l'algorithme de la façon suivante : supposons que l'heure est 10:00, vous calculez Di pour les barres m1 de cette heure et ensuite pour 10:00-minutes (close[i] - open[i])/di et ainsi de suite pour chaque minute.

 
Evgeniy Chumakov:


Je ne pense pas.

J'ai compris l'algorithme de cette façon : disons qu'il est 10:00, vous calculez Di pour les barres m1 de cette heure et ensuite pour la minute 10:00 (close[i] - open[i])/di et ainsi de suite pour chaque minute.

Code pour la première mesure. Tu dois le déplacer plus profondément, c'est une autre boucle sur le dessus.
 
Evgeniy Chumakov:


Je ne pense pas.

J'ai compris l'algorithme de cette façon : disons qu'il est 10:00, vous calculez Di pour les barres m1 de cette heure et ensuite pour la minute 10:00 (close[i] - open[i])/di et ainsi de suite pour chaque minute.

C'est exact. Nous créons deux archives - réelle et entière avec une taille de 1440=24*60. Dans le premier, additionnez les carrés des incréments, et dans le second - le nombre de barres pour une minute donnée, puis divisez le premier par le second (pour les nombres dont le nombre de barres est supérieur à 1). Nous extrayons ensuite la racine carrée et ce n'est qu'ensuite que nous renormalisons les incréments et assemblons la somme cumulée - une nouvelle série, que nous étudions ensuite pour voir si elle diffère de SB.

 
Aleksey Nikolayev:

Oui, c'est correct. Nous avons deux archives - réelles et entières, de taille 1440=24*60. Dans le premier, additionnez les carrés des incréments, et dans le second - le nombre de mesures pour une minute donnée, puis divisez le premier par le second (pour les nombres dont le nombre de mesures est supérieur à 1). Ensuite, nous extrayons la racine carrée et seulement après, nous renormalisons les incréments et les cumulons en une nouvelle série, que nous étudions pour voir si elle diffère de SB.

En d'autres termes, il s'agit de la moyenne carrée des points caractéristiques pour 24 heures, et ainsi pour 2 mois de points caractéristiques. Numéro de la barre des minutes ? Quelle est la somme des carrés divisée par 1440 ?

 
Valeriy Yastremskiy:

Est-ce que tu divises la somme des carrés par 1440 ?


Vous divisez la somme des carrés par le nombre de barres pour une minute donnée, puis vous extrayez la racine.

 
Aleksey Nikolayev:

Oui, c'est correct. Nous avons deux archives, une réelle et une entière de taille 1440=24*60.


c'est-à-dire que nous devons construire la somme cumulative quotidienne = 1440 minutes ?

 
Evgeniy Chumakov:


Vous divisez la somme des carrés par le nombre de barres pour une minute donnée, puis vous extrayez la racine.

Alors je ne comprends pas. Pour la profondeur de la barre 3, la somme sera de trois et cette valeur sera calculée pour la 3ème barre ou pour la première. Je comprends que la moyenne doit être calculée pour le même nombre de barres et non de manière cumulative. Il serait préférable de donner la formule tout de suite. Nous comprenons tous les mots différemment).

for(int i = 1,i<= 1440, i++);
{
Di+=pow((iClose(NULL,1,i) - iOpen(NULL,1,i)),2)/i ;
di=sqrt(Di);
DVal[i]=(iClose(NULL,1,i) - iOpen(NULL,1,i)/di; 
}

Ça ne me semble pas correct.

 
Valeriy Yastremskiy:


Ça ne me semble pas correct.


code incorrect

 

En supposant qu'il n'y a pas de trous dans l'historique et qu'il y a 1440 minutes dans tous les jours (moins le vendredi), le code devrait être comme ceci

double di = 0;

int n = 40; // глубина 40 суток (два месяца)

int pos = 0; // текущий бар

int step = 0; // шаг


for(int i = 0; i < n; i++){

di += MathPow( close[pos + step] - open[pos + step],2);

step += 1440;
}

di = MathSqrt(di/n);

double x = (close[pos] - open[pos])/di;