Göstergeler: Izgara - sayfa 2

 
Prival:
Code Base'de yeni bir 3.09 sürümü yayınladı, indirebilirsiniz.

Biraz daha geliştirebilirsiniz.

if(ObjectFind(0,nm)<0) ObjectCreate(0,nm,OBJ_VLINE,0,t1,2);

Bu tür yapılarda ObjectFind() açıkça gereksizdir. ObjectCreate() ile oluştururken, listede isme göre arama yapmak ve ya yeni bir nesne oluşturmak ya da mevcut olanın bağlantı noktalarının parametrelerini değiştirmek benzer olacaktır.
.

ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,false);

MQL programından oluşturulan nesneler için bu özellik false olarak zorlanır.

Benzer şekilde, OBJPROP_WIDTH değerini değiştirmenin bir anlamı yoktur, zaten 1'e eşit olacaktır.

Ölçümlerime göre bu düzenlemeler derleme süresini yaklaşık %10 azaltıyor.

 

Teşekkürler. Bunu aklımda tutacağım. Şu anda bir şey üzerinde çalışıyorum. Bir aksaklık var.

Üzerinde sadece ızgara olan 8 grafik açık.

Ağ bağlantısının 5 dakikalığına kesildiğini simüle ediyorum. Ağ açıldıktan sonraki görüntü bu. 2 grafik çöküyor.

Izgara sürüm 4.01'in yeni bir sürümünü ekliyorum.

Dosyalar:
setka__1.mq5  15 kb
 
Prival:

Teşekkürler. Bunu aklımda tutacağım. Şu anda bir şey üzerinde çalışıyorum. Bir aksaklık var.

Üzerinde sadece ızgara olan 8 grafik açık.

Ağ bağlantısının 5 dakikalığına kesildiğini simüle ediyorum. Ağ açıldıktan sonraki görüntü bu. 2 grafik çöküyor.

Izgara sürüm 4.01'in yeni bir sürümünü ekliyorum.

Bu, terminal mimarisinin ve gösterge algoritmasının bir sonucudur. Gösterge sembol akışında yürütülür, yani hesaplanması sırasında geçmişle ilgili birçok işlem imkansızdır: tiklerin işlenmesi, diğer göstergelerin hesaplanması, sunucu ile geçmiş senkronizasyonu, sembol zaman dilimlerine göre geçmiş oluşturma veya yükleme vb.

Grid göstergesi uzun bir süre için hesaplandığından ve diğer sembol zaman dilimlerinden veri kullandığından, herhangi bir hata durumunda hesaplamasının kesilmesi arzu edilir. Cidden kodu yeniden yazmayacaksanız, bunu bu şekilde yapabilirsiniz:

bool isNewBar_i(datetime date,ENUM_TIMEFRAMES timeFrame,bool& error)

  {

...

   else
     {
      Print("Timeframe ",fTimeFrameName(timeFrame)," is not ready");
      error=true;

     }

ve böylece:

      //--- определимся с цветом линии
      if(_Period<PERIOD_H1) if(isNewBar_i(time[i],PERIOD_H1,error) && _Period<PERIOD_M30) line_color=new_hour;
      if(_Period<PERIOD_D1) if(isNewBar_i(time[i],PERIOD_D1,error) && _Period<PERIOD_H4 ) line_color=new_day;
      if(_Period<PERIOD_W1) if(isNewBar_i(time[i],PERIOD_W1,error) && _Period<PERIOD_D1 ) line_color=new_week;
      if(_Period<PERIOD_MN1)if(isNewBar_i(time[i],PERIOD_MN1,error)&& _Period<PERIOD_MN1) line_color=new_mon;
      //---
      if(error) return(0);

Dosyalar:
setka.mq5  15 kb
 
antt:

Bu, terminal mimarisinin ve gösterge algoritmasının bir sonucudur. Gösterge sembol akışında yürütülür, yani hesaplama sürecinde geçmişle birçok işlem imkansızdır: tiklerin işlenmesi, diğer göstergelerin hesaplanması, geçmişin sunucu ile senkronizasyonu, sembol zaman dilimlerine göre geçmiş oluşturma veya yükleme vb.

Bu akış kavramını anlayamıyorum ve veri erişimi hakkındaki yardımı 50 kez okudum (( komut dosyası orada örnek olarak verilmiştir. Ve yürütülmesi yaklaşık bir dakika sürüyor (uzun bir süre), ama görünüşe göre almaya başladım. Doğru anladım mı, gösterge hesaplanırken, yani işlev yürütülmeye başladığında

int OnCalculate () {
bilgisayarın (terminalin) tüm kaynakları bu göreve verilir ve görev yürütülene (tamamlanana) kadar

return(rates_total); }

Aşağıdakilerden hiçbirini yapmamalısınız:

- eksikse bu sembolle geçmişi okumaya çalışın

- farklı bir zaman dilimi talep edin

- başka bir sembol talep edin

Sanırım programı nasıl yeniden yapacağımı anladım, ilk çağrıda tüm satırları ayarlamanız ve if(prev_calculated==0)'a kadar unutmanız gerekiyor.

Doğru mu?

S.Y.

  1. Tüccar - tırmıklara basan bir kişi.
  2. Kukla - hiç tırmığa basmamış ve bu nedenle tırmık olmadığından emin olan acemi bir tüccar.
  3. enayi - Düzenli olarak tırmıklara basan ama hala tırmıkların var olmadığından emin olan bir tüccar.
  4. Dar uzman - Aynı komisyona adım atma teknolojisinde akıcı olan bir tüccar.
  5. Geniş uzmanı, paralel olarak ikiden fazla tırmığa basan bir tüccardır.
  6. Mekanik sistemler uzmanı - komisyon vuruşlarını otomatikleştirebilen bir tüccar.

Renat'ın değerlendirmesine göre 5. seviyeye sahibim :-)) , https://www.mql5.com/ru/forum/1165/page3 bir adım daha ileri gitti)))

 

Kod tamamen yeniden yazıldı. Başka bir zaman dilimi istenmiyor.

eğer sakıncası yoksa. Unlimit penceresinde mac. çubuklarını ayarlayın ve M15, M5 ve M1'den geçin. sonucu burada günlüğe gönderin. M1'de bir sorunum var - servise yazdım. Sadece bende mi yoksa herkeste mi olduğunu görmek istiyorum.

işte günlüğüm.

2010.06.17 11:39:55 Grid (EURUSD,M1) Hata veya ilk çalıştırma 1293476 çubuk için Time= 1.2 sn ObjectsTotal= 48010 _time= 2002.10.25 06:41:00
2010.06.17 11:39:52 Grid (EURUSD,M5) Hata veya ilk çalıştırma Time= 0.847192 bar için 0 sn ObjectsTotal= 423 _time= 2010.06.02 21:35:00
2010.06.17 11:39:48 Grid (EURUSD,M15) Failure or first run Time= 0.0 sec for 285186 bars ObjectsTotal= 962 _time= 2010.05.04 22:00:00

şimdiden teşekkürler. grid sürümü 4.11

 
Prival:

Bu iş parçacığı kavramını anlayamıyorum ve veri erişimi hakkındaki yardımı 50 kez okudum (( kod orada örnek olarak verilmiştir. Ve yürütülmesi yaklaşık bir dakika sürüyor (uzun bir süre), ama sanırım anlamaya başlıyorum. Göstergenin hesaplaması devam ederken, yani fonksiyonun yürütülmeye başladığını doğru anlıyor muyum?

http://ru.wikipedia.org/wiki/Thread


int OnCalculate () {
tüm bilgisayar (terminal) kaynakları bu göreve verilir ve görev yürütülene (bitirilene) kadar

return(rates_total); }

Tüm kaynaklar değil. Ancak bu sembolle ilgili hesaplamaların çoğu OnCalculate() tamamlanana kadar bekleyecektir.


Aşağıdakilerden hiçbirini yapmamalısınız:

- eksikse bu sembolün geçmişini okumaya çalışmak

Evet. Mevcut sembol için yeterli geçmiş yoksa, OnCalculate() yürütmesi kesinlikle daha iyi olmayacaktır.


- başka bir zaman dilimi talep edin

Bunu talep edebilirsiniz, ancak veriler eksik veya yetersizse, OnCalculate() içinde beklemenin bir anlamı yoktur. Mevcut sembol için diğer göstergelerin verileriyle benzer şekilde.

- başka bir sembol talep etmek

Talep edebilirsiniz, teorik olarak gerekli tüm verilerin görünmesi için döngüde bile bekleyebilirsiniz, çünkü başka bir sembolün (geçmiş, göstergeler) verilerinin işlenmesi başka bir iş parçacığında yapılır. Ancak bunu yapmamak daha iyidir, OnCalculate () içindeki bekleme döngüsü mevcut sembolün verilerini işlemeyi durduracaktır.

.

Sanırım programı nasıl yeniden yapacağınızı anlıyorum, ilk çağrıda tüm satırları ayarlamanız ve if(prev_calculated==0) unutmanız gerekiyor.

Özel göstergeler yazarken genel öneri: herhangi bir hata tespit edilirse, herhangi bir veri eksikliği varsa, OnCalculate()'in yürütülmesini return(0) ile hemen durdurun. Bir sonraki tikte, if(prev_calculated==0) üzerinde hesaplama yapmak için yeni bir girişimde bulunun.
 
Prival:

eğer çok fazla sorun olmazsa. Unlimit penceresinde mac. çubuklarını ayarlayın ve M15, M5 ve M1'den geçin. Günlükte olacak sonucu buraya gönderin. M1'de bir sorunum var - servise yazdım. Sadece sorunun bende mi yoksa herkeste mi olduğunu görmek istiyorum.

2010.06.17 11:58:59 6op0k (EURUSD,M1) Hata veya ilk çalıştırma 4009008 çubuk için Time=0.1sec ObjectsTotal=403_time=2010.06.15 07:45:00
2010.06.17 11:58:54 6op0k (EURUSD,M5) Başarısızlık veya ilk çalıştırma Zaman=0.847196 çubuk için 0sn ObjectsTotal=605_time=2010.06.02 21:55:00
2010.06.17 11:58:44 6op0k (EURUSD,M15) Hata veya ilk çalıştırma 285187 çubuk için Time=0.0sn ObjectsTotal=1108_time=2010.05.04 22:15:00
 
antt:
2010.06.17 11:58:59 6op0k (EURUSD,M1) Hata veya ilk çalıştırma 4009008 çubuk için Zaman=0.1sn ObjectsTotal=403_time=2010.06.15 07:45:00
2010.06.17 11:58:54 6op0k (EURUSD,M5) Hata veya ilk çalıştırma 847196 çubuk için Time=0.0sec ObjectsTotal=605_time=2010.06.02 21:55:00
2010.06.17 11:58:44 6op0k (EURUSD,M15) Hata veya ilk çalıştırma 285187 çubuk için Time=0.0sec ObjectsTotal=1108_time=2010.05.04 22:15:00

Teşekkür ederim. bu, sonunda her şeyi doğru yazdığım ve "gösterge" nin gerçekten istediğim gibi çalıştığı anlamına geliyor. yaşadığım başarısızlık terminalin bir sorunu (her şey normal). _time=2010.06.15 07:45:00). geliştiricilerin servis dex'inde sessiz kalması üzücü. en azından birkaç kelime yazarlardı (( gibi

Sorun çözüldü...sanıyoruz...teşekkürler

 
Prival:

teşekkürler. demek ki sonunda her şeyi doğru yazmışım ve "gösterge" gerçekten istediğim gibi çalışıyor. yaşadığım hata terminalle ilgili bir sorun (iyi gidiyorsunuz. _time=2010.06.15 07:45:00). geliştiricilerin servis dex'inde sessiz kalması üzücü. en azından birkaç kelime yazarlardı (( gibi

Sorun giderildi...sanıyoruz...teşekkürler.

ve düzeltilebilir:

H1 gravfik üzerinde dikey veya yatay bir çizgi taşımak için, daha sonra başka bir zaman aralığına geçerseniz, gösterge ile ilgili olmayan çizgiler silinir.

Bu, fiyat adımını görsel olarak belirlemek için geçmişi kontrol etmek için çok uygun bir göstergedir, ancak daha küçük bir zaman aralığına geçerken eski zaman aralıklarına konulan işaretlerin (dikey ve yatay çizgiler) kaybolması nedeniyle rahatsız edici hale gelir.

 

Gösterge, terminal pencerelerinde fiyat ölçeğinin kullanılabilir görüntülenmesi sorununu mükemmel bir şekilde çözdü.

3021'e kadar olan derlemelerde derleme hiçbir hata göstermiyor ve her şey düzgün çiziliyor (hatta önceden derlenmiş sürümü terminalin yeni bir derlemesine atsanız bile).

Sonraki yapılarda derleme herhangi bir hata göstermez, ancak terminalde toplayıcı dikey işaretleme çizmez ve günlüklerde şöyle yazar: 1 sızdırılmış dizeler kaldı

Satırı yorumladıktan sonra:

StringConcatenate(line_name,IntegerToString(str.hour,2,'0'),":":",IntegerToString(str.min,2,'0'),"_N",line_counter);

terminal günlüklerindeki hata kaybolur (çizgiler çizilmemesine rağmen).

Hangi yolu kazmalı? Harika bir araç nasıl yeniden canlandırılır?