MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1213

 

Havai fişek! Yardım :)

Onay geçmişi , daha fazla işlem için göstergeden (MT5) kopyalanır. Kopyalama algoritması referans kitabından koparıldı, sadece biraz değişti:

         int      attempts = 0 ;
         bool     success = false ;
         MqlTick tick_array[];
         datetime startCopyTime = (copyTickTime < periodStartTime) ? periodStartTime : copyTickTime;
         datetime checkPoint;

         while (attempts < 3 ) {
             uint start = GetTickCount ();
            checkPoint = TimeCurrent ();
             int received = CopyTicks ( _Symbol , tick_array, COPY_TICKS_ALL , startCopyTime, ticksSizeToCopy);
             if (received != - 1 ) {
               PrintFormat ("%s: received %d ticks in %d ms", _Symbol , received, GetTickCount () - start);
               if ( GetLastError () == 0 ) {
                  success = true ;
                   break ;
               } else
                   PrintFormat ("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d",
                               _Symbol , received, GetTickCount () - start, _LastError );
            }
            attempts++;
         }
         if (!success) {
             PrintFormat ("Ошибка! Не удалось получить %d тиков по %s с трех попыток", ticksSizeToCopy, _Symbol );
             return ;
         }
         copyTickTime = checkPoint;

Ancak kene geçmişinin senkronizasyon dışı olduğuna dair bir uyarı var:

 2020.07 . 12 10 : 07 : 12.092 Volumes (GBPUSD,H1)     GBPUSD: Ticks are not synchronized yet, 10103745 ticks received for 532 ms. Error= 4403

Ve el kitabında şöyle diyor:

ERR_HISTORY_TIMEOUT

4403

Geçmiş istenirken zaman aşımı aşıldı

Kaptanın sezgisi, keneleri senkronize etmenin gerekli olduğunu gösteriyor... Bu anı doğru anlıyor muyum? Ama nasıl yapmalı? Yoksa sadece başarı kontrolünü kaldırarak senkronizasyon olmadan fazla zarar vermeden çalışmak mümkün müdür?

 
Yevhenii Levchenko :

Havai fişek! Yardım :)

Onay geçmişi , daha fazla işlem için göstergeden (MT5) kopyalanır.

göstergelerdeki geçmiş verilere eşzamansız erişim, Uzman Danışmanlarda ve komut dosyalarında eşzamanlı erişim, en azından geliştiricilerin verilerle çalışırken MQL programlarının davranışı olarak adlandırdıkları şey budur

insan dilinde ise, göstergedeki geçmiş verilerine erişirken, bir hata aldıktan sonra hesaplama döngüsünden çıkmanız ve bir süre sonra geçmişe yeniden erişmeniz gerekir.

ve bir döngüde göstergede geçmişe birkaç kez başvurmak anlamsızdır - bu teknik yalnızca Uzman Danışmanlarda ve komut dosyalarında çalışır

 
Igor Makanu :

göstergelerdeki geçmiş verilere eşzamansız erişim, Uzman Danışmanlarda ve komut dosyalarında eşzamanlı erişim, en azından geliştiricilerin verilerle çalışırken MQL programlarının davranışı olarak adlandırdıkları şey budur

insan dilinde ise, göstergedeki geçmiş verilerine erişirken, bir hata aldıktan sonra hesaplama döngüsünden çıkmanız ve bir süre sonra geçmişe yeniden erişmeniz gerekir.

ve bir döngüde göstergede geçmişe birkaç kez başvurmak anlamsızdır - bu teknik yalnızca Uzman Danışmanlarda ve komut dosyalarında çalışır

Teşekkür ederim!

Senkron bir çoklu iş parçacığı ile bağlı mı? "Keneler henüz senkronize edilmedi" - daha çok bir uyarı gibi mi?

 
ANDREY :

Saçmalık ... mantıkla arkadaş olma, matematikle arkadaş olma ..... ve aynı zamanda konuları hem mantık hem de matematiğe tamamen nüfuz eden bir forumu uzun ve başarılı bir şekilde yönettiniz.

Mantıkla arkadaş olmadığımı nerede söyledim?

 
ANDREY :

Bence bir grup uzmanın sahip olduğu bilgi, Ford'un kendi bilgisi değildi ve hiçbir zaman da olmadı. Üstelik bu bilgilere ihtiyacı da yoktu çünkü onları gereksiz olarak nitelendiriyordu. Ve bu uzmanlar bilgilerini Ford'a aktarmaya çalışsalardı, Ford bu bilgiyi özümseyemez ve pratik amaçlar için onunla çalışamazdı. Yeni bilgiyi özümsemek için, yeni bilginin ilişkilendirildiği konu hakkında genel fikirlerden biraz daha fazlasına sahip olmak gerekir. Yukarıdaki örnekte, uzmanlar Ford'a değil, avukatlara bilgi verdi.

Ve beyninizde, bana göründüğü gibi, matematik ve mantıkta yeterli bir dizi sistematik bilgi var ve bu set, yeni ve eksik bilgiler için hızlı ve doğru bir arama sorgusu oluşturmanıza ve hızlı ve doğru bir şekilde yorumlamanıza izin veriyor. Eminim sizin beyninizde böyle bir bilgi olamaz çünkü her gün bu forumda saatlerce vakit geçiriyorsunuz ve beyninizden özellikle matematik ve mantıkla ilgili çok büyük miktarda bilgi geçiyorsunuz. Daldırma yoluyla yabancı bir dil öğrenmek gibi. Asimilasyonu otomatik olarak, kendiliğinden gerçekleşir ve hatta dalmış kişinin iradesine aykırı olabilir.

Şimdi 100 akademisyen bana integral denklemleri hesaplamanın kurallarını açıklamaya başlasa, onlar kafama girmeden önce okulda öğrenmem gereken tüm matematik ve cebir ders kitaplarını sıralayana kadar onları nasıl hesaplayacağımı öğrenmeyeceğim. öğretmen bize integral denklemler konusunu açıklamaya başladı.

MQL öğrenmede de böyledir. Bir değişkenin ne olduğunu ve ne işe yaradığını anlamazsanız, o zaman bir değişkenin bilgisinin ne olduğunu anlamak bile zordur, hatta çok karmaşık olmayan diğer kavramlardan bahsetmiyorum bile.

Ford, kendisini ilgilendiren bilgi alanında kendisine doğru konunun öğretileceğini söylemedi. Çeşitli bilgi alanlarında o kadar çok sayıda uzmanla çevrili olduğunu ve o anda ihtiyaç duyduğu sorulara her an cevap alabileceğini söyledi. Bir lider neden her biri kendi alanında doğru cevabı verecek 200 uzmanın bilebileceğini bilmelidir? Evet ve prensipte her şeyi bilmek imkansızdır. Ancak uzmanların yardımıyla gerekli görevlere hızlı bir şekilde cevap almak - Ford'un bahsettiği şey buydu, referans kitaplarından ve doğru bilgiyi kullanmaktan bahsettiğim buydu. Ve bu, dar bir alanda bu kaynağı CodeBase ve bir forum biçiminde sağlar.

 
Yevhenii Levchenko :

Teşekkür ederim!

Senkron bir çoklu iş parçacığı ile bağlı mı? "Keneler henüz senkronize edilmedi" - daha çok bir uyarı gibi mi?

Numara

geliştiriciler, eşzamanlılık ile bunun, geçmişle çalışmak içinişlevleri çağırırken bazı garantili geçmiş veri işlemesi olduğunu kastediyor, ancak bu, istendiğinde verilerin zorunlu olarak iade edilmesini garanti etmiyor

... insanlık dışı bir dile geçtiler))))


ve asenkron bir istek ve veri veya bir hatadır ve bir hata meydana geldikten sonra senkronizasyon başlar, ancak senkronizasyonun (veya bir TF oluşturmanın) bitiş zamanı bilinmemektedir ve MT5'in yüksek performansı nedeniyle senkronize edilmiş veriler yerine bir hata alırsınız her aradığında

Not: MT5'te her şey karmaşıktır .... bir sunucu var, bir terminal var ve son olarak MQL programımız var, geçmiş talep ederken, sunucu terminalini ve ardından terminali senkronize etmeniz gerekiyor - MQL programı, birileri olabilir zaman dilimleri veya keneler hazır verileri yok

 
Igor Makanu :

Numara

geliştiriciler, eşzamanlılık ile bunun, geçmişle çalışmak içinişlevleri çağırırken bazı garantili geçmiş veri işlemesi olduğunu kastediyor, ancak bu, istendiğinde verilerin zorunlu olarak iade edilmesini garanti etmiyor

... insanlık dışı bir dile geçtiler))))


ve asenkron bir istek ve veri veya bir hatadır ve bir hata meydana geldikten sonra senkronizasyon başlar, ancak senkronizasyonun (veya bir TF oluşturmanın) bitiş zamanı bilinmemektedir ve MT5'in yüksek performansı nedeniyle senkronize edilmiş veriler yerine bir hata alırsınız her yeniden arama

Not: MT5'te her şey karmaşıktır .... bir sunucu var, bir terminal var ve son olarak MQL programımız var, geçmiş talep ederken, sunucu terminalini ve ardından terminali senkronize etmeniz gerekiyor - MQL programı, birileri olabilir zaman dilimleri veya keneler hazır verileri yok

Böyle bir şeye cevap vermek daha kolay olurdu:

Göstergede senkronizasyonu beklemek için, bir hata aldıktan sonra OnCalculate()'den çıkın ve sıfıra dönün - 0 döndürün;

Bu durumda, geçmiş verilere ilk erişim, veri senkronizasyonu sürecini başlatır ve yalnızca tamamlandığını kontrol etmek için kalır. Veri almada bir hata varsa, sıfır döndürün - sıfır, önceki çağrıda (önceki_hesaplanmış) zaten hesaplanmış veri miktarını gösterdiğinden ve mevcut çağrı ve geçmiş verilerin başarılı bir şekilde yüklenmesi sırasında, OnCalculate() üzerinden hesaplanacaktır. tarihin tüm derinliği (çünkü 0 döndürerek en çok son çağrıda hiçbir şeyin sayılmadığını belirteceğiz).

 
a.lxrn :

Herkese iyi günler, lütfen sorunu çözmeme yardım edin, sorun mantık, bugün zaten bütün beynimi kırdım ve yulaf lapası kafamın içinde olma noktasına geldim.

Burada bir temel kod örneği yazdım, bir sinyal var, mumun kapanması fareden daha büyükse, o zaman bir sipariş açılır.

Bir emir açılır, ancak stop veya kar tetiklendikten sonra sinyal kalır ve uzun bir süre True kalır, ne demek istediğimi anladığınızdan eminim,

aslında nasıl yapabilirim ki, bir al sinyali oluştuğunda, bir emir açılır ve bu kadar, ta ki durum değişinceye ve kapanış fiyatı elden düşük olana kadar.

ancak emir kapandığında kaydetmezler ve 15 dakika boyunca açılır veya geciktirilir.Açılış ve kapanış emirleri için koşullar aynı anda doğru olduğunda daha da serindir. Her tikte, bir emir)))) Bayraklar, bir emir açma sinyali doğruysa ve emrin açık olduğuna dair bayrak yanlışsa, o zaman emri açarız. Ve emrin açık olduğu bayrağı doğruysa, emir açılmayacaktır). Gecikme daha basit ve daha verimlidir. Siparişi kapattıktan sonra bir gecikme belirledik.

 
Igor Makanu :

ve asenkron bir istek ve veri veya bir hatadır ve bir hata meydana geldikten sonra senkronizasyon başlar, ancak senkronizasyonun (veya bir TF oluşturmanın) bitiş zamanı bilinmemektedir ve MT5'in yüksek performansı nedeniyle senkronize edilmiş veriler yerine bir hata alırsınız her aradığında

Not: MT5'te her şey karmaşıktır .... bir sunucu var, bir terminal var ve son olarak MQL programımız var, geçmiş talep ederken, sunucu terminalini ve ardından terminali senkronize etmeniz gerekiyor - MQL programı, birileri olabilir zaman dilimleri veya keneler hazır verileri yok


Yaklaşık olarak anlaşıldı ... Teşekkürler :)

Artyom Trishkin :

Böyle bir şeye cevap vermek daha kolay olurdu:

Göstergede senkronizasyonu beklemek için, bir hata aldıktan sonra OnCalculate()'den çıkın ve sıfıra dönün - 0 döndürün;

Bu durumda, geçmiş verilere ilk erişim, veri senkronizasyonu sürecini başlatır ve yalnızca tamamlandığını kontrol etmek için kalır. Veri almada bir hata varsa, sıfır döndürün - sıfır, önceki çağrıda (önceki_hesaplanmış) zaten hesaplanmış veri miktarını gösterdiğinden ve mevcut çağrı ve geçmiş verilerin başarılı bir şekilde yüklenmesi sırasında, OnCalculate() üzerinden hesaplanacaktır. tarihin tüm derinliği (çünkü 0 döndürerek en çok son çağrıda hiçbir şeyin sayılmadığını belirteceğiz).

Daha kolay, daha net anlamına gelmez :)

Stok enstrümanlarına geçtim ve orada sadece bir kez senkronize olmadıklarını yazdırdım. Sonraki istekler hiçbir şey döndürmedi.

Test cihazında hacimleri neden göstermediğini söyleyebilir misiniz?
 
Yevhenii Levchenko :

Kabaca anlaşıldı ... Teşekkürler :)

Daha kolay, daha net anlamına gelmez :)

Stok enstrümanlarına geçtim ve orada sadece bir kez senkronize olmadıklarını yazdırdım. Sonraki istekler hiçbir şey döndürmedi.

Test cihazında hacimleri neden göstermediğini söyleyebilir misiniz?

Geçmiş verileri güncel bir "sıcak" durumda tutmak için, CopyXXX, iXXX işlevlerinden herhangi birini, örneğin CopyTime() , iTime(), vb. kullanarak bu verilere her iki dakikada bir erişmek gerekir.

Test cihazında hangi ciltleri vermediğinizi bilmiyorum. Gerçek hacimler var ve kene hacimleri var. Kod olmadan, esasa cevap vermenin bir yolu yoktur.

Neden: