Hatalar, hatalar, sorular - sayfa 2460

 
ME'deki geliştiricilerin CTRL+SHIFT+F tuşlarına basmaları ve "MQL5Info" yazmaları istenir. Alınan SB dosyalarında bulunan esasları düzeltin.
 
Proje koduyla ilgili sorunu vurgulamak için 2 saat öldürüldü.
 #define PRINT(x) Print ( #x, ":" , string (x))

template < typename DATA_TYPE>
struct Wrapper{
   uchar type;
   DATA_TYPE data;
   
   template < typename T>
   void operator =(T value){                   // при замене данной строки на "void operator=(T &value){" происходит перезапись оператора присвоения в классе наследнике B (код не компилируется).
       this .data = value;   
   };
   
   void operator =(DATA_TYPE &_data){
       this .data = _data;   
   };
};

struct A{
   string data;
   
   void operator =( string value){
      data = value;
   };
};

struct B : Wrapper<A>{};


void OnStart (){  
  B b;
  
   string str_value;
  b = str_value;
  
  A a;
  b = a;
  
  B b1;
  b = b1;
}


Aşağıdaki kodu kullanarak her şey beklendiği gibi çalışır,
ancak, işlevselliği genişletmeye ve yalnızca A sınıfından (string) gibi basit türler için değil, aynı zamanda yapılar için de destek eklemeye çalışırsanız,
temel sınıftan şablon atama operatörünün, mirasçıların sınıflarının varsayılan atama operatörlerini geçersiz kılmaya başladığı ve tüm işlevselliği sıkı bir şekilde öldürdüğü ortaya çıktı.
Diğer operatörleri geçici çözüm olarak kullanabilirsiniz, örneğin "operator*=", ancak mesele bu değil.


Geliştiriciler:
Lütfen varsayılan olarak atama operatörü (kopyalama oluşturucu) için zorunlu kod oluşturma özelliğini ekleyin:
class_name & class_name :: operator = ( const class_name & ) = default ;  
class_name & class_name :: operator = ( const class_name & ) = delete ;   
 

Söyle bana, danışmanda standart göstergeler kullanırsam, örneğin iMA,

Görselleştirme penceresinde doğru şekilde görüntülenmeleri için çizim stilleri nasıl ayarlanır?

 
Игорь Евдокимов :

Söyle bana, danışmanda standart göstergeler kullanırsam, örneğin iMA,

Görselleştirme penceresinde doğru şekilde görüntülenmeleri için çizim stilleri nasıl ayarlanır?

Bunun gibi: Özel Hareketli Ortalama Giriş Rengi

 
Bilgili insanlar, söyle bana! Gerçek olana dayalı özel bir sembolüm var. Bu sembolün grafiğinden alım satım nasıl yapılabilir? Yoksa MT5'te böyle bir işlevsellik yok mu?
 
Vladimir Karputov :

Bunun gibi: Özel Hareketli Ortalama Giriş Rengi

Yani aslında kendi göstergenizi yazmanız gerekiyor. Standart göstergeleri yeniden yazmak bir seçenek değildir.

Soru tam olarak standart bir göstergenin nasıl şekillendirileceğiydi.

Başka bir yol var mı?

 
MT'nin son sürümlerinde, dizelerle çalışmak için bir paradigma kaymasının parçası olarak, NULL ile sonlandırılan dizeleri kullanmayı reddetme vardır.
Ancak, StringSetLength işlevinin çalışması bir dizi soruyu gündeme getirir.

StringSetLength'in yardımıyla, yalnızca dizenin uzunluğunu kısaltabilirsiniz, ancak nasıl artırılacağını değil, bu bir şekilde hiçbir anlam ifade etmiyor.
Bu amaçlanan davranış mı?

 #define PRINT(x) Print ( #x, ":" , string (x))

void OnStart (){  
   string str = "123456789" ;
  PRINT(str);
  PRINT( StringLen (str));
  
  
  PRINT( StringSetLength (str, StringLen (str)- 1 ));
  PRINT(str);
  PRINT( StringLen (str));
  
  PRINT( StringSetLength (str, StringLen (str)+ 2 ));
  PRINT(str);
  PRINT( StringLen (str));
}

Sonuç:
 2019.05 . 15 01 : 22 : 08.208 StringFormat_1 (EURUSD,H1)      str: 123456789
2019.05 . 15 01 : 22 : 08.208 StringFormat_1 (EURUSD,H1)       StringLen (str): 9
2019.05 . 15 01 : 22 : 08.208 StringFormat_1 (EURUSD,H1)       StringSetLength (str, StringLen (str)- 1 ): true
2019.05 . 15 01 : 22 : 08.208 StringFormat_1 (EURUSD,H1)      str: 12345678
2019.05 . 15 01 : 22 : 08.208 StringFormat_1 (EURUSD,H1)       StringLen (str): 8
2019.05 . 15 01 : 22 : 08.208 StringFormat_1 (EURUSD,H1)       StringSetLength (str, StringLen (str)+ 2 ): false
2019.05 . 15 01 : 22 : 08.208 StringFormat_1 (EURUSD,H1)      str: 12345678
2019.05 . 15 01 : 22 : 08.208 StringFormat_1 (EURUSD,H1)       StringLen (str): 8
 
Kullanıcının kendisini vurması, 0x0000 olarak başlatılan "yeni" karakterlerle "tam" bir StringSetLength uygulamaktan daha kolaydır.

 #define PRINT(x) Print ( #x, ":" , string (x))

void OnStart (){  
   string str = "123\x0000\x0000\x0000\x0000456789" ;
  PRINT(str);
  PRINT( StringLen (str));                                                  // StringLen(str):13      StringLen поддерживает работу с 0х0000 short value
  
  PRINT(StringSetLength_using_StringInit(str, 100 ));                      // false                  StringInit           не поддерживает работу с 0х0000 short value
  PRINT(StringSetLength_using_ShortArrayToString(str, 100 ));              // false                  ShortArrayToString   не поддерживает работу с 0х0000 short value
  PRINT(StringSetLength_using_StringInit_with_StringFill(str, 100 ));      // false                  StringFill           не поддерживает работу с 0х0000 short value
}


bool StringSetLength_using_StringInit( string &string_var, int new_length){
   bool result = false ;

   int prev_length = StringLen (string_var);
   if (new_length == prev_length){
      result = true ;
       return result;
   }
   
   string data = string_var;   
   if (new_length < prev_length){
       StringSetLength (data, new_length);
   } else {
       string string_tail;
       StringInit (string_tail, new_length - prev_length, 0x0000 );
      data += string_tail;
   }
   
   if ( StringLen (data) == new_length){
      string_var = data;
      result = true ;
   }
   return result;
}

bool StringSetLength_using_ShortArrayToString( string &string_var, int new_length){
   bool result = false ;

   int prev_length = StringLen (string_var);
   if (new_length == prev_length){
      result = true ;
       return result;
   }
   
   string data = string_var;   
   if (new_length < prev_length){
       StringSetLength (data, new_length);
   } else {    
       short data_array[];
       StringToShortArray (data, data_array);
       ArrayResize (data_array, new_length);
       ArrayFill (data_array, prev_length, new_length - prev_length, 0x0000 );
      data = ShortArrayToString (data_array, 0 , new_length);
   }
   
   if ( StringLen (data) == new_length){
      string_var = data;
      result = true ;
   }
   return result;
}

bool StringSetLength_using_StringInit_with_StringFill( string &string_var, int new_length){
   bool result = false ;

   int prev_length = StringLen (string_var);
   if (new_length == prev_length){
      result = true ;
       return result;
   }
   
   string data = string_var;   
   if (new_length < prev_length){
       StringSetLength (data, new_length);
   } else {    
       string string_tail;
       StringInit (string_tail, new_length - prev_length, 0x1111 );
       StringFill (string_tail, 0x0000 );
      data += string_tail;
   }
   
   if ( StringLen (data) == new_length){
      string_var = data;
      result = true ;
   }
   return result;
}
 
Sergey Dzyublik :
MT'nin son sürümlerinde, dizelerle çalışmak için bir paradigma kaymasının parçası olarak, NULL ile sonlandırılan dizeleri kullanmayı reddetme vardır.

Bu fikri detaylandırabilir misiniz?

 
rsrozhkov :
Bilgili insanlar, söyle bana! Gerçek olana dayalı özel bir sembolüm var. Bu sembolün grafiğinden alım satım nasıl yapılabilir? Yoksa MT5'te böyle bir işlevsellik yok mu?

Cevap apaçık ortada. Gerçek sembollerden bazı dönüşümlerle özel bir sembol elde edilir. Birinin (EA, komut dosyası veya manuel) ters dönüştürme yapması ve gerçek semboller için sipariş vermesi gerekir.