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

 
yosuf:
Grazie, lì sul link, c'è una soluzione software al problema, e non so cosa fare. Che cosa ha a che fare questo con e come posso risolvere questo problema? Perché l'EA ha funzionato bene per un mese e ora ha un glitch? Se l'errore era nel codice? Si scopre che questo thread non è per i neofiti se mi appesantisce con le risposte alle domande. Sono frustrato.

Ho scritto una cosa del genere nel mio EA subito dopo l'inizio:

//--- Section A: start - checking.
   if (!IsExpertEnabled())
      {Comment("Expert is NOT working. Check the reason."); return(0);}
   if (!IsConnected())
      {Comment("No connection!"); return(0);}
   if (IsTradeContextBusy())
      {Comment("Trade flow is busy. Wait..."); Sleep(5*1000); return(0);}
   if (AccountFreeMargin()<1000*Lot_super)
      {Comment("No money to trade. Free Margin = ",AccountFreeMargin()); Sleep(20*1000); return(0);}
//--- Section A: end - checking.

Provatelo, forse qualcosa vi sarà utile anche per voi.

 
drknn:


1. ok. È stato dichiarato Int start(). Ho sempre restituito zero. Ho visto i comandi return(-1) e anche return(-2) nel codice. Qual è il modo corretto di scegliere questo codice?

2. Quindi la domanda naturale sorge, è possibile dichiarare start() di EA/indicator/script non di tipo int(), ma di qualsiasi altro tipo e poi cosa restituire al terminale? In altre parole, cosa fa il terminale con il valore restituito da return() ?

1. Come si fa a decidere che cosa dovrebbe restituire una funzione normale?

2. Si può avere qualsiasi tipo, proprio come una funzione normale. Il terminale non fa nulla con i valori restituiti. Li ignora.

Funzioni speciali

 
Zhunko:

1. Come si fa a decidere quale funzione normale deve ritornare?

2. Si può avere qualsiasi tipo, proprio come una funzione normale. Il terminale non fa nulla con i valori restituiti. Li ignora.


1. Per decidere cosa dovrebbe restituire una funzione ordinaria, ho bisogno di sapere perché il codice principale ha bisogno di un tale valore. Per esempio, se voglio prendere la decisione di aprire un ordine di acquisto quando c'è un segnale, scriverò una funzione che restituisce il numero di ordini di acquisto già aperti. A seconda di quanti ce ne sono, il codice prenderà una decisione seguendo la logica incorporata nel codice. Non so quale logica sia incorporata nel codice di ritorno. Oggi stavo guardando un articolo sulla creazione di un semaforo e mi sono imbattuto in un codice di ritorno (-2). Sorpreso, ha fatto una domanda qui. Questo è tutto. ( https://www.mql5.com/ru/articles/1412 - articolo qui).

2. il terminale ignora i valori restituiti. È così? Se è così, allora ancora una volta sorge una domanda legittima, perché nella creazione di un EA/indicatore/script, lo sviluppatore mette in un template esattamente int, perché sarebbe più ragionevole mettere lì void - allora il terminale non deve ignorare nulla - guadagneremmo 1 tatto di tempo del processore? Forse c'è qualche logica in COSA restituire dalle funzioni int init(), int deinit() e int start()? Penso che Roche l'abbia già spiegato a qualcuno da qualche parte - ricordava una descrizione di quando restituire zero e quando restituire (-1). Era proprio questa la spiegazione che cercavo. Peccato che non l'ho trovato...

P.S.

L'autore dell'articolo usa return(-2) per i suoi scopi. Ma il fatto è che a volte la funzione start() finisce con un codice che restituisce un valore diverso da zero. E non è solo una persona a farlo. È esattamente questa logica che vogliamo capire.

 

Sembra che ci sia nel testo.

Le funzioni predefinite possono avere dei parametri. Tuttavia, quando queste funzioni sono chiamate dal terminale client, nessun parametro sarà passato esternamente, ma saranno utilizzati i valori predefiniti.

Questo riguarda i parametri che entrano nella funzione, non i parametri restituiti da essa.

 
grazie per la vostra risposta!
drknn:
Questo è un contatore di ordini. Bene, potrebbe essere il caso, per esempio, di voler sapere nel codice se ci sono ordini di acquisto nel mercato per una certa coppia di valute e con un certo numero magico, per esempio. Se c'è, ad esempio, un altro ordine di acquisto non può essere aperto. Quindi il contatore di ordini è necessario per prendere una decisione.
 
paladin80:

Ho scritto questo nel mio EA subito dopo l'inizio:

Provatelo, potreste trovare qualcosa di utile.

Grazie, ho trovato il mio errore. Quando il mio EA si è bloccato a causa del motivo indicato nell'articolo (link sopra), l'ho chiuso e ricominciato ma ho dimenticato di cambiare l'order master da 123 a 124 e due EA diversamente diretti hanno ottenuto gli stessi mag e hanno iniziato a competere per vedere chi apre gli ordini più velocemente. Se il primo ordine è stato aperto per primo, non è stato lo stesso che, diciamo, Vendere o viceversa. Non appena ho cambiato la magia del secondo EA aggiornato, entrambi hanno iniziato a funzionare normalmente. Se l'errore si ripete, seguirò il vostro consiglio. Grazie per le risposte.
 

come queste linee possono essere comprese:

volume degli ordini di ritorno

if(buys>0) return(buys);

else return(-sells);

} ?

 

Scrivere una sceneggiatura:

int start(){
  Print("Попытка ретурна 136");
  return(136);
}

buttalo sul grafico e guarda il registro:

2012.07.20 12:04:11 111 NZDUSD,M15: removed
2012.07.20 12:04:11 111 NZDUSD,M15: uninit reason 0
2012.07.20 12:04:11 111 NZDUSD,M15: Попытка ретурна 136
2012.07.20 12:04:11 111 NZDUSD,M15: loaded successfully

(qui 111 è il nome dello script). Vediamo la linea " uninit reason 0 " - apparentemente il terminale stava aspettando lo zero!

Prova lo stesso con (-1) :

int start(){
  Print("Попытка ретурна -1");
  return(-1);
}

Il risultato è lo stesso:

2012.07.20 12:08:19 111 NZDUSD,M15: rimosso
2012.07.20 12:08:19 111 NZDUSD,M15: uninit reason 0
2012.07.20 12:08:19 111 NZDUSD,M15:Tentativo di ritorno -1

2012.07.20 12:08:19 111 NZDUSD,M15: caricato con successo

Il terminale sembra preoccuparsi se viene restituito zero o no.

P.S.

In generale, nel web si è imbattuto in questa risposta:

return 0 - il programma ha completato il suo lavoro senza errori
return 1 - o numero superiore, il programma ha finito il suo lavoro con un errore e restituisce il codice di errore per un'ulteriore elaborazione.

In qualsiasi sistema operativo, qualsiasi programma restituisce sempre un codice di errore.

L'unico problema è che il nostro ritorno non restituisce il codice al sistema operativo, ma al terminale. Questo lascia aperta la questione.

 
drknn:

Scrivere una sceneggiatura:

buttalo sul grafico e guarda il registro:

(qui 111 è il nome dello script). Vediamo la linea " uninit reason 0 " - apparentemente il terminale stava aspettando lo zero!

Prova lo stesso con (-1) :

Il risultato è lo stesso:

A quanto pare al terminale interessa se viene restituito uno zero o meno.


uninit reason è il codice del motivo della terminazione dell'Expert Advisor

https://docs.mql4.com/ru/constants/uninit

 
Sei leggermente confuso, UNINIT REASON non ha nulla a che fare con i rendimenti relativi alle funzioni standard. Scrivi un EA e chiama "init" da "start" con diversi risultati di ritorno e vedi. In realtàhttps://docs.mql4.com/ru/basis/functions/special il dottore dice tutto perfettamente. Basta rileggere attentamente .
Motivazione: