Come posso ottenere i parametri Open,Low,High,Close in MQL5? - pagina 9

 
Renat Akhtyamov:

Sono abituato alla confezione da 4, è più compatta e più leggibile

;)

il mio esempio compatto è in prima pagina... è praticamente dove tutto è iniziato ))))

 
Igor Makanu:

hmmm, penso che tu abbia dei bit che non vogliono costruire in byte... praticamente non ci sono più opzioni! ))))

se questo thread è sotto lo sguardo di un moderatore, qualcosa deve essere fatto... Ho smontato la macro per le parti,

Artem, funziona almeno?

2019.07.30 19:42:16.639 tst_iXXX_Copy (EURUSD,H1) Inizia il test #1...

2019.07.30 19:42:40.199 tst_iXXX_Copy (EURUSD,H1) CopyClose : loops=500000000 , ms=23422

2019.07.30 19:42:40.199 tst_iXXX_Copy (EURUSD,H1) Inizia il test #2...

2019.07.30 19:43:26.953 tst_iXXX_Copy (EURUSD,H1) iClose : loops=500000000 , ms=46609

2019.07.30 19:43:26.953 tst_iXXX_Copy (EURUSD,H1) Inizia il test #3...

2019.07.30 19:44:12.274 tst_iXXX_Copy (EURUSD,H1) Close[i] : loops=500000000 , ms=45156

2019.07.30 19:44:12.274 tst_iXXX_Copy (EURUSD,H1) Inizia il test #4...

2019.07.30 19:44:42.080 tst_iXXX_Copy (EURUSD,H1) CopyRates : loops=500000000 , ms=29656

2019.07.30 19:44:42.080 tst_iXXX_Copy (EURUSD,H1) Fine script

Sì, funziona:

2019.07.31 00:38:01.936 Start test № 1...
2019.07.31 00:38:31.097 CopyClose : loops=500000000 , ms=29015
2019.07.31 00:38:31.097 Start test № 2...
2019.07.31 00:41:25.095 iClose : loops=500000000 , ms=173875
2019.07.31 00:41:25.095 Start test № 3...
2019.07.31 00:44:29.777 Close[i] : loops=500000000 , ms=184547
2019.07.31 00:44:29.777 Start test № 4...
2019.07.31 00:45:01.074 CopyRates : loops=500000000 , ms=31172
2019.07.31 00:45:01.074 End script

Linea di fondo:

  • 29 secondi CopyClose()
  • 173 secondi iClose()
  • 184 sec Chiudere[]
  • 31 secondi CopyRates()

Cosa c'è che non va? Perché ho una differenza di più di sei volte?

Corsa SZ su D1

 
Artyom Trishkin:

Cosa c'è che non va? Perché ho una differenza di più di sei volte?


Igor Makanu:

hmmm, penso che tu abbia dei bit che non vogliono costruire in byte... praticamente non ci sono più opzioni! ))))

)))

 

Igor Makanu:

hmmm, penso che tu abbia dei bit che non vogliono costruire in byte... praticamente non ci sono più opzioni! ))))

)))

Ho fatto un test su H1, nessuna differenza percettibile:

2019.07.31 00:55:30.290 Start test № 1...
2019.07.31 00:55:58.234 CopyClose : loops=500000000 , ms=27812
2019.07.31 00:55:58.234 Start test № 2...
2019.07.31 00:58:59.095 iClose : loops=500000000 , ms=180734
2019.07.31 00:58:59.095 Start test № 3...
2019.07.31 01:02:06.834 Close[i] : loops=500000000 , ms=187610
2019.07.31 01:02:06.834 Start test № 4...
2019.07.31 01:02:38.365 CopyRates : loops=500000000 , ms=31406
2019.07.31 01:02:38.365 End script

e i bit e i byte non c'entrano niente?

 
Artyom Trishkin:

e i bit e i byte non c'entrano niente?

Non ti dirò che il tuo computer deve essere stupido, vero?

Ho testato diverse volte, Roman ha testato - i risultati sono comparabili.

Per questo test, la velocità del disco rigido non dovrebbe essere critica, non rimane molto: OS, e hardware = memoria + CPU, da qualche parte c'è qualcosa di lento,

c'è naturalmente un'opzione in qualche "mondo interno" Core i3, ho un Core™ i3-4170

 
Igor Makanu:

Non ti dirò che il tuo computer deve essere stupido, vero?

Ho testato diverse volte, Roman ha testato - i risultati sono comparabili

Per questo test, la velocità del disco rigido non dovrebbe essere critica, non rimane molto: OS, e hardware = memoria + CPU, da qualche parte c'è qualcosa che ritarda,

c'è naturalmente un'opzione in qualche "mondo interno" Core i3, ho un Core™ i3-4170

Ho un test EA appeso al secondo simbolo, in cui il controllo dell'evento nel timer è costante. Possiamo supporre che influisca in qualche modo. E solo su funzioninon CopyXXX. Non c'è motivo di rimuoverlo dal grafico al momento - la sua presenza è più importante per i miei affari correnti che per questo test.

 
Artyom Trishkin:

Ho fatto un test su H1, nessuna differenza evidente:

Gli sviluppatori una volta hanno detto che le nuove funzioni iXXX in 5 sono solo un wrapper per le funzioni CopyXXX.

Pertanto, non c'è da aspettarsi alcuna differenza nelle singole interrogazioni.

 
Renat Akhtyamov:
Qual è il verdetto sulla velocità della funzione - quale è più veloce?
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int Count=5000000; // кол-во проходов
//---
void OnStart(void)
  {
   Print("Bench_1: ",Bench_1(Count)," msc");
   Print("Bench_2: ",Bench_2(Count)," msc");
  }
//+------------------------------------------------------------------+
//| Bench_1                                                                 |
//+------------------------------------------------------------------+
ulong Bench_1(const int _count)
  {
   const ulong  StartTime=GetMicrosecondCount();
//---
   for(int i=0; i<Count;i++)
     {
      datetime time  = iTime(Symbol(),Period(),0);
      double   open  = iOpen(Symbol(),Period(),0);
      double   high  = iHigh(Symbol(),Period(),0);
      double   low   = iLow(Symbol(),Period(),0);
      double   close = iClose(NULL,PERIOD_CURRENT,0);
      long     volume= iVolume(Symbol(),0,0);
     }
//---
   return(GetMicrosecondCount() - StartTime);
  }
//+------------------------------------------------------------------+
//| Bench_2                                                                 |
//+------------------------------------------------------------------+
ulong Bench_2(const int _count)
  {
   datetime  time[];
   double    open[];   // Open (цены открытия бара)
   double    high[];   // High (цены максимума бара)
   double    low[];    // Open (цены минимума бара)
   double    close[];    // Open (цены минимума бара)
   long      volume[]; // Close (цены закрытия бара)

   const ulong  StartTime=GetMicrosecondCount();
//---
   for(int i=0; i<Count;i++)
     {
      CopyTime(Symbol(),Period(),1,1,time);
      CopyOpen(Symbol(),Period(),1,1,open);
      CopyHigh(Symbol(),Period(),1,1,high);
      CopyLow(Symbol(),Period(),1,1,low);
      CopyClose(Symbol(),Period(),1,1,close);
      CopyTickVolume(Symbol(),Period(),1,1,volume);
//---
      datetime _time  = time[0];
      double   _open  = open[0];
      double   _high  = high[0];
      double   _low   = low[0];
      double   _close = close[0];
      long     _volume= volume[0];
     
}
//---
   return(GetMicrosecondCount() - StartTime);
  }
//+------------------------------------------------------------------+
l'autore della sceneggiatura non ricorda chi
 
Igor Makanu:

funzionano allo stesso modo, imho gli esperimenti sono per gli esperimenti... ecco l'ultima chiamata di test per mezzo miliardo di volte, beh sì, potete vedere la differenza, l'unica cosa rimasta è capire quanti tick in un minuto (~60), quanti in un tick in un'ora (~3600) e quanti in un giorno (~86400) e quanto questi 23 secondi gireranno per mezzo miliardo di chiamate ...

5 787 giorni = 23 secondi di profitto? se usiamo la funzione più veloce su ogni tick! )))))

imho, usa ciò che è conveniente e non ascoltare nessuno

Ho dimenticato i test e l'ottimizzazione, Igor. È qui che serve la velocità.

 
Andrey Khatimlianskii:

Ho dimenticato i test e l'ottimizzazione, Igor. È lì che serve la velocità.

Sì, beh... Non c'è un gruppo serio di persone qui che discute di questo argomento, quindi mi è completamente sfuggito a cosa serve tutto questo ))))

Hai ragione! - Ma abbiamo bisogno di un uso conveniente delle funzioni CopyOpen()... da fare, e probabilmente se avvolgiamo la chiamata CopyOpen() in una funzione aggiuntiva, allora il guadagno di prestazioni sarà perso.

ZZY: imho, in generale è come dappertutto - se scrivi in assembler, ottieni un lungo tempo di sviluppo e non il fatto che le prestazioni finali saranno più alte che usando C++, che hai scritto in 15 minuti - dovresti controllare