MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1409

 
Hepinize iyi günler!
mql4 ve daha özel olarak ArraySort() işleviyle ilgili soru
İşte kodum
 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] siparişi açtıktan sonra Teklif değerini (yani 1.6134) aldıktan sonra, ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND) işlevi diziyi birinci boyuta göre artan düzende sıraladı ve dizi öğesini en üst dizideki en büyük değer. Yani LoY[0][0] değeri ile birlikte artan düzende sıralanmış dizide LoY[30][0] oldu. Bu mantıklı ve bu yüzden ona katılıyorum.


Bana göre mantıklı olmayan ve benim için kabul edilemez olan nedir? Değerinin (1.61040) otuzuncu öğe hariç dizinin diğer tüm öğelerinin değerlerine eşit olmasına rağmen neden ArraySort() LoY[15][0] dizinini 0 dizinine koydu. Ayrıca neden ArraySort() olduğu da belli değil.   LoY[30][0], değerinin (1.61040) otuzuncu öğe hariç dizinin diğer tüm öğelerinin değerlerine eşit olmasına rağmen 15 dizininde yer almaktadır.

SORU. Belirli bir tikte 0 indeksli eleman LoY[1][0] olacak ve 15 indeksli eleman olacak şekilde nasıl yapılır   LoY[15][0] ve 29 dizinindeki eleman LoY[30][0] idi
Yani, işlevin gelecekte aynı değerlere sahip öğeleri sıralamadığından nasıl emin olunur. Mantıklı ve anlamsız değil.

Yardım için teşekkürler.

 

Muhtemelen böyle bir sıralama algoritması . Dizi elemanlarının bazı permütasyonları vardır.

Diğer sıralama seçeneklerini deneyin.

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

Muhtemelen böyle bir sıralama algoritması . Dizinin elemanlarının bazı permütasyonları vardır.

Diğer sıralama seçeneklerini deneyin.

Tavsiyen için teşekkür ederim. Lütfen bana mql4'te başka sıralama seçenekleri olduğunu söyleyin? Eğer öyleyse, bunlar Dizin'de neredeler?

 

denemek:

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

tek boyutlu bir dizi için gerçek işlev, ancak yeniden yapılabilir

 
Aleksei Stepanenko :

denemek:

tek boyutlu bir dizi için gerçek işlev, ancak yeniden yapılabilir

Çok teşekkürler.

 

Lütfen bana söyle,

kod açık çizelgeleri arar ve sembolün adıyla bir etiket oluşturur, ancak aynı sembole sahip iki çizelge varsa,

o zaman sadece bir grafikte etiket oluşturur.Neyi yanlış yapıyorum?

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

Lütfen bana söyle,

kod açık çizelgeleri arar ve sembolün adıyla bir etiket oluşturur, ancak aynı sembole sahip iki çizelge varsa,

o zaman sadece bir grafikte bir etiket oluşturur.Neyi yanlış yapıyorum?

Aynı sembolün Grafik Kimlikleri (ChartID()) farklıdır. Onları kullan.

 
Artyom Trishkin :

Aynı sembolün Grafik Kimlikleri (ChartID()) farklıdır. Onları kullan.

Bunun için kullanıyorum
 ChartFirst ()+i

onlar. tüm açık grafikler üzerinde yineleme

yoksa ben mi seni yanlış anladım Bir şekilde görsel olarak kod şeklinde mümkün mü?

 
Çok garip, yeni açılan tüm çizelgelere bir işaret koyuyor, yalnızca bir çizelge yok sayılıyor (
 
MakarFX :
Çok garip, yeni açılan tüm çizelgelere bir işaret koyuyor, yalnızca bir çizelge yok sayılıyor (

Belgeleri ve örnek kodu dikkatlice okuyun. Döngünüz yanlış.

 //--- переменные для идентификаторов графиков
   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++; // не забудем увеличить счетчик
     }
Sadece bunu söyleme, for ve while döngüleri aynı şekilde çalışır. Sorun bunda değil, seçilen satırlarda.