Hatalar, hatalar, sorular - sayfa 570

 

Program Özellikleri (#property) bölümüne bakın:

tester_indicator

string

Имя пользовательского индикатора в формате " имя_индикатора.ex5". Необходимые для тестирования индикаторы определяются автоматически из вызова функций iCustom() , если соответствующий параметр задан константной строкой. Для остальных случаев (использование функции IndicatorCreate() или использование неконстантной строки в параметре, задающем имя индикатора) необходимо данное свойство

tester_file

string

Имя файла для тестера с указанием расширения, заключенное в двойные кавычки (как константная строка). Указанный файл будет передан тестеру в работу. Входные файлы для тестирования, если необходимы, должны указываться всегда

tester_library

string

Имя библиотеки с расширением, заключенное в двойные кавычки. Библиотека может быть как с расширением dll, так и с расширением ex5. Необходимые для тестирования библиотеки определяются автоматически. Однако, если какая-либо библиотека используется пользовательским индикатором, то необходимо использовать данное свойство

 
Rosh :

Program Özellikleri (#property) bölümüne bakın:


Teşekkür ederim.
 

XAUUSD demo hesabındaki tik grafiğinde (piyasa incelemesinde), sürekli bir sıfırlama var.

Ve ayrıca:

"Detayları" açın ve boş bir alana tıklayın

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация о счете - Документация по MQL5
 
gumgum :

XAUUSD demo hesabındaki tik grafiğinde (piyasa incelemesinde), sürekli bir sıfırlama var.

Ve ayrıca:

"Detayları" açın ve boş bir alana tıklayın

Kalıcı sıfırlamanın ne anlama geldiği tam olarak açık değildir.

Hangi işletim sistemi, hangi işletim sistemi ve terminal bitliği?

 
Rosh :

Öğretin, çünkü belgeler diyor ki - Teknik göstergeler :

Bu, gösterge ilk başlatıldığında ( ilk kez yeni bir zaman dilimine geçilirken) gösterge değerlerinin henüz hesaplanmadığı anlamına gelir, bu nedenle prev_hesaplanmış =0. Bu zaman dilimine geri dönerken , gösterge yeniden oluşturulmaz, çünkü tutamacı hala hayattadır, sonuç olarak, mevcut tutamaç temelinde grafikte zaten var olan bir gösterge hesaplanır. Bu nedenle, prev_hesaplanmış!=0

Sözümü tutmaya hazırdım ama fikrimi değiştirdim. Dışarıdan aldığım sonuçlar neredeyse her şeyin her zaman çok düzgün olmadığını söylüyor, bazı istisnalar var ... ama şimdilik anlamıyorum, bu istisnalar tutamaklarla mı ilgili yoksa başka bir tıkaç mı?

" Not: OnCalculate işlevi sıfır değeri döndürürse, gösterge değerleri istemci terminalinin DataWindow'unda gösterilmez. kafamda belgeler ve etkisini kendim yorumlarım. Göstergenin değeri sadece çizilmez - tüm göstergenin çalışması durur, komut kuyruğu donar ve sonraki komutların işlenmesini beklemek imkansızdır. Burada aslında daha önceki bazı yazılarda kısaca anlatmayı başardım.

Daha önce de belirtildiği gibi, kodda bir tanıtıcı içermeyen birçok Copy ... komutu vardır (yani, CopyBuffer dışında her şey). İf 'kontrolünü geçerler ve kopyalama sonucu <= 0 ise aynı dönüşü (0) gerçekleştirirler, bundan sonra " gösterge değerleri gösterilmez " ve genel olarak göstergede tam bir felç olur.

Terminalin yapışmaz modunda (yani, hafta sonları veya çevrimdışı) eşlik eden genel felçle birlikte birincil oluşturmamanın gözlemlendiğini hatırlatmak için çok tembel değilim. Bunu önemsiz bir an olarak düşünmeyin, çünkü hiç kimse hafta sonları göstergelerinde hata ayıklamak, gereksiz hareketler yapmak, zaman dilimlerinden geçmek ve yapay olarak - manuel olarak - ilk çizimi başlatmak istemez. Ve bu sadece hata ayıklama ile ilgili değil ...

Dürüst olmak gerekirse, kibarca sağlanan bağlantıları, mevcut sorunla zaten var olan bir tanıtıcıdaki (ve ayrıca verilen diğer yanıtlarla) referans sayısını artırmaktan bahseden belgelerdeki örneklere bağlayacak kadar akıllı değildim. Bence, bacakları oradan hiç büyümüyor.

Ekli kodu aşağıdaki koşullarda oynatmayı deneyin: kodda önceden tanımlanmış zaman dilimi D1 , terminaldeki mevcut zaman dilimi D1 , terminal çevrimdışı. Göstergeyi belirtilen geçerli zaman çerçevesine sahip bir grafik üzerine bıraktığınızda, günlük kaydı sonucu anında Uzmanlar sekmesinde görünecektir.

Şimdi terminali tamamen boşaltın, yeniden başlatın, D1 dışında bir zaman dilimine geçin. Bir gösterge atın - dışa doğru, siz başka bir zaman dilimine (mutlaka D1 ) geçiş yapana kadar hiçbir değişiklik olmaz.

Bu hoş olmayan özellik nedeniyle, bitmemiş bir gösterge ile birlikte iyi bir fikir kaybolur.

Geliştiriciler, eminim, göstergede bu davranış için açıklamalar bulacaklardır, ancak tutamaçta önceden tanımlanmış TF verilerinin her bakımdan kusursuz bir şekilde çizilmesi, kullanıcı şu anda o TF'deyken ve açıksa, bu haksızlıktır. bir diğeri, daha sonra gereksiz hareketler yapmak zorunda kalıyor. Dış göstergelerin tutamaçlarını kullanırken zaman dilimlerinde eşitlikten yanayım, TF'lerin geri kalanı hiçbir şeyden suçlu değildi.

Not: yani... Dur. Şimdi tekrar kontrol ettim - görünüşe göre CopyHigh bu felci burada etkilemiyor. Şimdi hiçbir şey anlamıyorum. Tüm şüpheler keskin bir şekilde sapa düştü, OnInit'te ...

PPS: ikinci bir kod örneği eklendi - yanıt vermiyor bile.

Dosyalar:
paralich.mq5  3 kb
paralich2.mq5  2 kb
 

Problemin sınırını buldum.

Yorumla:

   SetIndexBuffer ( 0 ,FractalUpBuffer, INDICATOR_DATA );
   PlotIndexSetInteger ( 0 , PLOT_ARROW , 217 );
   PlotIndexSetInteger ( 0 , PLOT_ARROW_SHIFT ,ArrowShift);

- ve sorun ortadan kalkacak, ancak o zaman SetIndexBuffer aracılığıyla arabellek bağlamanın epizodik yanlışlığının açık bir göstergesi olacaktır. Ve bu zaten SetIndexBuffer kullanımını bırakma ve kontrollü arabellek boyutunun manuel olarak değiştirilmesine başvurma gereğini gösteriyor.

Ek olarak, ekli örnek, BarsCalculated'ın ( tutamaç ) , önceden tanımlanmış olanla eşleşmediği sürece, çağrılan göstergenin değerlerini herhangi bir mevcut TF'de zamanında hesaplayamadığını veya bunlar için herhangi bir şey hesaplama konusundaki temel isteksizliği açıkça göstermektedir. ilk kez (büyük olasılıkla bu seçenek). Bu durumda, değer <=0, dönüş (0) ve sonuç olarak bir durdurucu olacaktır.

Dosyalar:
 
alexvd :

Kalıcı sıfırlamanın ne anlama geldiği tam olarak açık değildir.

Hangi işletim sistemi, hangi işletim sistemi ve terminal bitliği?

W7 ve MT5 64 bit.

misal:

XAUUSD sürekli olarak başa sıfırlanır.(Karşılaştırma için XAGUSD verilmiştir)

 
x100intraday :

Problemin sınırını buldum.

Yorumla:

- ve sorun ortadan kalkacak, ancak o zaman SetIndexBuffer aracılığıyla arabellek bağlamanın epizodik yanlışlığının açık bir göstergesi olacaktır. Ve bu zaten SetIndexBuffer kullanımını bırakma ve kontrollü arabellek boyutunun manuel olarak değiştirilmesine başvurma gereğini gösteriyor.

Ek olarak, ekli örnek , BarsCalculated'ın ( tutamaç ) çağrılan göstergenin değerlerini önceden tanımlanmış olanla eşleşmediği sürece herhangi bir mevcut TF'de zamanında hesaplayamadığını açıkça göstermektedir. Bu durumda, değer <=0, dönüş (0) ve sonuç olarak bir durdurucu olacaktır.

İlk örneğe göre (ikincisine bakmadım), paralich göstergesinin bir işlevi var.

 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers( double &up_arrows[], datetime &up_times[], int ind_handle, int amount)
  {
   if ( CopyBuffer (ind_handle, 0 , 0 ,amount,up_arrows)< 0 ) return ( false );
   else CopyTime ( _Symbol , PERIOD_D1 , 0 ,amount,up_times);

   return ( true );
  }

Göstergenizin D1'de olduğunu ve H1 zaman diliminden gösterge arabelleğine veri kopyalamaya çalıştığınızı hayal edin. Eleman sayısı eşleşmiyor. Bence sorununuz tam olarak burada yatıyor - verileri kopyalamadan önce kontrol yok.

Diğer zaman dilimlerinden veri alan gösterge örnekleri, her teknik göstergenin yardımında bulunabilir. Örneğin, https://www.mql5.com/ru/docs/indicators/iama :

 //--- узнаем количество рассчитанных значений в индикаторе
   int calculated= BarsCalculated (handle);
   if (calculated<= 0 )
     {
       PrintFormat ( "BarsCalculated() вернул %d, код ошибки %d" ,calculated, GetLastError ());
       return ( 0 );
     }
//--- если это первый запуск вычислений нашего индикатора или изменилось количество значений в индикаторе iAMA
//--- или если необходимо рассчитать индикатор для двух или более баров (значит что-то изменилось в истории)
   if (prev_calculated== 0 || calculated!=bars_calculated || rates_total>prev_calculated+ 1 )
     {
       //--- если массив iAMABuffer больше, чем значений в индикаторе iAMA на паре symbol/period, то копируем не все 
       //--- в противном случае копировать будем меньше, чем размер индикаторных буферов
       if (calculated>rates_total) values_to_copy=rates_total;
       else                        values_to_copy=calculated;
     }
   else
     {
       //--- значит наш индикатор рассчитывается не в первый раз и с момента последнего вызова OnCalculate())
       //--- для расчета добавилось не более одного бара
      values_to_copy=(rates_total-prev_calculated)+ 1 ;
     }
Документация по MQL5: Технические индикаторы / iAMA
Документация по MQL5: Технические индикаторы / iAMA
  • www.mql5.com
Технические индикаторы / iAMA - Документация по MQL5
 
x100intraday :

Ekli kodu aşağıdaki koşullarda oynatmayı deneyin: kodda önceden tanımlanmış zaman dilimi D1 , terminaldeki mevcut zaman dilimi D1 , terminal çevrimdışı. Göstergeyi belirtilen geçerli zaman çerçevesine sahip bir grafik üzerine bıraktığınızda , günlük kaydı sonucu anında Uzmanlar sekmesinde görünecektir.

Ve genel olarak, tonlarca mesaj almamak için günlüğe kaydetme yerine hata ayıklamayı kullanmayı denediniz mi? MetaEditor YardımProgram GeliştirmeHata Ayıklama
 
Rosh :

Bu nedenle, göstergenizin D1'de olduğunu ve H1 zaman dilimindeki verileri gösterge arabelleğine kopyalamaya çalıştığınızı hayal edin. Eleman sayısı eşleşmiyor. Bence probleminiz tam olarak burada yatıyor - verileri kopyalamadan önce kontrol yok.

Her şeyden önce, açıklığa kavuşturacağım: Kopyala...- işlevlerini kullanarak değerleri kopyalarken dizi taşması durumları, istemci terminalinin Uzman Danışmanlarında " Dizi aralık dışında " bir taşma hata mesajına neden olmaz mı? Başarılı bir derlemeden sonra, zaten göstergenin çalışması sırasında böyle bir mesajın bazen üretildiğini hatırlıyorum, ancak tam olarak ne olduğunu söyleyemem. Bence bu, Kopyalama...- işlevleri için değil, var olmayan bir dizine veya başka bir şeye erişmek için ...

İkincisi, sizi temin ederim ki, doğrulama eksikliği hakkındaki hipoteziniz tamamen doğru değil. Yalnızca yanlış oluşturulmuş bir if-else filtresinden bahsedebiliriz, tamamen yokluğundan değil. Zaten üzerinde, bir düzineden fazla kez tökezledim. Geçenlerde ya burada ya da "Aptallar" da, mevcut olandan farklı zaman dilimleri için Rate_total analogu hakkında bir soru sordum, ancak kimseden bir cevap alamadım. Gerçek şu ki, oranları_toplam mevcut zaman çerçevesinin parametrelerinden biridir, ancak benim için tamamen işe yaramaz, çünkü birçok başka zaman çerçevesiyle çalışıyorum ve bir şekilde bazen kendimi önceden tanımlanmış olanlardan birinde bulursam, hala kullanıyorum hesaplamalar için oranları_toplam yerine TF-evrensel hesaplandı = BarsCalculated ( tutamaç ). Belki büyük bir hata yapıyorum, ancak bu görev için oranların toplam kullanımını görmüyorum .

Üçüncüsü, uzun zamandır kıdemli bir zaman diliminde olduğumdan, genç zaman dilimlerinin değerlerini başarılı bir şekilde kopyalayıp yeniden dağıtabildiğimden emin oldum ve bunun tersi de oldu . Birkaç gün önce verdiğim örnekler çok az ama ayrıntılı, hepsi orada. İki farklı TF'den gelen eleman sayısı arasındaki tutarsızlık iki tip olabilir: eksiklik ve fazlalık. İlk seçenek korkunç değil, ancak ikincisinde taşma olup olmadığını kontrol edeceğim ve bir şeyler ters giderse onu sınırlamaya çalışacağım. Mantıksal olarak, yalnızca taşma durumunda Kopyalama işlevinin eksik kontrolü nedeniyle gösterge bir uyuşukluk haline gelir, ancak başka bir TF'den kopyalanan çubukların üzerindeki çubuk sayısından az olması durumunda da bir uyuşukluk haline gelir. şimdiki.

Dördüncüsü, gösterge bir hafta boyunca hazırlandı ve doğrulandı, herhangi bir bariz hata vermiyor (derleme sırasında veya çalışma sırasında), yalnızca biri belirli TF'lerde ilk çizim yapılmayan örtük sorunlar var, M1'e tekrar geçiş yaparken hesaplanan sürede keskin bir artışın yanı sıra (ilk kez, her şey 2-3 saniye içinde hesaplanır). Gösterge hesaplamalarda tıkanmış gibi görünüyor (çığ benzeri bir bellek sızıntısı?) CopyBuffer kullanarak kopyalanan öğelerin sayısına bir sınır koydum - tüm geçmiş yerine 200'e kadar, ancak bu durumu değiştirmedi. M1'de çevrimdışı ve diğer her yerde hesaplamanın her zaman hızlı olduğu fark edildi, ilk kez olduğu gibi, çevrimiçi durumda durum çarpıcı biçimde değişiyor (görünüşe göre sorun, her tikte bir şey geçen çok koşullu filtrede, ancak bu olamaz olmalıdır, çünkü yeniden çizim sıklığı yeni - sıfır - çubuğun çizimine bağlı olduğundan ve tutamaçlardan birinde önceden belirlenmiş en düşük TF'den daha sık olamaz). Küçük ama hoş olmayan sorunlardan: fare tekerleği ile grafiği kaydırmaya yönelik en ufak bir girişim, tüm fraktalları kaydileştirir ve yeniden hesaplanıp tekrar çizilene kadar beklemeniz gerekir (yeni çubuklar olmamasına rağmen, yeniden hesaplanacak bir şey yok gibi görünüyor).