Discussione sull’articolo "Manuale MQL5: Analisi delle proprietà di posizione nel tester di strategia MetaTrader 5"
Buonasera, per favore aiutatemi, nella funzione CheckNewBar la variabile statica new_bar viene azzerata nella prima riga, e poi la logica della funzione si basa sul fatto che sia uguale a zero o meno. Potreste cortesemente dirmi dove non capisco?!!!!!!!!!!
bool CheckNewBar() { //--- Variabile per l'ora di apertura della barra corrente static datetime new_bar=NULL; //--- Array per ottenere l'ora di apertura della barra corrente static datetime time_last_bar[1]={0}; //--- Ottenere l'ora di apertura della barra corrente // Se si è verificato un errore durante la ricezione, lo segnaleremo if(CopyTime(_Symbol,Period(),0,1,time_last_bar)==-1) { Print(__FUNCTION__,": Errore nella copia dell'orario di apertura della barra: "+IntegerToString(GetLastError())+""); } //--- Se questa è la prima chiamata di funzione if(new_bar==NULL) { // Impostare l'ora new_bar=time_last_bar[0]; Print(__FUNCTION__,": Inizializzazione ["+_Symbol+"][TF: "+TimeframeToString(Period())+"][" +TimeToString(time_last_bar[0],TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"]"); return(false); // Restituire false e uscire } //--- Se l'ora è diversa if(new_bar!=time_last_bar[0]) { new_bar=time_last_bar[0]; // Impostare l'ora e uscire return(true); // Ricorda l'ora e restituisce true } //--- Siamo arrivati a questo punto, quindi la barra non è nuova, restituiamo false return(false); }
Buonasera, per favore aiutatemi, nella funzione CheckNewBar la variabile statica new_bar viene azzerata nella prima riga, e poi la logica della funzione si basa sul fatto che sia uguale a zero o meno. Potreste cortesemente dirmi dove non capisco?!!!!!!!!!!
La guida dice che:
Le variabili locali dichiarate con la parola chiave static mantengono i loro valori per tutto il tempo di esistenza della funzione. Ad ogni successiva chiamata della funzione tali variabili locali contengono i valori che avevano alla chiamata precedente.
Cioè, a una nuova chiamata della funzione CheckNewBar(), la variabile new_bar manterrà il valore ricevuto alla precedente chiamata della funzione, ma nella prima riga le verrà assegnato il nuovo valore NULL...... e quindi non mi è chiaro perché tutto questo e come funziona. Vi prego di dissipare la mia confusione, molto probabilmente sono da qualche parte stupido, ma DOVE ?????
Buonasera, per favore aiutatemi, nella funzione CheckNewBar la variabile statica new_bar viene azzerata nella prima riga, e poi la logica della funzione si basa sul fatto che sia uguale a zero o meno. Potreste cortesemente dirmi dove non capisco?!!!!!!!!!!
Se ho capito bene la Guida, nella rigastatic datetimenew_bar=NULL; " Se i valori iniziali non sono specificati, le variabili della classe di memoria statica assumono valori iniziali nulli". Quindi non avrebbe dovuto essere inizializzato con null e la logica sarebbe stata impeccabile. Oppure no ????
Se ho capito bene la Guida, la rigastatic datetimenew_bar=NULL; " Se i valori iniziali non sono specificati, le variabili statiche della classe di memoria assumono valori iniziali nulli". Quindi non avrebbe dovuto essere inizializzata con null e la logica sarebbe stata impeccabile. Oppure no?
Le variabili DEVONO sempre essere inizializzate. È una legge non scritta. Chi non la rispetta, prima o poi commette errori molto difficili da individuare :)
Come funziona una variabile statica:
//+------------------------------------------------------------------+ //|Test EA.mq5 | //|Copyright © 2018, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2018, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.000" //+------------------------------------------------------------------+ //| Funzione di inizializzazione dell'esperto| //+------------------------------------------------------------------+ int OnInit() { //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Funzione di deinizializzazione dell'esperto| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Funzione tick dell'esperto| //+------------------------------------------------------------------+ void OnTick() { //--- lavoriamo solo al momento della nascita della nuova barra static datetime PrevBars=0; Print("PrevBars ",PrevBars); datetime time_0=iTime(Symbol(),Period(),0); if(time_0==PrevBars) return; PrevBars=time_0; Print("New bar. PrevBars ",PrevBars); } //+------------------------------------------------------------------+
Stampa nella scheda Esperti. Il primo input di OnTick() è l'inizializzazione di una variabile statica, una nuova barra.
2018.01.08 00:00:00 PrevBars 1970.01.01 00:00:00 2018.01.08 00:00:00 New bar. PrevBars 2018.01.08 00:00:00 2018.01.08 00:00:30 PrevBars 2018.01.08 00:00:00 2018.01.08 00:00:59 PrevBars 2018.01.08 00:00:00 2018.01.08 00:01:00 PrevBars 2018.01.08 00:00:00 2018.01.08 00:01:00 New bar. PrevBars 2018.01.08 00:01:00 2018.01.08 00:01:30 PrevBars 2018.01.08 00:01:00 2018.01.08 00:02:00 PrevBars 2018.01.08 00:01:00
Le variabili DEVONO sempre essere inizializzate. Questa è una legge non scritta. Chi non la rispetta, prima o poi commette errori molto difficili da trovare :)
Come funziona una variabile statica:
Stampa nella scheda Esperti. Il primo input di OnTick() è l'inizializzazione di una variabile statica, una nuova barra.
OK, ho capito, grazie per la risposta concisa e molto lucida.
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
Il nuovo articolo Manuale MQL5: Analisi delle proprietà di posizione nel tester di strategia MetaTrader 5 è stato pubblicato:
Presenteremo una versione modificata dell'Expert Advisor dal precedente articolo "Manuale MQL5: Proprietà posizione nel pannello Informazioni personalizzate". Alcuni dei problemi che affronteremo includono l'ottenimento di dati dalle barre, il controllo di nuovi eventi di barra sul simbolo corrente, inclusa una classe commerciale della libreria standard in un file, la creazione di una funzione per la ricerca di segnali di trading e una funzione per l'esecuzione di operazioni di trading, nonché la determinazione degli eventi commerciali nella funzione OnTrade ().
Fondamentalmente, tutto è pronto e possiamo procedere ai test. Strategy Tester consente di eseguire rapidamente un test in modalità di visualizzazione e di trovare eventuali errori. L'uso dello Strategy Tester può anche essere visto come vantaggioso a causa del fatto che puoi continuare a sviluppare il tuo programma anche nei fine settimana quando i mercati sono chiusi.
Impostare Strategy Tester, abilitare la modalità di visualizzazione e fare clic su Start. L'Expert Advisor inizierà a fare trading nello Strategy Tester e vedrai un'immagine simile a quella mostrata di seguito:
Autore: Anatoli Kazharski