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

 
Maxim Kuznetsov:

Alert("Разбег "+DoubleToString(delta,_Digits));

o Alert(StringFormat("Spread %.5f",delta));

in generale, abituatevi, sono solo rappresentazioni diverse dello stesso numero. Ripensate ai vostri meravigliosi anni di scuola - ecco da dove viene.

Grazie. Ma cosa succede se ho bisogno di usare il valore delta come un numero e confrontarlo? Per esempio.

if(delta>0.00005)
  {
   //------------
  }
Sarebbe corretto?
 
prom18:

Grazie. E se ho bisogno di usare il valore delta come numero e confrontare? Per esempio.

È corretto?

Si possono confrontare due numeri reali in questo modo:

bool EqualDoubles(double d1,double d2,double epsilon)
  {
   if(epsilon<0) 
      epsilon=-epsilon;
//---
   if(d1-d2>epsilon) 
      return false;
   if(d1-d2<-epsilon) 
      return false;
//---
   return true;
  }

https://www.mql5.com/ru/docs/basis/types/double

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Вещественные типы (или типы с плавающей точкой) представляют значения, имеющие дробную часть. В языке MQL5 есть два типа для чисел с плавающей точкой. Способ представления вещественных чисел в машинной памяти определен стандартом IEEE 754 и не зависит от платформ, операционных систем и языков программирования. Константы с плавающей точкой...
 
Mihail Matkovskij:

Si possono confrontare due numeri reali in questo modo:

https://www.mql5.com/ru/docs/basis/types/double

Si può, se si è sicuri che non possono essere molto vicini nel significato. Dopo tutto, morbido è paragonato a caldo.
 
Alexey Viktorov:
Puoi, se sei sicuro che non possono essere molto vicini come valore. Dopo tutto, morbido è paragonato a caldo.

Non capisco. Per esempio. Prendo il numero di pip che il prezzo ha passato in un tick. Se il prezzo è passato più di 20 punti, allora ricevo un allarme.

Confronto la differenza di prezzo (1,12300-1,12321=0,00021) con il valore massimo necessario (0,00020).

0.00021>0.00020.

Che cosa ha a che fare questo con il morbido e il caldo?

 
prom18:

Non capisco. Per esempio. Prendo il numero di pip che il prezzo ha passato in un tick. Se il prezzo è passato più di 20 punti, allora ricevo un allarme.

Confronto la differenza di prezzo (1,12300-1,12321=0,00021) con il valore massimo necessario (0,00020).

0.00021>0.00020.

Che cosa ha a che fare questo con il morbido e il caldo?

hai bisogno di punti, quindi confronta i punti.

e il doppio è paragonato all'epsilon (DBL_EPS se la memoria non mi inganna), altrimenti si potrebbe ottenere 3.0-0.2 > 2.0+0.8 (in senso figurato, le cifre potrebbero essere diverse)

 
Maxim Kuznetsov:

avete bisogno di punti, quindi confrontate i punti. sono interi, a proposito.

mentre il doppio viene confrontato con l'epsilon (DBL_EPS se la memoria non mi inganna), altrimenti si può ottenere 3.0-0.2 > 2.0+0.8 (in senso figurato, i numeri possono essere diversi)

Meglio usare l'esempio di@fxsaber per questo scopo:

int PriceToInteger( const double Price, const double point )
{
   return((int)(Price / point + 0.1));
}

script da controllare:

//+------------------------------------------------------------------+
void OnStart()
{
   int bar1 = PriceToInteger(iClose(NULL, 0, 1), _Point);
   int bar2 = PriceToInteger(iClose(NULL, 0, 2), _Point);
   printf("bar2 - bar1 = %i point", bar2 - bar1);
}
//+------------------------------------------------------------------+
int PriceToInteger( const double Price, const double point )
{
   return((int)(Price / point + 0.1));
}
//+------------------------------------------------------------------+
 
prom18:

Non capisco. Per esempio. Prendo il numero di pip che il prezzo ha passato in un tick. Se il prezzo è passato più di 20 punti, allora ricevo un allarme.

Confronto la differenza di prezzo (1,12300-1,12321=0,00021) con il valore massimo necessario (0,00020).

0.00021>0.00020.

Che cosa ha a che fare questo con il morbido e il caldo?

Beh, a volte non c'è bisogno di leggere tutto quello che viene scritto.

Avete preso dei numeri che sono normalmente rappresentati dal sistema. Prendi questi...

  double a=1.12328,
         b=1.12309,
         c=0.00019,
         d=a-b;

e si ottiene

1.1232800000000001
1.1230899999999999
0.00019
0.000190000000000135

L'idea è a-b==c, ma il computer vi darà questi errori. È stato scritto molto sul forum, cercate e leggete.

Ma puoi prendere la differenza normalizzata e il valore di controllo normalizzato e confrontarli.

 
Иван:
Buon tempo a tutti voi. Domanda: in MT4, quando si lavora nel tester con i cross (coppie senza quid), come fa il tester a calcolare i risultati delle posizioni chiuse, se il conto, sul quale viene condotto il test, è un conto in dollari? Per il ricalcolo dei totali di posizione in dollari, il tester prende il tasso di cambio della valuta base del cross verso il dollaro al momento attuale o al momento dell'intervallo testato? Ho il forte sospetto che lo sia al momento attuale. Se è così, è impossibile farlo calcolare al momento dell'intervallo?
Qualcuno lo sa?
 
Иван:
Qualcuno lo sa?

conta il MODE_TICKVALUE stesso per ogni tick.

 
Alexey Viktorov:
Potresti, se sei sicuro che non possono essere molto vicini come valore. Dopo tutto, morbido è paragonato a caldo.

Seprom18 ha bisogno di confrontare due numeri, all'interno di segni di cifre, questo è l'unico metodo che funziona:

double price1 = 1.23450;
double price2 = 1.23447;

if(EqualDoubles(price1, price2, ((_Digits == 4) ? 0.0100 : 0.00100)) {
  ...
}

Ma come potete vedere, ha ancora più variazioni: https://www.mql5.com/ru/forum/160683/page1205#comment_17247843. Pertanto, nell'esempio ho ridotto intenzionalmente la precisione del confronto di due cifre. Naturalmente, un tale spread nei valori di prezzo è abbastanza impreciso... Ma come altro confrontare due numeri in casi come questo...? Se la deviazione fosse superiore alle cifre, allora non potremmo usare EqualDouble, ma usare NormalizeDouble per tagliare tutte le cose inutili.

Anche se si potrebbe anche fare così:

int digits = Digits() - 2;

double price1 = NormalizeDouble(1.23450, digits);
double price2 = NormalizeDouble(1.23447, digits);

if(price1 == price2) {
  ...
}
Motivazione: