Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1409

 
Bom dia a todos!
Uma pergunta sobre mql4, mais especificamente sobre a função ArraySort()
Aqui está meu 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;
}
}

Quando LoY[0][0] tem o valor Bid( 1,6134) após a ordem ter sido aberta, a função ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND) ordenou o array em ordem ascendente pela primeira dimensão e moveu o elemento do array com o maior valor para o topo do array. Assim, LoY[0][0] junto com seu valor se torna LoY[30][0] na matriz ordenada em ordem ascendente. Isto é lógico e, portanto, estou de acordo com ele.


O que, em minha opinião, não é lógico ou aceitável para mim? Por que o ArraySort() LoY[15][0] colocou 0 sob o índice, apesar de seu valor (1,61040) ser igual aos valores de todos os outros itens do array, exceto o trigésimo. O mesmo não é claro, porque o ArraySort()LoY[30][0] colocou o índice 15, apesar de seu valor (1,61040) ser igual aos valores de todos os outros elementos do array, exceto o trigésimo.

Uma pergunta: como fazer um elemento com índice 0 ser LoY[1][0] neste tick , um elemento com índice 15 serLoY[15][0] e um elemento com índice 29 ser LoY[30][0]
. Em outras palavras, como fazer uma função para não ordenar mais elementos com o mesmo valor? Não é lógico e sem sentido.

Obrigado por sua ajuda.

 

Este é provavelmente o algoritmo de classificação. Há algumas permutações dos elementos da matriz.

Tente outras opções de ordenação.

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

Este é provavelmente o algoritmo de classificação. Há algumas permutações dos elementos da matriz.

Tente outras opções de ordenação.

Muito obrigado pelo conselho. Você poderia me dizer se existem outras opções de ordenação em mql4? Em caso afirmativo, onde podem ser encontrados no diretório?

 

experimente:

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

embora a função seja para uma matriz unidimensional, mas pode ser redesenhada

 
Aleksei Stepanenko:

experimente:

É verdade que a função é para uma matriz unidimensional, mas ela pode ser retrabalhada.

Muito obrigado.

 

Uma palavra de conselho, por favor,

O código procura por gráficos abertos e cria uma etiqueta com o nome do símbolo, mas se dois gráficos tiverem o mesmo símbolo,

O que estou fazendo de errado?

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

Uma palavra de conselho, por favor,

O código procura por gráficos abertos e cria uma etiqueta com o nome do símbolo, mas se dois gráficos tiverem o mesmo símbolo,

O que estou fazendo de errado?

Os IDs dos gráficos (ChartID()) do mesmo símbolo são diferentes. Utilize-os.

 
Artyom Trishkin:

Os identificadores ChartID() do mesmo símbolo são diferentes. Utilize-os.

É para isso que eu o uso,
ChartFirst()+i

ou seja, passar por todos os gráficos abertos

Ou eu o entendi mal? Há alguma forma de deixar claro, sob a forma de código?

 
Muito estranho, marca todos os novos gráficos abertos, apenas um gráfico é ignorado (
 
MakarFX:
Muito estranho, em todos os novos gráficos abertos coloca uma marca, apenas um gráfico é ignorado (

Leia cuidadosamente a documentação e o código de exemplo. Seu laço não está organizado corretamente.

//--- переменные для идентификаторов графиков
   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++;// не забудем увеличить счетчик
     }
Não me diga isso por e enquanto os laços funcionam da mesma maneira. Esse não é o problema, mas sim as linhas destacadas.