Hatalar, hatalar, sorular - sayfa 1679

 
fxsaber :
Torunlarda da özel yapmak güzel olurdu. Daha iyi anlamak için. Konu değil kısaca.
Torunlarda onu aramak gerekir. )
 
Sergei Vladimirov :
Torunlarda onu aramak gerekir. )
Bütün mesele şu ki, buna gerek yok. Örneğime bakın.
 
fxsaber :
Bütün mesele şu ki, buna gerek yok. Örneğime bakın.
Örneğiniz sadece farklı, ancak öz aynı - temel sınıfın sanal yöntemi, soyundan gelende geçersiz kılındı. Tamam, genel olarak, her şey herkes için açıktır.
 

Gösterge arabelleklerinde hata

 #property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    1

class BUFFER
{
public :
   double Buffer[];
  
  BUFFER()
  {
    :: SetIndexBuffer ( 0 , this .Buffer);
  }
};

BUFFER* Buf;

void OnInit ()
{
  Buf = new BUFFER;
}

void OnDeinit ( const int Reason )
{
   delete (Buf);
}

void Restart()
{
   OnDeinit ( REASON_PARAMETERS );
   OnInit ();
}

#define PRINT(A) Print ( #A + " = " + ( string )A);

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[] )
{
   static bool Flag = false ;
  
   if (Flag)
    Restart();
  
  Flag = true ;
  
  PRINT( ArraySize (Buf.Buffer));
  
  Buf.Buffer[ 0 ] = 0 ; // array out of range
  
   return (rates_total);
}

Günlükteki sonuç

2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      array out of range in 'Test.mq5' (56,13)
2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 0
2016.09.12 17:21:54.828 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 2067

Hata ayıklayıcı, Buf.Buffer'ın HER ZAMAN dinamik dizi[0] olduğunda ısrar ediyor, I . Onlar. gösterge tamponu. Ama ortaya çıktığı gibi sıfır boyut.

Hata ayıklayıcının günlüğe sürümden daha fazlasını yazdığı ortaya çıktı. Yayın böyle şeyler söylemiyor

 2016.09 . 12 17 : 25 : 08.706 Test (RTS- 9.16 ,M1)      Indicator buffer # 0 detached
Gösterge arabelleği MT5'te yalnızca bir kez ayarlanabilir mi?
 

Ve bir sır değilse neden bu tür zorluklar? Eh, araştırma ilgisi dışında tabii.

Bunun yerine (bu arada, prensipte yanlıştır, çünkü yeniden başlatma sadece başlangıçta değil, çalışma sırasında da gerekebilir):

   static bool Flag = false ;
  
   if (Flag)
    Restart();
  
  Flag = true ;

Aynen böyle:

 if (prev_calculated == 0 )
   ArrayInitialize (Buf.Buffer, 0.0);
 
Sergei Vladimirov :

Ve bir sır değilse neden bu tür zorluklar? Eh, araştırma ilgisi dışında tabii.

Gösterge arabelleği olarak sabitlenen dinamik bir dizinin silindiği durumlar var. Ardından tekrar dinamik bir kütle oluşturmanız ve bunu bir gösterge tamponu olarak atamanız gerekir. Hata ayıklayıcı, atandığını gösterir. Ama sadece boyutu sıfır. Bu bir hata.

Görünüşe göre sorun eski.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

"Gösterge arabelleği #x ayrılmış" mesajı nasıl gizlenir

Konstantin Ivanov , 2015.02.17 21:18

Göstergemde, arabellek dizilerini nesne örneklerinde saklıyorum.
OnDeinit() içindeki bir nesneyi silerken, arabelleklere (SetIndexBuffer()) bağlı tüm diziler için bir mesaj görüntülenir:

" Gösterge arabelleği #x ayrılmış"

Böyle bir mesaj olmadan bir diziyi tampondan nasıl ayırabilirim?
Veya bu mesajı nasıl gizleyebiliriz?

http://forum.mql4.com/63975 dalını buldum, ancak önerilen tamponları küresel bağlamda kaydetme seçeneği bana uymuyor .


Ve tamponları küresel bağlamda kaydetme seçeneği de bana uymuyor. İlginç bir şekilde, her şey MT4'te çalışıyor.

 

makale Yeni başlayanlar için MQL5'te Uzman Danışmanlar yazmak için adım adım kılavuz Mevcut kod:


Üç işaretle bölmek gerekmez mi?

 
Aleksey Rodionov :

makale Yeni başlayanlar için MQL5'te Uzman Danışmanlar yazmak için adım adım kılavuz Mevcut kod:


Üç işaretle bölmek gerekmez mi?

Bu, EURUSD (5 haneli) ve USDJPY'den (3 haneli) kalan bir kalıntıdır. Hata yok, ancak özellikle yeni başlayanlar için bunu yapmamak daha iyidir.
 
Miras alınan tüm sınıflar için tek bir arayüz tanımlamam gerekiyor. Her zaman bir Init yöntemi içermelidir. Ancak Init, bir kurucunun kopyası gibidir, bu nedenle giriş parametreleri için seçenekler önceden belirlenemez. Böyle bir arayüz nasıl tanımlanır?
 
MK, neden aşağıdaki sözdizimini içe aktarılan işlevler için geçerli kılmıyorsunuz:
 #import ...
 int send(SOCKET s, void &buf[], int len, int flags);
 int send(SOCKET s, void &buf, int len, int flags);
#import

Şimdi çirkin şeyleri çitle çevirmeliyiz:

 #import ...
 int send(SOCKET s, char &buf[], int len, int flags);
 int send(SOCKET s, int &buf, int len, int flags);
 int send(SOCKET s, char &buf, int len, int flags);
 int send(SOCKET s, Cpoint &buf[], int len, int flags);
 ...
#import

Bunu dahili satır içi işlevler için önermiyorum, ancak içe aktarılan işlevler için güvenli olması gerekir.