Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Je me suis souvenu d'une façon de regrouper. Le principe est le suivant : vous attribuez des groupes d'éléments (clusters) dans un ensemble, de sorte que la distance maximale entre les éléments d'un cluster soit inférieure à la distance minimale entre tout élément de ce cluster et l'élément qui n'est pas dans ce cluster. La distance peut être une distance ordinaire, un modulus de différence de nombres réels. Bien sûr, il n'y aura pas nécessairement un seul groupe de ce type. Peut-être n'avez-vous pas besoin d'un seul cluster, peut-être devriez-vous les comparer entre eux d'autres manières également. Par exemple, le temps moyen d'occurrence d'un niveau dans le groupe.
C'est intéressant, mais jusqu'à présent, je n'arrive pas à trouver comment déterminer les numéros qui se trouvent dans le groupe - par force brute ? Ensuite, je suppose qu'il y aura des groupes qui se chevaucheront, car si nous définissons un groupe en recherchant le delta le plus petit, mais plus grand par rapport à d'autres éléments, alors le fait de supprimer un élément de ce groupe déplacera le groupe lui-même - la distance entre les groupes aura de l'importance, si elle est significative, alors cela devrait fonctionner.
La distance entre deux points sur l'axe réel que nous mesurons tous comme le module de leur différence. En mathématiques, c'est ce qu'on appelle communément la métrique. Comment mesurer la distance dans le plan entre des points, des paires de nombres, dont chacun est réel ? Là encore, nous avons la solution toute faite qui nous est familière - la distance euclidienne, la racine du carré de la somme des carrés des différences subordonnées. Et les mathématiciens ont d'autres métriques sur le plan, par exemple le plus grand module de deux différences, la somme des modules de différences(http://ad.cctpu.edu.ru/Math_method/math/45.htm). Et ceci uniquement dans le cas de paires de chiffres. Seulement deux chiffres, et toujours deux. Et vous devez entrer une mesure de proximité dans une situation beaucoup plus compliquée. Il n'y a pas deux numéros dans un groupe, et il y a des numéros différents dans des groupes différents.
Nous devons identifier le plus grand groupe, ou les mêmes groupes par le nombre d'éléments qui les composent. Mon inconvénient est mon incapacité à lire correctement des formules complexes. Je dois donc essayer de tout comprendre à partir des exemples et des commentaires qui s'y rapportent.
Il existe des métriques en mathématiques qui mesurent la distance entre deux fonctions. Mais encore une fois, toujours entre deux. Encore une fois pas adapté pour vous, vous avez un groupe.
C'est pourquoi il est important de bien le comprendre vous-même. Écrire, peut-être pouvons-nous le formaliser en un algorithme pour obtenir une caractéristique numérique de la proximité dans un ensemble.
Toutefois, envisagez également de renoncer à essayer de la créer. Le lien ci-dessus indique les exigences auxquelles le système métrique doit répondre. Ils ne sont pas apparus là par hasard, sans aucun d'entre eux, des effets étranges se produiront. Dans le post ci-dessus, j'ai donné un exemple de la manière d'abandonner de telles tentatives globales : laissez les points du groupe être plus proches deux à deux sur l'axe réel que des éléments extérieurs au point. Vous n'auriez pas à inventer quelque chose de très peu trivial.
C'est vrai, au départ nous déterminons la proximité de deux points, puis nous essayons d'exclure la distance qui est grande - c'est la question, comment déterminer si la distance est grande ou non ? C'est là que l'algorithme a échoué - lorsque la distance semble être d'un ordre de grandeur supérieur.
Je ne l'ai pas écrit - comptez d'abord les différences. Puis tout le reste.
Tester un tel algorithme pour filtrer les données avant traitement :
1. Additionner les deux deltas en séquence et multiplier la valeur par deux
2. Trouver la valeur moyenne de la série numérique résultante.
3. Créer une nouvelle série numérique si la valeur est inférieure à la valeur moyenne.
4. Répétez les points 2-3 jusqu'à ce que la série numérique soit inférieure à la moitié de la série d'origine.
5. Après le filtrage, nous effectuons déjà le calcul selon l'algorithme ci-dessus.
J'ai essayé différents chiffres - j'ai obtenu une version plausible, je serais heureux d'entendre des commentaires critiques.
Vous avez donc compté les différences dans la colonne "Delta", que suggérez-vous de faire ensuite ?
Pourquoi tournez-vous en rond ? C'est écrit ici depuis longtemps maintenant.
Ici, vous déclarez : "La période la plus longue est celle où la série originale est inférieure à la moyenne", mais ceci, comme je le comprends, est une faille dans mon algorithme, après quoi la décision a été prise de faire un filtre - je l'ai fait et maintenant l'algorithme ne devient pas aussi manifestement stupide lorsque les chiffres diffèrent significativement les uns des autres.
Quel est l'inconvénient ?
Le filtre ne remplace pas l'algorithme. Le filtre est un ajout à l'algorithme.
Quel est l'inconvénient ?
Le filtre ne remplace pas l'algorithme. Le filtre est un ajout à l'algorithme.
Je ne sais pas quel est l'inconvénient - je ne le vois peut-être pas encore.
Je pense que je devrais essayer de le coder maintenant - pouvez-vous m'aider si j'ai des difficultés ?
Je ne sais pas quel est l'inconvénient - je ne le vois peut-être pas encore.
Je pense que je dois essayer de le codifier maintenant - pouvez-vous m'aider si j'ai des difficultés ?
parce qu'à chaque fois que je découvre que je pense à une mauvaise chose, je pense à une mauvaise chose...
J'ai commencé à développer un algorithme - je suis en train de fabriquer un filtre. Des difficultés sont apparues lors de la synchronisation des deux colonnes "Nombre" et "Delta".
Les idées sur la façon d'éliminer l'imprécision seraient les bienvenues :
//| Test_FindOblast.mq4 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int massivSize=19; //размер массива
double Digit[19]=
{
10,
20,
30,
40,
50,
51,
52,
53,
54,
60,
70,
80,
120,
150,
190,
210,
223,
232,
250,
260
};
double summDelta[19-1];
int N=massivSize-1;//Количество оставшихся цифровых значений
double avrMass=0;//Среднее значение массива дельт
//-Фильтр
//1. Суммируем последовательно две дельты и умножаем значение на два
for(int i=1;i<massivSize;i++)
{
summDelta[i-1]=((Digit[i]-Digit[i-1])+(Digit[i+1]-Digit[i]))*2;
}
for(int i=0;i<massivSize-1;i++) printf("summDelta[%d] = %G",i,summDelta[i]);
//2. Находим среднее значение получившегося числового ряда
//3. Составляем новый числовой ряд, если значение меньше среднего значения
//4. Повторяем пункт 2-3 пока числовой ряд не будет меньше половины первоначального ряда
for(int Z=0;N>massivSize/2;Z++)
{
int SizeMass=ArraySize(summDelta);//Узнаем размер массива
avrMass=iMAOnArray(summDelta,0,SizeMass,0,0,0);
Print("Среднее значение получившегося числового ряда",Z,"=",avrMass);
for(int i=0;i<SizeMass;i++)
{
if(summDelta[i]>avrMass)
{
summDelta[i]=0;
Digit[i]=0;
N--;
}
}
Print("N=",N);
ArraySort(summDelta,WHOLE_ARRAY,0,MODE_DESCEND);
ArraySort(Digit,WHOLE_ARRAY,0,MODE_DESCEND);
if(N!=0)
{
ArrayResize(summDelta,N,0);
for(int i=0;i<N;i++) printf("summDelta[%d] = %G",i,summDelta[i]);
ArrayResize(Digit,N+1,0);
for(int i=0;i<N+1;i++) printf("Digit[%d] = %G",i,Digit[i]);
}
else
{
for(int i=0;i<N;i++) printf("summDelta[%d] = %G",i,summDelta[i]);
for(int i=0;i<N+1;i++) printf("Digit[%d] = %G",i,Digit[i]);
return;
}
}
int SizeMass=ArraySize(summDelta);//Узнаем размер массива
avrMass=iMAOnArray(summDelta,0,SizeMass,0,0,0);
Print("Среднее значение получившегося числового ряда=",avrMass);
//-Основной алгоритм
//1. Находим разницу между числами - это как раз их близость друг от друга.
//2. Если число меньше среднего значения дельт, получившихся из п.1, то - 1, а если нет - 0.
//3. Если значение из п.2 равно 1, то суммируем значение с предыдущим итогом, если нет - 0.
//4. Находим максимальное значение из пункта 3.
//5. Определяем диапазон - находим значение из пункта 4 и ищем вверх из пункта 3 число с нулевым значением, потом увеличиваем найденное число на единицу.
//Таким образом мы получаем диапазон чисел, плотность которых наибольшая по отношению к другим.
}
//+------------------------------------------------------------------+