Hatalar, hatalar, sorular - sayfa 2776

 
Ilyas :

Bu bir hata değil, grafiğe senkronize bir komutun maliyetidir.

Bir grafiğin özelliklerini kaldırmak için neden bir komuta ihtiyacı var? Verileri milisaniye (mikrosaniye bile değil!)
ChartSetInteger, ChartSetDouble, ChartSetString fonksiyonlarının asenkron olduğu açıktır.
Peki neden ChartGetInteger , ChartGetDouble , ChartGetString işlevleri eşzamanlıyken yürütme hızı açısından eşzamansız olarak davranır?

Bellekte böyle bir tablo yoksa ve bu işlevlerin istenen parametreyi oluşturabilmesi için her seferinde grafiği yavaşlatması gerekiyorsa, hiçbir şey anlamıyorum.
Sonuçta böyle bir masaya sahip olmak ve onu güncel tutmak hiç de pahalı değil. Gerçekçi olarak, bellekte birkaç kilobayt ve grafiğin özelliklerini değiştirirken tabloyu güncellemek için mikrosaniyenin küçük bir kısmı.
İlyas, lütfen bana neyi anlamadığımı söyle?

 
Nikolai Semko :

Peki neden ChartGetInteger, ChartGetDouble, ChartGetString işlevleri eşzamanlı olduklarında, yürütme hızı açısından eşzamansız olarak davranırlar?

Eşzamansızlık ve eşzamanlılık terimlerini yanlış anlamışsınız.
Bir işlevin eşzamansız olduğunu söylediklerinde, bunun geçerli yürütme dizisinde değil, başka bir paralel dizide yürütüleceği anlamına gelir.

İşlev eşzamansızdır; bu, işlevin belirtilen çizelgede başarıyla kuyruğa alınan bir komutun yürütülmesini beklemediği, ancak hemen kontrolü döndürdüğü anlamına gelir.
Özellik, yalnızca komut grafik kuyruğunda işlendikten sonra değişecektir. Komutları grafik kuyruğunda hemen yürütmek için
ChartRedraw işlevini çağırın .

Asıl yürütme farklı bir iş parçacığında gerçekleştiğinden, ana iş parçacığından zaman uyumsuz ChartSetInteger işlevinin çağrılması hızlıdır.


Öte yandan, ChartGetInteger eşzamanlı işlevini çağırmak, iş parçacığı eşitleme gerektirir ve bu ek zaman alabilir.
Gecikmeler, özellikle paralel bir iş parçacığı sürekli olarak grafik yapısının verilerini güncellediğinde (örneğin, kullanıcı grafik penceresini hareket ettirdiğinde veya geçmişi kaydırdığında) fark edilir.
Büyük olasılıkla, basitlik ve güvenilirlik için, grafik veri yapısı için bir senkronizasyon nesnesi kullanılır.
"Veri segmentasyonu" kullanarak yürütme hızını artırmayı deneyebilirsiniz, ancak diğer yandan, artık bir kilitlenme veya yetersiz güncellenmiş veriler veya diğer daha kritik yerlerde yavaşlama olasılığı vardır.
Genel olarak - zaten stabil çalışana dokunmamak daha iyidir.

 
Sergey Dzyublik :

Eşzamansızlık ve eşzamanlılık terimlerini yanlış anlamışsınız.
Bir işlevin eşzamansız olduğunu söylediklerinde, bunun geçerli yürütme dizisinde değil, başka bir paralel dizide yürütüleceği anlamına gelir.

Asıl yürütme farklı bir iş parçacığında gerçekleştiğinden, ana iş parçacığından zaman uyumsuz ChartSetInteger işlevinin çağrılması hızlıdır.


Öte yandan, ChartGetInteger eşzamanlı işlevini çağırmak, iş parçacığı eşitleme gerektirir ve bu ek zaman alabilir.
Gecikmeler, özellikle paralel bir iş parçacığı sürekli olarak grafik yapısının verilerini güncellediğinde (örneğin, kullanıcı grafik penceresini hareket ettirdiğinde veya geçmişi kaydırdığında) fark edilir.
Büyük olasılıkla, basitlik ve güvenilirlik için, grafik veri yapısı için bir senkronizasyon nesnesi kullanılır.
"Veri segmentasyonu" kullanarak yürütme hızını artırmayı deneyebilirsiniz, ancak diğer yandan, artık bir kilitlenme veya yetersiz güncellenmiş veriler veya diğer daha kritik yerlerde yavaşlama olasılığı vardır.
Genel olarak - zaten stabil çalışana dokunmamak daha iyidir.

Haklısın, ama bazı darboğazlar var gibi görünüyor. Piyasa şu anda kapalı, aşağıdaki kodu 1 grafikte çalıştırdım, başka hiçbir şey çalışmıyor. Yalnızca MT5'in çalıştığı bir VPS üzerinde çalışıyor ve grafik/MT5 ile ekran görüntüsü almaktan başka bir şeyle etkileşim kurmadım. µs cinsinden süre, ortalama 127 µs, ancak tepe noktası 43.995 µs'dir.


Dosyalar:
342152.mq5  5 kb
 

Lord geliştiriciler!

Yanlış konuya yazdıysam lütfen düzeltin. Birçokları için faydalı olacağını düşündüğüm kullanım kolaylığı ve hata ayıklama önerileri var ama benim için önemli.


1. Nesneler için OBJPROP_TOOLTIP dizesinin uzunluğunu artırın (2 kez yeterlidir). Çok grafikli stratejiler için mevcut uzunluk çok küçüktür. Hata ayıklama için, her seferinde gerekli tüm verileri sığdırmaya çalışmak için zaman harcamanız gerekir. Ardından, tüketiciler için kısaltmaları düzenli olarak değiştirin ve (veya) ekleyin.


2. Giriş parametrelerinin adlarına göre yorumun uzunluğunu artırın (2 kez yeterlidir). Tüketici, girdi parametreleri hakkında yorumlara ihtiyaç duyar. Ve büyük bir sayı ile ek numaralandırma yapmak da uygundur. Optimizasyon için değişkenin adını bilmek önemlidir. Sonuç olarak, her şeyi mevcut uzunluğa sığdırmak çoğu zaman imkansızdır. Misal:


3. Optimizasyon sonuçları tablosundaki sütun seçimini çeşitlendirin - ENUM_STATISTICS'ten her şeyi kaldırmaya kadar, kullanıcı zaten ihtiyacı olanı seçecektir. Analiz için çok kötü bir seçim. Sabit hacim optimizasyonunda % cinsinden düşüş işe yaramaz. Fonlar ve mevduat için para biriminde maksimum düşüş seçeneği yoktur. Bazen optimizasyon sırasında alım ve satım pozisyonları arasında güçlü bir önyargı olabilir, ancak bunu yalnızca tek bir test başlattıktan sonra öğrenebilirsiniz. Genellikle sonuç alanında ( STAT_CUSTOM_ONTESTER ) eksik parametreleri bırakmamız gerekir. Ancak, ek sonuç ölçütlerimi orada görüntülemek istiyorum ve ENUM_STATISTICS'ten gelen standart ölçütlerin sütunlarının sayısı değişse bile katlanılabilecek olan yalnızca birini görüntülemek mümkündür. Genel olarak, yeniden optimizasyon ve analiz için çok fazla zaman harcamanız gerekir.

Teşekkür ederim!

 
Alain Verleyen :

Haklısın, ama bazı darboğazlar var gibi görünüyor. Piyasa şu anda kapalı, aşağıdaki kodu 1 grafikte çalıştırdım, başka hiçbir şey çalışmıyor. Yalnızca MT5'in çalıştığı bir VPS üzerinde çalışıyor ve grafik/MT5 ile ekran görüntüsü almaktan başka bir şeyle etkileşim kurmadım. µs cinsinden süre, ortalama 127 µs, ancak tepe noktası 43.995 µs'dir.

Zirvenin grafik yorumunun çizimi olduğunu varsayacağım, aksi takdirde, grafik kuyruğu boş olduğunda, ChartGetXXX işlevine yapılan çağrı (eşzamanlı çağrı) 0.13 milisaniye sürer.

 
Sergey Dzyublik :

Eşzamansızlık ve eşzamanlılık terimlerini yanlış anlamışsınız.
Bir işlevin eşzamansız olduğunu söylediklerinde, bunun geçerli yürütme dizisinde değil, başka bir paralel dizide yürütüleceği anlamına gelir.

Asıl yürütme farklı bir iş parçacığında gerçekleştiğinden, ana iş parçacığından zaman uyumsuz ChartSetInteger işlevinin çağrılması hızlıdır.


Öte yandan, ChartGetInteger eşzamanlı işlevini çağırmak, iş parçacığı eşitleme gerektirir ve bu ek zaman alabilir.
Gecikmeler, özellikle paralel bir iş parçacığı sürekli olarak grafik yapısının verilerini güncellediğinde (örneğin, kullanıcı grafik penceresini hareket ettirdiğinde veya geçmişi kaydırdığında) fark edilir.
Büyük olasılıkla, basitlik ve güvenilirlik için, grafik veri yapısı için bir senkronizasyon nesnesi kullanılır.
"Veri segmentasyonu" kullanarak yürütme hızını artırmayı deneyebilirsiniz, ancak diğer yandan, artık bir kilitlenme veya yetersiz güncellenmiş veriler veya diğer daha kritik yerlerde yavaşlama olasılığı vardır.
Genel olarak - zaten stabil çalışana dokunmamak daha iyidir.

Bu doğru, senkronize komutların işlenmesini hızlandırmak için mimaride bir değişiklik gerekir (özellikle GUI), daha fazla yük / zaman veren, grafiğin oluşturulmasını engelleyen kişidir.
 
İlginç davranış.
PrtScr düğmesini basılı tutarsanız ve grafik penceresini bir daire içinde hareket ettirirseniz, bu, 5 saniyeye kadar ağır çekimde korkunç gecikmelere neden olur.
Ancak, ALT + PrtScr aracılığıyla yalnızca terminal.exe program penceresinin ekran görüntüsünü alırsanız, gecikme olmaz.
 
Ilyas :
TERMINAL_GUI_ON/OFF

Yerleşik VPS hizmetine bakılırsa, bu konuda deneyim var.

 
Ilyas :

Zirvenin, grafik yorumunun oluşturulması olduğunu varsayacağım, aksi takdirde, grafik kuyruğu boş olduğunda, ChartGetXXX işlevine yapılan çağrı (not, senkronizasyonlu çağrı) 0.13 milisaniye sürer.

Hayır, İlyas'ın grafikle ilgili bir yorumu yok gibi görünüyor. Günlükleri kullanacağım ve yayınlayacağım.

Düzenleme: İşte sonuç, başlatmadan sonra günlüğü kopyalamak dışında grafik veya MT5 veya Windows ile etkileşim yok. Sadece 1 çizelge, sistemde başka bir yazılım çalışmıyor. Zirve daha küçüktür, ancak yine de ortalamaya göre çok önemlidir. (µs)

2020.06.13 07:11:25.192 342152 (EURGBP, H1) Tutar = 7440
2020.06.13 07:11:25.192 342152 (EURGBP, H1) Min=37
2020.06.13 07:11:25.192 342152 (EURGBP, H1) Maks = 17776
2020.06.13 07:11:25.192 342152 (EURGBP, H1) Ort = 147

Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Свойства графиков
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Свойства графиков
  • www.mql5.com
Признак отрисовки ценового графика. Если установлено значение false, то отключается отрисовка любых атрибутов ценового графика и устраняются все отступы по краям графика: шкалы времени и цены, строка быстрой навигации, метки событий Календаря, значки сделок, тултипы индикаторов и баров, подокна индикаторов, гистограммы объёмов и т.д. Значение...
 
Alain Verleyen :

Hayır, İlyas'ın grafikle ilgili bir yorumu yok gibi görünüyor. Günlükleri kullanacağım ve yayınlayacağım.

Düzenleme: İşte sonuç, başlatmadan sonra günlüğü kopyalamak dışında grafik veya MT5 veya Windows ile etkileşim yok. Sadece 1 çizelge, sistemde başka bir yazılım çalışmıyor. Zirve daha küçüktür, ancak yine de ortalamaya göre çok önemlidir. (µs)

2020.06.13 07:11:25.192 342152 (EURGBP, H1) Tutar = 7440
2020.06.13 07:11:25.192 342152 (EURGBP, H1) Min=37
2020.06.13 07:11:25.192 342152 (EURGBP, H1) Maks = 17776
2020.06.13 07:11:25.192 342152 (EURGBP, H1) Ort.=147

Güncelleme :

Maksimum tepe artık ciddi şekilde artırıldı:

2020.06.13 08:18:25.187 342152 (EURGBP, H1) Tutar = 23520
2020.06.13 08:18:25.187 342152 (EURGBP, H1) Min=33
2020.06.13 08:18:25.187 342152 (EURGBP, H1) Maks = 81011
2020.06.13 08:18:25.187 342152 (EURGBP, H1) Ort = 149