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

 
Roman Sharanov :
Söyleyin bana, Expert Advisor'ın sembolle açtığı tüm siparişleri kapatma işlevi doğru uygulandı mı?

Mimarinin kendisi doğru. Kontrollerin yokluğundaki hatalar ve bazı işlevlerin kullanımı:

 bool OrderCloseAll()
{
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
   {
         if (! OrderSelect (i, SELECT_BY_POS , MODE_TRADES )
             continue ;

         if ( OrderSymbol () != Symbol () || OrderMagicNumber () != Magic)
             continue ;
         
         if (! OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), slippage, clrWhite ))
             return false ;
   }

   return true ;
}

  1. Sizin durumunuzda ilk yineleme başarısız olacak - OrdersTotal() indeksli sipariş mevcut değil.
  2. OrderSelect fonksiyonunun sonucu üzerinde kontrol yoktur.
  3. OrderClose fonksiyonunun sonucu üzerinde kontrol yoktur. Emrin kapatılması başarısız olursa, aynı fonksiyonda kalamazsınız, çünkü kapatmanın neden başarısız olduğunu belirlemeniz gerekir. Bunu yapmak için, işlevden yanlış bir sonuçla çıkın ve bunun dışında ne yapacağınıza karar verin.
  4. Tüm emirler için aynı kapanış fiyatını uygulayamazsınız. Birincisi, emirler farklı türlerde olabilir ve ikincisi, önceki emirlerin uygulanması sırasında (kapanmak için), fiyat büyük olasılıkla değişti. Hangi fiyatın kullanılacağını tahmin etmemek için MT4 özelliğini kullanabilirsiniz: Bir piyasa emri için kapanana kadar, OrderClosePrice() değeri, emrin türüne bağlı olarak Alış veya Satış fiyatıdır.
 
Ihor Herasko :

Mimarinin kendisi doğru. Kontrollerin yokluğundaki hatalar ve bazı işlevlerin kullanımı:

  1. Sizin durumunuzda ilk yineleme başarısız olacak - OrdersTotal() indeksli sipariş mevcut değil.
  2. OrderSelect fonksiyonunun sonucu üzerinde kontrol yoktur.
  3. OrderClose fonksiyonunun sonucu üzerinde kontrol yoktur. Emrin kapatılması başarısız olursa, aynı fonksiyonda kalamazsınız, çünkü kapatmanın neden başarısız olduğunu belirlemeniz gerekir. Bunu yapmak için, işlevden yanlış bir sonuçla çıkın ve bunun dışında ne yapacağınıza karar verin.
  4. Tüm emirler için aynı kapanış fiyatını uygulayamazsınız. Birincisi, emirler farklı türlerde olabilir ve ikincisi, önceki emirlerin uygulanması sırasında (kapanmak için), fiyat büyük olasılıkla değişti. Hangi fiyatın kullanılacağını tahmin etmemek için MT4 özelliğini kullanabilirsiniz: Bir piyasa emri için kapanana kadar, OrderClosePrice() değeri, emrin türüne bağlı olarak Alış veya Satış fiyatıdır.

teşekkür ederim, asıl sorun muhtemelen sadece aynı fiyatın uygulanmasıydı

 

OrderSelect üzerindeki yardımdan " SELECT_BY_POS parametresi kullanılarak sıralı olarakemir seçimi yapıldığında, bilgi işlem sunucusundan geldiği sıraya göre verilir. Alınan emir listesinin herhangi bir şekilde sıralanması garanti edilmez."

Bu ifadenin sertifikaya boşuna eklendiğini varsayarsak, her şey yolunda demektir. Boşuna olmadığını düşünüyorsanız, siparişler listesindeki döngü sırasında bu listeyi değiştirmemelisiniz. Emirlerden biri sunucuda silindikten sonra ve daha küçük OrdersTotal ile yeni, güncel bir liste geldikten sonra emirlerin nasıl sıralanacağı bilinmiyor. Silmeden, listenin aynı değişmemiş örneğinden geçmek ve silinecek tüm fırsat biletleri sayısını toplamak (bir dizide) daha güvenilirdir. Ardından bu listeyi unutun ve biletleri bilete göre seçerek fırsatları silin.

Tabii ki, sadece bu sırasız listenin sonundan birkaç siparişin silinmesi durumunda, ancak geliştiricilerin karşı çıkması durumunda, değiştirilmiş listedeki sıralamanın korunduğuna inanmak isterim ... Şimdi çalışıyor, ancak yeni derleme yayınlanacak - "sizi uyardık."

 
Vladimir :

OrderSelect üzerindeki yardımdan " SELECT_BY_POS parametresi kullanılarak sıralı olarakemir seçimi yapıldığında, bilgi işlem sunucusundan geldiği sıraya göre verilir. Alınan emir listesinin herhangi bir şekilde sıralanması garanti edilmez."

Bu ifadenin sertifikaya boşuna eklendiğini düşünürsek, her şey yolunda demektir. Boşuna olmadığını düşünüyorsanız, siparişler listesindeki döngü sırasında bu listeyi değiştirmemelisiniz. Emirlerden biri sunucuda silindikten sonra ve daha küçük OrdersTotal ile yeni, güncel bir liste geldikten sonra emirlerin nasıl sıralanacağı bilinmiyor. Silmeden, listenin aynı değişmemiş örneğinden geçmek ve silinecek tüm fırsat biletleri sayısını toplamak (bir dizide) daha güvenilirdir. Ardından bu listeyi unutun ve biletleri bilete göre seçerek fırsatları silin.

Tabii ki, değiştirilmiş listedeki sıralamanın korunduğuna inanmak isterim, en azından bu sırasız listenin sonundan birkaç siparişin silinmesi durumunda, ancak geliştiriciler buna karşı ... Şimdi çalışıyor, ancak yeni bir derleme yayınlanacak - "sizi uyardık."

Bu "Amerika" zaten üç yüz yıldır açık :)

 
Artyom Trishkin :

Bu "Amerika" zaten üç yüz yıldır açık :)

Burada acemiler adına soru soranların kendilerinin keşfettiğini sanmıyorum. Bu nedenle yazıyorum. Moderatörler için değil, soru sormak için. Bakın ipliğin adı ne.

PS Baktı, nereden böyle bir ilgi. https://www.mql5.com/en/forum/215783/page8 "Sipariş arama döngüsünün organizasyonu" şubesinden çıkıyor. Görünüşe göre, Ekim 2017'de bu üç yüz yıl henüz bitmedi, hala yenilikler var.

Организация цикла перебора ордеров
Организация цикла перебора ордеров
  • 2017.09.16
  • www.mql5.com
MQL4 и MetaTrader 4: Организация цикла перебора ордеров
 
Vladimir :

Burada acemiler adına soru soranların kendilerinin keşfettiğini sanmıyorum. Bu nedenle yazıyorum. Moderatörler için değil, soru sormak için. Bakın ipliğin adı ne.

PS Baktı, nereden böyle bir ilgi. https://www.mql5.com/en/forum/215783/page8 "Sipariş arama döngüsünün organizasyonu" şubesinden çıkıyor. Görünüşe göre, Ekim 2017'de bu üç yüz yıl henüz bitmedi, hala yenilikler var.

Yine tahmin edemediler :) mql4.com'da üç yüz yıl başladı - orada aktif olarak tartışıldığı bir zaman vardı. Ve sadece "Şimdi çalışıyor, ama yeni bir yapı çıkacak -" uyardık " bölümünde tanımladığınız anlar bile vardı. Sadece uyarılar olmadan ve böylece birkaç kez - duruma göre değişir, sıralamaya bağlı değildir ...

Ve evet, bu tür cevaplar için özel bir konu var:

Особенности языка mql4, тонкости и приёмы работы
Особенности языка mql4, тонкости и приёмы работы
  • 2017.02.24
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql4, примеры решения тех, или иных задач...
 
Vladimir :

OrderSelect üzerindeki yardımdan " SELECT_BY_POS parametresi kullanılarak sıralı olarakemir seçimi yapıldığında, bilgi işlem sunucusundan geldiği sıraya göre verilir. Alınan emir listesinin herhangi bir şekilde sıralanması garanti edilmez."

Bu ifadenin sertifikaya boşuna eklendiğini düşünürsek, her şey yolunda demektir. Boşuna olmadığını düşünüyorsanız, siparişler listesindeki döngü sırasında bu listeyi değiştirmemelisiniz. Emirlerden biri sunucuda silindikten sonra ve daha küçük OrdersTotal ile yeni, güncel bir liste geldikten sonra emirlerin nasıl sıralanacağı bilinmiyor. Silmeden, listenin aynı değişmemiş kopyasından geçmek ve silinecek anlaşmaların tüm bilet sayılarını toplamak (bir dizide) daha güvenilirdir. Ardından bu listeyi unutun ve biletleri bilete göre seçerek fırsatları silin.

Tabii ki, değiştirilmiş listedeki sıralamanın korunduğuna inanmak isterim, en azından bu sırasız listenin sonundan birkaç siparişin silinmesi durumunda, ancak geliştiriciler buna karşı ... Şimdi çalışıyor, ancak yeni bir derleme yayınlanacak - "sizi uyardık."

İyi tarafta (birkaç Uzman Danışman + bir tüccarın bir hesapta paralel olarak çalışabileceği göz önüne alındığında), bir döngüde alım satım işlemleri yapmak genellikle imkansızdır. Gerekli siparişi aldık, işlemi gerçekleştirdik ve tüm OnTick()'i yeniden gerçekleştirdik (yeni bir tick'in gelmesiyle değil). Ve böylece gerekli tüm işlemler tamamlanana kadar.

Bu nedenle, siparişleri silmek için bir dizi oluşturmak, bir döngüdeki siparişleri silmekle eşdeğerdir.

 

"Dur" butonu var, tıkladıktan sonra yazısını nasıl "Başlat" olarak değiştirebilirim?

 bool stop;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
//Closed at Profit
   ObjectCreate ( 0 , "Stop" , OBJ_BUTTON , 0 , 0 , 0 );
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_XDISTANCE , 10 );
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_YDISTANCE , 105 );
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_XSIZE , 100 );
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_YSIZE , 25 );

   ObjectSetString ( 0 , "Stop" , OBJPROP_TEXT , "Stop" );

   ObjectSetInteger ( 0 , "Stop" , OBJPROP_COLOR ,White);
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_BGCOLOR ,Green);
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_BORDER_COLOR ,Green);
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_BORDER_TYPE , BORDER_FLAT );
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_HIDDEN , true );
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_STATE , false );
   ObjectSetInteger ( 0 , "Stop" , OBJPROP_FONTSIZE , 12 );
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,
                   const long &lparam,
                   const double &dparam,
                   const string &sparam)
  {
if (sparam== "Stop" )
     {
       ObjectSetInteger ( 0 , "Stop" , OBJPROP_STATE , false );
      CloseAtProfit();
      stop= true ;
     }
     }
 
lil_lil : Bir "Durdur" düğmesi var, tıkladıktan sonra metnini nasıl "Başlat" olarak değiştiririm?

Uzman örneğime bakın

Dosyalar:
ToFile.mq4  11 kb
 
STARIJ :

Uzman örneğime bakın

Teşekkürler, ihtiyacınız olan şey

Pozisyonların olmamasında bir hata olduğunu bilmenizde fayda var --- ToFile EURUSD,H1: 'ToFile.mq4' içinde sıfır bölme (62.39)

/*62*/  Строка= DoubleToStr ( AccountEquity ()/ AccountMargin ()* 100 , 2 )+ "%" ; // Уровень=Средства/Залог
Test cihazında yazı değişmiyor, ne yani böyle bir ihtimal yok mu?