Başlatmada ChartNavigate

 

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:

 #property indicator_chart_window 
int OnInit ()
{
   if ( ChartNavigate ( 0 , CHART_END , - 1000 ))
       Alert ( "Успешно" );
   else
       Alert ( "Ошибка №" , GetLastError ());

   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[])
{
   return (rates_total);
}

Oynamak için adımlar:

  1. Grafik otomatik kaydırmayı devre dışı bırakın.
  2. Göstergeyi tabloya ekleyin. ChartNavigate, grafiği doğru konuma taşıyarak çalışacaktır.
  3. Terminali boşaltın.
  4. Terminali indirin. ChartNavigate, grafiği ofset olmadan görüntüleyerek çalışmayacaktır.
Peki, işlev bir hata ürettiyse. Ama o değil. Tüm çağrılar başarılıdır, ancak tam olarak terminal yeniden başlatıldığında grafik kaymaz.

 
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.
 
Vladimir Karputov :
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.

 
Ihor Herasko :

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.

 
Vladimir Karputov :

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?

 
Alexey Viktorov :

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.

 
Ihor Herasko :

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ı.

 
Vladimir Karputov :

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ı.

Dosyalar:
Test.mq5  6 kb
 
Vladimir Karputov :

İş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.

Neden: