Döngüler ve Emirleri Kapatma veya Silme - sayfa 5

 
Eleni Anna Branou :

Lütfen kodunuzu eklemek için </> düğmesini kullanın.


Özür dilerim... İşte uygun formatta..

OrdersTotal() doğru değil...

OrdersTotal() kullanan ve doğru sonuçlar vermeyen (iki farklı broker ile gözlemlenen) kod dizisini döngüye sokarak şaşırdım.

WINE 3.0 çalıştıran bir Linux Ubuntu-MATE 16.04 masaüstünde MT4 sürüm 1090 kullanıyorum

İşte kullandığım şey ...

İşte burada:

 for ( int cc = 0 ; cc < OrdersTotal (); cc++)
{
       if (! OrderSelect (cc, SELECT_BY_POS , MODE_TRADES ) ) continue ;
       if ( OrderSymbol () != Symbol () ) continue ;
       if ( OrderType () > 1 ) continue ;     //--ignore pending trades

      OpenTradecnt++;     //--counts up for every live position of that symbol that exists
       Print ( "count of the open trades of this symbol is: " , OpenTradecnt);

İki farklı komisyoncuyla, OrdersTotal() değerinin MT4 komisyoncusunun 'Ticaret' sekmesinde gösterilenle her zaman uyuşmadığını fark ettim. Başlangıçta, OrdersTotal() işlevinin düzgün çalışmamasına neden olanın aracı olduğunu düşündüm. 2. aracıda fark ettiğimde, MT4'ün dahili bir 'sorunu' olup olmadığını veya kodumun yanlış olup olmadığını VEYA bunun MT4'ün sunucuyla düzgün bir şekilde senkronize edilmesiyle ilgili bir sorun olup olmadığını merak etmeye başladım....?

Bu forum ileti dizisini okuduktan sonra, for..loop'u şu şekilde değiştirerek daha iyi sonuçlar elde edip edemeyeceğimi merak ediyorum:

 for ( int cc = OrdersTotal () - 1 ; cc >= 0 ; cc--)
{
      if (! OrderSelect (cc, SELECT_BY_POS , MODE_TRADES ) ) continue ;
       if ( OrderSymbol () != Symbol () ) continue ;
       if ( OrderType () > 1 ) continue ;     //--ignore pending trades

      OpenTradecnt++;     //--counts up for every live position of that symbol that exists
       Print ( "count of the open trades of this symbol is: " , OpenTradecnt);
VEYA, OnTick() olayı sırasında OrdersTotal() öğesinin düzgün bir şekilde senkronize edilmesini sağlayacak bir bayrak veya kod satırı var mı?

Bununla ilgili herhangi bir açıklama çok yardımcı olacaktır ve çok takdir edilecektir!

 
Simon Gniadkowski :

Bu, muhtemelen kısmen Expert Advisor Builder gibi çöplerden dolayı gördüğüm en yaygın hatalardan biri. Bu yüzden, ileride başvurmak üzere bağlantı kurulabilmesi için konuya adanmış bir iş parçacığının zamanının geldiğini düşündüm.

Sorun

Basit bir örnek verelim; EA'mız için tüm açık siparişleri kapatacak bir işlev istiyoruz, birçok örnek var ama hadi sıfırdan bir tane oluşturalım.

Bir döngüye ihtiyacımız var çünkü belirli bir EA için tüm siparişlerimizi kapatmak istiyoruz, bu döngü içinde siparişi seçmek için kodumuz, doğru sembol ve sihirli sayı olduğunu kontrol etmek için kodumuz ve son olarak siparişi kapatmak için kodumuz olacak:

Bu kod kötü. . . KULLANMAYIN . . . Nedenini bir sonraki bölümde açıklayacağım. . .

Açıklama

Yukarıdaki kod üzerinde çalışalım. . . satır satır, Siparişe Göre Sırala. . .

Kapatmak istediğimiz aşağıdaki Emirlere sahip olduğumuzu varsayalım, hepsinin EA'mız ile aynı sihirli sayı ve Sembolü var, bu yüzden kodumuzun hepsini kapatmasını istiyoruz:

Konum Bilet numarası
0 111
1 222
2 333
3 444
4 555

1. döngü boyunca çalıştırın:

PositionIndex'in başlangıç değeri 0'dır, bu nedenle 0 pozisyonundaki emir seçilir, bilet numarası 111, bu emir başarıyla silinir ve kalan Emirler aşağıdaki gibi pozisyon değiştirir:

Konum Bilet numarası
0 222
1 333
2 444
3 555

2. döngü boyunca çalıştırın:

şimdi PositionIndex'in değeri 1'dir, bu nedenle 1. pozisyondaki emir seçilir, 333 numaralı bilet, bu emir başarıyla silinir ve kalan Emirler aşağıdaki gibi pozisyon değiştirir :

Konum Bilet numarası
0 222
1 444
2 555

Döngü boyunca 3. çalıştırma:

şimdi PositionIndex'in değeri 2'dir, bu nedenle 2. pozisyondaki emir seçilir, bilet numarası 555, bu emir başarıyla silinir ve kalan Emirler aşağıdaki gibi pozisyon değiştirir :

Konum Bilet numarası
0 222
1 444

4. döngü boyunca çalıştırın:

şimdi PositionIndex'in değeri 3'tür. OrderSelect(), 3. pozisyonda Sırayı seçmeye çalışır ve başarısız olur , devam, kodun yürütülmesini döngüdeki bir sonraki değere götürür. .


Döngü boyunca 5. ve son çalıştırma:

şimdi PositionIndex'in değeri 4'tür. OrderSelect(), 4. pozisyonda Sırayı seçmeye çalışır ve başarısız olursa , devam, kodun yürütülmesini döngüdeki bir sonraki değere götürür. . . döngü bitti.


Şimdi 2 Sipariş, 222 ve 444 numaralı biletler ile kapatılmış olması gereken ancak kapatılmayan kaldı. . . sonraki, bu sorunun nasıl çözüleceği.

Çözüm

Açık emirleri kapatırken veya bekleyen emirleri silerken aşağıdaki kod doğru yaklaşımdır. . .

Temel fark, döngünün ( TotalNumberOfOrders - 1 ) değerinden 0'a düşmesidir.

Bir kez daha yukarıdaki kod üzerinde çalışalım. . . satır satır, Siparişe Göre Sırala. . .

Daha önce olduğu gibi aynı siparişlere sahibiz:

Konum Bilet numarası
0 111
1 222
2 333
3 444
4 555

1. döngü boyunca çalıştırın:

PositionIndex'in başlangıç değeri TotalNumberOfOrders - 1'dir ve bu 5 - 1 = 4'e eşittir, bu nedenle 4. pozisyondaki emir seçilir, bilet numarası 555, bu emir başarıyla silinir ve kalan Emirler pozisyonu aşağıdaki gibi değiştirir:

Konum Bilet numarası
0 111
1 222
2 333
3 444

2. döngü boyunca çalıştırın:

şimdi PositionIndex'in değeri 3'tür, bu nedenle 3. pozisyondaki emir seçilir, 444 numaralı bilet, bu emir başarıyla silinir ve kalan Emirler aşağıdaki gibi pozisyon değiştirir :

Konum Bilet numarası
0 111
1 222
2 333

Döngü boyunca 3. çalıştırma:

şimdi PositionIndex'in değeri 2'dir, bu nedenle 2. pozisyondaki emir seçilir, 333 numaralı bilet, bu emir başarıyla silinir ve kalan Emirler aşağıdaki gibi pozisyon değiştirir :

Konum Bilet numarası
0 111
1 222

4. döngü boyunca çalıştırın:

şimdi PositionIndex'in değeri 1'dir , dolayısıyla 1 numaralı pozisyondaki emir seçilir, 222 numaralı bilet, bu emir başarıyla silinir ve kalan Emirler aşağıdaki gibi pozisyon değiştirir :

Konum Bilet numarası
0 111

Döngü boyunca 5. ve son çalıştırma:

şimdi PositionIndex'in değeri 0 böylece 0 pozisyonundaki emir seçilir, bilet numarası 111, bu emir başarıyla silinir, 0 değeri döngü için geçerli olan son değerdir . . . döngü bitti.

Tüm eşleşen siparişlerimizi başarıyla sildik. . .

Bu konuya bağlantı: Döngüler ve Emirleri Kapatma veya Silme

çok teşekkürler! çok net bir anlatım
 
Merhaba kodlayıcılar,
Sipariş seçimi hakkında bu konuyu okudum. Aslında, işleri doğru yaptığına inandığım bir kodum var amaseçilen siparişin OpenPrice değerini okuyamadığım için seçim benim için çalışmıyor . Diğer her şey iyi çalışıyor, sağlanan kodun sadece bu kısmı. Neden olduğundan emin değilim.
Kodun tamamında, sipariş gönderildikten hemen sonra OrderOpenPrice'ı çağırmam gereken 4 bölüm var... OrderSend iyi çalışıyor, OrderSelect bana ihtiyacım olan sonuçları almayacak. Yardım edebilecekseniz kodun 1 bölümüne bakın.
Teşekkür ederim.
 if (Protection_Step_One== 1 )
        {
         while (Protective_Order< 0 )
          {
           RefreshRates ();
          Protective_Order= OrderSend ( Symbol (), OP_SELL ,Protective_Lots, NormalizeDouble ( MarketInfo ( Symbol (), MODE_BID ), MarketInfo ( Symbol (), MODE_DIGITS )), 3 , 0 , 0 , "Intermediary" ,MN_Sell_Intermediary_Protection, 0 ,Cyan);
          }
   //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Addition for Clamp       
           for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
            { if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )== true )
               { if ( OrderMagicNumber ()==MN_Sell_Intermediary_Protection)
                  { RefreshRates ();
                  Intermediary_OpenPrice_Sell= OrderOpenPrice ();
                  }
                }
             }   
               //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>..
         if (Protective_Order!=- 1 )
          { 
          Protection_Step_One= 0 ;
          RealTime_Drawing= 2 ;
          Protective_Mode_Activated= 1 ;
          Protective_Order=- 2 ;
          Defcon= 2 ;

 

Teşekkürler sevgili Simon Gniadkowski,

Yazınız gerçekten zamanımı kurtardı.

 
Gelson Kasonia :
 void OnStart ()
{
     int Protective_Order= OrderSend ( _Symbol , ORDER_TYPE_BUY , 0.01 ,Ask, 3 , 0 , 0 , "Intermediary" );
     if (Protective_Order< 0 )
           return ;
     if (! OrderSelect (Protective_Order,SELECT_BY_TICKET, MODE_TRADES))
           return ;
     Print (Protective_Order, " OrderOpenPrice: " , OrderOpenPrice());
}
 

Piyasa emirlerini kapatmak için önerdiğim kod bu

 int MagicNo= 1234 ;
int Slippage= 10 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseOrdersBackward()
  {
   for ( int i= OrdersTotal ()- 1 ; i>= 0 && !IsStopped() ; i--)
     {
       if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
        {
         Print ( "Order Select failed, order index: " ,i, " Error: " , GetLastError ());
         continue ;
        }

       if (OrderSymbol()== Symbol () && OrderMagicNumber()==MagicNo && OrderType()<=OP_SELL)
        {
         if (!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage))

             Print ( "Order Close failed, order ticket: " ,OrderTicket(), " Error: " , GetLastError ());
        }
     }
  }

Ve şunu öneriyorum, eğer bir for for döngüsü kullanılıyorsa doğru yol budur (ABD brokerlerinin FIFO Kurallarına uymak için)

 int MagicNo= 1234 ;
int Slippage= 10 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseOrdersForward()
  {
   for ( int i= 0 ; i< OrdersTotal () && !IsStopped(); i++)
     {
       if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
        {
         Print ( "Order Select failed, order index: " ,i, " Error: " , GetLastError ());
         continue ;
        }

       if (OrderSymbol()== Symbol () && OrderMagicNumber()==MagicNo && OrderType()<=OP_SELL)
        {
         if (OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage))
           {
             i--;
           }
         else
           {
             Print ( "Order Close failed, order ticket: " ,OrderTicket(), " Error: " , GetLastError ());
           }
        }
     }
  }

İleri döngüde,

  1. OrderTotal() işlevi, dizinin dizi aralığı dışında kalmasını önlemek için her döngü yinelemesinde kalan açık sipariş sayısını güncellemek için for döngüsü içinde kullanılır.
  2. Bazı siparişlerin atlanmasını önlemek için i endeksi, kapatılan her siparişle birlikte azaltılır.
 
amrali : Bazı emirleri atlamamak için i indeksi kapanan her emirle birlikte düşürülür.
Mevcut işlemin (kapanış, silme, değiştirme) tamamlanmasını beklerken birden fazla emrin (bir EA çoklu grafik, birden fazla EA, manuel ticaret) varlığında, diğer emirlerde herhangi bir sayıda başka işlem aynı anda gerçekleşmiş olabilir ve konum indekslemeyi değiştirdi:
  1. FIFO dışı (ABD brokerleri) için (veya EA, sembol başına yalnızca bir emir açar), bir pozisyon döngüsünde basitçe geri sayım yapabilirsiniz ve emirleri kaçırmazsınız. Her zaman geri saymayı alışkanlık haline getirin.
    Döngüler ve Siparişleri Kapatma veya Silme - MQL4 programlama forumu
    FIFO (ABD brokerleri) ve sizin (potansiyel olarak) sembol başına birden fazla sipariş işlemeniz için, en erken siparişi bulmanız, kapatmanız ve başarılı bir işlemde kalan tüm pozisyonları yeniden işlemeniz gerekir .
    CloseOrders by FIFO Rules - Strategy Tester - MQL4 programlama forumu - Sayfa 2 #16

  2. ve daha önceki pozisyonların silinmesi durumunda OrderSelect'i kontrol edin.
    İşlev dönüş değerleri nelerdir? Onları nasıl kullanırım? - MQL4 programlama forumu
    MQL4 Programlarında Sık Karşılaşılan Hatalar ve Bunların Önlenmesi - MQL4 Makaleleri
  3. ve (potansiyel olarak) birden fazla siparişi işlerseniz, bir sonraki sipariş / sunucu çağrısında, Ön Tanımlı Değişkenleri ( Bid/Ask ) veya (yönden bağımsız olun ve kullanın) kullanmak istiyorsanız, sunucu çağrılarından sonra RefreshRates() öğesini çağırmalısınız . OrderClosePrice( ) .
 

Bunun bana ne kadar yardımcı olduğunu anlayacaksın. Sadece üzerinde çalıştığım kodla değil, tamamen anlayışımla. Şimdi mükemmel çalışıyor ve bunu farklı şekillerde uygulama anlayışına sahibim.

Bu bilgiyi gerçekten takdir ediyorum.