Errori, bug, domande - pagina 1856

 
Andrey Dik:

Come posso vedere la codifica?
So che è cambiata cambiando l'aspetto del testo in un editor di terze parti, ma come dire quale codifica non so.
Andrey Khatimlianskii:
Ha appena creato un EA in ME 1580: Win-1251 (ANSI)

Sì, con Akepad vedo che la codifica è Win-1251 (ANSI), ma i file più vecchi hanno UTF-16LE 1200.

Quindi cambia la codifica predefinita per i nuovi file?

 

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Caratteristiche del linguaggio mql5, sottigliezze e trucchi

fxsaber, 2017.04.14 11:40

Sì, broker disonesti. Ci mettevano anche i numeri negativi.

Sarebbe bello se gli sviluppatori avessero un limite alla gamma di valori possibili di ogni parametro quando i broker impostano i simboli.

 

Ho notato che quando aggiorno i prodotti dal marketplace - tutte le impostazioni per quel prodotto sui grafici vengono riportate alle impostazioni predefinite.

Questo non è giusto, come si può evitare?

 

ArrayMaximum() e ArrayMinimum() - l'ordine in cui vengono passati i parametri non corrisponde all'aiuto:


 
fxsaber:
Un po' di know-how. Bypassare l'operatore di assegnazione

Risultato

Non è una mancia, è una perversione.

Non me lo aspettavo da te.

 
Koldun Zloy:

Non è un trucco intelligente, è una perversione.

Non me lo aspettavo da te.

Quindi questo è per te

Forum sul trading, sistemi di trading automatico e test di strategia

Biblioteche: TypeToBytes

fxsaber, 2017.04.13 13:34

Un esempio di come questa funzione può essere utile per identificare potenziali errori.

Scrivere ed eseguire lo script.

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT() : i(0) {}
  
  template <typename T>
  void operator =( T& ) {}
};

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

void OnStart()
{
  PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT))
}


Risultato.

_WRONG_ASSIGN_OPERATOR(STRUCT) = true

Questo indica che l'operatore di assegnazione non copierà la struttura in una struttura dello stesso tipo.


Se aggiungiamo altro alla struttura,

  void operator =( STRUCT &Value ) { this.i = 0; }

il risultato sarà lo stesso.


Può sembrare che cambiando questo operatore in

  void operator =( STRUCT &Value ) { this.i = Value.i; }

ma la biblioteca dice il contrario.


Questo è forse il punto più sottile di questo esempio.

Correggetelo con

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT() : i(0) {}
  
  template <typename T>
  void operator =( T& ) {}

  void operator =( const STRUCT &Value ) { this.i = Value.i; }
};

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

void OnStart()
{
  PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT))
}

e si ottiene il risultato

_WRONG_ASSIGN_OPERATOR(STRUCT) = false


Ora l'operatore di copia è corretto!

Possiamo controllare la correttezza degli operatori di assegnazione/copia di qualsiasi struttura semplice nello stesso modo.

 

1. Quando scriviamo così:

STRUCT StructCopy1 = Struct;
Non è operator= che dovrebbe essere chiamato, ma il costruttore della copia.

Anche se questa è più una domanda per le Metaquotazioni.

2. Se il costruttore di copie creato dal compilatore non viene chiamato, possiamo scriverlo noi stessi.

struct STRUCT
{
  int i;
  
  STRUCT(){}
  STRUCT( int _i ) : i(_i){}
  STRUCT( const STRUCT& other )
  {
      i = other.i;
  }
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

Ora operator= non viene chiamato.

3. Dato che i membri della struttura sono disponibili per noi, possiamo semplicemente scriverlo in questo modo:

StructCopy1.i = Struct.i;

Ma se li rendi privati, allora anche il tuo tiphook non ti aiuterà.

4. e soprattutto: operator= è usato per assicurare che tutte le assegnazioni passino attraverso di esso e non lo scavalchino.

Di solito, il costruttore di copie è definito insieme ad esso.

Sì, ho dato un'occhiata al campione. Non ho visto molti profitti.

 
Koldun Zloy:

1. Quando scriviamo così:

Non è operator= che dovrebbe essere chiamato, ma il costruttore della copia.

Anche se questa è più una domanda per le Metaquotazioni.

2. Se il costruttore di copie creato dal compilatore non viene chiamato, possiamo scriverlo noi stessi.

Ora operator= non viene chiamato.

3. Dato che i membri della struttura sono disponibili per noi, possiamo semplicemente scriverlo in questo modo:

Ma se li rendi privati, allora anche il tuo tiphook non ti aiuterà.

4. e soprattutto: operator= è usato per assicurare che tutte le assegnazioni passino attraverso di esso e non lo scavalchino.

Di solito, il costruttore di copie è definito insieme ad esso.

Sì, ho dato un'occhiata al campione. Non ho visto molti profitti.

Lifehack bypassa anche il costruttore di copie. E il beneficio è qui
#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT(){}
  STRUCT( int _i ) : i(_i){}
  STRUCT( const STRUCT& other )
  {
      i = 2;
  }
  
  void operator =( const STRUCT& )
  {
//    Print(__FUNCSIG__);
    
    this.i = 5;
  }
};

void OnStart()
{
  STRUCT Struct(1);  

  ArrayPrint(_R(Struct).Bytes); // 1 0 0 0
  
  STRUCT StructCopy1 = Struct;  // STRUCT( const STRUCT& )

  ArrayPrint(_R(StructCopy1).Bytes); // 2 0 0 0
    
  StructCopy1 = Struct;         // void STRUCT::operator=( const STRUCT& )

  ArrayPrint(_R(StructCopy1).Bytes); // 5 0 0 0
}

La R è una cosa universale. Ecco perché non abbiamo bisogno di ridefinire le strutture aliene con i loro operatori.

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

void OnStart()
{
  STRUCT Structs[] = {{1}, {2}};
  
  ArrayPrint(_R(Structs).Bytes); // 1 0 0 0 2 0 0 0
}
 
Andrey Dik:

Sì, con Akepad vedo che la codifica è Win-1251 (ANSI), ma i file più vecchi hanno UTF-16LE 1200.

Quindi la codifica predefinita per i nuovi file è cambiata dopo tutto?

No, è sempre stato Win-1251 (ANSI) e UTF è stato aggiunto ad un certo punto. Ma solo per quei file sorgente che contengono caratteri non-Ansi.
 
Andrey Khatimlianskii:
No, è sempre stato Win-1251 (ANSI) e ad un certo punto è stato aggiunto UTF. Ma solo per quelle fonti che contengono caratteri non-Ansi.
Capisco. Grazie.