Errori, bug, domande - pagina 1525

 
Yuri Evseenkov:

MT4. Ancora una volta vorrei attirare la vostra attenzione sulle peculiarità dell'inizializzazione delle variabili globali del programma.

Forum sul trading, sistemi di trading automatico e test di strategia

Bug, bug, domande

Slawa, 2016.02.24 07:34

Coda. L'applicazione ha solo due ore.

In generale, tali domande dovrebbero essere poste sul forum. Perché molti possono essere colpiti. Mi permetto di citarla e di rispondere immediatamente

Questo è un comportamento pianificato. Infatti, è esplicitamente descritto nella documentazione

L'upload e il download comportano una completa reinizializzazione di tutto.

In cinque, come hai giustamente notato, la situazione è simile.

È vero, era storicamente in quattro, e abbiamo cambiato questo comportamento all'inizio quando siamo passati al nuovo MQL4 (per farlo comportare come negli esperti, cioè come ci si aspetta). Ma sono sorte molte domande con i vecchi indicatori, che si basavano su questa inizializzazione. Siamo stati costretti a tornare

Nei cinque, questo è stato il caso immediatamente a causa dell'architettura. Quando cambi i parametri, il vecchio indicatore con i vecchi parametri viene distrutto e viene creato un nuovo indicatore con i parametri cambiati.


 
Alexey Kozitsyn:

Grazie. Conclusione - una citazione dalla documentazione: "... funzione predefinita OnInit(), il cui scopo è la corretta inizializzazione di tutte le variabili globali e statiche del programma".

Quindi azzerare o rendere predefinite tutte le variabili globali o gli array inOnInit().

События клиентского терминала - Программы MQL4 - Справочник MQL4
События клиентского терминала - Программы MQL4 - Справочник MQL4
  • docs.mql4.com
События клиентского терминала - Программы MQL4 - Справочник MQL4
 

1. Creo un array della forma:

CArrayString list[5];

2. Provo a chiamare l'elenco dei metodi tramite <Ctrl+Space>.

list[0].
La lista dei metodi non appare. È normale che sia così?
 
Andrey Voytenko:

1. Creo un array della forma:

2. Provo a chiamare l'elenco dei metodi nel codice tramite <Ctrl+Space>.

L'elenco dei metodi non appare. È normale che sia così?

Lasciatemi provare a fare un'ipotesi. Se ci sono altri errori nel codice oltre al fatto che il metodo/membro non è specificato, la lista non apparirà sempre.

Provato. No, supposizione sbagliata. Ma alcune pressioni ripetute della combinazione hanno aiutato.

 

Alexey Kozitsyn:

Ma alcune pressioni ripetute della combinazione hanno aiutato.

Sfortunatamente, la tua ricetta non funziona per me.
 
Andrey Voytenko:
Purtroppo la tua ricetta non funziona per me.
No, è vero, se c'è un errore nel codice, la lista dei membri/metodi aperti non appare. Ma se non c'è nessun errore... poi guai.
 

1. Codice semplice:

uint a=50;
int b=-20;
Print(fmax(a,b));

risultato: 50

2. Aggiunta dell'input del modificatore:

input uint  a=50;
int b=-20;
Print(fmax(a,b));

risultato: 4294967276

Si aspettava un risultato di 50. Dove mi sbaglio?

 
Andrey Voytenko:

1. Codice semplice:

risultato: 50

2. Aggiungiamo un ingresso modificatore:

risultato: 4294967276

Mi aspettavo un risultato di 50. Dove mi sbaglio?

fmax confronta due numeri doppi. Quindi va così:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.01"
#property script_show_inputs
//---
input uint a=50;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//uint a=50;
   int b=-20;
   Print("\"uint a=50\" as double:",DoubleToString((double)a,8));
   Print("\"int b=-20\" as double:",DoubleToString((double)b,8));
   Print(DoubleToString(fmax((double)b,(double)a),8));
  }
//+------------------------------------------------------------------+

e il risultato:

2016.03.03 16:00:24.821 Test (EURUSD,D1)        "uint a=50" as double:50.00000000
2016.03.03 16:00:24.821 Test (EURUSD,D1)        "int b=-20" as double:-20.00000000
2016.03.03 16:00:24.821 Test (EURUSD,D1)        50.00000000
File:
Test.mq5  2 kb
 
Karputov Vladimir:

fmax confronta due numeri doppi. Quindi va così:

In MQL, viene dichiarata ed eseguita una conversione di tipo implicita. In particolare uint -> double.

La domanda è perché non funziona correttamente con le variabili di input.

 
Andrey Voytenko:

1. Codice semplice:

risultato: 50

2. Aggiungere il modificatore di input:

risultato: 4294967276.

Mi aspettavo un risultato di 50. Dove mi sbaglio?

Per favore, datemi il codice completo.

Ci sono 2 possibilità qui ed entrambe sono sbagliate.

1. Il codice viene eseguito al di fuori di qualsiasi funzione.

2. la variabile di ingresso è dichiarata all'interno della funzione