Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1409

 
Guten Tag zusammen!
Eine Frage zu mql4, genauer gesagt zur Funktion ArraySort()
Hier ist mein 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;
}
}

Wenn LoY[0][0] nach dem Öffnen der Bestellung den Wert Bid( 1.6134) erhalten hat, hat die Funktion ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND) das Array in aufsteigender Reihenfolge nach der ersten Dimension sortiert und das Arrayelement mit dem größten Wert an den Anfang des Arrays gestellt. So wird LoY[0][0] zusammen mit seinem Wert zu LoY[30][0] in der in aufsteigender Reihenfolge sortierten Matrix. Das ist logisch und deshalb stimme ich ihm zu.


Was ist meiner Meinung nach nicht logisch oder akzeptabel für mich? Warum hat ArraySort() LoY[15][0] 0 unter den Index gesetzt, obwohl sein Wert (1,61040) gleich den Werten aller anderen Array-Elemente außer dem dreißigsten ist? Es ist auch nicht klar, warum ArraySort()LoY[30][0] den Index 15 gesetzt hat, obwohl sein Wert (1.61040) den Werten aller anderen Elemente des Arrays außer dem dreißigsten entspricht.

Eine FRAGE: Wie kann man ein Element mit Index 0 zu LoY[1][0] auf diesem Tick machen , ein Element mit Index 15 zuLoY[15][0] und ein Element mit Index 29 zu LoY[30][0]
. Mit anderen Worten, wie kann man eine Funktion dazu bringen, Elemente mit demselben Wert nicht weiter zu sortieren? Es ist unlogisch und sinnlos.

Ich danke Ihnen für Ihre Hilfe.

 

Dies ist wahrscheinlich der Sortieralgorithmus. Es gibt einige Permutationen der Array-Elemente.

Versuchen Sie andere Sortieroptionen.

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

Dies ist wahrscheinlich der Sortieralgorithmus. Es gibt einige Permutationen der Array-Elemente.

Versuchen Sie andere Sortieroptionen.

Vielen Dank für den Ratschlag. Können Sie mir bitte sagen, ob es in mql4 noch andere Sortiermöglichkeiten gibt? Wenn ja, wo befinden sie sich in dem Verzeichnis?

 

Versuchen Sie es:

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

obwohl die Funktion für ein eindimensionales Array gedacht ist, aber sie kann umgestaltet werden

 
Aleksei Stepanenko:

Versuchen Sie es:

Es stimmt zwar, dass die Funktion für ein eindimensionales Array gedacht ist, aber sie kann überarbeitet werden.

Ich danke Ihnen vielmals.

 

Ein Ratschlag, bitte,

Der Code sucht nach offenen Diagrammen und erstellt ein Etikett mit dem Namen des Symbols, aber wenn zwei Diagramme das gleiche Symbol haben,

dann wird nur in einem Diagramm eine Beschriftung erstellt, was mache ich falsch?

//---
   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:

Ein Ratschlag, bitte,

Der Code sucht nach offenen Diagrammen und erstellt ein Etikett mit dem Namen des Symbols, aber wenn zwei Diagramme das gleiche Symbol haben,

Die Beschriftung wird nur in einem Diagramm erstellt, was mache ich falsch?

Die Chart-IDs (ChartID()) desselben Symbols sind unterschiedlich. Verwenden Sie sie.

 
Artyom Trishkin:

Die ChartID()-Kennungen desselben Symbols sind unterschiedlich. Verwenden Sie sie.

Dafür verwende ich es,
ChartFirst()+i

d.h. Durchgehen aller offenen Charts

Oder habe ich Sie missverstanden? Gibt es eine Möglichkeit, dies in Form von Code deutlich zu machen?

 
Sehr seltsam, alle neu geöffneten Diagramme werden markiert, nur ein Diagramm wird ignoriert (
 
MakarFX:
Sehr seltsam, bei allen neu geöffneten Charts wird eine Markierung gesetzt, nur ein Chart wird ignoriert (

Lesen Sie die Dokumentation und den Beispielcode sorgfältig durch. Ihre Schleife ist nicht richtig organisiert.

//--- переменные для идентификаторов графиков
   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++;// не забудем увеличить счетчик
     }
Erzählen Sie mir nicht, dass for- und while-Schleifen auf die gleiche Weise funktionieren. Das ist nicht das Problem, es sind die hervorgehobenen Zeilen.
Grund der Beschwerde: