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

 
Vitaly Muzichenko :

Burada fonksiyonda, zamanın en yenisinin, yani sonuncusunun aranması ve seçilmesi var.

Ardından, seçili olanı elde ederiz ve onu iBarShift işleviyle değiştiririz (sym, tf, oot , true );

İşlev, çubuk numarasını zamana göre döndürür. Her şey.

Maalesef kontrol edemiyorum, ancak kullandığımda, burada I. Kim'den yayınlanan tüm işlevler gibi mükemmel çalıştı.

Bir sipariş açarken bana bir bilet atanırsa ve fonksiyonda bir seri numarası seçilirse, bu bir şey değil mi?
 
Вадим Мотеюнас :
if ( iOpen [ 0 ] != time_open ) 'iOpen' - bildirilmemiş kimliği gösteren bir hata yazıyor

Biraz yanlış bir şey yazdım, biraz da düşüncenin aksi yönünde. iOpen[0] öğesini Open[0] olarak değiştirin. düzeltildi . Basitçe söylemek gerekirse. Açılırken bar açılış saati hatırlanır ve bu barda sipariş alınmaz.

 

Ayrıca işlevin açıklamasında diyor ki

Dikkate alınacak pozisyonların seçimi harici parametreler tarafından belirlenir:

  • sy - Piyasa aracının adı. Bu parametreyi ayarlarsanız, işlev yalnızca belirtilen takımın konumlarını dikkate alacaktır. Varsayılan değer - NULL , mevcut piyasa aracı anlamına gelir.
  • tf - Zaman çerçevesi. Varsayılan değer - 0 , geçerli zaman çerçevesi anlamına gelir.
  • op - Ticaret işlemi , pozisyon türü. Geçerli değerler: OP_BUY , OP_SELL veya -1 . Varsayılan değer -1 , herhangi bir konum anlamına gelir.
  • mn - Konum Kimliği, MagicNumber. Varsayılan değer -1 , herhangi bir tanımlayıcı anlamına gelir.
harici ayarlar? İlk özel etkinlikten önce onları duyurmak gerekiyor. yani NumberOfBarOpenLastPos() işlevinin açıklamasında yer almaları yeterli değil mi?

 
Вадим Мотеюнас :

Ayrıca işlevin açıklamasında diyor ki

Dikkate alınacak pozisyonların seçimi harici parametreler tarafından belirlenir:

  • sy - Piyasa aracının adı. Bu parametreyi ayarlarsanız, işlev yalnızca belirtilen takımın konumlarını dikkate alacaktır. Varsayılan değer - NULL , mevcut piyasa aracı anlamına gelir.
  • tf - Zaman çerçevesi. Varsayılan değer - 0 , geçerli zaman çerçevesi anlamına gelir.
  • op - Ticaret işlemi , pozisyon türü. Geçerli değerler: OP_BUY , OP_SELL veya -1 . Varsayılan değer -1 , herhangi bir konum anlamına gelir.
  • mn - Konum Kimliği, MagicNumber. Varsayılan değer -1 , herhangi bir tanımlayıcı anlamına gelir.
harici ayarlar? İlk özel etkinlikten önce onları duyurmak gerekiyor. yani NumberOfBarOpenLastPos() işlevinin açıklamasında yer almaları yeterli değil mi?

Yeterlik. Gerekli değerleri harici parametrelere girebilirsiniz: Sihir, hangi pozisyonları arıyoruz, belki sadece AL ile, gerekirse AL(0) ve SAT (1) ile - sonra "-1" yazın.

 
Konstantin Nikitin :

Biraz yanlış bir şey yazdım, biraz da düşüncenin aksi yönünde. iOpen[0] öğesini Open[0] olarak değiştirin. düzeltildi . Basitçe söylemek gerekirse. Açılırken bar açılış saati hatırlanır ve bu barda sipariş alınmaz.

Bir sipariş açmadan önce if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) koşulu gibi bir grup sipariş açılır, çünkü NumberOfBarOpenLastPos -1 döndürür

 
Вадим Мотеюнас :

Bir sipariş açmadan önce if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) koşulu gibi bir grup sipariş açılır, çünkü NumberOfBarOpenLastPos -1 döndürür

Siparişleri arıyorsunuz, o zaman işlevi tam sürümünde, yani yalnızca pozisyonlara göre değil, siparişlere göre arama yapma özelliğiyle kullanmanız gerekir:

 int NumberOfBarOpenLastPos( string sym= "" , int tf= 0 , int op=- 1 , int mn=- 1 )
  {
   datetime oot= 0 ; // Инициализируем нулём
   int       i,k= OrdersTotal ();

   if (sym== "" ) sym= Symbol ();
   for (i= 0 ; i<k; i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
        {
         if ( OrderSymbol ()==sym)
           {
             if ( OrderType ()< 6 ) // Ищем и по ордерам
              {
               if (op< 0 || OrderType ()==op)
                 {
                   if (mn< 0 || OrderMagicNumber ()==mn)
                    {
                     if (oot< OrderOpenTime ()) oot= OrderOpenTime (); // Ищем последнее
                    }
                 }
              }
           }
        }
     }
   return ( iBarShift (sym, tf, oot, true ));
  }
 
Vitaly Muzichenko :

Yeterlik. Gerekli değerleri harici parametrelere girebilirsiniz: Sihir, hangi pozisyonları arıyoruz, belki sadece AL ile, gerekirse AL(0) ve SAT (1) ile - sonra "-1" yazın.

test cihazında başlatıldığında, doğal olarak, açık sipariş yoktur, bu nedenle belki -1 döndürülür ve bu nedenle if(NumberOfBarOpenLastPos( Symbol() ,0,-1,-1)>0) koşulu karşılanmaz mı?

 
Вадим Мотеюнас :

test cihazında başlatırken, doğal olarak, açık sipariş yoktur, bu nedenle belki -1 döndürülür ve bu nedenle if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) koşulu karşılanmaz mı?

Şimdi kontrol edeceğim.

 
Vitaly Muzichenko :

Siparişleri arıyorsunuz, o zaman işlevi tam sürümünde, yani yalnızca pozisyonlara göre değil, siparişlere göre arama yapma özelliğiyle kullanmanız gerekir:

neyse -1 döner

 
Вадим Мотеюнас :

neyse -1 döner

Harika çalışıyor!

İkincisini, ekran görüntüsünde görülebileceği gibi, 11. çubukta olmak üzere iki konumdan seçtim:


Doğrulama kodu:

 void OnTick () 
  {
   ...
   Comment ( NumberOfBarOpenLastPos( "" , 0 ,- 1 ,- 1 ) );
   ...
  }

int NumberOfBarOpenLastPos( string sym= "" , int tf= 0 , int op=- 1 , int mn=- 1 )
  {
   datetime oot= 0 ; // Инициализируем нулём
   int       i,k= OrdersTotal ();

   if (sym== "" ) sym= Symbol ();
   for (i= 0 ; i<k; i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
        {
         if ( OrderSymbol ()==sym)
           {
             if ( OrderType ()< 6 ) // Ищем и по ордерам
              {
               if (op< 0 || OrderType ()==op)
                 {
                   if (mn< 0 || OrderMagicNumber ()==mn)
                    {
                     if (oot< OrderOpenTime ()) oot= OrderOpenTime (); // Ищем последнее
                    }
                 }
              }
           }
        }
     }
   return ( iBarShift (sym, tf, oot, true ));
  }