Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1409

 
Buongiorno a tutti!
Domanda su mql4, più precisamente sulla funzione ArraySort()
Ecco il mio codice
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;
}
}

Quando LoY[0][0] ha ottenuto il valore Bid( 1.6134) dopo che l'ordine è stato aperto, la funzione ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND) ha ordinato l'array in ordine crescente per la prima dimensione e ha spostato l'elemento dell'array con il valore più grande in cima all'array. Così, LoY[0][0] insieme al suo valore diventa LoY[30][0] nell'array ordinato in ordine crescente. Questo è logico e quindi sono d'accordo.


Cosa secondo me non è logico o accettabile per me? Perché ArraySort() LoY[15][0] ha messo 0 sotto l'indice, nonostante il fatto che il suo valore (1,61040) sia uguale ai valori di tutti gli altri elementi dell'array tranne il trentesimo. Lo stesso non è chiaro, perché ArraySort()LoY[30][0] ha messo l'indice 15, nonostante il fatto che il suo valore (1,61040) sia uguale ai valori di tutti gli altri elementi dell'array tranne il trentesimo.

UNA DOMANDA: come fare in modo che un elemento con indice 0 sia LoY[1][0] in questo tick , un elemento con indice 15 siaLoY[15][0] e un elemento con indice 29 sia LoY[30][0]
. In altre parole, come fare una funzione per non ordinare ulteriormente gli elementi con lo stesso valore? Non è logico e insensato.

Grazie per il vostro aiuto.

 

Questo è probabilmente l'algoritmo di ordinamento. Ci sono alcune permutazioni degli elementi dell'array.

Prova altre opzioni di ordinamento.

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

Questo è probabilmente l'algoritmo di ordinamento. Ci sono alcune permutazioni degli elementi della matrice.

Prova altre opzioni di ordinamento.

Grazie mille per il consiglio. Potresti dirmi se ci sono altre opzioni di ordinamento in mql4? Se sì, dove si possono trovare nell'elenco?

 

provalo:

//функция быстрой сортировки
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);
   }

anche se la funzione è per un array unidimensionale, ma può essere rielaborata

 
Aleksei Stepanenko:

provalo:

È vero che la funzione è per un array monodimensionale, ma può essere rielaborata.

Grazie mille.

 

Un consiglio, per favore,

Il codice cerca i grafici aperti e crea un'etichetta con il nome del simbolo, ma se due grafici hanno lo stesso simbolo,

allora crea un'etichetta solo su un grafico, cosa sto facendo di sbagliato?

//---
   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 consiglio, per favore,

Il codice cerca i grafici aperti e crea un'etichetta con il nome del simbolo, ma se due grafici hanno lo stesso simbolo,

crea l'etichetta solo su un grafico, cosa sto facendo di sbagliato?

Gli ID dei grafici (ChartID()) dello stesso simbolo sono diversi. Usateli.

 
Artyom Trishkin:

Gli identificatori ChartID() dello stesso simbolo sono diversi. Usateli.

È per questo che lo uso,
ChartFirst()+i

cioè passando attraverso tutti i grafici aperti

O ho capito male? C'è un modo per renderlo chiaro, sotto forma di codice?

 
Molto strano, mette un segno su tutti i nuovi grafici aperti, solo un grafico viene ignorato (
 
MakarFX:
Molto strano, su tutti i nuovi grafici aperti mette un segno, solo un grafico viene ignorato (

Leggete attentamente la documentazione e il codice di esempio. Il vostro ciclo non è organizzato correttamente.

//--- переменные для идентификаторов графиков
   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++;// не забудем увеличить счетчик
     }
Non ditemi che i cicli for e while funzionano allo stesso modo. Non è questo il problema, sono le linee evidenziate.