Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1409

 
Bonjour à tous !
Question sur mql4, plus précisément sur la fonction ArraySort()
Voici mon code
double LoY[31][31];
int P1;
void OnTick()
{
if (TimeCurrent()==1262568096)
{
for(int r=0; r<31;r++)
{
LoY[r][0]=1.6104;
LoY[r][1]=r;
P1=1;
}
}
if (TimeCurrent()>1262568095)
{
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
for( r=0; r<31;r++)
Print("-------------------------------------LoY[r][1]--------------=",  LoY[r][1],"  r ",   r,"  LoY[r][0] ",  DoubleToString( LoY[r][0],5));
}

if (Bid-LoY[0][0]>=0.0030)
{
OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,Ask+300*Point,Ask-100*Point,"300",0);
LoY[0][0]=Bid;
}
}

Lorsque LoY[0][0] a obtenu la valeur Bid( 1.6134) après l'ouverture de l'ordre, la fonction ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND) a trié le tableau par ordre croissant selon la première dimension et a déplacé l'élément du tableau ayant la plus grande valeur vers le haut du tableau. Ainsi, LoY[0][0] avec sa valeur devient LoY[30][0] dans le tableau trié par ordre croissant. C'est logique et je suis donc d'accord avec cela.


Ce qui, à mon avis, n'est pas logique ou acceptable pour moi ? Pourquoi ArraySort() LoY[15][0] a-t-il placé 0 sous l'index, malgré le fait que sa valeur (1,61040) soit égale aux valeurs de tous les autres éléments du tableau sauf le trentième. La même chose n'est pas claire, pourquoi ArraySort()LoY[30][0] a mis l'indice 15, malgré le fait que sa valeur (1.61040) est égale aux valeurs de tous les autres éléments du tableau sauf le trentième.

UNE QUESTION : comment faire en sorte qu'un élément avec l'indice 0 soit LoY[1][0] sur ce tick , qu'un élément avec l'indice 15 soitLoY[15][0] et qu'un élément avec l'indice 29 soit LoY[30][0]
. En d'autres termes, comment faire en sorte qu'une fonction ne trie pas plus loin les éléments avec la même valeur ? Ce n'est pas logique et c'est insensé.

Merci pour votre aide.

 

Il s'agit probablement de l'algorithme de tri. Il existe quelques permutations des éléments du tableau.

Essayez d'autres options de tri.

Методы сортировки и их визуализация с помощью MQL5
Методы сортировки и их визуализация с помощью MQL5
  • www.mql5.com
Для работы с графикой в MQL5 создана специальная библиотека Graphic.mqh. В статье описан пример ее практического применения и поясняется сама суть сортировок. По каждой сортировке существует как минимум отдельная статья, а по ряду из них уже опубликованы целые исследования, поэтому здесь описывается лишь общая идея.
 
Aleksei Stepanenko:

Il s'agit probablement de l'algorithme de tri. Il existe quelques permutations des éléments du tableau.

Essayez d'autres options de tri.

Merci beaucoup pour les conseils. Pourriez-vous me dire s'il existe d'autres options de tri dans mql4 ? Si oui, où peut-on les trouver dans l'annuaire ?

 

Essayez-le :

//функция быстрой сортировки
void SortArray(int &eArray[], int eFirst, int eLast)
   {
   int eMiddle, eTemp;
   int eLeft=eFirst, eRight=eLast;
   //вычисление опорного элемента
   eMiddle=eArray[(eLeft+eRight)/2];
   do
      {
      while(eArray[eLeft]<eMiddle) eLeft++;
      while(eArray[eRight]>eMiddle) eRight--;
      //перестановка элементов
      if(eLeft<=eRight)
         {
         eTemp=eArray[eLeft];
         eArray[eLeft]=eArray[eRight];
         eArray[eRight]=eTemp;
         eLeft++;
         eRight--;
         }
      }
   while(eLeft<eRight);
   if(eFirst<eRight) SortArray(eArray,eFirst,eRight);
   if(eLeft<eLast) SortArray(eArray,eLeft,eLast);
   }

bien que la fonction soit pour un tableau unidimensionnel, mais elle peut être retravaillée

 
Aleksei Stepanenko:

Essayez-le :

Il est vrai que la fonction est destinée à un tableau unidimensionnel, mais elle peut être retravaillée.

Merci beaucoup.

 

Un conseil, s'il vous plaît,

Le code recherche les graphiques ouverts et crée une étiquette avec le nom du symbole, mais si deux graphiques ont le même symbole,

Je ne crée une étiquette que sur un seul graphique, qu'est-ce que je fais de travers ?

//---
   string name;
   for(int i=0; i<10; i++)
     {
      if(ChartSymbol(ChartFirst()+i)=="EURGBP")
        {name="EURGBP";
         if(ObjectFind(ChartFirst()+i,name+IntegerToString(i))!=0)
           {
            Create_Label(ChartFirst()+i,name+IntegerToString(i),0,5,5,CORNER_RIGHT_UPPER,name,"Times New Roman",10,
                      clrBlack,0,ANCHOR_RIGHT_UPPER," ",false,false,false,true,0);
           }
        }
     }
 
MakarFX:

Un conseil, s'il vous plaît,

Le code recherche les graphiques ouverts et crée une étiquette avec le nom du symbole, mais si deux graphiques ont le même symbole,

Je ne crée l'étiquette que sur un seul graphique, qu'est-ce que je fais de travers ?

Les ID des graphiques (ChartID()) d'un même symbole sont différents. Utilisez-les.

 
Artyom Trishkin:

Les identifiants ChartID() d'un même symbole sont différents. Utilisez-les.

C'est pour ça que je l'utilise,
ChartFirst()+i

c'est-à-dire en passant en revue tous les graphiques ouverts

Ou est-ce que je vous ai mal compris ? Y a-t-il un moyen de le rendre clair, sous forme de code ?

 
Très étrange, met une marque sur tous les nouveaux graphiques ouverts, seul un graphique est ignoré (
 
MakarFX:
Très étrange, sur tous les nouveaux graphiques ouverts met une marque, seul un graphique est ignoré (

Lisez attentivement la documentation et le code d'exemple. Votre boucle n'est pas organisée correctement.

//--- переменные для идентификаторов графиков
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   Print("ChartFirst = ",ChartSymbol(prevChart)," ID = ",prevChart);
   while(i<limit)// у нас наверняка не больше 100 открытых графиков
     {
      currChart=ChartNext(prevChart); // на основании предыдущего получим новый график
      if(currChart<0) break;          // достигли конца списка графиков
      Print(i,ChartSymbol(currChart)," ID =",currChart);
      prevChart=currChart;// запомним идентификатор текущего графика для ChartNext()
      i++;// не забудем увеличить счетчик
     }
Ne me dites pas que les boucles for et while fonctionnent de la même façon. Ce n'est pas le problème, ce sont les lignes en surbrillance.