Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1409

 
Buenos días a todos!
Una pregunta sobre mql4, más concretamente sobre la función ArraySort()
Aquí está mi código
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;
}
}

Cuando LoY[0][0] ha obtenido el valor Bid( 1.6134) después de abrir la orden, la función ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND) ha ordenado la matriz en orden ascendente por la primera dimensión y ha movido el elemento de la matriz con el mayor valor a la parte superior de la matriz. Así, LoY[0][0] junto con su valor se convierte en LoY[30][0] en el array ordenado de forma ascendente. Esto es lógico y por lo tanto estoy de acuerdo con ello.


¿Qué es lo que, en mi opinión, no es lógico o aceptable para mí? ¿Por qué ArraySort() LoY[15][0] colocó el 0 bajo el índice, a pesar de que su valor (1,61040) es igual a los valores de todos los demás elementos del array excepto el trigésimo? Lo mismo no está claro, por qué ArraySort()LoY[30][0] ha puesto el índice 15, a pesar de que su valor (1,61040) es igual a los valores de todos los demás elementos de la matriz excepto el trigésimo.

UNA PREGUNTA: ¿cómo hacer que un elemento con índice 0 sea LoY[1][0] en este tick , un elemento con índice 15 seaLoY[15][0] y un elemento con índice 29 sea LoY[30][0]
. En otras palabras, cómo hacer que una función no ordene elementos con el mismo valor en adelante? No es lógico ni tiene sentido.

Gracias por su ayuda.

 

Este es probablemente el algoritmo de clasificación. Hay algunas permutaciones de los elementos de la matriz.

Pruebe otras opciones de clasificación.

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

Este es probablemente el algoritmo de clasificación. Hay algunas permutaciones de los elementos de la matriz.

Pruebe otras opciones de clasificación.

Muchas gracias por los consejos. ¿Podría decirme si hay otras opciones de clasificación en mql4? Si es así, ¿dónde se pueden encontrar en el directorio?

 

pruébalo:

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

aunque la función es para un array unidimensional, pero se puede rediseñar

 
Aleksei Stepanenko:

pruébalo:

Es cierto que la función es para un array unidimensional, pero se puede rehacer.

Muchas gracias.

 

Un consejo, por favor,

El código busca los gráficos abiertos y crea una etiqueta con el nombre del símbolo, pero si dos gráficos tienen el mismo símbolo,

entonces sólo crea una etiqueta en un gráfico. ¿Qué estoy haciendo mal?

//---
   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 consejo, por favor,

El código busca los gráficos abiertos y crea una etiqueta con el nombre del símbolo, pero si dos gráficos tienen el mismo símbolo,

sólo crea la etiqueta en un gráfico. ¿Qué estoy haciendo mal?

Los ID de los gráficos (ChartID()) del mismo símbolo son diferentes. Utilízalos.

 
Artyom Trishkin:

Los identificadores ChartID() del mismo símbolo son diferentes. Utilízalos.

Para eso lo uso,
ChartFirst()+i

es decir, pasar por todas las cartas abiertas

¿O te he entendido mal? ¿Hay alguna forma de aclararlo, en forma de código?

 
Muy extraño, pone una marca en todos los nuevos gráficos abiertos, sólo un gráfico es ignorado (
 
MakarFX:
Muy extraño, en todos los nuevos gráficos abiertos pone una marca, sólo un gráfico es ignorado (

Lea atentamente la documentación y el código de ejemplo. Su bucle no está organizado correctamente.

//--- переменные для идентификаторов графиков
   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++;// не забудем увеличить счетчик
     }
No me digas que los bucles for y while funcionan igual. Ese no es el problema, sino las líneas resaltadas.