Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 973

 

Salve.

Per favore, aiutatemi a capire. Quando si controlla il funzionamento di un semplice array (assegnare un valore);

a[0][2]=91.49999999993754;

Print("a[0][2]=",a[0][2]);

H= 1/(1+exp(-a[0][2]));

a[0][2]=H;

Stampa(" 1/(1+exp(-a[0][2]))=",1/(1+exp(-a[0][2]), " H=",H," a[0][2]=",a[0][2]);


Ottengo il risultato:

2019.09.21 13:21:44.328 2011.01.03 14:54:20 W EURUSD,H4: a[0][2]=91.4999999999993754

2019.09.21 13:21:44.328 2011.01.03 14:54:18 W EURUSD,H4: 1/(1+exp(-a[0][2]))=0.7310585786300049 H=1.0 a[0][2]=1.0

Come mai?

 
im-zvv:

Salve.

Per favore, aiutatemi a capire. Quando si controlla il funzionamento di un semplice array (assegnare un valore);

a[0][2]=91.49999999993754;

Print("a[0][2]=",a[0][2]);

H= 1/(1+exp(-a[0][2]));

a[0][2]=H;

Stampa(" 1/(1+exp(-a[0][2]))=",1/(1+exp(-a[0][2]), " H=",H," a[0][2]=",a[0][2]);


Ottengo il risultato:

2019.09.21 13:21:44.328 2011.01.03 14:54:20 W EURUSD,H4: a[0][2]=91.4999999999993754

2019.09.21 13:21:44.328 2011.01.03 14:54:18 W EURUSD,H4: 1/(1+exp(-a[0][2]))=0.7310585786300049 H=1.0 a[0][2]=1.0

Come mai?

Questo è un esempio difficile da riprodurre, ma ho il sospetto che a causa della conversione dei tipi si ottiene un risultato diverso da quello che ci si aspetta.

Sperimentate con questo codice:

void OnStart()
{
   double a;
   int b = 2;
   a = b / 5;     //    a = 0.0
   Print("a = ",a);  
}

poi con questo:

void OnStart()
{
   double a;
   int b = 2;
   a = b /(double) 5;     //    a = 0.4
   Print("a = ",a);  
}

и

void OnStart()
{
   double a;
   int b = 2;
   a = b / 5.0;     //  a = 0.4
   Print("a = ",a);  
}

e fare una ricerca sul forum per "numeri reali", insomma, la conversione C è un po' confusa all'inizio ;)

 

Hai mostrato un mucchio di esempi che usano variabili int.

Le mie variabili sono tutte doppie.

Quindi, convertire le variabili nello stesso formato non funzionerà.

 
im-zvv:

Hai mostrato un mucchio di esempi che usano variabili int.

Le mie variabili sono tutte doppie.

Quindi la conversione della variabile nello stesso formato non funzionerà.

a[0][2]=91.49999999993754;

Print("a[0][2]=",a[0][2]);

H= 1/(1+exp(-a[0][2]));

a[0][2]=H;

Stampa(" 1/(1+exp(-a[0][2]))=",1/(1+exp(-a[0][2]), " H=",H," a[0][2]=",a[0][2]);


Ottengo il risultato:

2019.09.21 13:21:44.328 2011.01.03 14:54:20 W EURUSD,H4: a[0][2]=91.4999999999993754

2019.09.21 13:21:44.328 2011.01.03 14:54:18 W EURUSD,H4: 1/(1+exp(-a[0][2]))=0.7310585786300049 H=1.0 a[0][2]=1.0

Come mai?

Hai delle costanti intere così come l'esempio stesso non è riproducibile - nessun tipo di variabile, bene in generale - il mio "mucchio di esempi" può essere calcolato senza PC, il tuo esempio... Dimmi solo cos'è e^(-91,49999).

Ok, lascia perdere, non posso aiutarti.

 

È un peccato che "non può aiutare"...

La domanda non è quanto e^(-91,49999). La domanda è perché una variabile di tipo double = H, è erroneamente scritta

calcolato prima numero di tipo double =0.7310585786300049 , ma è scritto 1.0 (incidentalmente double).

Se provate ad usare il mio codice nel tester, penso che il vostro MT4 visualizzerà la stessa cosa.

Se è così, semplicemente non potete usare MQL4 per lavoro ed è pericoloso!

 
im-zvv:

Peccato... "non può aiutare"...

Ho aiutato, aiutare non significa farlo per me o non lo leggerò comunque, e mi interessa il risultato!

im-zvv:

Se è così, MQL4 semplicemente non può essere usato per lavoro ed è pericoloso!

Il comportamento di MQL4 / MQL5 nel calcolo delle espressioni matematiche è lo stesso che in C++. Puoi andare in qualsiasi forum C++ con la tua domanda, forse una risorsa ti aiuterà lì

La tua domanda si è spostata dall'aiuto/spiegazione/insegnamento alla discussione sulla piattaforma MT, non ti piace, l'hai ricevuta gratis?

... Nell'antichità la mancanza di comprensione dei processi fisici causava la paura del panico nella gente, il tuono o il terremoto... all'inizio ha causato panico e speculazione, poi è arrivata la religione ))))

 

Non avresti dovuto essere così arrabbiato.

Se ho ferito i vostri sentimenti personali, mi scuso sinceramente.

Non sto affatto discutendo o giudicando MT4. Ho semplicemente suggerito di eseguire

Ho appena proposto di eseguire il codice che ti ho mandato nel tester di MT4 e se tutte le variabili (H,a[0][2])

sono definiti come doppi e il risultato è lo stesso che per me, ho una domanda:

Qual è il problema? L'ho indirizzato a te.

Ancora una volta:mi dispiace... "non posso aiutare"...

Addio.

 
im-zvv:

che tutte le variabili (H,a[0][2])

sono definiti come doppio

Ancora una volta - hai delle costanti nella tua espressione matematica? - il mio esempio ha anche la costante 5 ... poi ho scritto 5.0 - non è lo stesso per il compilatore! e poi ho portato esplicitamente la costante intera 5 al tipo double ---> per il compilatore sarà lo stesso dell'esempio sopra 5.0


La tua domanda si ripete regolarmente sul forum, anche se potrei non vedere qual è la tua domanda - hai una "formula pesante" e variabili non ovvie - rimuovi il superfluo dagli esempi - array ed esponente - poi vedrai qual è il problema, anche se se rimuovi tutto il superfluo, molto probabilmente troverai dove hai ottenuto non quello che ti aspettavi - io di solito lo faccio ;)


HH: e l'esponente alla potenza di meno 91,49 - non è un numero molto piccolo? tipo doppio ha grande precisione, ma alla centesima potenza e tenendo conto del segno meno - a mio parere, questa espressione perderà precisione, non voglio google, ma la prima cosa che ho scorrere questo Wiki

 

Grazie per la vostra pazienza!

Provato questo:

A=91.49999999993754;//a[0][2]=91.49999999993754;

Stampa("A=",A);

H= 1/(1+exp(-A));

//A=H;

Stampa("1/(1+exp(-A))=",1/(1+exp(-A)), " H=",H," a[0][2]=",a[0][2]);

Risultato:

2019.09.21 16:14:17.691 2011.01.04 22:29:51 W EURUSD,H4: A=91.499999999999993754

2019.09.21 16:14:17.690 2011.01.04 22:29:50 w EURUSD,H4: 1/(1+exp(-A))=1.0 H=1.0 a[0][2]=0.0

!!!!! Questo mostra che 1/(1+exp(-91.49999999993754))=1.0 ma se lascio come nel codice A=H allora il calcolo continua nel comando Print (

Cercherò di scoprire perché 1/(1+exp(-91.49999999993754))=1.0.

Vi prego di capirmi. Sono occupato ora con la messa a punto e l'addestramento della rete neurale. Il codice stesso è grezzo e anche io mi ci confondo... :)

Ho notato che la rete ripete gli errori. E l'errore principale è nel calcolo del sigmoide. NON DOVREBBE ESSERE =1.


 
im-zvv:

Grazie per la vostra pazienza!

Provato questo:

A=91.49999999993754;//a[0][2]=91.49999999993754;

Stampa("A=",A);

H= 1/(1+exp(-A));

//A=H;

Stampa("1/(1+exp(-A))=",1/(1+exp(-A)), " H=",H," a[0][2]=",a[0][2]);

Risultato:

2019.09.21 16:14:17.691 2011.01.04 22:29:51 W EURUSD,H4: A=91.499999999999993754

2019.09.21 16:14:17.690 2011.01.04 22:29:50 w EURUSD,H4: 1/(1+exp(-A))=1.0 H=1.0 a[0][2]=0.0

!!!!! Questo mostra che 1/(1+exp(-91.49999999993754))=1.0 ma se lascio come nel codice A=H allora il calcolo continua nel comando Print (

Cercherò di scoprire perché 1/(1+exp(-91.49999999993754))=1.0.

Vi prego di capirmi. Sono occupato ora con la messa a punto e l'addestramento della rete neurale. Il codice stesso è grezzo e anche io mi ci confondo... :)

Ho notato che la rete ripete gli errori. E l'errore principale è nel calcolo del sigmoide. NON DEVE ESSERE =1.


Quindi non troverete nulla, è quello che ho deciso di controllare, dovete cercare dove è il bug o l'imprecisione nel codice:

void OnStart()
  {
      double a=91.49999999993754;
      Print("1. a = ",a);
      double H= 1/(1+exp(-a));
      a=H;
      Print("2. a = ",a);
      Print("3. H = ",H);
      double e = exp(-91.49999999993754);
      Print("4. e = ",e);
  }

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 4. e = 1.828331349163451e-40

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 3. H = 1.0

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 2. a = 1.0

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 1. a = 91.49999999993754

e poi calcolare per passi e ristampare i risultati, ma secondo me nel passo #4 la precisione diminuirà già, il mio risultato è il seguente: 1.82 x 10^(-40) - questo è un numero molto piccolo e qualsiasi operazione con tali numeri piccoli in futuro perderà ulteriormente più precisione, questa è una cosiddetta "magia" quando si lavora con i numeri reali - per non perdere la precisione con tali numeri piccoli per cercare di fare calcoli in numeri interi o in doppio, ma senza perdere numero mantissa - è necessario moltiplicare per 10^40 ... - poi in generale bisogno di contare, quindi vai avanti io non aiuterà