prev_calcolato - pagina 10

 
Dmitry Fedoseev:
Non è così. Ci sarà un'interruzione della connessione di diverse barre, diverse barre saranno non inizializzate con spazzatura.
Alexey Kozitsyn:
O, come ha detto Dmitry sopra, c'è stata un'interruzione di connessione di diverse barre... A proposito, anche prev_calculated restituirà 0 in caso di fallimento della connessione?

A quanto pare c'è stata davvero un'interruzione della comunicazione in questo periodo.

2016.10.19 04:46:13.770 Network '4092672': scanning network finished
2016.10.19 04:45:37.260 Network '4092672': scanning network for access points
2016.10.19 04:45:36.630 Network '4092672': trading has been enabled - hedging mode
2016.10.19 04:45:36.630 Network '4092672': terminal synchronized with MetaQuotes Software Corp.
2016.10.19 04:45:36.000 Network '4092672': previous successful authorization performed from 31.173.80.3 on 2016.10.18 17:51:14
2016.10.19 04:45:36.000 Network '4092672': authorized on MetaQuotes-Demo through Access Point SG Singapore (ping: 583.86 ms)
2016.10.19 04:42:57.680 Network '4092672': connection to MetaQuotes-Demo lost

Ed è molto probabile che quando c'è un'interruzione, prev_calculato restituisca 0.

OK, è stata una lunga pausa, ma cosa ha causato gli altri nulli prev_calcolati?

Da queste righe.

2016.10.18 23:51:34.895 Network '4092672': scanning network finished
2016.10.18 23:51:20.865 Network '4092672': scanning network for access points

Fino a quelli di cui sopra non ci sono altri record, se non quelli commerciali come questo.

2016.10.19 00:00:36.066 Trades  '4092672': cancel order #103987819 buy stop 0.10 USDJPY at 103.977 sl: 103.377 tp: 104.077

E potete vedere quanti azzeramenti di prev_calcolato c'erano nel mio post precedente.

 
Alexey Kozitsyn:

Potenzialmente, la colpa potrebbe essere qui:

if(rates_total > prev_calculated)
   {
    minEquity = 0;
    maxEquity = 0;
   }
   minEquity = NormalizeDouble(fmin((minEquity == 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);

Quando arriva una nuova barra, si resettano i valori a 0 - bene. Ma poi si controlla minEquity e 0 per l'uguaglianza, il che non è raccomandato.

Per provare le mie parole, ecco la sua immagine. Potete vedere che i valori "spazzatura", come avete detto, sono circa zero.

Naturalmente, è meglio aggiungere una finestra di dati nell'immagine con il valore "cestino".

Puoi spiegare perché questo metodo non è raccomandato?

Questa parte di codice (minEquity == 0? bal : minEquity), se minEquity == 0, restituirà il valore di bal che è stato ottenuto in precedenza; il valore di minEquity non cambierà fino alla fine della funzione fmin().

Anche se sono d'accordo che tale scrittura è un po' rischiosa... ma non è questo il problema.

 
Alexey Viktorov:

Puoi spiegare più dettagliatamente perché questo metodo non è raccomandato?

questa (minEquity == 0? bal : minEquity) parte del codice, se minEquity == 0, restituirà il valore di bal ottenuto in precedenza; il valore di minEquity non cambierà finché la funzione fmin() non termina

Anche se sono d'accordo che questo modo di scrivere il codice è un po' rischioso... ma non è questo il problema.

Parlavo specificamente di questo: minEquity ==0. Stai confrontando un numero uguale di doppi. Questo potrebbe spiegare il calo dei valori a 0.
 
Alexey Kozitsyn:
Parlavo specificamente di questo: minEquity ==0. State confrontando sull'uguaglianza dei numeri solitari. Questo potrebbe spiegare il calo dei valori a 0.

Vedo, la risposta corretta è minEquity ==0,0 ... Non riesco ad abituarmi.

E l'ultima frase non la capisco affatto. Quali valori a 0?

 
Alexey Viktorov:

Vedo, la risposta corretta è minEquity ==0,0 ... Non riesco ad abituarmi.

E l'ultima frase non la capisco affatto. Quali valori a 0?

Ma non so se una conversione di tipo implicita può causare un errore. Intendevo il confronto di tipi reali. Cioè qui, per essere sicuri, lo scriverei così:

CompareDoubles( minEquity, 0.0 );

bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false);
  }
 
Alexey Kozitsyn:

Tuttavia, non so se una conversione implicita di tipo possa causare un errore, stavo parlando, in linea di principio, di confrontare tipi reali. Cioè qui, per affidabilità, lo scriverei così:

CompareDoubles( minEquity, 0.0 );

bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false);
  }


Sì, la mia versione conta i soldi con due cifre decimali. Questa non è una citazione per essere così meticolosi.
 
Alexey Viktorov:
Sì, la mia versione conta i soldi con due cifre decimali. Questa non è una citazione, quindi non si può essere così precisi.

Non è una questione di meticolosità, è una questione di precisione. Nel vostro caso, potrebbe risultare in un valore zero scritto nel buffer. Se non volete questa precisione, fate così:

if(rates_total > prev_calculated)
   {
    minEquity = -1.0;
    maxEquity = 0.0;
   }
   minEquity = NormalizeDouble(fmin((minEquity < 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);

Allora non ci sarà nessun errore.

 
Alexey Kozitsyn:

Non è una questione di meticolosità, è una questione di precisione. Nel vostro caso, potrebbe risultare in un valore zero scritto nel buffer. Se non volete questa precisione, fate così:

if(rates_total > prev_calculated)
   {
    minEquity = -1.0;
    maxEquity = 0.0;
   }
   minEquity = NormalizeDouble(fmin((minEquity < 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);

Non ci sarà nessun errore in questo caso.

Perché sono così stupido? Come ho fatto a non capire che è meglio inizializzare minEquity con un valore diverso da zero? Allora tutto sarà più facile...

if(rates_total > prev_calculated)
   {
    minEquity = DBL_MAX;
    maxEquity = 0.0;
   }
   minEquity = NormalizeDouble(fmin(minEquity, equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);

Potete anche usare maxEquity = DBL_MIN;

 
Alexey Viktorov:

Perché sono così stupido? Come ho fatto a non capire che è meglio inizializzare minEquity con un valore diverso da zero? Allora tutto sarebbe più facile...

if(rates_total > prev_calculated)
   {
    minEquity = DBL_MAX;
    maxEquity = 0.0;
   }
   minEquity = NormalizeDouble(fmin(minEquity, equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);


Bene... o così...
 
Alexey Kozitsyn:
Bene... O così...
Non è proprio questo il problema. Anche se è stato in qualche modo aggirato, la spazzatura nel buffer dell'indicatore quando l'indicatore parte non è giusta.