Döngüler ve Emirleri Kapatma veya Silme

 

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:

 int PositionIndex;     //  <-- this variable is the index used for the loop

int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool

TotalNumberOfOrders = OrdersTotal ();     // <-- we store the number of Orders in the variable

for (PositionIndex = 0 ; PositionIndex < TotalNumberOfOrders; PositionIndex++)   //  <-- for loop to loop through all Orders
   {
   if ( ! OrderSelect (PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue ;   // <-- if the OrderSelect fails advance the loop to the next PositionIndex
   
   if ( OrderMagicNumber () == MagicNo       // <-- does the Order's Magic Number match our EA's magic number ? 
      && OrderSymbol () == Symbol ()         // <-- does the Order's Symbol match the Symbol our EA is working on ? 
      && ( OrderType () == OP_BUY           // <-- is the Order a Buy Order ? 
      ||   OrderType () == OP_SELL ) )       // <-- or is it a Sell Order ?

       if ( ! OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), Slippage ) )               // <-- try to close the order
         Print ( "Order Close failed, order number: " , OrderTicket (), " Error: " , GetLastError () );   // <-- if the Order Close failed print some helpful information 
      
   } //  end of For loop

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 elimizde 2 Sipariş, 222 ve 444 numaralı biletler kaldı ki bunlar kapanması gerekiyordu ama kapatılmadı. . . 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.

 int PositionIndex;     //  <-- this variable is the index used for the loop

int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool

TotalNumberOfOrders = OrdersTotal ();     // <-- we store the number of Orders in the variable

for (PositionIndex = TotalNumberOfOrders - 1 ; PositionIndex >= 0 ; PositionIndex --)   //  <-- for loop to loop through all Orders . .   COUNT DOWN TO ZERO !
   {
   if ( ! OrderSelect (PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue ;   // <-- if the OrderSelect fails advance the loop to the next PositionIndex
   
   if ( OrderMagicNumber () == MagicNo       // <-- does the Order's Magic Number match our EA's magic number ? 
      && OrderSymbol () == Symbol ()         // <-- does the Order's Symbol match the Symbol our EA is working on ? 
      && ( OrderType () == OP_BUY           // <-- is the Order a Buy Order ? 
      ||   OrderType () == OP_SELL ) )       // <-- or is it a Sell Order ?
   
       if ( ! OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), Slippage ) )               // <-- try to close the order
         Print ( "Order Close failed, order number: " , OrderTicket (), " Error: " , GetLastError () );   // <-- if the Order Close failed print some helpful information 
      
   } //  end of For loop

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

 

Daha karmaşık bir örnek alalım. . .

Kapatmak istediğimiz aşağıdaki Emirlere sahip olduğumuzu varsayalım, hepsi aynı sihirli numaraya sahip ancak bazılarının EA'mız ile farklı bir Sembolü var, kodumuzun EA, EURUSD ile aynı sembol için emirleri kapatmasını istiyoruz:

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


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. konumdaki sipariş seçilir, bilet numarası 555, bu sipariş sihirli sayı ve Sembol ile eşleşir, bu nedenle başarıyla silinir ve kalan Emirler şu şekilde değişir: şöyle:

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

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

şimdi PositionIndex'in değeri 3'tür, bu nedenle 3. pozisyondaki sipariş seçilir, bilet numarası 444, bu sipariş sihirli sayı ve Sembol ile eşleşir, bu nedenle başarıyla silinir ve kalan Emirler aşağıdaki gibi pozisyon değiştirir :

Konum Bilet numarası sembol
0 111 EURUSD
1 222 EURUSD
2 333 GBPUSD


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

şimdi PositionIndex'in değeri 2'dir, bu nedenle 2. konumdaki sipariş seçilir, bilet numarası 333, bu sıra sihirli sayı ile eşleşir, ancak Sembol DEĞİLDİR . silinmez, kalan Emirler değişmez :

Konum Bilet numarası sembol
0 111 EURUSD
1 222 EURUSD
2 333 GBPUSD

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

şimdi PositionIndex'in değeri 1'dir , bu nedenle 1. konumdaki sipariş seçilir, bilet numarası 222, bu sıra sihirli sayı ve Sembol ile eşleşir, bu nedenle başarıyla silinir ve kalan Emirler aşağıdaki gibi pozisyon değiştirir :

Konum Bilet numarası sembol
0 111 EURUSD
1 333 GBPUSD

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.

Sembolümüzle eşleşmeyen bir siparişi bırakarak tüm eşleşen siparişlerimizi başarıyla sildik, bilet numarası 333 şimdi 0 konumunda. . .

Konum Bilet numarası sembol
0 333 GBPUSD


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

 

Bu önemli açıklama için Raptor'a teşekkür ederiz.

Y.

 
Bu benim için son derece yararlı, çöp uzmanı danışman oluşturucu kralı! Oh, ortaya çıkan kodu hacklemekten nasıl zevk alıyorum. Çok teşekkürler.
 

Vay. Bir siparişi kapatmak için tüm bu bilgiler.

Son 137 işlem boyunca, sürekli olarak, her gün (ortalama olarak) - hatasız bir şekilde, günde 50+ pip'i netleştirmenin ne kadar bilgi alacağını merak ediyorum.

Bana böyle bir şeyi nasıl yapacağımı gösterin, bunun son derece yararlı bir bilgi olduğunu düşüneceğim ve Guru, sonsuza dek ve sonsuza dek unvanınız olacak, Amin.

 
CFx :

Vay. Bir siparişi kapatmak için tüm bu bilgiler.

Son 137 işlem boyunca her gün (ortalama olarak) tutarlı bir şekilde günde 50+ pip netleştirmenin ne kadar bilgi gerektireceğini merak ediyorum.

Piplere ilgim yok. . . onlarla ne yapabilirim? Onları harcayamam, GBPPIPS oranı nedir? Başarıyı pip olarak sayarak cehaletinizi gösterirsiniz. . .
 
CFx :

Son 137 işlem boyunca, sürekli olarak, her gün (ortalama olarak) - hatasız bir şekilde, günde 50+ pip'i netleştirmenin ne kadar bilgi alacağını merak ediyorum.

Bana böyle bir şeyi nasıl yapacağımı gösterin, bunun son derece yararlı bir bilgi olduğunu düşüneceğim ve Guru, sonsuza dek ve sonsuza dek unvanınız olacak, Amin.

  1. Konu dışı bilgilerle başlığı Kaçırmayın
  2. Kuralları okumadığınız için size göstermeyeceğiz MetaQuotes Language 4 ve otomatik alım satım dışında herhangi bir tartışma yasaktır
 

Raptor, gönderinizin ilk bakışta mql4'te oldukça uzman olduğunuzu biliyorum. Bu konu yine şüphelerimi gidermeye yardımcı oluyor!

 

Sadece başka bir fikir:

 for (PositionIndex = 0 ; PositionIndex < OrdersTotal () ; PositionIndex ++)   //  <-- for loop to loop through all Orders . .   COUNT DOWN TO ZERO !
   {
   if ( ! OrderSelect (PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue ;   // <-- if the OrderSelect fails advance the loop to the next PositionIndex
   
   if ( OrderMagicNumber() == MagicNo       // <-- does the Order's Magic Number match our EA's magic number ? 
      && OrderSymbol() == Symbol ()         // <-- does the Order's Symbol match the Symbol our EA is working on ? 
      && ( OrderType() == OP_BUY           // <-- is the Order a Buy Order ? 
      ||   OrderType() == OP_SELL ) )       // <-- or is it a Sell Order ?
   
         add_trade_to_close_queue( OrderTicket());   // <--  You need to model the queue mechanism ...
      
   } //  end of For loop


Saygılarımızla.

 
abstract_mind :


Sadece başka bir fikir:


Saygılarımızla.

evet, MT4'ün mantığını anlayın, sayacı kod artırma veya azaltma size kalmış.