Testare 'CopyTicks'. - pagina 39

 
 
fxsaber:

Non dovrebbe essere lento e dipendente dal server di trading.

Velocità di consegna: il terminale memorizza 4096 ultimi tick per ogni simbolo nella cache per un accesso rapido (per i simboli con statistica corrente - 65536 tick), le richieste a questi dati sono più veloci. Quando si richiedono i tick della sessione di trading corrente al di fuori della cache, CopyTicks() accede ai tick già memorizzati nella memoria del terminale, queste richieste richiedono più tempo per essere eseguite. Le più lente sono le richieste di tick per altri giorni, perché in questo caso i dati vengono letti dal disco.

Se i terminali sono sullo stesso disco, avete ragione.

Avete fatto diversi test? Sperimentate costantemente dei ritardi su un certo server? Solo nel caso in cui il disco fosse occupato con qualche altra operazione al momento del test...

 
Alexey Kozitsyn:

Se i terminali sono sulla stessa unità, hai ragione.

Avete eseguito più test? La latenza è costantemente su un server particolare? Solo nel caso in cui l'unità fosse impegnata in qualche altra operazione al momento del test...

È riproducibile al 100%. Il terminale è lo stesso.

 

Come ottenere i tick nell'indicatore OnDeinit? Voglio ottenere dei tick, che esistono già nei file tkc e che sono dati quasi istantaneamente. Ma come determinare quali zecche ci sono e quali no?

Dietro tutta l'apparente attrattiva della semplicità di CopyTicks, ci sono in realtà delle insidie nascoste, che sono impossibili da evitare a causa della funzionalità limitata per il bene di questo appello esterno di nuovo.

 
fxsaber:

Come ottenere i tick nell'indicatore OnDeinit? Voglio ottenere dei tick, che esistono già nei file tkc e che sono dati quasi istantaneamente. Ma come determinare quali zecche ci sono e quali no?

Dietro tutta l'apparente attrattiva della semplicità di CopyTicks, ci sono in realtà delle insidie nascoste, che sono impossibili da evitare a causa della funzionalità limitata per il bene di questo appello esterno di nuovo.

Perché dovremmo ottenere i tick in OnDeinit()?
 
Alexey Kozitsyn:
Perché ottenere i tick in OnDeinit()?

Devi creare un simbolo personalizzato e scriverci tutta la storia dei tick convertiti (da una certa data) che esiste già nei file tkc. Le zecche, che non sono sulla macchina, non sono interessanti. Pertanto, l'indicatore non dovrebbe rallentare in questo compito. Tuttavia, CopyTicks non permette di ricevere tick in questo modo.

 
Cercare di ottenere tick su un altro simbolo in OnInit
#include <Trade\Trade.mqh>

bool OpenPos( const string Symb )
{
  static CTrade Trade;
  
  return(Trade.Buy(1, Symb));
}

void OnInit()
{
  Sleep(3600 * 1000);    
  
  OpenPos("NZDUSD"); // Заставляем Агент получить тики по чужому символу

  MqlTick Ticks[];
  
  Print(CopyTicks("NZDUSD", Ticks, COPY_TICKS_INFO, 0, 5)); // 0
  
  ArrayPrint(Ticks);
}


Risultato

MetaTester 5 started on 127.0.0.1:3000
initialization finished
login (build 1653)
template file tester.tpl added. 2398 bytes loaded
38520 bytes of account info loaded
1482 bytes of tester parameters loaded
188 bytes of input parameters loaded
3456 bytes of symbols list loaded
expert file added: Experts\Test4.ex5. 44667 bytes loaded
initial deposit 10000000.00 USD, leverage 1:500
successfully initialized
48 Kb of total initialization data received
Intel Core i7-2700 K  @ 3.50 GHz, 16301 MB
EURUSD: symbol to be synchronized
EURUSD: symbol synchronized, 3464 bytes of symbol info received
EURUSD: history synchronization started
EURUSD: load 27 bytes of history data to synchronize in 0:00:00.000
EURUSD: history synchronized from 2016.01.04 to 2017.10.11
EURUSD: ticks synchronization started
EURUSD: load 34 bytes of tick data to synchronize in 0:00:00.000
EURUSD: history ticks synchronized from 2017.04.03 to 2017.10.10
EURUSD,M1: history cache allocated for 667542 bars and contains 651824 bars from 2016.01.04 00:00 to 2017.09.29 23:59
EURUSD,M1: history begins from 2016.01.04 00:00
EURUSD,M1 (MetaQuotes-Demo): generating based on real ticks
EURUSD,M1: testing of Experts\Test4.ex5 from 2017.10.01 00:00 to 2017.10.11 00:00 started
EURUSD : real ticks begin from 2017.04.03 00:00:00
EURUSD : 2017.10.01 00:00 - 2017.10.11 00:00  last prices absent for 7 whole days, bars built by bid prices
NZDUSD: symbol to be synchronized
NZDUSD: symbol synchronized, 3464 bytes of symbol info received
NZDUSD: history synchronization started
NZDUSD: load 27 bytes of history data to synchronize in 0:00:00.000
NZDUSD: history synchronized from 2016.01.04 to 2017.10.11
NZDUSD: ticks synchronization started
NZDUSD: load 34 bytes of tick data to synchronize in 0:00:00.000
NZDUSD: history ticks synchronized from 2017.10.02 to 2017.10.10
2017.10.01 01:00:00   instant buy 1.00 NZDUSD at 0.72043 (0.72017 / 0.72043)
2017.10.01 01:00:00   deal #2 buy 1.00 NZDUSD at 0.72043 done (based on order #2)
2017.10.01 01:00:00   deal performed [#2 buy 1.00 NZDUSD at 0.72043]
2017.10.01 01:00:00   order performed buy 1.00 at 0.72043 [#2 buy 1.00 NZDUSD at 0.72043]
2017.10.01 01:00:00   CTrade::OrderSend: instant buy 1.00 NZDUSD at 0.72043 [done at 0.72043]
2017.10.01 01:00:00   true
2017.10.01 01:00:00   0
NZDUSD : real ticks begin from 2017.10.02 00:00:00
NZDUSD : 2017.10.01 00:00 - 2017.10.11 00:00  last prices absent for 7 whole days, bars built by bid prices


Cioè non ci sono dati di spunta all'inizio sul personaggio di qualcun altro. E i tick sono generati nel database quando appare OnTick. È stato progettato in questo modo o le spunte per i personaggi alieni dovrebbero essere disponibili, così come per il simbolo principale del test?

 
Cosa significa questa citazione della Documentazione?

Примечание

La funzione CopyTicksRange() è progettata per richiedere i tick di un intervallo strettamente specificato, per esempio, per un giorno particolare nella storia. Mentre CopyTicks()permette dispecificare solo la data di inizio, per esempio - per ottenere tutti i tick dall'inizio del mese al momento attuale.

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicksRange
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicksRange
  • www.mql5.com
[out]  Cтатический или динамический массив MqlTick для приема тиков. Если в статический массив не вмещаются все тики из запрошенного интервала времени, то будет получено столько тиков, сколько помещается в массив. При этом функция сгенерирует ошибку ERR_HISTORY_SMALL_BUFFER (4407) . ERR_NOT_ENOUGH_MEMORY – не хватает памяти для получения...
 

CopyTicks funziona solo con i caratteri che sono inclusi nel Market Review. E questo è sempre stato logico prima dell'avvento dei simboli personalizzati.

I simboli personalizzati hanno un enorme campo di applicazione e non è sempre necessario che questi simboli siano richiesti nel Market Watch. Tuttavia, a volte è necessario ottenere una parte della storia dei tick tramite CopyTicks.

Pertanto, si prega di disabilitare il ritorno di errore CopyTicks per i simboli personalizzati se quello personalizzato non è selezionato in Market Watch.

 
Per i caratteri personalizzati, per scoprire il numero totale di tick, dovete usare CopyTicksRange(Symb, Ticks) ( più questo) e guardare la dimensione dell'array. Ma questo è molto dispendioso!
Motivazione: