MT4 iMAOnArray ve iBandsOnArray eleman sayısının hesaplamalar üzerindeki etkisi - sayfa 6

 

Sana bilerek bir hesap makinesi veya Excell teklif ettim. Bu çöpün nasıl çalıştığını anlamaya yardımcı olur. Sadece hazır bir diziniz varsa, sıfır dışındaki eleman sayısını hesaplamak için kullanmak mümkündür. Diyelim ki 1000 elemanlık bir dizi var ama sadece son 100 elemanın ortalamasını hesaplamanız gerekiyor. Ve burada iki seçenek var, bu 100 elemanı özel bir diziye kopyalayın ve ondan sayın veya 100'den 0'a bir döngü kullanarak, bu hazır diziyi kullanın ve eleman sayısını 0 değil, 100 olarak ayarlayın.

Ama burada göstergelerde kaçınılmaz olan dizi boyutunu değiştirmekle ilgili bir sorun var...

Ve yine, hesaplama için eleman sayısını sınırlamanın başka yollarından bahsettim. Pekala, koşulu iMAOnArray()'i sayacak şekilde ayarlayın, yalnızca if(rates_total-i >= Rates_total-100); ve yalnızca son 100 çubuk yeniden hesaplanacak ve yeni bir çubuk geldiğinde her şey yoluna girecek.

 int i, limit;
   limit = prev_calculated == 0 ? rates_total-1 : rates_total-prev_calculated;

   for (i = limit; i >= 0 ; i--)
     {
      Buffer[i]=open[i];
       if (rates_total-i >= rates_total- 100 )
      BufferMA[i] = NormalizeDouble ( iMAOnArray (Buffer, 0 , 5 , 0 , MODE_LWMA , i), _Digits );
      
     }

return (rates_total);


 
Alexey Viktorov :

Sana bilerek bir hesap makinesi veya Excell teklif ettim. Bu çöpün nasıl çalıştığını anlamaya yardımcı olur. Sadece hazır bir diziniz varsa, sıfır dışındaki eleman sayısını hesaplamak için kullanmak mümkündür. Diyelim ki 1000 elemanlık bir dizi var ama sadece son 100 elemanın ortalamasını hesaplamanız gerekiyor. Ve burada iki seçenek var, bu 100 elemanı özel bir diziye kopyalayın ve ondan sayın veya 100'den 0'a bir döngü kullanarak, bu hazır diziyi kullanın ve eleman sayısını 0 değil, 100 olarak ayarlayın.

Ama burada göstergelerde kaçınılmaz olan dizi boyutunu değiştirmekle ilgili bir sorun var...

Ve yine, hesaplama için eleman sayısını sınırlamanın başka yollarından bahsettim. Pekala, koşulu iMAOnArray()'i sayacak şekilde ayarlayın, yalnızca if(rates_total-prev_calculated-i >= 100); ve yalnızca son 100 çubuk yeniden hesaplanacak ve yeni bir çubuk geldiğinde her şey yoluna girecek.


Söylesene, programcı mısın yoksa hobi olarak mı yoksa zorunluluktan mı yapıyorsun? Nasıl çalıştığını anlamak için excel'e veya bir kağıt parçasına ihtiyacım yok ve Barabashka daha önce ekranda tüm "zorlukları" gösterdi. Sırayla gidelim.

1. iMAOnArray (iBandsOnArray gibi) iki şekilde çalışabilir, tüm diziyi okuyabilir ve doğru bir şekilde yapabilir (ancak ilk hesaplama sırasında frenleri vardır) veya dizinin bir kısmını okuyabilir, ancak bunu yalnızca ilk öğeler için yapabilir, buna rağmen ofset final için ayarlanmıştır. Yani, hesaplamayı çubuklarla nasıl sınırlamaya çalışsam da, yine de tüm diziyi (yani, "frenlemenin" orijinal sürümünü) hesaplamam veya arabelleği kopyalayarak sizinkine benzer bir seçenek bulmam gerekiyor. ve daha önce mesajlarımda açıklandığı gibi, karmaşık yumuşatma yöntemleri için doğru sonucu vermeyen ve ayrıca genel olarak veri işleme süresini artıran bu arabelleğin tüm öğelerini yeniden hesaplamak.

2. İndikatörlerde dizi boyutunu değiştirme ile ilgili anlattığınız sorun sadece dizi gösterge tamponlarından biri değilse yani tarif ettiğiniz "tefle dans etmek" de sonuç olarak olumsuz etki yapar çünkü birincil kaynak koduna dönersek, sorun yalnızca yavaş hesaplamada ve yalnızca ilk aşamadaydı.

3. 100 (N) çubuklu dizilerin sadece bir kısmının yeniden hesaplanması ile önerdiğiniz seçenek, yine genel performansta bir kayıp ve dizileri kopyalama veya gereksiz yeniden hesaplama ile gereksiz uygulama sorunlarına neden oluyor. Ek olarak, ekranınızda ve yukarıdaki kodda, tüm hesaplamalar yapıldı (iç dizide bir yerde olduğundan şüpheleniyorum, büyük olasılıkla bundan dolayı, birincil frenler meydana geliyor), aksi takdirde, bu tür bir yumuşatma ile ilk doldurulan sonuçlar olacaktır. farklıydı ve arabellek dizisini bunlarla doldurmazdınız. İşlevi hesaplamak için dizi boyutu parametresindeki 0, açıkça tüm verileri okumasını söylediğinden, yakalama budur.

Sadece bir sonuç görüyorum - tam olarak gerektiği gibi çalışacak ve yeni bir çubuğun gelmesiyle tüm verileri (N-inci kısımları) yeniden hesaplamama, ancak özellikle saymama izin verecek olan kendi işlevimi kullanmak için çünkü böyle bir ortalama alma fonksiyonum var ve birçok ürünümde kullandım. Bu forum konusunun sorusu, işlem hızını ve sonucu kötüleştirmeden MT4'ün normal işlevlerini "yenmenin" nasıl mümkün olduğuydu. Bollinger Bantları için benzer bir fonksiyon yazmak ikinci problemin çözümü olacaktır, çünkü ortadaki çizgi aslında hareketli bir çizgi ve bunun için zaten bir fonksiyon var, peki, yukarıdaki mesaja inanıyorsanız, o zaman dizi için " standart sapma " frenler olmadan hesaplanır veya bir geri dönüş seçeneği olarak kendinizinkini yazın sapmanın hesaplanması, özellikle hesaplama formülleri burada belgelerde herkesin kullanımına açık olduğundan.

 

O kadar çok mektup... Ve her şey yalnızca önerilen seçeneğe katılmamayı amaçlıyor.

Fikir için teşekkürler, en azından nasıl çalıştığını anladım, ancak gereksiz olduğu için bu işlevlerin inceliklerini araştırmadım.

Kendi yazdığınızı kullanmayı sevmeyin.

 
Alexey Viktorov :

O kadar çok mektup... Ve her şey yalnızca önerilen seçeneğe katılmamayı amaçlıyor.

Fikir için teşekkürler, en azından nasıl çalıştığını anladım, ancak gereksiz olduğu için bu işlevlerin inceliklerini araştırmadım.

Kendi yazdığınızı kullanmayı sevmeyin.

Peki, neden katılmıyorsunuz, bunu neden yapmamanız gerektiğini açıklamak için, çünkü. yavaş işlevlere bağlı kod veya ek kopyalama döngüleri oluşturan kod yazmak her zaman doğru seçenek değildir, ancak bazen daha az zaman alır :)
Ve buradaki mesele "beğenmek" / "beğenmemek" değil, işlevlerin gerektiği gibi çalışmamasıdır, çünkü aslında analogların yaratılması bir bisikletin icadı gibidir, ancak bu özel durumda bu imkansızdır. onsuz yapmak.

Kendi adıma bir kaç sayfa önce bir sonuca varmıştım ama senin yolun bu durumun burada zaten ele alındığını ve bu sorunu çözmek için ne yapılması gerektiğini anlamasına yardımcı olabilir, bu yüzden bu kadar çok mektup var :)

 

İkinci versiyonda, kopyalama veya ek döngü yoktur. Ve sizin ve Dmitry'nin daha önce konuştuğunuz doğru yeniden hesaplamanın imkansızlığı hakkında MODE_LWMA hesaplama yöntemi.

Koda ve ekran görüntüsüne bakın. MA ekranında, periyot 5, kodda olduğu gibi, MODE_LWMA yöntemini kullanın ve hesaplanan çubukların sayısına, MA göstergesinin değerlerinin çakışmasına ve iMAOnArray() işleviyle göstergeye dikkat edin. altbilgide. Tüm çubukları yeniden hesaplamak veya yalnızca 100 parçayı yeniden hesaplamak için zaman maliyetleri önemli ölçüde farklılık gösterir. Herhangi bir değişiklik yoksa, diğer hesaplamalarda frenler.

 
Tam paragraf!
 
Sergey Efimenko :

Söylesene, programcı mısın yoksa hobi olarak mı yapıyorsun, iyi mi yoksa zorunluluktan mı?...

Daha önce, kendisi bir programcı değil, amatör olduğunu ve bu nedenle sürülebileceğini söylemeye başladı.
 
Alexey Viktorov :

İkinci versiyonda, kopyalama veya ek döngü yoktur. Ve sizin ve Dmitry'nin daha önce bahsettiğiniz doğru yeniden hesaplamanın imkansızlığıyla ilgili MODE_LWMA hesaplama yöntemi.

Koda ve ekran görüntüsüne bakın. MA ekranında, periyot 5, kodda olduğu gibi, MODE_LWMA yöntemini kullanın ve hesaplanan çubukların sayısına, MA göstergesinin değerlerinin çakışmasına ve iMAOnArray() işleviyle göstergeye dikkat edin. altbilgide. Tüm çubukları yeniden hesaplamak veya yalnızca 100 parçayı yeniden hesaplamak için zaman maliyetleri önemli ölçüde farklılık gösterir. Herhangi bir değişiklik yoksa, diğer hesaplamalarda frenler.

Son sürüm aslında orijinalinden farklı değil. Daha önce de yazdığım gibi, 0 dizi boyutuyla, yine de bir bütün olarak kabul edilir. Tüm değerlerin hesaplanmasının gerekli olmadığı bir Uzman Danışmanda genellikle optimizasyon için yapıldığı gibi, forumda bir konu oluşturmadan önce bile hesaplama süresini kısaltmaya yönelik ilk kararım, sayıyı sınırlamak için böyle bir seçenekti. barlar, ama ne yazık ki, bu hiçbir şekilde etkilemedi, sonra iMAOnArray için dizinin uzunluğunu denemeye başladım ve sonra durumun karmaşıklığını fark ettim. O zaman ve ancak o zaman, farklı kombinasyonlar için dizilerin indekslenmesini değiştirmek de dahil olmak üzere neredeyse tüm basit seçenekleri denedikten sonra bu konuyu oluşturdum. Sonra cevaplar geldi, bazıları diğerlerinin de girişimleri olduğunu doğruladı ve herkes kendi işlevini yaratmaya geldi. O yüzden ilk başta ne olacağını bilerek sizden kodu istedim :) Kusura bakmayın :) Belki bu konuyu okuduktan sonra kullanıcılardan biri bu "tırmık"ı aşacaktır. :)
 
Dmitry Fedoseev :
Daha önce, kendisi bir programcı değil, amatör olduğunu ve bu nedenle sürülebileceğini söylemeye başladı.

Daha çok retorik bir soruydu :)

PS Beyler, birbirimize karşı daha hoşgörülü olalım. Sonuçta, hepimiz burada tek bir amaç için toplandık - pazarı "ayakkabılamak". :) O halde dikkatimiz dağılmadan bu hedefe gidelim. Her birimizin kendi zorlukları ve algılama özellikleri vardır, ancak gerçekler yalnızca anlaşmazlıklarda doğar, ancak Napolyon'un dediği gibi: “Yanlış olduğunu bilerek tartışmak aptalca, haklı olduğunu bilerek tartışmak, aşağılık. Bu nedenle, asla tartışmıyorum."

 
Sergey Efimenko :
Son sürüm aslında orijinalinden farklı değil. Daha önce de belirtildiği gibi, dizi boyutu 0 ile hala bir bütün olarak kabul edilir. Tüm değerlerin hesaplanmasının gerekli olmadığı bir Uzman Danışmanda genellikle optimizasyon için yapıldığı gibi, forumda bir konu oluşturmadan önce bile hesaplama süresini kısaltmaya yönelik ilk kararım, sayıyı sınırlamak için böyle bir seçenekti. barlar, ama ne yazık ki, bu hiçbir şekilde etkilemedi, sonra iMAOnArray için dizinin uzunluğunu denemeye başladım ve sonra durumun karmaşıklığını fark ettim. O zaman ve ancak o zaman, farklı kombinasyonlar için dizilerin indekslenmesini değiştirmek de dahil olmak üzere neredeyse tüm basit seçenekleri denedikten sonra bu konuyu oluşturdum. Sonra cevaplar geldi, bazıları diğerlerinin de girişimleri olduğunu doğruladı ve herkes kendi işlevini yaratmaya geldi. O yüzden ilk başta ne olacağını bilerek sizden kodu istedim :) Kusura bakmayın :) Belki bu konuyu okuduktan sonra kullanıcılardan biri bu "tırmık"ı aşacaktır. :)

if(rates_total-i >= Rates_total-100); işleminden sonra, hesaplamak için yalnızca 100 çubuk kaldığında, iMAOnArray() işlevinin önce ENTIRE dizisini yeniden hesapladığını mı kastediyorsunuz?