Çaydanlıktan gelen sorular - sayfa 62

 
x100intraday :
Böyle bir örnek olur...

Bunun gibi bir şey (bir yapı değil, elbette bir sınıf):

 class TBuffer
{
public :
   double   MABuffer[ ];
};

//---------------------------------------------------------------------
TBuffer*  Buffer_Array[ ];
//---------------------------------------------------------------------

//---------------------------------------------------------------------
   ArrayResize ( Buffer_Array, NUMBER );
   for ( int i = 0 ; i < NUMBER; i++ )
  {
    Buffer_Array[ i ] = new TBuffer;
     SetIndexBuffer ( i, Buffer_Array[ i ].MABuffer, INDICATOR_DATA );
  }

Nereye ne ekleneceği bence açık.

Sonunda şunu unutmayın:

   for ( int i = 0 ; i < NUMBER; i++ )
  {
     delete ( Buffer_Array[ i ] );
  }
 
Yedelkin :

yeniden formüle edeceğim. Bir işlevi tanımlarken mümkün olup olmadığını merak ediyor musunuz?

biçimsel parametresi olarak, yapının adının göstergelerini göz ardı ederek, yapı tipinin yalnızca bir değişkenini belirtin mi? Onlar. örneğin, void funcName(MqlTradeRequest & req) değil, sadece void funcName(& req)?

Evet. herhangi bir basit yapı için genel bir işleve ihtiyaç vardır --- Yöntem yok, dyn. diziler. vb. --- tanımlanmış veri türlerinin saf bir dizisi.

Çünkü senaryonun kompozisyonu benim tarafımdan önceden belirlenir, ilgileneceğim yapıların sayısını açıkça belirleyebilirim.

 struct Data1
  {
   double param[ 1000000 ];
  };
struct Data2
  {
   int     temp;
   double k;
  };
struct Data3
  {
   int     temp;
   double k;
  };

Ancak bu yapılardan herhangi birini tek adlı bir işleve geçirmek için aşırı yükleme kullanmanız gerekir.

 void funWrite(Data1 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
     FileWriteArray ( 1 , dd);
  }
void funWrite(Data2 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
     FileWriteArray ( 1 , dd);
  }
void funWrite(Data3 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
     FileWriteArray ( 1 , dd);
  }

Burada zorluklar ortaya çıkıyor.

1. yapıların sayısı sınırlıdır, çünkü daha fazla sayıda elemanla aşırı yükleme işi yavaşlatacaktır.

2. Aşırı yük işlevlerini kopyalarken kendim hata yapabilirim.

PS// funWrite() işlevi belirli hesaplamaları gerçekleştirir ve belirli bir dizi ve hesaplanmış parametrelerle (hangi dizinden yazmaya başlanacak, kaç tane okunacak) FileWriteArray() işlevini yürütür.

 
rlx :

Evet. herhangi bir basit yapı için genel bir işleve ihtiyaç vardır --- Yöntem yok, dyn. diziler. vb. --- tanımlanmış veri türlerinin saf bir dizisi.

Çünkü senaryonun kompozisyonu benim tarafımdan önceden belirlenir, ilgileneceğim yapıların sayısını açıkça belirleyebilirim.

Ancak bu yapılardan herhangi birini tek adlı bir işleve geçirmek için aşırı yükleme kullanmanız gerekir.

Açık. Bir süre önce , bir işlev tanımlarken dizilerin türünü belirtmemenin mümkün olup olmadığıyla ilgili benzer bir soru sormuştum. Biraz aşağıda, Rosh aşırı yüklenmeyi tavsiye etti.

Bu nedenle, void türüyle belirtilen bazı parametrelere sahip olan FileWriteArray() gibi "yerleşik" işlevlerin kendilerinin aşırı yüklenmiş işlevler olduğu sonucuna vardım. Sadece uygulamalarını görmüyoruz.

 
Yedelkin :

Açık. Bir süre önce , bir işlev tanımlarken dizilerin türünü belirtmemenin mümkün olup olmadığına ilişkin benzer bir soru sormuştum. Biraz aşağıda, Rosh aşırı yüklenmeyi tavsiye etti.

Bu nedenle, void türüyle belirtilen bazı parametrelere sahip olan FileWriteArray() gibi "yerleşik" işlevlerin kendilerinin aşırı yüklenmiş işlevler olduğu sonucuna vardım. Sadece uygulamalarını görmüyoruz.

Yerleşik işlevler, tam teşekküllü bir programlama dilinde yazılmıştır.

Örneğin C'de herhangi bir sayıdaki değişkenleri iletebilirsiniz ve fonksiyonda zaten geçirilen parametrelerin bir listesini alabilir ve bunları göz önünde bulundurabilirsiniz.

 void fun(...)
  {
}

MQL5'te böyle bir olasılık yoktur. Özellikle, basit veri türleri ve yapılarına yönelik referanslar ve işaretçiler eksik...

 

Muhtemelen güvenlikle ilgili bir şeydir. Veri erişimi. Sandbox'tan çıkış .

Ancak yine de bu özelliklerin MQL5'te uygulanmasını istiyorum.

 
rlx :

Muhtemelen güvenlikle ilgili bir şeydir. Veri erişimi. Sandbox'tan çıkış .

Ancak yine de bu özelliklerin MQL5'te uygulanmasını istiyorum.

Servis Masasına bir dilek yazmak daha iyidir. Ve sonra forumda hızla kaybolur.
 
Dima_S :

Bunun gibi bir şey (bir yapı değil, elbette bir sınıf):

Nereye ne ekleneceği bence açık.

Sonunda şunu unutmayın:

Anladığım yardım bu: gerçek ve oldukça spesifik. Sayesinde. artı nerede?

Bu arada ... Anladım - bu seçenek benim için yeterli. Ama bir formalist olarak kalmak istemiyorum... bu yüzden meraktan, iki boyutlu bir dizi düzenlemeye çalışmanın yine de zarar vermeyeceğine karar verdim. MQL, son on yılda güvenle unuttuğum C/C++'ı biraz andırıyor. Şimdi bunu yapmaya çalıştım (burada bir döngü olmadan - özellikle basitleştirdim):

 class TBuffer
{
public :
   double MABuffer[][ 1 ];
};

//---------------------------------------------------------------------
TBuffer* Buffer_Array[][ 1 ];
//---------------------------------------------------------------------
int OnInit ()
  {
   ArrayResize (Buffer_Array, 1 );
   Buffer_Array[ 0 ][ 0 ] = new TBuffer;
   SetIndexBuffer ( 0 ,Buffer_Array[ 0 ][ 0 ].MABuffer, INDICATOR_DATA );
// --- [...]
   delete (Buffer_Array[ 0 ][ 0 ]);
   return ( 0 );
  }

Derleyici bir hata veriyor: "'MABuffer' - parametre dönüştürmeye izin verilmiyor".

Merak ediyorum neyi yanlış yapıyorum? Yanılmıyorsam, çok boyutlu dizili bir sınıf bildirirken boyutlardan birini sayısal olarak belirtmek ve böylece statik hale getirmek gerekir mi? Bu arada ArrayResize , ilk boyut için yeni boyutu ayarlar.

 

x100intraday :

Merak ediyorum neyi yanlış yapıyorum?

1) SetIndexBuffer , aynı boyutta bir çift diziyle çalışır.

2 ) Neden TBuffer * kullandığınız belli değil, yani. gerekli olmayan yerlerde dinamikleri kullanmak?

3) (İPUCU) Örnekte, biraz bellek ve birkaç yüz döngüden tasarruf etmek için bir sınıfla değil, bir yapıyla geçmek oldukça mümkündü.

 

mql5 :

3) (İPUCU) Örnekte, biraz bellek ve birkaç yüz döngüden tasarruf etmek için bir sınıfla değil, bir yapıyla geçmek oldukça mümkündü.

doğrulandı mı??
 

Uzman Danışman, başka bir zaman diliminde bir gösterge kullanır. Expert Advisor'daki testlerde, göstergeden yanlış veriler görünüyor.

Danışmanın kendisi M5'te ve gösterge H4'te çalışır. Aynı zaman diliminde (M5) çağrılan göstergeler doğru değerleri döndürür.

Döndürülen değerler gösterge değerlerine benzer, ancak gösterge fiyat tablosu penceresinde üst üste bindirildiğinde görünen gerçek değerlerden farklıdır.

Sorun nedir?

Örnek bir gösterge çağrı kodu:

 int W_handle;
int OnInit ()
  {
   W_handle= iCustom ( NULL , PERIOD_H4 , "WW" );
  }

void OnNewBar() // моя функция
{
 double wave[ 10 ];
 ArraySetAsSeries (wave, true );

 CopyBuffer (W_handle, 0 , 0 , 2 ,wave);
 if (wave[ 1 ] > 0 ) Buy(); 
// по замыслу в wave[1] должно лежать значение индикатора на предыдущем баре H4
// но так получается только на нескольких первых обращениях, потом результат начинает расходиться с реальностью
}
Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • 2010.03.09
  • KlimMalgin
  • www.mql5.com
C появлением новой версии языка MQL, не только изменился подход к работе с индикаторами, но и появились новые способы создания индикаторов. Кроме того, появилась дополнительная гибкость при работе с индикаторными буферами - теперь вы можете самостоятельно указать нужное направление индексации и получать ровно столько значений индикатора, сколько вам требуется. В этой статье рассмотрены базовые методы вызова индикаторов и получения данных из индикаторных буферов.