Caratteristiche del linguaggio mql4, sottigliezze e tecniche - pagina 29

 
Vladimir Karputov:

L'ora è la stessa nella finestra deidati?

Sì.

 
Andrey Khatimlianskii:

Sì.

Capisco, quindi è davvero l'ora del bar. Ho solo avuto un sospetto sul parametro"Precise timeline".

Настройки платформы - Начало работы - Справка по MetaTrader 5
Настройки платформы - Начало работы - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая платформа обладает множеством настроек, что позволяет организовать работу в ней так, как это удобно именно вам. Выполните команду " Настройки" меню "Сервис" или нажмите "Ctrl+O". Графики — общая настройка отображения ценовых графиков, а также настройка параметров управления объектами: выделение объектов после их создания, немедленная...
 

Ciao!
Qual è il modo corretto di usare il "doppio" nel ciclo "for"? Sembra che non ci sia alcun divieto di usare "doppio" nell'aiuto. Capisco che devo normalizzare la "i", ma non funziona per me.

double expr1=1.0;
double expr2=2.8;
double step=0.2;
double i;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int count=0;
   for(i=expr1; i<=expr2; i+=step)
     {
      NormalizeDouble(i,1);
      count++;
      Print(" i: ",DoubleToStr(i,8)," step: ",DoubleToStr(step,8));
     }
   int MaxPass=(int)NormalizeDouble(((expr2-expr1)/step),0)+1;
   Print(" MaxPass: ",MaxPass," count: ",count," i: ",i);
  }
//+------------------------------------------------------------------+

Se "expr2=2.6" è ancora ok per 9 iterazioni, ma quando "expr2=2.8" mostra già 9 iterazioni errate (il valore corretto è 10).

 
Nauris Zukas:

Ciao!
Qual è il modo corretto di usare il "doppio" nel ciclo "for"? Sembra che non ci sia alcun divieto di usare "doppio" nell'aiuto. Capisco che devo normalizzare la "i", ma non funziona per me.

Se "expr2=2.6" va ancora bene per 9 iterazioni, ma quando "expr2=2.8" mostra già 9 iterazioni errate (il valore corretto è 10).

Probabilmente devo normalizzare i valori.

 
Alexey Viktorov:

Probabilmente bisogna normalizzare i valori.

Se intendevi questo, non è stato d'aiuto neanche questo:

double expr1=1.0;
double expr2=2.8;
double step=0.2;
double i;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int count=0;
   for(i=NormalizeDouble(expr1,1); i<=NormalizeDouble(expr2,1); i+=NormalizeDouble(step,1))
     {
      NormalizeDouble(i,1);
      count++;
      Print(" i: ",DoubleToStr(i,8)," step: ",DoubleToStr(step,8));
     }
   int MaxPass=(int)NormalizeDouble(((expr2-expr1)/step),0)+1;
   Print(" MaxPass: ",MaxPass," count: ",count," i: ",i);
  }
 
Nauris Zukas:

Se intendevi questo, non è stato d'aiuto neanche questo:

No. Come minimo bisogna ottimizzarlo

double expr1=1.0;
double expr2=2.8;
double step=0.2;
double i;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int count=0;
   for(i=NormalizeDouble(expr1,1); i<=NormalizeDouble(expr2,1); NormalizeDouble(i+=step,1))
     {
      NormalizeDouble(i,1);
      count++;
      Print(" i: ",DoubleToStr(i,8)," step: ",DoubleToStr(step,8));
     }
   int MaxPass=(int)NormalizeDouble(((expr2-expr1)/step),0)+1;
   Print(" MaxPass: ",MaxPass," count: ",count," i: ",i);

perché è quello che vi dà il valore sbagliato. E gli altri potrebbero non doverlo fare.

 
Nauris Zukas:

Ciao!
Qual è il modo corretto di usare il "doppio" nel ciclo "for"? Sembra che non ci sia alcun divieto di usare "doppio" nell'aiuto. Capisco che devo normalizzare la "i", ma non funziona per me.

Se "expr2=2.6", allora tutto è normale 9 iterazioni, ma quando "expr2=2.8" mostra non correttamente 9 iterazioni (correttamente 10).

Qui potete trovare, leggete il post di Nikolay, una descrizione molto dettagliata e molto qualitativa del doppiohttps://www.mql5.com/ru/forum/1111/page2623#comment_14473837

Se non riuscite ad assimilare il materiale dalla prima volta, provate a sostituire Print() con printf() nel vostro codice con l'uscita del doppio almeno alla 15a cifrahttps://www.mql5.com/ru/forum/1111/page2623#comment_14474138.

Forse allora capirai perché è così

 
Alexey Viktorov:

No. Come minimo bisogna ottimizzare questo

perché è quello che vi dà il valore sbagliato. E gli altri potrebbero non doverlo fare.

Grazie, ma anche il tuo esempio non ci ha dato il risultato giusto. In printf potete vedere che non avviene nessuna normalizzazione:

0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.0000000000000000000000000000000000000000000000000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.199999999999999999995559107901499373838305473327636718750000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.399999999999991111182158029987476766109466552734375000000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.59999999999999999866773237044981212151491164199829101562500000000
0 10:29:31595 Test_Double_For EURCHF,H4: i = 1.7999999999999999982236431605997495353221893310546875000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.99999999999997779553950749686919152736638618359375000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 2.1999999999999997335464740899624302983283996582031250000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 2.399999999999999999119182158029987476766109466552734375000000000
0 10:29:31595 Test_Double_For EURCHF,H4: i = 2.6000000000000088817841970012523233890533447265625000000000
0 10:29:31595 Test_Double_For EURCHF,H4: MaxPass: 10 count: 9
0 10:29:31.595 Test_Double_For EURCHF,H4: Last i = 2.800000000002664535259100375697016716003417968750000000

 
Igor Makanu:

Eccolo, leggete il post di Nikolay, ha descritto il lavoro con il doppio in grande dettaglio e con grande qualitàhttps://www.mql5.com/ru/forum/1111/page2623#comment_14473837

Se non riuscite a digerire il materiale dalla prima volta, provate a sostituire Print() con printf() con l'uscita del doppio almeno fino alla 15a cifrahttps://www.mql5.com/ru/forum/1111/page2623#comment_14474138.

Forse allora capirete perché è così.

Grazie, capisco perché succede, per questo ho cercato di normalizzarlo. Non ha funzionato per me. Anche l'opzione di Alexey Viktorov non ha risolto il problema, i valori rimangono non normalizzati. Quindi la domanda rimane, si può usare il "doppio" in un ciclo e ottenere sempre il numero corretto di iterazioni?

 
Nauris Zukas:

Quindi la domanda rimane, "doppio" può essere usato nel ciclo

può

Nauris Zukas:

e ottenere sempre il numero corretto di iterazioni?

il valore di double è sempre corretto, ma non corrisponde al sistema decimale posizionale che vorreste vedere o ottenere

Nauris Zukas:

Grazie, capisco perché questo accade, è per questo che ho cercato di normalizzare. Non ha funzionato per me. Anche l'opzione di Alexey Viktorov non ha risolto il problema, i valori rimangono non normalizzati

Qualsiasi manipolazione con la doppia conversione avrà sempre delle limitazioni, dubito che questo problema possa essere risolto come nei vostri esempi

Fate una soluzione affidabile: nel ciclo usate int e formula per calcolare il valore di risultato del doppio e non usate l'aggiunta del doppio come risultato durante le iterazioni nel ciclo - ancora una volta guardate il mio esempio nel dialogo con Nikolaev