Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 156

 

1) perché non inizializzare immediatamente quando si dichiara int err=0 ?

2) non ho controllato, ma secondo la documentazione err è memorizzato in qualche variabile, che è auto-zero quando si usa la funzione GetLastError(),

e inoltre cambia sempre quando si usano alcune funzioni (soprattutto quelle terminali)

3) Questo è il motivo per cui GetLastError() ha dato un valore di 0 dopo aver fatto riferimento a un numero di biglietto inesistente in OrderSelect:

"Le altre funzioni non cambiano il valore della variabile last_error in nessuna condizione. ................., OrderSelect, ...................."

 
hoz:

Spesso dichiaravo una variabile come questa all'interno delle funzioni:

Più all'interno, a qualche condizione lo chiamo già per vedere se c'è un errore. Beh, non sono solo io, ma molti altri posti nel codice che ho incontrato. Quindi, per dire, è una situazione tipica. Oggi ho pensato che non è logico dichiarare ogni volta la stessa variabile in ogni funzione in cui si vogliono controllare gli errori. Ci ho pensato e sono arrivato alla conclusione che sarebbe stato più facile dichiarare globalmente una volta e inizializzarlo nell'init. Funziona così:

E inoltre, quando avete bisogno di chiamare la variabile err nelle funzioni utente, sapendo che ha già un valore. In effetti, GetLastError() emette il codice dell'ultimo errore, quindi se questa variabile err viene chiamata in ogni funzione alla fine di tutti i calcoli, che è responsabile di emettere il codice di errore, e chiama GetLastError(), allora tutto sarà corretto, giusto?

Ma se non chiamate questa variabile alla fine di qualche funzione (seguendo la catena di esecuzione del codice), non si resetterà, e causerà un'esecuzione sbagliata nel caso in cui ci sia stato un errore nell'esecuzione precedente, ma non in quella attuale, ma il codice di errore viene restituito per ultimo... E per resettarlo, dovete chiamare questa funzione GetLastError(). Cioè qui tutto dipende dal fatto che sia stato chiamato o meno. Se non si è sicuri che sarà ovunque, è più facile riassicurarsi e azzerare ogni volta, giusto?

Possiamo dichiarare err globalmente, poi azzerarlo in start() prima di chiamare GetLastError(), ad esempio

int err;
//------------------
int init() 
{
  // ...
  return(0);
}
//------------------
int start() 
{ 
  // ...
  RefreshRates();
  OrderClose(...);
  err=0;     // обнуление
  err=GetLastError();
  SomeErrFunction(err);
  // ...
return(0);
}
 
ALXIMIKS:

1) perché non inizializzare immediatamente quando si dichiara int err=0 ?


Provate!:) Non ha funzionato per me. Come ho capito, l'inizializzazione da funzioni speciali in variabili globali non è permessa. Anche se la documentazione non sembra dire nulla al riguardo.
ALXIMIKS:

2) non ho controllato, ma secondo la documentazione err è memorizzato in qualche variabile, che è auto-zero quando si usa la funzione GetLastError(),

e inoltre cambia sempre quando si usano alcune funzioni (soprattutto quelle terminali)

Riguardo all'azzeramento ho scritto sopra, ma ecco che se dopo il valore entra nella variabile LastError(), allora per resettarlo, dobbiamo chiamare la funzione GetLastError() per restituire il codice dell'ultimo errore e resettare la variabile LastError . Altrimenti, il codice dell'ultimo errore sarà memorizzato permanentemente fino a quando non si chiamerà GetLastError() e, di conseguenza, può restituire il codice dell'ultimo errore se non esiste più. (cioè in un'altra funzione per rendere più difficile la lettura del registro o la stampa).
ALXIMIKS:

3) Questo è il motivo per cui GetLastError() ha dato un valore di 0 dopo aver fatto riferimento a un numero di biglietto inesistente in OrderSelect:

"Le altre funzioni non cambiano il valore della variabile last_error in nessuna condizione. ................., OrderSelect, ...................."

Questo molto probabilmente non è dovuto a OrderSelect(), ma c'è qualcos'altro di sbagliato (vicino nella stessa funzione). Soprattutto è spesso influenzato da molte altre cose.
 
paladin80:

Potete dichiarare err globalmente, poi azzerarlo in start() prima di chiamare GetLastError(), ad esempio

Se lo dichiari all'inizio e poi più di 1 errore nel codice, allora la logica è già sballata. A meno che GetLastError() sia chiamato costantemente (teoricamente alla fine di ogni funzione utente).
 
hoz:
allora c'è già un problema logico. A meno che GetLastError() sia chiamato costantemente(teoricamente alla fine di ogni funzione utente).

A volte bisogna chiamarlo più spesso
 

Victor (hoz), non capisco la tua confusione con l'ultimo errore.

Dichiarare la funzione per la gestione degli errori e chiamarla dove necessario. Tutto sarà locale e potrà essere usato ovunque.

// Объявление:
void CommentError(int nLastCodeError, string sComment)
 {
  if (nLastCodeError != 0) Print(sComment, "  ", ErrorDescription(nLastCodeError));
 }

// Вызов:
void start()
 {
  CommentError(GetLastError(), "Ошибка в функции start()!");
 }
 
Zhunko:

Victor (hoz), non capisco la tua confusione con l'ultimo errore.

Dichiarare la funzione per la gestione degli errori e chiamarla dove necessario. Tutto sarà locale e potrà essere usato ovunque.


È comprensibile. Ma questa funzione sarà chiamata quando ne ho bisogno, cioè quando voglio controllare se c'è un errore. Ma se c'era un errore da qualche parte prima e non c'è nessun errore in questo momento, restituirà l'errore precedente... Perché nella tua funzione Vadim, la variabile LastError non è azzerata , chiamando GetLastError(). Ecco il punto...
 
hoz:

È comprensibile. Ma questa funzione sarà chiamata quando ne ho bisogno, cioè quando voglio controllare se c'è un errore. Ma se c'era un errore da qualche parte prima, e in questo momento non c'è nessun errore, restituirà l'errore precedente... Perché nella tua funzione Vadim, la variabile LastError non è azzerata , chiamando GetLastError(). Questo è il punto...

Non dovrebbe essere azzerato. Ci dovrebbe essere l'abitudine di controllare gli errori ovunque dopo le funzioni. Si dovrebbe anche rendere la chiamata disabilitata. In modo che non rallenti in modalità di combattimento. Cioè è un tale debugger.

L'eccezione, naturalmente, è per gli errori che devono essere analizzati, per prendere una decisione.

 
hoz:

Questo è comprensibile. Ma questa funzione sarà chiamata quando ne ho bisogno, cioè quando voglio controllare se c'è un errore. Ma se c'era un errore da qualche parte prima e non c'è nessun errore in questo momento, restituirà l'errore precedente... Perché nella tua funzione Vadim, la variabile LastError non è azzerata , chiamando GetLastError(). Ecco il punto...
Cosa gli impedisce di azzerare prima (err=0;), poi di chiamare l'azione, poi di assegnare err=GetLastError(), di gestirlo e di sbagliare di nuovo.
 
Come calcolare il fattore di profitto con diversi t/p e s/l. È chiaro, se take e stop sono 20 pips ciascuno, calcoliamo il numero di trade redditizi e in perdita e dividiamoli. Come faccio a calcolare se prendo un TP di 40 pip e lo stop di 30 pip? Lo useremo nello stesso modo in cui lo usiamo nello stesso posto.