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

 
Alexey Viktorov :

Bir dizi öğesinin her eklenmesinden sonra diziyi sıralamaya gerek yoktur. Daha iyi sıralama

yardımdan

Mas[Blizko2] dizideki bir sonraki en küçük değerdir

Cevap için teşekkürler! Lütfen söyleyin, dizinin bir sonraki öğesini belirlemek için zaten bulunan +1 öğesini kullandım, ancak test cihazında bu yerde hata veriyor.

 double Mas[];                                                                 //массив для упорядочивания всех ордеров
   for ( int i= 0 ; i< OrdersTotal (); i++)                                           // Цикл перебора ордер
   {
     if ( OrderSelect (i, SELECT_BY_POS ))                                           // Если есть следующий
     {
       Price= OrderOpenPrice ();
       ArrayResize (Mas, i+ 1 );                                                 //задан размер массива
       Mas [i] = Price; 
       ArraySort (Mas, WHOLE_ARRAY , 0 , MODE_DESCEND );                           // Теперь цены открытия упорядочены по убыванию
     }
   } 
   if ( ArraySize (Mas)> 1 )                                                         //Если массив не пустой
   
         { 
         int Blizko2= ArrayBsearch (Mas, Ask , WHOLE_ARRAY , 0 , MODE_DESCEND );           //Определен индекс ближайшего большего по значению елемента к текущей цене
        

        Mas[Blizko2+ 1 ]= Blizko1;      // В этой строке перед квадратной скобкой выдает ошибку!                            //Определен индекс ближайшего меньшего по значению елемента к текущей цене

        PriceBlizko1=Mas[Blizko1];
        PriceBlizko2 = Mas[Blizko2];                                       // Цена выбранного ордера   

Ve bir sonraki öğeyi tanımlamam gerekiyor. Açıkçası +1, ancak program bir hata veriyor! Başka bir yolu var mı yoksa yanlış mı yapıyorum? Lütfen bana söyle)

Blizko1 = Mas[Blizko2]+ 1 ;

ya da böyle??

ancak olası veri kaybı hakkında bir uyarı derlerken

 
vikzip :

Böyle bir tasarımla

Blizko1 = Mas[Blizko2]+ 1 ;

Blizko2 indeksli hücreden elde edilen değere 1 eklersiniz ve fiyat orada saklanır - çift değer. Bir tamsayı eklersiniz 1. Bir uyarıdan kaçınmak için +1.0 yazmanız gerekir.

Ancak bu bile "Rus demokrasisinin babasını" kurtarmaz, çünkü dizine değil, Blizko2 dizinindeki Mas[] dizisinde depolanan değere bir tane ekliyorsunuz.

Bu nedenle, doğal olarak, yakındaki bir dizi hücresinden bir değer elde etmek için, dizine 1 eklemeniz veya çıkarmanız gerekir, ancak burada tökezlediğiniz bir hata düzenlenir: dizin dizinin en uç hücresini gösteriyorsa - ya 0 ya da sonuncusu, sonra 1'i çıkararak ( 0'da) ya da 1 ekleyerek (en son), dizinin ötesine geçeceksiniz - orada böyle bir hücre yok. Buna göre Blizko2+1'in ArraySize(Mas)-1'den büyük veya Blizko2-1'in sıfırdan küçük olmadığından emin olmanız gerekir.

Ve..., döngünün her yinelemesinde diziyi sıralamanız gerekmediği söylendi - frenlere ihtiyacınız var mı?

Dizinin boyutunun 1'den büyük olduğunu kontrol ettikten sonra sıralamanız gerekir.

Ancak bu tasarım genellikle neden açık değildir:

 int Blizko2= ArrayBsearch (Mas, Ask , WHOLE_ARRAY , 0 , MODE_DESCEND );           //Определен индекс ближайшего большего по значению елемента к текущей цене

Mas[Blizko2+ 1 ]= Blizko1; // В этой строке перед квадратной скобкой выдает ошибку! //Определен индекс ближайшего меньшего по значению елемента к текущей цене

        PriceBlizko1=Mas[Blizko1];
        PriceBlizko2 = Mas[Blizko2];                                       // Цена выбранного ордера   

Bakın: Blizko2'de fiyat ile dizi hücresinin indeksine sahipsiniz.
Ardından diziye - Blizko2+1 hücresine - Blizko1 değişkeninin içerdiği değeri (neden???) - orada da fiyatlarınız olmalı ve onları anlaşılmaz değerlerle dolduruyorsunuz.

Gerçekte ne yaptığınızı bulmanız gerekiyor - sadece işlevinizin her satırını yorumlayın. Düşünceli bir şekilde.

 
Artyom Trishkin :

Böyle bir tasarımla

Blizko2 indeksli hücreden elde edilen değere 1 eklersiniz ve fiyat orada saklanır - çift değer. Bir tamsayı eklersiniz 1. Bir uyarıdan kaçınmak için +1.0 yazmanız gerekir.

Ancak bu bile "Rus demokrasisinin babasını" kurtarmaz, çünkü dizine değil, Blizko2 dizinindeki Mas[] dizisinde depolanan değere bir tane ekliyorsunuz.

Bu nedenle, doğal olarak, yakındaki bir dizi hücresinden bir değer elde etmek için, dizine 1 eklemeniz veya çıkarmanız gerekir, ancak burada tökezlediğiniz bir hata düzenlenir: dizin dizinin en uç hücresini gösteriyorsa - ya 0 ya da sonuncusu, sonra 1'i çıkararak ( 0'da) ya da 1 ekleyerek (en son), dizinin ötesine geçeceksiniz - orada böyle bir hücre yok. Buna göre Blizko2+1'in ArraySize(Mas)-1'den büyük veya Blizko2-1'in sıfırdan küçük olmadığından emin olmanız gerekir.

Ve..., döngünün her yinelemesinde diziyi sıralamanız gerekmediği söylendi - frenlere ihtiyacınız var mı?

Dizinin boyutunun 1'den büyük olduğunu kontrol ettikten sonra sıralamanız gerekir.

Ancak bu tasarım genellikle neden açık değildir:

Bakın: Blizko2'de fiyat ile dizi hücresinin indeksine sahipsiniz.
Ardından diziye - Blizko2+1 hücresine - Blizko1 değişkeninin içerdiği değeri (neden???) - orada da fiyatlarınız olmalı ve onları anlaşılmaz değerlerle dolduruyorsunuz.

Gerçekte ne yaptığınızı bulmanız gerekiyor - sadece işlevinizin her satırını yorumlayın. Düşünceli bir şekilde.


Anlamlı cevap için teşekkürler! Dizi oluşturma amacım, fiyatın altındaki ve varsa fiyatın üzerindeki en yakın emirlerin fiyatlarını belirlemektir. Ve eğer öyleyse ve onlardan fiyata olan mesafe belirli bir mesafeyi aşarsa, ilgili emirleri açın. Böyle görünmesi gerektiğini düşündüm (Burada eylemlerimin mantığını elimden geldiğince anlattım)

 //---Создаем массив для учета всех ордеров в терминале
   double Price;                                                               // Цена выбранного ордера
   double Mas[];                                                                 //массив для упорядочивания всех ордеров
   for ( int i= 0 ; i< OrdersTotal (); i++)                                           // Цикл перебора ордер
   {
     if ( OrderSelect (i, SELECT_BY_POS ))                                           // Если есть следующий
     {
       Price= OrderOpenPrice ();                                                 //Цена ордера
       ArrayResize (Mas, i+ 1 );                                                 //задан размер массива
       Mas [i] = Price; 
       ArraySort (Mas, WHOLE_ARRAY , 0 , MODE_DESCEND );                           // Теперь цены открытия упорядочены по убыванию. Я намеренно сортирую массив, потому что ордера добовляются в него в том порядке в котором появляются в 
                                                                             //терминале и не сортируются по убыванию(Верно ли это мое утверждение??)А мне необходимо позже точно определить ближайший ордер выше и ниже цены

     }
   } 
   if ( ArraySize (Mas)> 1 )                                                         //Если массив не пустой
   
         { 
         int Blizko2= ArrayBsearch (Mas, Ask , WHOLE_ARRAY , 0 , MODE_DESCEND );           //Определен индекс ближайшего большего по значению елемента к текущей цене
                                                                               //Здесь я справку прочитал и если указано MODE_ASCEND тогда будет найдено ближайшее меньшее значение, но первым я намерен определить ордер выше цены и 
                                                                               // поэтому поставил MODE_DESCEND. Скажите пожалуйста - это верно?? 
         PriceBlizko1 = Mas[Blizko2]+ 1 ;                                         //!!!Вот здесь я намереваюсь определить ордер сразу ниже цены и так как я намеренно упорядочил по убыванию уже все ордера в массиве, то по логике после 
                                                                               //определения ближайшего верхнего ордера к цене Blizko2 следующим в массиве будет ордер уже ниже цены(Верно ли мое утверждение??)И вот на этом месте я не 
                                                                               //могу понять: каким же образом это сделать? Ведь мне очевидно что он следующий, но как это записать в код я не могу понять))) Пробовал и в скобках уже 
                                                                               //прибавлять еденицу)) А мне нужно что бы PriceBlizko1 была присвоена цена ордера сразу ниже цены!! Подскажите пожалуйста как определить цену ордера ниже 
                                                                               //цены PriceBlizko2 ??
         PriceBlizko2 = Mas[Blizko2];                                           // Цена выбранного ордера выше цены         

        
 

böyle arardım

 double levelDown= 0 ;
double levelUp= DBL_MAX ;

int totalOrders= OrdersTotal ();


   for ( int i= 0 ;i<totalOrders;i++)
      {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
         {
         double price= OrderOpenPrice ();
         
         if (price- Ask > _Point && levelUp-price> _Point )
            levelUp=price;
         
         if ( Bid -price> _Point && price-levelDown> _Point )
            levelDown=price;
         }
      }
 
Taras Slobodyanik :

böyle arardım


Teşekkür ederim! DBL_MAX en üst düzeyde ne anlama geliyor ?

 
vikzip :

Teşekkür ederim! DBL_MAX ne anlama geliyor?

Hatta bir bağlantı eklemiş akıllı bir forum motorunuz var. Cevap beklemektense onu takip etmek daha kolay.

 
Artyom Trishkin :

Hatta bir bağlantı eklemiş akıllı bir forum motorunuz var. Cevap beklemektense onu takip etmek daha kolay.


Teşekkür ederim! Böyle bir motor istiyorum)))

 
vikzip :

Anlamlı cevap için teşekkürler! Dizi oluşturma amacım, fiyatın altındaki ve varsa fiyatın üzerindeki en yakın emirlerin fiyatlarını belirlemektir. Ve eğer öyleyse ve onlardan fiyata olan mesafe belirli bir mesafeyi aşarsa, ilgili emirleri açın. Böyle görünmesi gerektiğini düşündüm (Burada eylemlerimin mantığını elimden geldiğince anlattım)

Bu satırdaki yorumda bir hata var.

         int Blizko2= ArrayBsearch (Mas, Ask , WHOLE_ARRAY , 0 , MODE_DESCEND );           //Определен индекс ближайшего большего по значению елемента к текущей цене 


Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

MQL4, yardım ve algoritmalar ve kodlar hakkında herhangi bir acemi sorusu

Alexey Viktorov , 2017.10.04 09:32


yardımdan

Geri dönüş değeri

Bulunan ilk öğenin dizinini döndürür. Aranan değer bulunamazsa, arama değerinin bulunduğu öğelerin en yakın alt değerinin dizinini döndürür .

Mas[Blizko2] dizideki bir sonraki en küçük değerdir.


Sadece yardımın diziyi sıralama yönüne bağımlılık hakkında söylemediğini eklemek için kalır. Bu nedenle, ArrayBsearch'ten sonra herhangi bir manipülasyon gerekli değildir. Görev zaten tamamlandı.

Sonra Artyom her şeyi çiğnedi. Sınırların dışına atlamamak için dizinin sıfıra eşit olup olmadığını ve dizinin boyutunu kontrol edin...

 

Farenin yalnızca düğmeye bastıktan sonra izlemeye başlaması nasıl yapılır. Sonra şöyle bir durum oluyor (teorik olarak danışmandan mouse ile stop tüm emirler için tek bir noktaya aktarılıyor) butona tıkladığımda butonun bulunduğu fiyattaki tüm emirler için stop hemen aktarılmaya başlıyor. basıldı. Bu özelliği beğen if(id==CHARTEVENT_CLICK)

sadece bu butona tıkladıktan sonra çalıştırın if( ObjectGetInteger (0,"cm STOP ALL",OBJPROP_STATE))

 
Basicprof :

Farenin yalnızca düğmeye bastıktan sonra izlemeye başlaması nasıl yapılır. Ve sonra şöyle bir durum oluyor (teorik olarak danışmandan fare ile tıklanarak stop tüm emirler için tek bir noktaya aktarılıyor) butona tıkladığımda butonun bulunduğu fiyattaki tüm emirler için stop hemen aktarılmaya başlıyor. basıldı. Bu özelliği beğen if(id==CHARTEVENT_CLICK)

sadece bu butona tıkladıktan sonra çalıştırın if(ObjectGetInteger(0,"cm STOP ALL",OBJPROP_STATE))


 if (id== CHARTEVENT_OBJECT_CLICK && sparam == "cm STOP ALL" ) { // код }