Bir grafik üzerinde çalışan bir fonksiyon uyguluyorsunuz. Bir gösterge için, grafik oluşturma garantisi, bir Uzman Danışman için OnCalculate'e ilk giriştir - OnTick()'e ilk giriş. Ama daha önce değil.
Sorun yok. Henüz bir çizelge yoksa, işlevin yanlış ve ilgili hata kodunu döndürmesine izin verin. Ancak durum böyle değil, fonksiyon başarıyla tamamlandığını gururla bildirir. Belgelerin, bunun çizelgeye başarılı bir mesaj göndermenin bir işareti olduğunu söylemediğine dikkatinizi çekiyorum. Açıkça diyor ki: işlevin başarılı bir şekilde yürütülmesi.
Ayrıca, bu çoğaltma kodudur. Aslında, ChartNavigate çağırmadan önce bile zaman serilerine erişiyorum. Ve ortaya çıktığı gibi, hepsi doğru bir şekilde dolduruldu. Yani, grafik zaten orada, verileri var. Ayrıca terminali kapatmadan önce üzerine yerleştirilen grafik nesnelerini tablodan okuyabilirsiniz.
Bu nedenle, tüm göstergelere göre, program zaten mevcuttur.
Bazı tuhaflıklar. Benim için sorunsuz çalışıyor.
Ve bir not daha: Grafiği kaydırmadan önce, CHART_AUTOSCROLL otomatik kaydırmasını devre dışı bırakmalısınız.
Sorun yok. Henüz bir çizelge yoksa, işlevin yanlış ve ilgili hata kodunu döndürmesine izin verin. Ancak durum böyle değil, fonksiyon başarıyla tamamlandığını gururla bildirir. Belgelerin, bunun çizelgeye başarılı bir mesaj göndermenin bir işareti olduğunu söylemediğine dikkatinizi çekiyorum. Açıkça diyor ki: işlevin başarılı bir şekilde yürütülmesi.
Ayrıca, bu çoğaltma kodudur. Aslında, ChartNavigate çağırmadan önce bile zaman serilerine erişiyorum. Ve ortaya çıktığı gibi, hepsi doğru bir şekilde dolduruldu. Yani, grafik zaten orada, verileri var. Ayrıca terminali kapatmadan önce üzerine yerleştirilen grafik nesnelerini tablodan okuyabilirsiniz.
Bu nedenle, tüm göstergelere göre, program zaten mevcuttur.
Grafik ve veri çok farklı iki şeydir.
Grafiklere erişmek için tüm işlevler eşzamansızdır: yani, tek yönlü bir yol başlatılır ve unutulur. Ve bu durumda, true, yalnızca bu işlevin alanlarını doğru bir şekilde doldurduğunuz her şey anlamına gelir, başka bir şey değil.
Tüm veriler hazır olduğunda ve çizelgeler oluşturulduğunda işaret, Oncalculate/OnTick'e ilk giriştir.
Grafik ve veri çok farklı iki şeydir.
Grafiklere erişmek için tüm işlevler eşzamansızdır: yani, tek yönlü bir yol başlatılır ve unutulur. Ve bu durumda, true, yalnızca bu işlevin alanlarını doğru bir şekilde doldurduğunuz her şey anlamına gelir, başka bir şey değil.
Tüm veriler hazır olduğunda ve çizelgeler oluşturulduğunda işaret, Oncalculate/OnTick'e ilk giriştir.
O zaman benim için kusursuz çalıştığı gerçeğini nasıl açıklarsınız ??? OnInit()'te tam olarak konunun ilk mesajındaki gibi... Neden saçma sapan yazalım?
Bazı tuhaflıklar. Benim için sorunsuz çalışıyor.
Nasıl bir yapıya sahipsin? 1861'im var.
Ve bir not daha: Grafiği kaydırmadan önce, CHART_AUTOSCROLL otomatik kaydırmasını devre dışı bırakmalısınız.
Evet, bunu üremenin ilk adımında belirtmiştim.
Nasıl bir yapıya sahipsin? 1861'im var.
Evet, bunu üremenin ilk adımında belirtmiştim.
Bende de 1861 var. Sadece bir kez çoğaldığı ortaya çıktı. Diğer tüm girişimler iyi çalıştı.
Grafik ve veri çok farklı iki şeydir.
Grafiklere erişmek için tüm işlevler eşzamansızdır: yani, tek yönlü bir yol başlatılır ve unutulur.
Hayır hepsi değil. Bu şekilde düzenlenenler özel olarak yorumlanır. Örneğin, aynı ChartApplyTemplate.
Ve bu durumda, true yalnızca bu işlevin alanlarını doğru bir şekilde doldurduğunuz anlamına gelir, başka bir şey değil.
Grafiğin kendisi henüz mevcut değilse, işlev grafik kimliğinin doğru olduğunu nasıl belirler?
Tüm veriler hazır olduğunda ve çizelgeler oluşturulduğunda işaret, Oncalculate/OnTick'e ilk giriştir.
Ne yazık ki hayır. İşte kod:
#property indicator_chart_window int OnInit () { Print ( __FUNCTION__ , ", баров: " , Bars ( Symbol (), PERIOD_CURRENT )); return ( INIT_SUCCEEDED ); } void OnDeinit ( const int reason) { } int OnCalculate ( const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { Print ( __FUNCTION__ , ", баров: " , Bars ( Symbol (), PERIOD_CURRENT )); return (rates_total); }
Şu şekilde çalışır:
16 : 01 : 31.765 Test (XBNUSD,M1) OnInit , баров: 0 16 : 01 : 33.531 Test (XBNUSD,M1) OnCalculate , баров: 37026 16 : 01 : 34.010 Test (XBNUSD,M1) OnCalculate , баров: 46484
Göstergeyi, grafiğini henüz açmadığım, yani henüz veri oluşturulmamış yeni bir sembolde başlattım.
İlk satırda (OnInit) gerçekten veri yok. Ancak, bir grafik kimliği vardır ve OnInit()'te daha sonra grafikte başarıyla görüntülenecek nesneler oluşturabilirsiniz.
İkinci satır zaten veri içeriyor, ancak eksik. Veri bütünlüğü üçüncü yinelemede elde edildi.
OnCalculate'e yapılan ilk çağrının veri yükleme garantisi olmadığı sonucuna varmak mantıklıdır. Bu, grafiği açtıktan sonraki ilk sembol işaretidir ve bazı verilerden sonra veya başka veriler olmadan gelebilir.
Konuda gündeme getirilen soruna dönersek , ChartNavigate() fonksiyonunun parametrelerin geçerliliğini kontrol etmediğini görüyoruz. Sonuçta, OnInit()'te henüz veri yoksa (0 çubuk) ve işleve -1000 değeri geçirilirse, çubuk yoksa böyle bir değer nasıl doğru kabul edilebilir? Sonuçta, var olmayan bir dizine sahip bir çubuğa erişirken başka herhangi bir işlev bir hata döndürür. Ve burada - başarıyla. Başarılı olan tam olarak nedir?
İşte böyle bir gösterge - Özellikle dokuz kene gecikmesi, iki tür grafik hareketi ve zorunlu yeniden çizme bayrağı (açık / kapalı) ayarladım
//+------------------------------------------------------------------+ //| ProjectName | //| Copyright 2012, CompanyName | //| http://www.companyname.net | //+------------------------------------------------------------------+ #property indicator_chart_window #property indicator_plots 0 //--- input parameters input bool redraw= true ; input ENUM_CHART_POSITION position= CHART_BEGIN ; //--- long count= 0 ; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit () { count= 0 ; //--- return ( INIT_SUCCEEDED ); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnDeinit ( const int reason) { Comment ( "" ); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnCalculate ( const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { count++; Comment (count); if (count== 9 ) { ResetLastError (); if (position== CHART_BEGIN ) { if ( ChartNavigate ( 0 , CHART_BEGIN , 100 )) Print ( "Успешно. redraw " ,redraw, ". position " , EnumToString (position)); else Print ( "Ошибка №" , GetLastError (), ". redraw " ,redraw, ". position " , EnumToString (position)); } if (position== CHART_END ) { if ( ChartNavigate ( 0 , CHART_END ,- 100 )) Print ( "Успешно. redraw " ,redraw, ". position " , EnumToString (position)); else Print ( "Ошибка №" , GetLastError (), ". redraw " ,redraw, ". position " , EnumToString (position)); } if (redraw) ChartRedraw (); } return (rates_total); } //+------------------------------------------------------------------+
Ön: CHART_BEGIN kararlı.
İşte böyle bir gösterge - Özellikle dokuz kene gecikmesi, iki tür grafik hareketi ve zorunlu yeniden çizme bayrağı (açık / kapalı) ayarladım
Ön: CHART_BEGIN kararlı.
Ve kene yoksa, hafta sonu? Ardından zamanlayıcının bağlanması gerekecektir.
Ve sonuçta, tek bir soruyu çözmeniz gerekiyor: Başarılı ChartNavigate işleme gerçeği nasıl belirlenir? True döndürmesi sadece "gösteri amaçlıdır", gerçek çalışmaya hiçbir şekilde yardımcı olmaz.
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
ChartNavigate işleviyle ilgili bir sorunla karşılaştım. Yanlış bir şey yapıyorum veya işlevde gerçekten bir sorun var. Yeterince sık kullananların aboneliğinden çıkın.
Dolayısıyla, sorunun özü: OnInit() içindeki işlevi çağırırsanız , uçbirim başladığında ChartNavigate grafiği kaydırmaz. Belgeleri özellikle birkaç kez okuyun. Hiçbir yerde başlatma sırasında bir işlevin çağrılamayacağını söylemez.
Oynatma için gösterge kodu:
Oynamak için adımlar: