Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1409

 
Всем доброго времени суток!
Вопрос по mql4 , а конкретнее по функции ArraySort()
Вот мой код
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;
}
}

После того как LoY[0][0] после открытия ордера получила значение Bid( то есть 1.6134) функция ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND) отсортировала массив по возрастанию по первому измерению и поместила элемент массива с самым большим значением в самый верх массива. То есть   LoY[0][0]  вместе со своим значением стала  LoY[30][0] в отсортированном по возрастанию массиве. Это логично и поэтому я с этим согласен.


Что на мой взгляд не логично и не приемлемо для меня? Почему  ArraySort()  LoY[15][0] поместила под индексом 0 не смотря на то что ее значение (1.61040) равно значениям всех остальных элементов массива кроме тридцатого. Так же не понятно почему  ArraySort()  LoY[30][0] поместила под индексом 15 не смотря на то что ее значение (1.61040) равно значениям всех остальных элементов массива кроме тридцатого.

ВОПРОС. Как сделать так что бы на данном тике элементом с индексом 0 был  LoY[1][0] , а элементом с индексом 15  был  LoY[15][0], а элементом с индексом 29 был  LoY[30][0]
То есть как сделать так что функция и в дальнейшем не сортировала элементы с одинаковыми значениями. Ведь это не логично и бессмысленно.

Спасибо за помощь.

 

Вероятно такой алгоритм сортировки. Происходят некоторые перестановки элементов массива.

Попробуйте другие варианты сортировки.

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

Вероятно такой алгоритм сортировки. Происходят некоторые перестановки элементов массива.

Попробуйте другие варианты сортировки.

Спасибо большое за совет. Подскажите пожалуйста в mql4 другие варианты сортировки есть? Если есть где они находятся в Справочнике?

 

попробуйте:

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

правда функция для одномерного массива, но можно переделать

 
Aleksei Stepanenko:

попробуйте:

правда функция для одномерного массива, но можно переделать

Спасибо большое.

 

Подскажите, пожалуйста,

код ищет открытые графики и создает метку с названием символа, но если два графика с одинаковым символом,

то создает метку только на одном графике.Что я делаю не так?

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

Подскажите, пожалуйста,

код ищет открытые графики и создает метку с названием символа, но если два графика с одинаковым символом,

то создает метку только на одном графике.Что я делаю не так?

Идентификаторы графиков (ChartID()) одного и того же символа отличаются. Их используйте.

 
Artyom Trishkin:

Идентификаторы графиков (ChartID()) одного и того же символа отличаются. Их используйте.

Я для этого использую,
ChartFirst()+i

т.е. перебираю все открытые графики

или я не правильно тебя понял? Можно как-то наглядно, в виде кода?

 
Очень странно, на всех новых открытых графиках ставит метку, только один график игнорирует (
 
MakarFX:
Очень странно, на всех новых открытых графиках ставит метку, только один график игнорирует (

Внимательно почитайте документацию и пример кода. У вас неправильно организован цикл.

//--- переменные для идентификаторов графиков
   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++;// не забудем увеличить счетчик
     }
Только не говорите, что цикл for и while одинаково работают. Проблема не в этом, а в выделенных строках.
Причина обращения: