Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 742

 
Klimenko_a_e:

Nel codice reale, la funzione restituisce un oggetto.

Penso che il costruttore di copie dovrebbe creare una copia temporanea in questo caso.

Il codice funziona correttamente in MQL5 build 1545.

Nella nuova build, il costruttore di copie non può ridimensionare nemmeno un array unidimensionale: errore 4007.

Penso che non sia corretto.

È difficile per me fare una dichiarazione definitiva in questo caso. Ci sono ottimi esperti per la tua domanda, quindi ti consiglio di rivolgerti ahttps://www.mql5.com/ru/forum/1111 branch.

Con le mie modifiche il codice funziona come dovrebbe. Senza, non è così. Ma se il tuo codice dovrebbe funzionare o meno è meglio per il ramo al link qui sopra.

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
Klimenko_a_e:

Nel codice reale, la funzione restituisce un oggetto.

Penso che il costruttore di copie dovrebbe creare una copia temporanea in questo caso.

Il codice funziona correttamente in MQL5 build 1545.

Nella nuova build, il costruttore di copie non può ridimensionare nemmeno un array unidimensionale: errore 4007.

Questo non è corretto secondo me.


L'errore è stato risolto nella build 1580, grazie, tutto funziona come dovrebbe).
 
fxsaber:

È difficile per me dire qualcosa di definitivo in questo caso. Ci sono ottimi esperti sulla tua domanda, quindi ti consiglio di rivolgerti al ramohttps://www.mql5.com/ru/forum/1111.

Con le mie modifiche il codice funziona come dovrebbe. Senza, non è così. Ma se il tuo codice dovrebbe funzionare o meno è meglio essere indirizzati al ramo al link qui sopra.


Grazie per il link.
 

Forse qualcuno può darmi un suggerimento.

Non riesco a capire come interrompere l'esecuzione dell'EA dopo aver cambiato manualmente le impostazioni di ingresso.

1) Esegui il codice EA in questo modo sul grafico:

#property version   "1.00"

input int Setting_ = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   Print ("OnInit:",Setting_);
   
   return (INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Print ("OnDeinit(",reason,"):",Setting_);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   while (!_StopFlag)
   {
      Sleep(1000);
   }
}

2) Aprire la finestra delle impostazioni e cambiare il parametro "Setting_" a 1.

3) E applicare le modifiche.

Quindi, per iniziare ad applicare le modifiche, OnInit deve essere eseguito, ma OnInit non sarà eseguito fino a quando i calcoli in OnTick (o qualsiasi altro) si fermeranno.

Per quanto ne so, c'è solo un controllo perfermare il programma attraverso _StopFlag - flag per fermare il programma mql5, ma è solo per l'uscita completa. Ma non so come capire che le impostazioni di input sono cambiate per fermare i calcoli.

Forse qualcuno ha affrontato una situazione simile? Forse c'è qualche trucco segreto?

 
Marat Sultanov:

Forse qualcuno può darmi un suggerimento.

Non riesco a capire come interrompere l'esecuzione dell'EA dopo aver cambiato manualmente le impostazioni di ingresso.

1) Esegui il codice EA in questo modo sul grafico:

2) Aprire la finestra delle impostazioni e cambiare il parametro "Setting_" a 1.

3) E applicare le modifiche.

Quindi, per iniziare ad applicare le modifiche, OnInit deve essere eseguito, ma OnInit non sarà eseguito fino a quando i calcoli in OnTick (o qualsiasi altro) si fermeranno.

Per quanto ne so, c'è solo un controllo perfermare il programma attraverso _StopFlag - flag per fermare un programma mql5, ma è solo per l'uscita completa. Ma non so come capire che le impostazioni di input sono cambiate per fermare i calcoli.

Forse qualcuno ha affrontato una situazione simile? Forse c'è qualche trucco segreto?

Controllare il codice di deinizializzazione in OnInit()

Motivi per la deinizializzazione

I codici dei motivi di deinizializzazione di Expert Advisor restituiti da UninitializeReason(). Possono avere uno dei seguenti valori:

Costante .

Valore

Descrizione

PROGRAMMA RAGIONEVOLE

0

Expert ha interrotto il suo lavoro chiamando ExpertRemove()

RAGIONE_REMOVE

1

Programma rimosso dal grafico

MOTIVO_RICOMPILAZIONE

2

Programma ricompilato

MOTIVO_CAMBIAMENTO GRAFICO

3

Il simbolo del grafico o il periodo è stato cambiato

MOTIVO_CHARTCLOSE

4

Il grafico è chiuso

RAGIONE_PARAMETRI

5

I parametri di input sono stati cambiati dall'utente

CONTO REASON_ACCOUNT

6

Un altro conto è stato attivato o ricollegato al server commerciale perché le impostazioni del conto sono state cambiate

MOTIVO_TEMPLATE

7

Un altro modello di grafico è stato applicato

MOTIVO_INITFAILED

8

Un segno che il gestore OnInit() ha restituito un valore non nullo

RAGIONE_CHIUSA

9

Il terminale è stato chiuso

 
Artyom Trishkin:

Controllare il codice di deinizializzazione in OnInit()

...

Ehm... Mi hai frainteso :)

È necessario sapere all'interno della funzione (per esempio inOnTick), che l'utente ha cambiato i parametri di input, cioè sapere che è il momento di concludere e lasciare che il programma vada a OnDeinit.

 
Marat Sultanov:

Ehm... Mi hai frainteso :)

Avete bisogno di sapere all'interno della funzione (per esempio inOnTick) che l'utente ha cambiato i parametri di input, cioè sapere che è il momento di chiudere e lasciare che il programma esca in OnDeinit.

Non appena un utente chiama la finestra delle impostazioni EA (F7) e vi preme il pulsante OK, OnDeinit() viene chiamato immediatamente e questo, a sua volta, scrive il valore REASON_PARAMETERS nel codice di deinizializzazione. Poi viene chiamata OnInit(), dove usandoUninitializeReason() si può controllare il codice di deinizializzazione e, se il suo valore è uguale aREASON_PARAMETERS, decidere cosa fare dopo.
 
Artyom Trishkin:
Non appena un utente chiama la finestra delle impostazioni EA (F7) e vi clicca il pulsante OK, OnDeinit() viene immediatamente chiamato, e questo, a sua volta, scrive nel codice di deinizializzazione il valore di REASON_PARAMETERS. Poi viene chiamata OnInit(), dove usando UninitializeReason() si può controllare il codice di deinizializzazione e, se il suo valore è uguale aREASON_PARAMETERS, decidere cosa fare dopo.

Tutto a posto.

Per favore:

1) Prima esegui il mio codice, che ho dato nel mio primo post. Non l'ho messo lì per bellezza... Si può eseguire su qualsiasi grafico.

2) Chiama la finestra delle impostazioni EA.

3) Modificare il parametro e premere OK.

Se guardate attentamente il mio codice, allora il risultato non vi sorprenderà: OnDeinit() non sarà chiamato.

 

Non solo, ho aggiunto una stampa nel deinit, sia il motivo che il parametro, in modo che possiate assicurarvi che l'esperto NON raggiunga il deinit.

Si prega di notare il pezzo più importante del codice:

void OnTick()
{
   while (!_StopFlag)
   {
      Sleep(1000);
   }
}

È una chiara emulazione di un lungo calcolo che non sarà interrotto da un cambiamento nei parametri di input. E ho bisogno di interromperlo e la domanda è: come? :)

Voglio solo assicurarmi di non perdere nulla in MQL5 e non c'è davvero nient'altro nel linguaggio se non_StopFlag, che purtroppo non risolve questa situazione.

Approssimativamente, ho bisogno di catturare il momento in cui i parametri di input cambiano durante un calcolo pesante.

 
Marat Sultanov:

Non solo, ho aggiunto una stampa nel deinit, sia il motivo che il parametro, in modo che possiate assicurarvi che l'esperto NON raggiunga il deinit.

Si prega di notare il pezzo più importante del codice:

È una chiara emulazione di un lungo calcolo che non sarà interrotto da un cambiamento nei parametri di input. E ho bisogno di interromperlo e la domanda è: come? :)

Voglio solo assicurarmi di non perdere nulla in MQL5 e non c'è davvero nient'altro nel linguaggio se non_StopFlag, che purtroppo non risolve questa situazione.

Approssimativamente, ho bisogno di catturare il momento in cui i parametri di input cambiano durante un calcolo pesante.

Più o meno - rileggi attentamente quello che ti ho scritto e elimina il ciclo infinito dal tuo codice.

Sei sicuro che portare l'Expert Advisor in un ciclo infinito sia la soluzione giusta?

Motivazione: