Errori, bug, domande - pagina 1182

 
Zeleniy:

L'ottimizzazione non funziona.

2014.08.05 19:34:42 Tester nessun parametro ottimizzato selezionato, controllare gli ingressi da ottimizzare e impostare accuratamente i valori di start, step e stop

La traduzione non ha dato nulla.

Cosa vuol dire "niente"? La traduzione dovrebbe averti dato qualcosa, tipo che devi selezionare almeno un parametro per l'ottimizzazione e assicurarti che i valori di inizio, fine e passo siano corretti.
 
marketeer:
Cosa vuol dire "niente"? La traduzione avrebbe dovuto darmi qualcosa, tipo che dovrei selezionare almeno un parametro per l'ottimizzazione e assicurarmi che l'inizio, la fine e il passo del test siano corretti.
È così strano, non capisco niente, forse sono solo stanco, sto ancora lottando con gli errori per il secondo giorno. Grazie, farò affidamento sulle sue parole.
 

Ho affrontato questo problema: ho bisogno di confrontare due oggetti della stessa classe tra loro e ho deciso di sovraccaricare l'operatore == per comodità. Si è scoperto che se gli oggetti sono dinamici, il mio operatore non viene eseguito, e invece degli oggetti stessi vengono confrontati i loro puntatori. Beh, ha senso in linea di principio, l'operazione di salto all'oggetto tramite il suo puntatore è richiesta: *a == *b. Ma MQL ha dimenticato di fornire una tale possibilità. Dobbiamo aggiungere.

class T {   int x;

public:

T (int value) { x=value; }   bool operator==(T& other) { Print("compare1");  return x==other.x; }   bool operator==(T* other) { Print("compare2");  return x==other.x; } }; //------------------ void OnStart() {   T* a= new T(10);   T* b= new T(10);      Alert(a==b);      delete a;   delete b; }

 

Anche se ho appena pensato, il fatto che stiamo confrontando puntatori invece di oggetti è fondamentalmente sbagliato, considerando le specifiche del linguaggio. Dopo tutto, MQL è un linguaggio gestito, e il concetto stesso di "oggetto" è usato qui indipendentemente da come l'oggetto è memorizzato e da come vi si accede. I membri e i metodi sono in ogni caso accessibili con un punto. Corrispondentemente, l'operatore di confronto dovrebbe funzionare allo stesso modo sia per gli oggetti selezionati staticamente che per quelli dinamici. E se avete bisogno di confrontare i puntatori, dovreste farlousando GetPointer().

 
meat:

Anche se stavo pensando, il fatto che ci sia un confronto tra puntatori invece che tra gli oggetti stessi è fondamentalmente sbagliato, date le specifiche del linguaggio.

Non c'è bisogno di inventare regole di confronto in MQL che contraddicono il C++, a patto di poterlo fare con altri mezzi. Se avete dei puntatori e avete bisogno di confrontare gli oggetti, usate una funzione di confronto.
bool Compare(const T& t1, const T& t2 ) { return ( t1 == t2 ); }

Alert( Compare( a, b ));
Una cosa è permettere un record della forma (*a == *b) e un'altra cosa è dare un significato diverso al record (a == b)
 

Quando si testa l'Expert Advisor, genera un errore

takeprofit non valido per la funzione OrderSend

Errore 4107 di OrderSend

Come posso risolvere il problema senza entrare nel codice?

 
A100:
Non c'è bisogno di inventare regole di confronto in MQL che contraddicono il C++, finché si possono usare altri mezzi. Se avete puntatori e avete bisogno di confrontare oggetti, usate una funzione di confronto Una cosa è suggerire di permettere una voce del tipo (*a == *b), e un'altra cosa è dare un significato diverso alla voce (a == b)

Beh, sto spiegando che le regole del MQL contraddicono il C++ così com'è. Riferirsi a un oggetto con un puntatore qui è fatto con un punto, mentre dovrebbe essere fatto con ->, se seguiamo le regole del C++.

Cioè "puntatore" e "oggetto" sono due nozioni assolutamente diverse in C++, per questo la sintassi è diversa. Tutto è rigoroso. Ma qui tutto è mischiato in un unico gruppo. Sembra che ci rivolgiamo a proprietà e metodi di un puntatore. Non sto dicendo che è male, è più conveniente per l'OOP, è fatto in C# per esempio. Ma poi tutto il resto deve essere implementato allo stesso modo. Ci deve essere un unico concetto. Altrimenti si verificano contraddizioni e confusione: in alcuni casi usiamo un puntatore allo stesso modo dell'oggetto stesso, e in altri casi il puntatore improvvisamente prende vita.

Procedendo al lato pratico di tutto questo, ho già affrontato un problema: il mio codice utilizzava oggetti statici. Poi ho deciso di sostituire alcuni di essi con oggetti dinamici. Come risultato, le operazioni di confronto e di assegnazione hanno iniziato a funzionare in modo molto diverso. E questo problema era difficile da rilevare perché il programma continua a compilare e a funzionare normalmente ma non nel modo in cui dovrebbe.

 

Ho qualche classe nel mio codice che contiene qualche oggetto:

CClass
{
  ...
  CObj  Object; 
  ...
};

La classe CObj è dichiarata prima di essa.

Quando provo a compilare ottengo il seguente errore: 'Object' - cannot be unset

Cosa significa questo errore e qual è la sua causa? Non ricordo di aver incontrato questo errore prima. La classe CObj ha un costruttore e un distruttore.

Ho provato a dichiarare Object semplicemente come una variabile - tutto è OK. Ma non lo farà quando fa parte di una classe.

 
Qualcuno può spiegare cos'è questo errore ("- cannot be unset") e quando si verifica?
 
meat:
Qualcuno può spiegare cos'è questo errore ("- cannot be unset") e quando si verifica?
La funzione ZeroMemory non può essere usata per questo oggetto