iClose/iOpen zaman serilerine vb. erişimle çalışırken MQL5 hatası. - sayfa 10

 
fxsaber :

aptallık.

+1
 
fxsaber :

aptallık.

"Aniden" (c) sınırlı sistem performansı sorunu ortaya çıkana kadar (hangisi olduğu önemli değil).

 

Bu günlerde OnCalculate'in çalışmasına ve kene verilerinin işlenmesine bakıyorum. Daha önce, çarpık yazılmış göstergelerin "donmasını" önlemek için her şeyin yapıldığı yazıldı, ancak önceki OnCalculate çağrısından bu yana tüm onay verileri akışını gerçekten işlememiz gerekiyorsa, o zaman fiyatın hızlı bir hareketiyle (ve geri almayla), oldukça "derin" bir dizi almalıyız, kene dizisinin derinliği konusunda herhangi bir kısıtlama var mı?

"Böyle bir durumda OnCalculate'de biriken onay(lar) alınacak..., optimizasyon için..." gibi bir cevap duymak istemiyorum.

Kim zaten kene verilerinin analiziyle uğraşıyor, bu tür endişeler için herhangi bir sebep var mı?

 
Farkhat Guzairov :

Bu günlerde OnCalculate'in çalışmasına ve kene verilerinin işlenmesine bakıyorum. Daha önce, çarpık yazılmış göstergelerin "donmasını" önlemek için her şeyin yapıldığı yazıldı, ancak önceki OnCalculate çağrısından bu yana tüm onay verileri akışını gerçekten işlememiz gerekiyorsa, o zaman fiyatın hızlı bir hareketiyle (ve geri almayla), oldukça "derin" bir dizi almalıyız, kene dizisinin derinliği konusunda herhangi bir kısıtlama var mı?

"Böyle bir durumda OnCalculate'de biriken onay(lar) alınacak..., optimizasyon için..." gibi bir cevap duymak istemiyorum.

Kim zaten kene verilerinin analiziyle uğraşıyor, bu tür endişeler için herhangi bir sebep var mı?

2008-2009'da Renat bir keresinde kenelerde mutluluk olmadığını yazdı, bir uzman örneği verdi. Tikler yine de atlanır. Gerekirse, her aramada https://www.mql5.com/ru/docs/series/copyticks adresini alın, ancak girmek istediğiniz üst/alt 50/50'yi atlayın.

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
  • www.mql5.com
[in]  Количество запрашиваемых тиков. Если параметры from и count не указаны, то в массив ticks_array[] будут записаны все доступные последние тики, но не более 2000. Первый вызов CopyTicks() инициирует синхронизацию базы тиков, хранящихся на жёстком диске по данному символу. Если тиков в локальной базе не хватает, то недостающие тики...
 

Belki işaretleyeceğim kalabalık için buradayım. Bir aydır bunun neden çalışmayı bıraktığını anlamaya çalışıyorum:

 long lastbardaytime= 0 ;

int OnInit (){ 
}

bool isNewBar( string symbol_, ENUM_TIMEFRAMES period_){
     long curbar = SeriesInfoInteger (symbol_,period_, SERIES_LASTBAR_DATE )% 86400 ;
     if (lastbardaytime == 0 ){
        lastbardaytime = curbar;
    }
     if (lastbardaytime != curbar){
        lastbardaytime = curbar;
         return ( true );
    }
     return ( false );
}


void OnTick (){
     if (isNewBar(MIX- 12.18 , PERIOD_M1 )){ 
         Print ( "New bar" );
///....
    }
} 


Açılışta yeni bir sürüm bekliyoruz.

 

Geçmiş verilerin optimizasyonu ve yüklenmesi ile ilgili sorulara devam ediyorum.

1. iClose / iOpen setinden fonksiyonların doğru çalışması sorunu ve bu durumda iTime var ve bence her şeyin mükemmel olmasını beklemenin bir anlamı yok. O zaman belki de MQL5'ten kolayca çıkarılabilirler, böylece aynı tırmıkla tekrar tekrar basmaz mıyız? (bir sorun var ama anlatmaya zaman yok, çünkü bir çözüm buldum, başka bir "büküm")

2. Belki bir çözüm vardır, ancak bunun belgelenmesini istiyorum, MQL5 topluluğunun başka bir hilesi değil. Yerel veritabanlarını senkronize eden asenkron isteklerle nasıl başa çıkmamız gerektiğinden bahsediyoruz, örneğin:

Göstergelerde, CopyTicks() işlevi sonucu hemen döndürür: Bir göstergeden çağrıldığında, CopyTick() hemen sembol başına kullanılabilir onay işaretlerini döndürür ve ayrıca yeterli veri yoksa onay tabanının senkronizasyonunu başlatır. Aynı sembol üzerindeki tüm göstergeler tek bir ortak iş parçacığında çalışır, bu nedenle göstergenin senkronizasyonun tamamlanmasını bekleme hakkı yoktur. Senkronizasyon sona erdikten sonra, CopyTicks()'e yapılan bir sonraki çağrı, istenen tüm onay işaretlerini döndürür. Göstergelerdeki OnCalculate() işlevi, her bir onay işareti geldikten sonra çağrılır.


Anahtar ifade " Senkronizasyonun sona ermesinden sonra, CopyTicks()'e yapılan bir sonraki çağrı, istenen tüm onay işaretlerini geri getirecektir. ", beyler, senkronizasyonun sonunu nasıl öğrenebilirim ??? Örneğin, CopyTicks() senkronizasyonun bitiminden önce -1 döner gibi yazılır, ancak değildir. Sonuç olarak, göstergenin birkaç kez yeniden başlatılmasından sonra, veritabanı senkronize edilir ve gerçekten tüm veri setini alırız, ancak göstergeyi bozmazsam, sonucu bilmediğim için bu seti alamayacağım. bu lanet senkronizasyonu tamamlamak için.

Canlı bir örnek, geçmiş darbelerdi, gösterge tüm bu süre boyunca açık olmasına ve bu süreyi normal bir şekilde çiziyor gibi görünmesine rağmen, EURUSD'de keskin bir hareket vardı, ancak yeniden yüklendikten sonra (giriş parametrelerini değiştirdi), gösterge yansıtmaya başladı. bilgi sırasıyla yanlış, arama göstergede hatalara başladı (birkaç kez yeniden derledim ve yeniden yükledim), ancak hiçbir şey yardımcı olmadı ve sonra aynı "mucize" oldu, " Göstergeden çağrıldığında, CopyTick() hemen kullanılabilir keneleri döndürür sembolü ve ayrıca onay tabanının senkronizasyonunu başlat ", belki de hepsi aynı, bize şu anda yerel veritabanının senkronizasyonunun tamamlanmadığını söyleyebilecek bir fonksiyon yaratmaya değer (veya orada mı), bu fonksiyon işimizi kolaylaştıracak ve karşılığında Pazar için daha iyi bir son ürün yazmamızı sağlayacaktır.

Not: SymbolInfoTick işlevi maalesef böyle bir işlevselliğe sahip değil.

 

Ne yazık ki, bu örnek her zaman çalışmıyor:

 //--- запросим тиковую историю с момента 1970.01.01 00:00.001 (параметр from=1 ms) 
       int received= CopyTicks ( _Symbol ,tick_array, COPY_TICKS_ALL , 1 ,getticks); 
       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 ); 
        } 

Daha doğrusu 10 vakanın 1-2 katı işe yarıyor.

Ancak yukarıda açıklanan durumda bir kez bile çalışmadı.

 

Yine soru şu ki, veritabanı gerçek zamanlı olarak güncelleniyor mu?

Yukarıda yazdığım gibi, sorunlu olan tüm dönem, gösterge çalıştı, yani. CopyTicks() işlevineyapılan çağrı düzenli olarak gerçekleştirildi, ancak ortaya çıktığı gibi, bu yerel veritabanını hiçbir şekilde etkilemedi .... Bu garip ....

 
Unicornis :

2008-2009'da Renat bir keresinde kenelerde mutluluk olmadığını yazdı, bir uzman örneği verdi. Tikler yine de atlanır. Gerekirse, her aramada https://www.mql5.com/ru/docs/series/copyticks adresini alın, ancak girmek istediğiniz üst/alt 50/50'yi atlayın.

Kim istemez, kimin umurunda :) güncel verilere, özellikle kene verilerine sahip olmak.
 
Farkhat Guzairov :

Geçmiş verilerin optimizasyonu ve yüklenmesiyle ilgili sorulara devam ediyorum.

1. iClose / iOpen setinden fonksiyonların doğru çalışması sorunu ve bu durumda iTime var ve bence her şeyin mükemmel olmasını beklemenin bir anlamı yok. O zaman belki de MQL5'ten kolayca çıkarılabilirler, böylece aynı tırmıkla tekrar tekrar basmaz mıyız? (bir sorun var ama anlatacak zaman yok, çünkü bir çözüm, başka bir "büküm" buldum)

2. Belki bir çözüm vardır, ancak bunun belgelenmesini istiyorum, MQL5 topluluğunun başka bir hilesi değil. Yerel veritabanlarını senkronize eden asenkron isteklerle nasıl başa çıkmamız gerektiğinden bahsediyoruz, örneğin:

Göstergelerde, CopyTicks() işlevi sonucu hemen döndürür: Bir göstergeden çağrıldığında, CopyTick() hemen sembol başına kullanılabilir onay işaretlerini döndürür ve ayrıca yeterli veri yoksa onay tabanının senkronizasyonunu başlatır. Aynı sembol üzerindeki tüm göstergeler tek bir ortak iş parçacığında çalışır, bu nedenle göstergenin senkronizasyonun tamamlanmasını bekleme hakkı yoktur. Senkronizasyon sona erdikten sonra, CopyTicks()'e yapılan bir sonraki çağrı, istenen tüm onay işaretlerini döndürür. Göstergelerdeki OnCalculate() işlevi, her bir onay işareti geldikten sonra çağrılır.


Anahtar ifade " Senkronizasyonun sona ermesinden sonra, CopyTicks()'e yapılan bir sonraki çağrı, istenen tüm onay işaretlerini geri getirecektir. ", beyler, senkronizasyonun sonunu nasıl öğrenebilirim ??? Örneğin, CopyTicks() senkronizasyonun bitiminden önce -1 döner gibi yazılır, ancak değildir. Sonuç olarak, göstergenin birkaç kez yeniden başlatılmasından sonra, veritabanı senkronize edilir ve gerçekten tüm veri setini alırız, ancak göstergeyi bozmazsam, sonucu bilmediğim için bu seti alamayacağım. bu lanet senkronizasyonu tamamlamak için.

Canlı bir örnek, geçmiş darbelerdi, gösterge tüm bu süre boyunca açık olmasına ve bu süreyi normal bir şekilde çiziyor gibi görünmesine rağmen, EURUSD'de keskin bir hareket vardı, ancak yeniden yüklendikten sonra (giriş parametrelerini değiştirdi), gösterge yansıtmaya başladı. bilgi sırasıyla yanlış, arama göstergede hatalara başladı (birkaç kez yeniden derledim ve yeniden yükledim), ancak hiçbir şey yardımcı olmadı ve sonra aynı "mucize" oldu, " Göstergeden çağrıldığında, CopyTick() hemen kullanılabilir keneleri döndürür sembolü ve ayrıca onay tabanının senkronizasyonunu başlat ", belki de hepsi aynı, bize şu anda yerel veritabanının senkronizasyonunun tamamlanmadığını söyleyebilecek bir fonksiyon yaratmaya değer (veya orada mı), bu fonksiyon işimizi kolaylaştıracak ve karşılığında Pazar için daha iyi bir son ürün yazmamızı sağlayacaktır.

Not: SymbolInfoTick işlevi maalesef böyle bir işlevselliğe sahip değil.

Bu gibi durumlarda SERIES_SYNCHRONIZED ne getirir?