Sipariş numaralandırma döngüsünün organizasyonu

 
" Mql4 dilinin özellikleri, incelikleri ve çalışma yöntemleri " ile ilgili olmayan yorumlar bu konuya taşınmıştır.
 

MT4 için MQL5 kitaplıklarını başlatma temasının sürdürülmesi

 #property strict

// https://www.mql5.com/ru/docs/standardlibrary/graphics/cgraphic
#include <Graphics\Graphic.mqh> // MQL5\Include\Graphics\Graphic.mqh

void OnStart ()
{
   double Y[] = { 1 , 2 };
  
  GraphPlot(Y);
}
 

Genellikle test cihazında, hız kaydırıcısı 31'e ayarlanmışsa - bu, 32'ye ayarlanmışsa yavaştır - test süper hızla tamamlanmaya başlar.

Sayaçtan koda bir gecikme ekleyerek çıkıyorum:

 input int gDelay = 10000 ;         // Счетчик для задержки, off=0

void OnTick ()
{
  int delayCount = 0 ;
   while (delayCount < gDelay) ++delayCount;
}

Girişteki gecikme, danışmanın hızına ve işlemcinin gücüne bağlı olarak ayarlanabilir.

Şimdi 32. hızda, ilginizi çeken anlara, bana uygun hızda ilerleyebilirsiniz.

 

Sadece MT4'ü değil, diğer platformlarla birlikte MT5'i de ilgilendiren aşağıdaki konuya değinilecektir. Ancak kolay algılanması için mantık MQL4'te yazılacaktır, yani bu başlıkta.


Çoğu zaman, siparişleri değiştirmenin / silmenin omurgası (herhangi bir et büyür) aşağıdaki mantığa iner.

 // Самый распространенный костяк логики модификации ордеров
for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
   if ( OrderSelect (i, SELECT_BY_POS ))
     OrderModify ( OrderTicket (), Price, SL, TP, OrderExpiration ());


Ve şimdi yaklaşım nadir, ancak çok daha doğru

 // Редкий, но правильный костяк модификации ордеров
for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
   if ( OrderSelect (i, SELECT_BY_POS ))
     if ( OrderModify ( OrderTicket (), Price, SL, TP, OrderExpiration ()))     
    {
       i = OrdersTotal (); // Хотя бы так
      
       // А лучше так
//      OnTick(); break; // вместо строки выше лучше делать такой вызов (переполнения стека от рекурсивных вызовов быть не должно)
    }


Bir ticaret talebi gönderdikten sonra, ticaret ortamı değişir, bu nedenle ticaret sunucusunun yanıtından hemen sonra TS'nin tüm ticaret mantığını sıfırdan yürütmeniz önerilir.

 
fxsaber :

Ve şimdi yaklaşım nadir, ama çok daha doğru

Bu varyant, herhangi bir hata durumunda, listedeki son sırayı değiştirmeye sabitlenir ve 1'den fazla siparişi olan Uzman Danışman, geri kalan her şeyi "gözden kaçırır".

Tarifim: tüm siparişlerimde dolaşın, her birini işleyin (gerekirse, piyasa bilgilerinin güncellemesini işlemeden önce), bir sonraki tıklamada - bir sonraki yaklaşım. Bazı durumlarda, bir sonraki yaklaşım (OnTick'i çağırır), içinde hatalar varsa, mevcut döngü sona erdikten hemen sonra yapılabilir.

 
Andrey Khatimlianskii :

Bu varyant, herhangi bir hata durumunda, listedeki son sırayı değiştirmeye sabitlenir ve 1'den fazla siparişi olan Uzman Danışman, geri kalan her şeyi "gözden kaçırır".

Bu koşul nedeniyle döngü olmayacak

 if ( OrderModify ( OrderTicket (), Price, SL, TP, OrderExpiration ()))

Tarifim: tüm siparişlerimde dolaşın, her birini işleyin (gerekirse, piyasa bilgilerinin güncellemesini işlemeden önce), bir sonraki tıklamada - bir sonraki yaklaşım. Bazı durumlarda, bir sonraki yaklaşım (OnTick'i çağırır), içinde hatalar varsa, mevcut döngü sona erdikten hemen sonra yapılabilir.

Ardından, terminal günlüğünde daha fazla ticaret talebi hatası göreceksiniz.

 
fxsaber :

Bu koşul nedeniyle döngü olmayacak

Evet, yanlış, !OrderModify olarak okuyun.

Değişiklik başarılı olursa, işlemi listenin başından itibaren tekrarlamak da imkansızdır, çünkü bu durumda, bir emir de değiştirilir (örneğin, fiyat tarafından yukarı çekilir) ve geri kalanı uzun süre gözetimsiz kalabilir.

Tarifim yayında.


fxsaber :

Ardından, terminal günlüğünde daha fazla ticaret talebi hatası göreceksiniz.

Bunu anlamadım.

 
Andrey Khatimlianskii :

Değişiklik başarılı olursa, işlemi listenin başından itibaren tekrarlamak da imkansızdır, çünkü bu durumda, bir emir de değiştirilir (örneğin, fiyat tarafından yukarı çekilir) ve geri kalanı uzun süre gözetimsiz kalabilir.

Bu mantıkta bir şeyler başlangıçta yanlıştır. Burada bilinçli bir seçim yapmanız gerekir: bir gerçek sıraya veya birçok alakasız sıraya sahip olmak daha iyidir.

Tarifim yayında.

Bunu anlamadım.

OrderModify'ın 5 saniye çalışmasına izin verin. Yürütülmesi sırasında, ticaret sunucusunda birkaç kez kısmi bir limit emri uygulandı ve bir düzine anlaşmaya yol açtı.

 
fxsaber :

Bu mantıkta bir şeyler başlangıçta yanlıştır. Burada bilinçli bir seçim yapmanız gerekir: bir gerçek sıraya veya birçok alakasız sıraya sahip olmak daha iyidir.

Bir sipariş aynı anda farklı seviyelerde olamaz. Veya her seviye için kendi danışmanınızı mı kuruyorsunuz? Stratejilerin büyük çoğunluğu için şüpheli bir karar.

Özel bir durum olarak, birkaç pozisyon (birkaç girişle trend tarafından edinilir) ve onlar için bir takip durağı. Tek bir ticaretin SL'sini çekmek mi yoksa her şeyi değiştirmek mi? Aynı keskin sonraki geri alma ile keskin bir harekette, yalnızca bir siparişi değiştirme seçeneği çok şey kaybeder (ve geri kalanı işe yaramaz, çünkü her yeni OnTick çağrısı listedeki ilk sırayı değiştirir).


fxsaber :

OrderModify'ın 5 saniye çalışmasına izin verin. Yürütülmesi sırasında, ticaret sunucusunda birkaç kez kısmi bir limit emri uygulandı ve bir düzine anlaşmaya yol açtı.

İzin vermek. İşlenmiş (ve olması gereken) tüm siparişleri işleyeceğiz ve bir sonraki tıklamada veya ilk döngünün tamamlanmasından hemen sonra yenilerine geçeceğiz.

Aksi takdirde, her zaman son bir emrin son yürütülen kısmıyla çalışma riski vardır. Belki de en küçük parçası. Büyük bir arama emrini gözetimsiz bırakmak.

 
Andrey Khatimlianskii :

Bir sipariş aynı anda farklı seviyelerde olamaz. Veya her seviye için kendi danışmanınızı mı kuruyorsunuz? Stratejilerin büyük çoğunluğu için şüpheli bir karar.

Özel bir durum olarak, birkaç pozisyon (birkaç girişle trend tarafından edinilir) ve onlar için bir takip durağı. Tek bir ticaretin SL'sini çekmek mi yoksa her şeyi değiştirmek mi? Aynı keskin sonraki geri alma ile keskin bir harekette, yalnızca bir siparişi değiştirme seçeneği çok şey kaybeder (ve geri kalanı işe yaramaz, çünkü her yeni OnTick çağrısı listedeki ilk sırayı değiştirir).

OnTick'in neden yalnızca bir siparişi değiştireceğini anlamıyorum? Hepsi değiştirilecek.

İzin vermek. İşlenmiş (ve olması gereken) tüm siparişleri işleyeceğiz ve bir sonraki tıklamada veya ilk döngünün tamamlanmasından hemen sonra yenilerine geçeceğiz.

Aksi takdirde, her zaman son bir emrin son yürütülen kısmıyla çalışma riski vardır. Belki de en küçük parçası. Büyük bir arama emrini gözetimsiz bırakmak.

"Omurga" kelimesine dikkat çekiyorum. Bir sürü veya başka bir şey için bir öncelik seçme şeklinde et her zaman arttırılabilir. Mantığın temeli aynı kalır: Başarılı bir ticaret emrinden sonra, tüm ticaret mantığını sıfırdan başlatın.

 
fxsaber :

OnTick'in neden yalnızca bir siparişi değiştireceğini anlamıyorum? Hepsi değiştirilecek.

Fiyat hareket edeceğinden ve her yeni OnTick aramasında, listedeki ilk emirde yeni bir değişiklik şartı yerine getirilmiş olacaktır. Hele modifikasyon 5 saniye sürecekse ;)


fxsaber :

"Omurga" kelimesine dikkat çekiyorum. Bir sürü veya başka bir şey için bir öncelik seçme şeklinde et her zaman arttırılabilir. Mantığın temeli aynı kalır: Başarılı bir ticaret emrinden sonra, tüm ticaret mantığını sıfırdan başlatın.

Böyle bir "omurga", birden fazla siparişle çalışan bir Uzman Danışmanın mantığını bozacaktır.
Bir düzene sahip sistemlere bir fayda sağlamayıp gerisini mahvediyorsa ne anlamı var?

Siparişlerle çalışmadan önce fiyata göre hacim ve/veya mesafeye göre sıralama yapmak doğru karardır. Ancak kodu forumdan kopyalayan herkesin onu uygulayacağı varsayılmamalıdır.
Bu anlamda, kodum daha güvenli.