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

 
Vasiliy Sokolov :

Döngü, en tehlikeli programlama tekniklerinden biridir. Analiz edilmesi neredeyse imkansız olan garip, nadiren tezahür eden hatalarla doludur.

Döngü yapmak yerine tam tersini yapmanız, kullanıcı iş parçacığını olabildiğince çabuk tamamlamaya çalışmanız gerekir. Gerçekten "nabzı tutmak" istiyorsanız - OnTradeTransaction'ı MT5'te analiz edin. MT4 genellikle bu tür tuhaflıklar için kötüdür, çünkü dedikleri gibi basitlik hırsızlıktan daha kötüdür.

Belirli bir uygulama ile ilgili değil, herhangi bir duraklamadan sonra TS'yi sallama ilkesiyle ilgiliydi. Eh, korkunç bir döngünün olduğu yer belli değil. Net olmamakla birlikte, kullanıcı akışını bitirmek için ne acele edilmeli.

 
fxsaber :

Eh, korkunç bir döngünün olduğu yer belli değil.

OnTick'ten OnTick'i çağırma - özyineleme yoluyla önemsiz olmayan döngü:

 // Редкий, но правильный костяк модификации ордеров
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; // вместо строки выше лучше делать такой вызов (переполнения стека от рекурсивных вызовов быть не должно)
    }

Net olmamakla birlikte, kullanıcı akışını bitirmek için ne acele edilmeli.

Bir olay modeli ile çalışıyoruz. Bu nedenle, bir sonraki için bekleme moduna geçmek için mevcut olayı olabildiğince hızlı işlemek gerekir. Akışta geçirilen zaman bir kara deliktir. Akışta ne kadar çok zaman harcarsak, birlikte çalıştığımız ticaret ortamı o kadar modası geçmiş olur.

 
Vasiliy Sokolov :

OnTick'ten OnTick'i çağırma - özyineleme yoluyla önemsiz olmayan döngü:

Görünüşe göre, beni korkutan tek şey bu.

Bir olay modeli ile çalışıyoruz. Bu nedenle, bir sonraki için bekleme moduna geçmek için mevcut olayı olabildiğince hızlı işlemek gerekir. Akışta geçirilen zaman bir kara deliktir. Akışta ne kadar çok zaman harcarsak, birlikte çalıştığımız ticaret ortamı o kadar eskimiş olur .

Bu doğru değil!
 
:
 void OnTick ()
{
   for ( int i = 0 ; i < symbols.Total(); i++)
   {
      request.symbol = symbols.At(i); 
       OrderSendAsynch(request, result); // Начиная с этой строки, анализировать торговое окружение в текущем потоке не имеет смысла
                                         // Единственная верная стратегия - как можно быстрее завершить цикл, и выйти из OnTick
                                         // Для дальнейшего анализа например в OnTransaction
   }
}

ps Genel olarak, kategorik olarak birbirimizi anlamıyoruz. Aramızda bir diyalog olacağını sanmıyorum.

 
Vasiliy Sokolov :
:

Kodunuzda, yalnızca varlığı TS'yi sıfırdan sallamanın nedeni olan bir duraklama gördünüz mü? sende yok!

 
fxsaber :

Kodunuzda, yalnızca varlığı TS'yi sıfırdan sallamanın nedeni olan bir duraklama gördünüz mü? sende yok!

Dolayısıyla bu kod, mevcut iş parçacığının neden mümkün olduğunca çabuk tamamlanması gerektiğinin bir örneğidir. OnTick'te ticaret ortamını sorgulamaya bile çalışamazsınız:

 void OnTick ()
{
   for ( int i = 0 ; i < symbols.Total(); i++)
   {
      request.symbol = symbols.At(i); 
      OrderSendAsynch(request, result); // Начиная с этой строки, анализировать торговое окружение в текущем потоке не имеет смысла
                                         // Единственная верная стратегия - как можно быстрее завершить цикл, и выйти из OnTick
                                         // Для дальнейшего анализа например в OnTransaction      
   }
   // Далее торговое окружение начинает меняться. Мы не можем анализировать его в OnTick
   // Бессмысленно зацикливать OnTick дальше.
   // Результат работы этого кода будет неопределен
   Sleep ( 50 );
   int total_1 = OrdersTotal ();
   Sleep ( 50 );
   int total_2 = OrdersTotal ();
   //Результат операции не определен
   if (total_1 == total_2)
}

İki değişkenin karşılaştırılması noktasında olduğumuz için onları karşılaştıramayız çünkü ortam değişmeye devam ediyor. total_1 ve total_2 içindeki değerler ya birbirine eşit değil ya da her ikisi de güncel değil ya da var olmayan sayıda sipariş içeriyor ya da doğru değerleri içeriyor. OnTick'te değişen ticaret ortamıyla uğraşmak mantıklı değildir, bunun yerine, for döngüsünden hemen sonra OnTick'ten çıkmanız ve ticaret ortamında bir değişikliği gösteren yeni olayları beklemeniz yeterlidir.

 
Vasiliy Sokolov :

Dolayısıyla bu kod, mevcut iş parçacığının neden mümkün olduğunca çabuk tamamlanması gerektiğinin bir örneğidir. OnTick'te ticaret ortamını sorgulamaya bile çalışamazsınız:

İki değişkenin karşılaştırılması noktasında olduğumuz için onları karşılaştıramayız çünkü ortam değişmeye devam ediyor. total_1 ve total_2 içindeki değerler ya birbirine eşit değil ya da her ikisi de güncel değil ya da var olmayansayıda sipariş içeriyor ya da doğru değerleri içeriyor. OnTick'te değişen ticaret ortamıyla uğraşmak mantıklı değildir, bunun yerine, for döngüsünden hemen sonra OnTick'ten çıkmanız ve ticaret ortamında bir değişikliği gösteren yeni olayları beklemeniz yeterlidir.

Peki neden duraklama?


Bir kez daha, herhangi bir duraklamadan sonra (fişler veya senkronize ticaret emirleri), TS sallanmalıdır - ticaret mantığı sıfırdan başlar. Buna göre asenkron alım satım emirleri kullanılırsa söz konusu duraklamalar gerçekleşmez ve yeni bir olay beklentisi ile Event fonksiyonundan çıkılır. Eşzamansız işlem yoksa, tüm ticaret mantığı döngülü bir komut dosyasına bile yerleştirilebilir.

 
fxsaber :

Peki neden duraklama?

Bir kez daha, herhangi bir duraklamadan sonra (fişler veya senkronize ticaret emirleri), TS sallanmalıdır - ticaret mantığı sıfırdan başlar. Buna göre asenkron alım satım emirleri kullanılırsa söz konusu duraklamalar gerçekleşmez ve yeni bir olay beklentisi ile Event fonksiyonundan çıkılır. Eşzamansız işlem yoksa, tüm ticaret mantığı döngülü bir komut dosyasına bile yerleştirilebilir.

Ben sana Foma'dan bahsediyorum, sen bana Yeryoma'dan. Diyalogumuzu bitirelim. Döngüsel komut dosyalarınızı oluşturmaya devam edin. Evet gerçekten işe yarıyor ama bunu bir çalışma yöntemi olarak önermek kesinlikle imkansız.

 

Deneyimli kişilerin MT4'teki böyle bir durum hakkındaki görüşleri ilginç, bunu nasıl çözerler?


EA'nın Görev Tanımı, beklemede tutmak ve her bir işarette mevcut fiyattan belirli bir sabit mesafede açık pozisyonları almaktır.


Aracının değişikliklerinin, fiyat işaretleri arasındaki ortalama zaman aralığından biraz daha uzun sürmesine izin verin.


Böylece ters çevrimde (azalan SELECT_BY_POS indeksi yönünde) koşuyoruz ve buna karşılık gelen OrderModify'ı yapıyoruz.


Bu nedenle, OnTick'e doldurulan bu döngü sırasında aşağıdakiler olabilir:

  1. Sipariş Toplamı artabilir (el ile, örneğin, açık veya kısmi dolumlar).
  2. Bekleyen öğeleri ve pozisyonları yeniden endeksleme (örneğin, döngü sırasında bazı bekleyen öğeler yürütüldü veya bazı bekleyen öğeler manuel olarak silindi ve bazıları kısa bir ping ile bir makinede ayarlandı).
  3. 1. veya 2. nokta, ancak OrderSelect ve OrderModify hatası oluşmuyor. Sadece döngü sırasında, 1/2 maddesi nedeniyle bazı emirler / pozisyonlar atlanacak.

Nasıl olunur?

Soru dolaylı olarak yukarıdaki tartışma ile ilgilidir, ancak bu onun devamı için değildir (konu kapanmıştır). MT4Orders for MT5'te bazı belirgin olmayan nüansları çözmem gerekiyor. Bu nedenle, MT4'te iyi olanlardan açıklanan durumlar hakkında fikir almak faydalı olacaktır. Eh, sadece ben değilim, muhtemelen faydalı olacaktır.


Sorunu OnTimer aracılığıyla çözün - bu muhtemelen hemen sunulacaktır. Ama onsuz gidelim - sadece OnTick.

 
fxsaber :

Deneyimli kişilerin MT4'teki böyle bir durum hakkındaki görüşleri ilginç, bunu nasıl çözerler?


EA'nın Görev Tanımı, beklemede tutmak ve her bir işarette mevcut fiyattan belirli bir sabit mesafede açık pozisyonları almaktır.


Aracının değişikliklerinin, fiyat işaretleri arasındaki ortalama zaman aralığından biraz daha uzun sürmesine izin verin.


Böylece ters çevrimde (azalan SELECT_BY_POS indeksi yönünde) koşuyoruz ve buna karşılık gelen OrderModify'ı yapıyoruz.


Bu nedenle, OnTick'e doldurulan bu döngü sırasında aşağıdakiler olabilir:

  1. Sipariş Toplamı artabilir (elle, örneğin, açık veya kısmi dolumlar).
  2. Bekleyen öğeleri ve pozisyonları yeniden endeksleme (örneğin, döngü sırasında bazı bekleyen öğeler yürütüldü veya bazı bekleyen öğeler manuel olarak silindi ve bazıları kısa bir ping ile bir makinede ayarlandı).
  3. 1. veya 2. nokta, ancak OrderSelect ve OrderModify hatası oluşmuyor. Sadece döngü sırasında, 1/2 maddesi nedeniyle bazı emirler / pozisyonlar atlanacak.

Nasıl olunur?

Soru dolaylı olarak yukarıdaki tartışma ile ilgilidir, ancak bu onun devamı için değildir (konu kapanmıştır). MT4Orders for MT5'te bazı belirgin olmayan nüansları çözmem gerekiyor. Bu nedenle, MT4'te iyi olanlardan açıklanan durumlar hakkında fikir almak faydalı olacaktır. Eh, sadece ben değilim, muhtemelen faydalı olacaktır.


Sorunu OnTimer aracılığıyla çözmek için - bu muhtemelen hemen sunulacaktır. Ama onsuz gidelim - sadece OnTick.

İlk olarak, durum standart dışı olarak sunulur ve eğer varsa, çok az kişi bu durumu zaten çözmüştür.

Tamamen teorik olarak:

OrderModify için bir ters çevrim düzenlemek gerekli değildir, bu yüzden doğrudan olmasına izin verin

 int i, total = OrdersTotal ();
for (i = 0 ; i < total; i++)

Ve sonra sipariş listesini değiştirmeyi kontrol edin

 if (total != OrdersTotal ())
 {
  i = 0 ;
  total = OrdersTotal ();
  continue ;
 }

Sayıda bir değişiklik olursa, yeni bir sipariş sayısıyla döngüyü yeniden başlatacağız.

Ve başka bir soru:

fxsaber :

  1. Sipariş Toplamı artabilir (el ile, örneğin, açık veya kısmi dolumlar).
  2. Bekleyen öğelerin ve pozisyonların yeniden endekslenmesi (örneğin, bazı bekleyen öğeler döngü sırasında yürütüldü veya bazı bekleyen öğeler manuel olarak silindi ve bazıları kısa bir ping ile bir makinede ayarlandı).
  3. 1. veya 2. nokta, ancak OrderSelect ve OrderModify hatası oluşmuyor. Sadece döngü sırasında, 1/2 maddesi nedeniyle bazı emirler / pozisyonlar atlanacak .

Eklenirlerse, onların veya diğerlerinin atlanacağı açıktır. Ya sadece silindilerse? Sipariş listesinin sınırlarının ötesine geçemiyor musunuz?