Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 985

 

do { ... arabellek doldurma kodu

}

while( bu iki değer uyuşmuyor )

kısacası, bir döngüde eşleşene kadar değerleri alın, ancak bundan sonra aşağıdaki kodu yürütün
 
Maxim Dmitrievsky :

do { ... arabellek doldurma kodu

}

while( bu iki değer uyuşmuyor )

kısacası, bir döngüde eşleşene kadar değerleri alın, ancak bundan sonra aşağıdaki kodu yürütün

Yani bir gösterge çalışana kadar, veri (akış) diğerine aktarılmaz, yani. Bu göstergenin OnCalculate işlemini bitirmeden göstergede bir döngü yardımcı olmaz. Ve OnCalculate biter bitmez, veriler derhal danışmana verilir ve bunlar hatalıdır.

Ya da ben senin fikrini yanlış anladım.
 
Aleksey Vyazmikin :

Yani bir gösterge çalışana kadar, veri (akış) diğerine aktarılmaz, yani. Bu göstergenin OnCalculate işlemini bitirmeden göstergede bir döngü yardımcı olmaz.

sırayla diğer göstergelerin arabelleklerinden değerler alın, aynı sayı değilse, aynı olana kadar tekrar alın, akışları unutun. ama genel olarak hiç kimse göstergelerin göstergelerden sapmasını çok yavaş yapmaz

 
Aleksey Vyazmikin :

Yani bir gösterge çalışana kadar, veri (akış) diğerine aktarılmaz, yani. Bu göstergenin OnCalculate işlemini bitirmeden göstergede bir döngü yardımcı olmaz. Ve OnCalculate biter bitmez, veriler derhal danışmana verilir ve bunlar hatalıdır.

Ya da ben senin fikrini yanlış anladım.

koşulun yerine getirilmesine ihtiyacınız var, o zaman anladığım kadarıyla yalnızca arabellekler doldurulacak (böylece diğer göstergelerin arabelleklerindeki çubukların sayısı eşleşir)

mevcut göstergenin tamponlarını doldurmadan önce tüm koşulları zorla

ya da çarpık programcıya neden problemlerini yanlış konuda çözmemiz gerektiğini geri verin

 
Maxim Dmitrievsky :

sırayla diğer göstergelerin arabelleklerinden değerler alın, aynı sayı değilse, aynı olana kadar tekrar alın, akışları unutun. ancak genel olarak hiç kimse göstergelerin göstergelerden sapmasını çok yavaş yapmaz

Maksim Dmitrievski :

koşulun yerine getirilmesine ihtiyacınız var, o zaman anladığım kadarıyla yalnızca arabellekler doldurulacak (böylece diğer göstergelerin arabelleklerindeki çubukların sayısı eşleşir)

mevcut göstergenin tamponlarını doldurmadan önce tüm koşulları zorla

ya da çarpık programcıya neden problemlerini yanlış konuda çözmemiz gerektiğini geri verin

Hesaplama diğer göstergelerden hazır değilse, değerler sıfır olacaktır, bu nedenle zorla doldurmanın bir anlamı yoktur, geçmiş verileri doldurabilirsiniz, ancak aynı etkiyle, veriler için değil, veri talep edebilirsiniz. göstergeden geçerli çubuk, ancak geçmiş için ve ardından kodun hiç düzenlenmesi gerekmez.

Neden burada tartışıyoruz - test cihazındaki ve gerçek hesaptaki durum farklı olduğundan, Uyku simülasyonu çok garip çalışıyor ve gösterge uykunun 15 saniyesinde yalnızca bir kez yeniden hesaplanır, ancak her tikte gerçekleşmesi gerekir veya istek üzerine ve 15 saniyede değil, günlüğe bakılırsa 13'te olur.

Ek olarak, senkronizasyon sorunu önemlidir ve bu tür durumlar için göstergeyi veri akışını diğer göstergelere aktarma ihtiyacı hakkında bilgilendirme yeteneği eklemek iyi olur, bu olmadan daha fazla hesaplama yapmak imkansızdır - bu çözüm ol - hesaplamayı tamamlamadan akışı diğerine aktarma komutu.

Buna göre, EA, göstergeden veri alınmasını beklemek ve tam hesaplamanın sonuna kadar keneleri atlamak zorundadır ve şimdi, doğru hesaplama sonuçlarını beklemek için while ifadesini kullanmaya çalışırken donuyor / dönüyor ( yani hiçbir şey olmuyor, sadece test cihazı duruyor) ve bu aynı doğru değil.

Tabii ki, geliştiriciyi bilgilendirdim, ancak ondan bir aydan fazla bir süredir haber yok - serbest çalışmanın maliyeti.

 

test cihazındaki ve gerçek hesaptaki durum farklıdır, Uyku simülasyonu çok garip çalışır ve gösterge uykunun 15 saniyesinde yalnızca bir kez yeniden hesaplanır, ancak her tikte veya istek üzerine gerçekleşmesi gerekir ve olmaz 15 saniyede ve günlüğe bakılırsa 13'te gerçekleşir.

Ek olarak, senkronizasyon sorunu önemlidir ve bu tür durumlar için göstergeyi veri akışını diğer göstergelere aktarma ihtiyacı hakkında bilgilendirme yeteneği eklemek iyi olur, bu olmadan daha fazla hesaplama yapmak imkansızdır - bu çözüm ol - hesaplamayı tamamlamadan akışı diğerine aktarma komutu.

Buna göre, EA, göstergeden veri alınmasını beklemek ve tam hesaplamanın sonuna kadar keneleri atlamak zorundadır ve şimdi, doğru hesaplama sonuçlarını beklemek için while ifadesini kullanmaya çalışırken donuyor / dönüyor ( yani hiçbir şey olmuyor, sadece test cihazı duruyor) ve bu aynı doğru değil.

 

Sevgili Artyom Trishkin !

Umarım yukarıdaki soruların yeni başlayanlar için olduğunu belirlediğine göre, bunların cevabını zaten biliyorsun ve bana yardım edebilirsin!

Bir profesyonelden cevap bekliyorum.

 
Aleksey Vyazmikin :

Sevgili Artyom Trishkin !

Yukarıdaki soruların yeni başlayanlar için olduğunu belirlediğinize göre, bunların cevabını zaten bildiğinizi ve bana yardımcı olabileceğinizi umuyorum!

Bir profesyonelden cevap bekliyorum.

Yalnızca şunu tavsiye edebilirim: gösterge, hesaplama için gerekli sayıda çubuğu almadıysa OnCalculate()'den çıkmalıdır: if(rates_total<required_number_of_bars) return 0;

EA, göstergeden alınan verileri kontrol etmeli ve göstergenin boş değerine eşit değilse, ancak o zaman alınan verilerle hesaplamalar yapmalıdır.

  1. Göstergede, arabellekler önce boş bir değerle başlatılır (nedir - göstergede ayarlayabilirsiniz)
  2. Göstergede (arabellekler zaten boş bir değerle doldurulmuş), mevcut çubukların sayısını kontrol ediyoruz (yukarıda açıklanmıştır)
  3. Çubuk kullanılabilirlik kontrolünden geçilirse, gerekli değerlerle doldurulan tamponlar ile gösterge hesaplama döngüsü gerçekleştirilir.
    ... ... ...
  4. Expert Advisor'da indikatör tarafından kaç bar hesaplandığını kontrol ediyoruz (bunun için standart BarsCalculated() fonksiyonu vardır)
  5. Göstergeden veri alma
  6. Alınan şeye bağlı olarak - zaten aracınızın mantığına bağlıdır
    1. Gösterge bir çizgi ise, boş değeri henüz hesaplanmadığını gösterir, bu yüzden onu dikkate almıyoruz.
    2. Gösterge ok ise, o zaman zaten farklı bir mantık vardır (çünkü boş bir değer aynı zamanda çalışma verileridir), örneğin, bir fraktal ise, o zaman 3 numaralı çubuğu kontrol ederiz ve elde edilen değerlerden başlarız.
  7. Pekala, kendi mantığınızı açın ve her şeyi terminalin HATALARINA suçlamayın.
  8. Her şeyden önce, hataları KENDİMDE kontrol ediyorum.
  9. peki sen?
 
Artyom Trishkin :

Yalnızca şunu tavsiye edebilirim: gösterge, hesaplama için gerekli sayıda çubuğu almadıysa OnCalculate()'den çıkmalıdır: if(rates_total<required_number_of_bars) return 0;

Tavsiyen için teşekkürler çıktıyla ilgili herhangi bir sorun yok ama bu durumu çözmüyor şimdiye kadar başarısız bir hesaplama yaptım

 if (barsch!=channel. BarsCalculated ()) return (counted_bars=rates_total- 1 );

Ve bir şekilde arabellekler doldurulur ve diğer göstergelerden veriler alınırken, veriler koşul karşılanana kadar danışmana aktarılmaz. Verilerin doğruluğu henüz kontrol edilmedi, ancak gözle her şey doğru. Yoksa yanılıyor muyum ve bir şeyler kesinlikle yanlış mı?

Artyom Trishkin :

EA, göstergeden alınan verileri kontrol etmeli ve göstergenin boş değerine eşit değilse, ancak o zaman alınan verilerle hesaplamalar yapmalıdır.

EA , yeni bir çubuk geldiğinde bir hesaplama yapar ve buna göre, göstergeden doğru değeri beklemeye çalışırken, test cihazı çalışmayı durdurur.

Artyom Trishkin :
  1. Göstergede, arabellekler önce boş bir değerle başlatılır (nedir - göstergede ayarlayabilirsiniz)
  2. Göstergede (arabellekler zaten boş bir değerle doldurulmuş), mevcut çubukların sayısını kontrol ediyoruz (yukarıda açıklanmıştır)
  3. Çubuk kullanılabilirlik kontrolünden geçilirse, arabellekler gerekli değerlerle doldurularak gösterge hesaplama döngüsü gerçekleştirilir.
    ... ... ...
  4. EA'da, gösterge tarafından kaç çubuk hesaplandığını kontrol ediyoruz (bunun için standart bir BarsCalculated() işlevi vardır)
  5. Göstergeden veri alma
  6. Alınan şeye bağlı olarak - zaten aracınızın mantığına bağlıdır
    1. Gösterge bir çizgi ise, boş değeri henüz hesaplanmadığını gösterir, bu yüzden onu dikkate almıyoruz.
    2. Gösterge ok ise, o zaman zaten farklı bir mantık vardır (çünkü boş bir değer aynı zamanda çalışma verileridir), örneğin, bir fraktal ise, o zaman 3 numaralı çubuğu kontrol eder ve elde edilen değerlerden başlarız.
  7. Pekala, kendi mantığınızı açın ve her şeyi terminalin HATALARINDA suçlamayın.
  8. Her şeyden önce, hataları KENDİMDE kontrol ediyorum.
  9. peki sen?

1. Öyle.

2. Olan bu. Ve bir sonraki tikte hesaplama doğru olacak, ancak ilk tikte doğru hesabı almam gerekiyor, çünkü danışman döngüde diğer tikler için beklemez veya sabrımla orantılı olmayan bir beklenti vardır, yani. gerçekçi değil - bir hata var.

3. Öyle.

4. Elbette.

5. Evet, yapıyoruz, ancak göstergenin diğer göstergelerden veri alması gerekiyor ve sorun da bu!

6. 1-2. gösterge arabelleğine kasıtlı olarak yanlış veri koymak doğru değildir, bu yalnızca koddaki EA algoritmasındaki bir hatanın tespit edilmesini zorlaştıracaktır.

7. Her şeyi mantıklı bir şekilde anlatıyorum, ancak göstergeyi yazmadım, bu yüzden sebebinin ne olduğunu anlamak benim için zor, göstergenin çalışmasının tezahürlerini, yani tampon değerleri almadan hesaplayamamayı makul bir şekilde açıkladım. veri akışının özel kullanımı nedeniyle diğer göstergeler (göstergeler ardışık olarak sayılır).

8. Burada ve daha önce yazar olmadığımı belirtmiştim, nedenleri belirlemek için çok zaman harcadım - neredeyse bir gün.

9. Ve soruna bir çözüm arıyorum, ayrıca bu durumla karşılaşan varsa bana hemen yardımcı olabilir. Tekrar ediyorum, o konuya Uyku yüzünden yazmaya başladım ve sonra testçinin çalışmasının diğer özellikleri ortaya çıktı, ki bunu da bir hata olarak görüyorum.

Cevap için teşekkürler.

 
Aleksey Vyazmikin :

Tavsiyen için teşekkürler çıktıyla ilgili herhangi bir sorun yok ama bu durumu çözmüyor şimdiye kadar başarısız bir hesaplama yaptım

Ve bir şekilde arabellekler doldurulur ve diğer göstergelerden veriler alınırken, veriler koşul karşılanana kadar danışmana aktarılmaz. Verilerin doğruluğu henüz kontrol edilmedi, ancak gözle her şey doğru. Yoksa yanılıyor muyum ve bir şeyler kesinlikle yanlış mı?

EA , yeni bir çubuk geldiğinde bir hesaplama yapar ve buna göre, göstergeden doğru değeri beklemeye çalışırken, test cihazı çalışmayı durdurur.

1. Öyle.

2. Olan bu. Ve bir sonraki tikte hesaplama doğru olacak, ancak ilk tikte doğru hesabı almam gerekiyor, çünkü danışman döngüde diğer tikler için beklemez veya sabrımla orantılı olmayan bir beklenti vardır, yani. gerçekçi değil - bir hata var.

3. Öyle.

4. Elbette.

5. Evet, yapıyoruz, ancak göstergenin diğer göstergelerden veri alması gerekiyor ve sorun da bu!

6. 1-2. gösterge arabelleğine kasıtlı olarak yanlış veri koymak doğru değildir, bu yalnızca koddaki EA algoritmasındaki bir hatanın tespit edilmesini zorlaştıracaktır.

7. Her şeyi mantıklı bir şekilde anlatıyorum, ancak göstergeyi yazmadım, bu yüzden sebebinin ne olduğunu anlamak benim için zor, göstergenin çalışmasının tezahürlerini, yani tampon değerleri almadan hesaplayamamayı makul bir şekilde açıkladım. veri akışının özel kullanımı nedeniyle diğer göstergeler (göstergeler ardışık olarak sayılır).

8. Burada ve daha önce yazar olmadığımı belirtmiştim, nedenleri belirlemek için çok zaman harcadım - neredeyse bir gün.

9. Ve soruna bir çözüm arıyorum, ayrıca bu durumla karşılaşan varsa bana hemen yardımcı olabilir. Tekrar ediyorum, o konuya Uyku yüzünden yazmaya başladım ve sonra testçinin çalışmasının diğer özellikleri ortaya çıktı, ki bunu da bir hata olarak görüyorum.

Cevap için teşekkürler.

OnInit() içinde, sembolün zaman serilerine bir çağrı yapın: iTime(Symbol,Timeframe,1);

OnTick()'te, en başta, en azından aynı if( iTime(Symbol,Timeframe,10)==0) return;

Daha sonra danışman yeni bir çubuk tanımına ulaşmayacak ve bir sonraki onay işaretini bekleyecektir.

OnInit()'te, zaman serisi verilerini istedik, böylece veri sayfalamayı etkinleştirdik.

OnTick()'te, EA için gerekli minimum geçmişin kullanılabilirliğini kontrol ederiz ve henüz mevcut değilse, bir sonraki onay için beklemeye bırakırız.

Ve EA tarafından istenen tüm veriler alınana kadar bir sonraki onay işaretini beklemeye devam edecektir.

Gerekli tüm veriler indirilip alınır alınmaz EA, yeni bir çubuk ve ihtiyaç duyduğu geçmişle çalışmaya başlayacaktır.

Seri verileri güncel tutmak için en az iki dakikada bir erişim sağlamak gerekir. Yaklaşık bir buçuk dakika (90 saniye) için ikinci bir zamanlayıcı yapın ve içindeki istenen sembolün herhangi bir zaman serisine bakın, örneğin iTime(Symbol,Timeframe,1); Alınan verileri kontrol etmeden - sadece hikayeyi "taşıyın". Ardından sembol üzerindeki tüm veriler her zaman güncel olacaktır.

Neden: