Errori, bug, domande - pagina 2460

 
Si prega di chiedere agli sviluppatori ME di premere CTRL+SHIFT+F e digitare "MQL5Info". Correggere i rudimenti trovati nei file SB risultanti.
 
Mi ci sono volute 2 ore per isolare il problema dal codice del progetto.
#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;
}


Usando il codice di cui sopra tutto funziona come previsto,
tuttavia se cerchiamo di estendere la funzionalità e aggiungere il supporto non solo per i tipi semplici come (string) dalla classe A, ma anche per le strutture,
risulta che l'operatore di assegnazione dei template dalla classe base inizia a sovrascrivere gli operatori di assegnazione predefiniti delle classi discendenti, uccidendo tutte le funzionalità.
Altri operatori possono essere usati come workaround, come "operator*=", ma è un casino.


Agli sviluppatori:
Si prega di aggiungere la possibilità di specificare la generazione forzata di codice per l'operatore di assegnazione predefinito (costruttore di copia):
class_name & class_name :: operator= ( const class_name & ) = default;  
class_name & class_name :: operator= ( const class_name & ) = delete;   
 

Puoi dirmi se uso indicatori standard nel mio EA, per esempio iMA,

come posso impostare i loro stili di disegno per visualizzarli correttamente nella finestra di visualizzazione?

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

Puoi dirmi se uso indicatori standard nel mio EA, per esempio iMA,

come posso impostare gli stili di disegno perché siano visualizzati correttamente nella finestra di visualizzazione?

Come questo:colore di ingresso della media mobile personalizzata

 
Persone competenti, un suggerimento! Ho un simbolo personalizzato basato su uno reale. Come posso rendere disponibile un trade dal grafico di questo simbolo? O non c'è questa funzionalità in MT5?
 

In effetti, dovete scrivere il vostro indicatore. Riscrivere gli indicatori standard non è la soluzione.

La domanda era esattamente come impostare lo stile per l'indicatore standard.

C'è un altro modo?

 
Nelle versioni recenti di MT, come parte del cambio di paradigma nella gestione delle stringhe, si è visto che si abbandona l'uso di stringhe con terminazione NULL.
Tuttavia, il funzionamento della funzione StringSetLength solleva una serie di domande.

Con StringSetLength potete solo troncare la lunghezza di una stringa ma mai aumentarla, il che in qualche modo non ha senso.
È questo il comportamento previsto?

#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));
}

Risultato:
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
 
L'utente preferirebbe spararsi piuttosto che implementare unaStringSetLength"completa", con caratteri "nuovi" inizializzati come 0x0000.

#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:
Nelle ultime versioni di MT, come parte del cambio di paradigma nella gestione delle stringhe, vediamo il rifiuto di usare stringhe con terminazione NULL.

Potrebbe approfondire questa idea?

 
rsrozhkov:
Gente esperta, potete darmi un suggerimento! Ho un simbolo personalizzato creato sulla base di un simbolo reale. Come posso rendere disponibile un trade dal grafico di questo simbolo? O non c'è questa funzionalità in MT5?

La risposta si spiega da sola. Un simbolo personalizzato è ottenuto da un qualche tipo di trasformazione da simboli reali. Qualcuno (EA, script o manualmente) deve fare la trasformazione inversa e inviare ordini per i simboli reali.