Hatalar, hatalar, sorular - sayfa 480

 
papaklass :
Şimdi güncellendi ve tekrar anlamaya çalışıyor. Neredeyse her satıra parmak izi koydum. Sonuçları size bildireceğim.

İşte eklemeniz ile bir çalışma, kayıp düzeltme anını durdurun:

2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 EURUSD uzun pozisyonu stop-loss'tan kapatılacak
2011.08.09 00:41:08 Çekirdek 1 2011.01.14 01:41:27 -----------------Anlaşma #63 sl 1.33328
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 eskiFırsatlarToplam=62 yeniFırsatlarToplam=63
2011.08.09 00:41:08 Çekirdek 1 2011.01.14 01:41:27 CSampleExpert::Ticaret
2011.08.09 00:41:08 Çekirdek 1 2011.01.14 01:41:27 emir gerçekleştirildi 0.15 1.33328'den [#63 satış 0.15 EURUSD 1.33328'den]
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 anlaşması yapıldı [#63, 0.15 EURUSD'yi 1.33328'den sattı]
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 #63 anlaşma 0.15 EURUSD 1.33328'den satıldı (63. sıraya göre)
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 stop loss tetiklendi 0.15 EURUSD 1.32127 sl: 1.33328 tp: 1.35139 [#63 0.15 EURUSD'yi 1.33328'den sat]
2011.08.09 00:41:08 Çekirdek 1 2011.01.13 18:32:00 EURUSD tarafından uzun pozisyon değiştirilecek sondaki
 
Açıkçası, farklı bir sonuç - OnTrade'de farklı işlemler, sadece anlaşmalar arıyorum, sadece beni ilgilendiriyor, ancak anladığım kadarıyla tüm olayları işliyor, sınıflandırıyorsunuz ve bir yerde bir şeyleri karıştırıyorsunuz.
 
Vadeli işlem camının da bir demo olduğunu anlıyorum? MICEX real'den bir bardak aldım, partiler uyuşmuyor.
 
papaklass :

1 saatlik ömrü olan bekleyen siparişler veriyorum. Bir saat sonra, aktifleştirilmeyen siparişler, sipariş bitiş saatinde kapatılır. Birkaç sipariş aynı anda kapatılırsa ve HistoryOrdersTotal() işlevi kapanmadan önce sıfırdan farklı bir değere sahipse, bazı siparişleri kaybeder. Örneğin, 8 emri kapatmadan önce, fonksiyon = 4 değerine sahipti, sonra kapanıştan sonra 10 değerine sahipti. İki emir kaybedildi.


"Kayıp siparişler" ne anlama geliyor? OnTrade()'e gelen mesajların birden fazla alım satım olayı hakkında bilgi içerebileceği unutulmamalıdır. Ayrıca, aynı anda birden fazla mesaj başarısız olursa, ilk mesaj işlendiğinde geçmiş önbelleği zaten değişmiş olabilir ve "etkinlikleri kaybetme" hissine kapılabilirsiniz.

MetaTrader 5'teki Ticaret Olayları makalesini okuyun:

Çözüm

MetaTrader 5 alım satım ve analitik platformundaki tüm işlemler asenkron olarak gerçekleştirilir ve alım satım hesabındaki tüm değişikliklerle ilgili mesajlar birbirinden bağımsız olarak gönderilir. Bu nedenle, "Tek istek - Tek işlem olayı" kuralına göre tek bir olayı takip etmeye çalışmamalısınız. Trade olayının gelmesiyle tam olarak neyin değiştiğini belirlemeniz gerekiyorsa, OnTrade işleyicisinin her çağrısında, tüm anlaşmaları, pozisyonları ve siparişleri analiz etmeniz ve bunları ortaya çıkmadan önceki durumla karşılaştırmanız gerekir.
 
papaklass :
Emirleri kapatmadan önce 4'e eşit olan HistoryOrdersTotal() değerini özellikle istedim. 8 siparişi kapattıktan sonra, HistoryOrdersTotal()'ın değeri 12'ye (4+8) eşit olmalıydı ve 10'a eşit olmalıydı. log dosyası eklendiğinde benzer durumlarla tekrar tekrar karşılaşılmaktadır. Bunun elde edildiği uzmanı da ekledim. Kendin yap ve göreceksin.

İşlevi değiştirmeyi deneyin, ne olacak?

 void OnTrade (){
//---
   HistorySelect (dayStart, TimeTradeServer ());      
   Print ( "              " , __FUNCTION__ , "  :  historyOrdersTotal = " , HistoryOrdersTotal (), "   " , TimeTradeServer ()); 
}
     
 
Test cihazı çalıştırma sonuçlarıyla ilgili HTML raporu her zaman bir dosyaya kaydedilmiyor mu?!
 
zigan :
Test cihazı çalıştırma sonuçlarındaki HTML raporu her zaman bir dosyaya kaydedilmiyor mu?!

Daha kesin olarak tanımlayın. Hangi koşullar altında.

 
alexvd :

Daha kesin olarak tanımlayın. Hangi koşullar altında.

nadiren, test cihazının 20-30 çalışmasından biri - "Sonuçlar" sekmesini açıyorum

XML raporunu kaydetmek için tıklayın - Rapor dosyasını alıyorum, her şey yolunda!

HTML raporunu kaydet'e tıklayın - dosyayı kaydetmek için bir pencere açılır, bir süre (kısa bir süre için) boş bir ProgressBar ile donar, ardından ProgressBar hızla dolar ve pencere kapanır ... ancak rapor dosyası oluşturulmaz!

Tam olarak bu olduğunda herhangi bir kalıp gösteremem.

 
Rosh :

İşlevi değiştirmeyi deneyin, ne olacak?

Bunun yardımcı olacağını sanmıyorum. OnTrade'de papaklass'ın yaptığı gibi çalışmak temelde imkansızdır.

Anahtar şudur: " OnTrade işleyicisinin her çağrısında, tüm işlemleri, pozisyonları ve siparişleri analiz etmeniz ve bunları ortaya çıkmadan önceki durumla karşılaştırmanız gerekir". İçinde misal meslekten olmayanlarla, bu sadece tarihteki emirler için geçerlidir. Siparişlerin kaybolmaması için kodu şu şekilde değiştirirdim:

global değişkeni int oldHistoryOrders'a girin; ve Ontrade'de şöyle bir şey:

 //--------------------------ТОРГОВЫЕ СОБЫТИЯ-------------------------------------------------------------+
void OnTrade (){
//---
   Print ( __FUNCTION__ );
   HistorySelect ( 0 , TimeCurrent ()+ 1 );      
   int newHistoryOrders= HistoryOrdersTotal ();
   if (oldHistoryOrders==newHistoryOrders) return ;
   Print ( "oldHistoryOrders=" ,oldHistoryOrders, " newHistoryOrders=" ,newHistoryOrders);
   for ( int i=oldHistoryOrders;i<newHistoryOrders;i++)
       Print ( "Order " ,i, " #" , HistoryOrderGetTicket (i));
   oldHistoryOrders=newHistoryOrders;    
//   Print("              ",__FUNCTION__,"  :  historyOrdersTotal = ",newHistoryOrders,"   ",dayStart); 
}
Dosyalar:
 
papaklass :

Açıkladığınız gibi OnTrade() ile çalışmıyorum. Ekli kodumda, her şeyi kaldırdım, yalnızca işlevi vurgulayan kısmı cant olarak bıraktım. Uzman Danışmanımda neredeyse hiç döngü yok. EA, onay başına bir sembolü işler. Yani döngülere ihtiyacım yok. 12 tik ile tüm enstrümanları işliyorum.

Not: OnTrade() bana bir ticaret olayı hakkında bilgi veriyor. Ve hangi olayın meydana geldiği, döngüler olmadan işlevlerim tarafından belirlenir.

Pekala, tamam, sadece, OnTrade işlevi tarafından siparişlerin kaybedildiğini kanıtladığı iddia edilen örneğinden bahsediyordum. OnTrade keneler üzerinde çalışmaz, asenkron olarak çalışır, bu nedenle tik başına kaç sembol işlediğinizin, bir tanesinin veya tamamının önemi yoktur. Burada, bir seferde, bir grup doldurulmamış siparişin süresi aynı anda sona erer, bu nedenle bir işleme döngüsü olmadan yapamazsınız. OnTrade'in hiçbir şeyi kaçırmadığını görebilmeniz için kodunuzu değiştirdim. Test cihazında başlattım bile, her şey yerli yerinde görünüyor. OnTrade'den yazdırılarak görüntülenen, sona erme tarihine kadar kaldırılan tüm siparişlerin biletleri günlükte bulunur. Benim versiyonumu denedin mi?
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5