MT4 iMAOnArray et iBandsOnArray : effet du nombre d'éléments sur les calculs

 

Voici la question. Si je n'ai pas besoin de calculer l'ensemble du tableau, mais seulement les N derniers éléments.

Je ne comprends pas bien la logique du calcul de ces fonctions lors de la limitation. J'ai un tableau de timeseries (un des buffers d'indicateurs), si je laisse le nombre d'éléments égal à 0, aucune question, tout est compté et calculé, mais si je diminue le nombre d'éléments impliqués dans le calcul par les mêmes décalages, je n'obtiens que les primaires. Pour simplifier, il y a un tableau de 5000 éléments (barres sur le graphique), pour gagner du temps je dois calculer seulement les 300 derniers, mais quand j'ai spécifié la valeur 300 dans le deuxième paramètre j'ai obtenu 5000-4700 éléments primaires, mais sur le décalage 300-0, et les autres valeurs à un appel ne changent pas. Quel est l'intérêt d'utiliser ce paramètre ?

 
Sergey Efimenko:

Voici la question. Si je n'ai pas besoin de calculer l'ensemble du tableau, mais seulement les N derniers éléments.

Je ne comprends pas bien la logique du calcul de ces fonctions lors de la limitation. J'ai un tableau de timeseries (un des buffers de l'indicateur), si je laisse le nombre d'éléments égal à 0, pas de questions, tout est compté et calculé, mais si je diminue le nombre d'éléments impliqués dans le calcul par les mêmes décalages, je n'obtiens que les primaires. Pour simplifier, il y a un tableau de 5000 éléments (barres sur le graphique), pour gagner du temps je dois calculer seulement les 300 derniers, mais quand j'ai spécifié la valeur 300 dans le deuxième paramètre j'ai obtenu 5000-4700 éléments primaires, mais sur le décalage 300-0, et les autres valeurs à un appel ne changent pas. Quel est l'intérêt d'utiliser ce paramètre ?

Donnez-moi un exemple de code pour bien comprendre la question.
 
Alexander Voronkov:
Donnez-moi un exemple de code pour bien comprendre la question.

cela fonctionne bien :

Buffer[i]=GetValue(i) ;
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i) ;
BufferBMA[i]=iBandsOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i)

cela ne fonctionne pas bien :

Buffer[i]=GetValue(i) ;
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i) ;
BufferBMA[i]=iBandsOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i) ;

 
Sergey Efimenko:

cela fonctionne bien :

Buffer[i]=GetValue(i) ;
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i) ;
BufferBMA[i]=iBandesOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i) ;

cela ne fonctionne pas normalement :

Buffer[i]=GetValue(i) ;
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i) ;
BufferBMA[i]=iBandesOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i) ;

Pour gagner dutemps et ne compter que les 300 dernières barres du graphique, utilisez les opérateurs for() ou if().
 
Alexander Voronkov:
Pour gagner dutemps et ne compter que les 300 dernières barres du graphique, utilisez les valeurs des opérateurs for() ou if().

Comment puis-je dire ça délicatement... As-tu la moindre idée de ce dont tu parles ? Avez-vous déjà utilisé les fonctions mentionnées dans le titre dans votre code et essayé de calculer une partie d'un tableau plutôt que le tableau entier ? Eh bien, essayez et peut-être comprendrez-vous "visuellement" ce dont nous parlons. Votre proposition est pertinente pour le calcul des barres ou d'autres situations où vous pouvez spécifier explicitement la quantité à compter, mais pas pour un tableau utilisant ces fonctions. La partie du code ci-dessus est absolument identique, la seule différence est que dans le premier cas je compte le tableau entier, et dans le second je ne compte que 300 de ses valeurs, mais les valeurs sont comptées à la fin du tableau, alors que les références sont utilisées au début. Peut-être que je ne décris pas clairement la situation, mais le code vous aidera à voir cela si vous l'attachez à un indicateur et comparez le résultat...

PS A propos de la version "auto-écrite" des analogues de fonctions alternatives est claire, mais je voudrais obtenir le résultat souhaité au moyen d'un langage.

 
Sergey Efimenko:

Comment puis-je dire ça délicatement... As-tu la moindre idée de ce dont tu parles ? Avez-vous déjà utilisé les fonctions mentionnées dans le titre dans votre code et essayé de calculer une partie d'un tableau au lieu du tableau entier ? Eh bien, essayez et peut-être comprendrez-vous "visuellement" ce dont nous parlons. Votre proposition est pertinente pour le calcul des barres ou d'autres situations où vous pouvez spécifier explicitement la quantité à compter, mais pas pour un tableau utilisant ces fonctions. La partie du code ci-dessus est absolument identique, la seule différence est que dans le premier cas je compte le tableau entier, et dans le second je ne compte que 300 de ses valeurs, mais les valeurs sont comptées à la fin du tableau, alors que les références sont utilisées au début. Peut-être que je ne décris pas clairement la situation, mais le code vous aidera à voir cela si vous l'attachez à un indicateur et comparez le résultat...

PS A propos de la version "auto-écrite" des analogues de fonctions alternatives est claire, mais je voudrais obtenir le résultat souhaité au moyen d'un langage.

Dites-le comme il est, c'est bon.

Je t'ai donc mal compris.

 
Personne n'utilise ces fonctions et n'est confronté à cette situation ?
 
Sergey Efimenko:

cela fonctionne bien :

Buffer[i]=GetValue(i) ;
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i) ;
BufferBMA[i]=iBandesOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i) ;

cela ne fonctionne pas normalement :

Buffer[i]=GetValue(i) ;
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i) ;
BufferBMA[i]=iBandesOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i) ;

Quel résultat attendez-vous et comment cela doit-il fonctionner normalement ?
 
Alexey Viktorov:
Quel résultat attendez-vous et comment cela doit-il fonctionner normalement ?
Que voulez-vous dire, qu'est-ce que j'attends ? J'ai écrit plus haut que j'avais besoin des 300 dernières valeurs réelles (actuelles), et non des 300 premières (initiales). De plus, j'accède à un tableau à l'offset 299-0, mais j'obtiens des données à l'offset de "fin de tableau" à "fin de tableau - 300" valeurs (dans mon cas de 4999 à 4700), ce qui signifie qu'à l'offset 299 se trouve une valeur qui devrait être à l'offset 4999 et de même à l'offset 0 se trouve une valeur qui devrait être à l'offset 4700. Pour réduire le nombre de calculs du tableau, il est important d'obtenir non pas les données historiques initiales, mais les données actuelles. La question est de savoir à quoi sert de calculer les valeurs les plus anciennes, alors que les valeurs actuelles ne sont pas calculées.
 
Sergey Efimenko:
Comment ça, qu'est-ce que j'attends ? J'ai écrit que j'avais besoin des 300 dernières valeurs réelles (actuelles), et non des 300 premières (initiales). De plus, j'accède à un tableau à l'offset 300-0, mais j'obtiens des données à l'offset des valeurs de "fin de tableau" à "fin de tableau - 300" (dans mon cas de 4999 à 4700), c'est-à-dire qu'à l'offset 300 se trouve la valeur qui devrait être à l'offset 4999 et de la même manière à l'offset 0 se trouve la valeur qui devrait être à l'offset 4700. Pour réduire le nombre de calculs du tableau, il est important d'obtenir les données actuelles au lieu des données historiques initiales. La question est de savoir à quoi sert de calculer les valeurs les plus anciennes lorsque les valeurs actuelles ne sont pas calculées.

La fonctionArraySetAsSeries() est-elle utile ?

J'ai fait face à une telle chose une fois - je ne pouvais pas gagner, alors j'ai abandonné. Je l'ai fait sans iMAOnArray().

 
Artyom Trishkin:

La fonction ArraySetAsSeries() est-elle utile ?

J'ai fait face à une telle chose une fois - je ne pouvais pas gagner, alors j'ai abandonné. Je l'ai fait sans iMAOnArray().

C'est là le problème - le tableau est initialement un tampon "série". Le problème est de limiter le nombre de calculs, comme je l'ai déjà écrit, les données sont normales lorsque l'on utilise le calcul de l'ensemble du tableau mais cela ralentit le terminal lors de l'initialisation et c'est encore plus difficile lorsque l'on utilise plusieurs indicateurs pour différents délais, sans parler de l'optimisation d'un EA pour un tel indicateur ; le problème est de nature interne à MT4, c'est-à-dire que la seule solution est d'utiliser leurs propres analogues des fonctions spécifiées mais je veux les éviter

PS J'utilise également mon propre analogue de iMAOnArray, mais je ne serai pas le seul à disposer du code source. Bien qu'il soit possible d'utiliser des bibliothèques, iBands est également nécessaire, mais le calcul des écarts devra être effectué. En général, il est dommage que ce soit le cas pour les fonctions standard.