Grafikte yüklü olan göstergenin arabelleklerini okuma - sayfa 3

 
comp :

Deneysel:

Doğru yazarsan mutlu olursun
 
Dmitry Fedoseev :
Ne olmuş?

Göstergeyi çalıştırın, ardından danışman

 #property strict

#define PAUSE 100

sinput int BufferIndex = 0 ;     // Номер буфера индикатора
sinput bool TimerEvent = FALSE ; // Использование события Timer

string IndicatorName;

string GetBetweenString( string &SourceString, const string BeginString, const string EndString = "" )
{
   string Str = SourceString;
   int Pos1 = 0 ;
   int Pos2 = 0 ;

   if (BeginString != "" )
    Pos1 = StringFind (SourceString, BeginString);

   if (Pos1 >= 0 )
  {
    Pos1 += StringLen (BeginString);

    Pos2 = StringFind (SourceString, EndString, Pos1);

     if (Pos2 != Pos1)
      Str = StringSubstr (SourceString, Pos1, Pos2 - Pos1);
     else
      Str = "" ;
  }

  SourceString = StringSubstr (SourceString, Pos2 + StringLen (EndString));

   return (Str);
}

string FileToString( const string FileName )
{
   string Res = "" ;

   const int handle = FileOpen (FileName, :: FILE_READ |:: FILE_BIN );

   if (handle != INVALID_HANDLE )
  {
     uchar Array[];

     FileReadArray (handle, Array);

    Res = CharArrayToString (Array);

     FileClose (handle);
  }

   return (Res);
}

string GetIndicatorName( const long Chart_ID = 0 )
{
   string Res = "" ;

   const string FileName = :: WindowExpertName () + ".tpl" ;

   if ( ChartSaveTemplate (Chart_ID, "..\\MQL4\\Files\\" + FileName))
  {
     string Str = FileToString(FileName);

     if ( StringFind (Str, "name=Custom Indicator" ) > 0 )
      Res = GetBetweenString(Str, "<indicator>\r\nname=Custom Indicator\r\n<expert>\r\nname=" , "\r\n" );
  }

   return (Res);
}

string GetIndicatorString( const int Pos = - 1 )
{
   static int PrevPos = 0 ;

   if (Pos != - 1 )
    PrevPos = Pos;

   const string Str = ((PrevPos < 0 ) || (IndicatorName == "" )) ? "" : IndicatorName + "[" + ( string )BufferIndex + "][" + ( string )PrevPos + " - " + ( string ) Time [PrevPos] +
                                                                     "] = " + ( string ) iCustom ( Symbol (), Period (), IndicatorName, BufferIndex, Pos) ;
   return (Str);
}

void OnInit ( void )
{
  IndicatorName = GetIndicatorName();

   ChartSetInteger ( 0 , CHART_EVENT_MOUSE_MOVE , TRUE );

   if (TimerEvent)
     EventSetMillisecondTimer (PAUSE);

   return ;
}

void OnDeinit ( const int reason )
{
   if (TimerEvent)
     EventKillTimer ();

   Comment ( "" );

   return ;
}

void OnTimer ( void )
{
   Comment (GetIndicatorString());

   return ;
}

void OnChartEvent ( const int id, const long & lparam, const double & dparam, const string & sparam )
{
   if (id == CHARTEVENT_MOUSE_MOVE )
  {
     datetime time;
     double price;
     int SubWindow;

     ChartXYToTimePrice ( 0 , ( int )lparam, ( int )dparam, SubWindow, time, price);
     const int Pos = iBarShift ( Symbol (), Period (), time, TRUE );

     Comment (GetIndicatorString(Pos));
  }

   return ;
}

Gösterge arabelleğinin (CTRL+D) değerlerinin iCustom (EA tarafından grafik yorumunda görüntülenen) değerleriyle eşleşmediğini gözlemlersiniz.

Test konumuzun durumunda iCustom, EMPTY_VALUE veya sıfır verecektir.

 

Kontrol. Eşleşmediğinden değil, hiç yok. Güzel.

 
comp :

Sessizliğe bakılırsa, bu sorunun dördüncü forumda (Google hatırlıyor) kamuya açıklanmasından bu yana yedi yıldan fazla bir süre sonra, işlevselliğin geliştiricileri oluşturulmadı.

Bazı nedenlerden dolayı, gösterge verilerini grafikten insanca okumak hala imkansız! Kulağa çılgınca geliyor, ama bu doğru.

Sorun, görevin ayarlanmasındadır.

Bunun için göstergeleri kullanmazsınız. Bir zamanlayıcı üzerinde çalışmak ve olaylara tepki vermek için tasarlanmamışlardır, zaman serilerini ekonomik olarak küreklemek için tasarlanmıştır.

Görevinize diğer taraftan yaklaşın, güzel ve ekonomik bir çözüm bulacaksınız.

 
Önemli olan, arabellekleri okumak değil, iCustom() aracılığıyla çağrılan göstergenin bir zamanlayıcıya ve grafik olayı olmamasıdır.
 
Dmitry Fedoseev :
Buradaki nokta, arabellekleri okumak değil, iCustom() aracılığıyla çağrılan göstergenin bir zamanlayıcıya ve grafik olayı olmamasıdır.

Neden yapmalılar?

Cidden, neden?

 
Andrey Khatimlianskii :

Neden yapmalılar?

Cidden, neden?

İhtiyacım yok. Ama burada birinin buna ihtiyacı olduğu ortaya çıktı.
 
Andrey Khatimlianskii :

Sorun, görevin ayarlanmasındadır.

Bunun için sadece göstergeler kullanmazsınız. Bir zamanlayıcı üzerinde çalışmak ve olaylara tepki vermek için tasarlanmamışlardır, zaman serilerini ekonomik olarak küreklemek için tasarlanmıştır.

Görevinize diğer taraftan yaklaşın, güzel ve ekonomik bir çözüm bulacaksınız.

Böyle bir açıklama ne kafaya darbe indir. Kod tabanında gösterge aramaya karar verdim. Alıştığım şeyi kullanacak KİMSE bulamadım: bir olay modeli + OOP.

Daha fazlasını söylemek zor: Bu durumdan kaynaklanan hayal kırıklığı veya hayal kırıklığı. Görünüşe göre göstergeler ilkel olarak yazılmalıdır.

Göstergelerde olay modeli + OOP kullanan var mı?

Pekala, bu yine de, çizelgede gözümle gördüğüm şeyi programlı olarak elde etmenin imkansız olduğu şaşkınlığını ortadan kaldırmıyor!

 
iCustom ile bir test EA yazarken, çözülemeyen bir MQL sorunuyla karşılaştım. Göstergenin dosya adını (koda bakın) ve giriş parametrelerinin değerlerini bulmak sorun değil. Ancak bundan sonra, göstergenin bu giriş parametrelerini iCustom'a eklemenin bir yolu yoktur. iCustom çağrısı, herhangi bir gösterge için evrensel bir çözümün yalnızca varsayılan giriş parametreleri durumunda uygun olacağı şekilde düzenlenmiştir. Aksi takdirde - koda tırmanmanız gerekir. Biraz aptalca bir karar. Gösterge girişlerini, karşılık gelen dize alanları ile bir yapı olarak geçirmek de mümkündü. Ama bunu, çağrının tüm evrenselliğini öldüren üç nokta aracılığıyla yaptılar. Başka bir anlaşılmaz sınırlama!
 
comp :

Böyle bir açıklama ne kafaya darbe indir. Kod tabanında gösterge aramaya karar verdim. Alıştığım şeyi kullanacak KİMSE bulamadım: bir olay modeli + OOP.

Daha fazlasını söylemek zor: Bu durumdan kaynaklanan hayal kırıklığı veya hayal kırıklığı. Görünüşe göre göstergeler ilkel olarak yazılmalıdır.

Göstergelerde olay modeli + OOP kullanan var mı?

Pekala, bu yine de, çizelgede gözümle gördüğüm şeyi programlı olarak elde etmenin imkansız olduğu şaşkınlığını ortadan kaldırmıyor!

Ne için? Her şey bizden önce orada çalındı, OnCalculate işlevi var - yaklaşan bir kene olayı. OOP kullanmak istiyorum - kullan, ama neden orada, nereye koymalı?
Neden: