Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 41

 
Slava:
Hai dimenticato di specificare che l'inizio della misurazione è all'inizio del primo OnTick. La fine della misurazione è all'inizio di OnDeinit.
O all'inizio di OnTester, perché
// После окончания бэктеста сначала вызывается OnTester, затем OnDeinit

In argomento

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Bug, bug, domande

fxsaber, 2016.08.25 11:13

Ciclo di vita
// Возвращает true, если полностью выполнился OnTick() на последнее событие NewTick в тестере - окончание бэктеста. Иначе - false.
   static bool BACKTEST::IsEnding(void)
     {
      return(::TesterStatistics(STAT_BALANCEMIN) > 0);
     }
 
fxsaber:
O all'inizio di OnTester, come


E restituire il risultato della misurazione come codice di ritorno da OnTester
 
Slava:
E restituire il risultato della misurazione come codice di ritorno da OnTester

Non ho ancora testatoGetTickCount nel tester. Ho supposto che questa funzione sarà emulata dal tester, il che può essere logico in alcune situazioni.

A proposito, come capire il tempo corrente nel tester al ms più vicino? SymbolInfoTick+Tick.time_msc permette di scoprire il tempo della chiamata OnTick del simbolo principale. E così anche per controllare la correttezza della modalità di slittamento del tester. Ma sembra che non ci sia altro modo.


In realtà, volevo chiedere qualcos'altro. Per automatizzare un batch nell'ottimizzatore con lo scarto del primo e dell'ultimo valore, dovrei agire attraverso i frame (per passare OnTester-result), o il risultato sarà distorto?

 
GetTickCount nel tester funziona normalmente e non è emulato, a differenza di Sleep
 
fxsaber:

In realtà, volevo chiedere qualcos'altro. Per automatizzare i banchi nell'ottimizzatore con lo scarto del primo e dell'ultimo valore, ho bisogno di agire attraverso i frame (per passare l'OnTester-result), o il risultato sarà distorto?

Non deve. Viene inviato dopo la misurazione. Prova
 
Slava:
Non usare un timer a microsecondi per le misure di massa. Usa il regolare millisecondo GetTickCount.

GetMicrosecondCount rallenta il tester più di GetTickCount (o è emulato)?

O il fallimento di EventSetMillisecondTimer era voluto?

 
fxsaber:

GetMicrosecondCount rallenta il tester più di GetTickCount (o è emulato)?

O il fallimento di EventSetMillisecondTimer era voluto?

Intendevo GetMicrosecondCount. Non posso dire con certezza se rallenta il server. Può avere un effetto indiretto. Pertanto, è meglio usare il nativo GetTickCount del sistema

GetMicrosecondCount è usato per misurare brevi periodi di esecuzione del codice. Per misurare un gran numero di esecuzioni OnTick, è meglio usare GetTickCount.

Prova a usare GetMicrosecondsCount invece di GetTickCount quando ottieni risultati stabili. Me ne parlerai qui. Forse mi sto preoccupando troppo.

 
Ci sono due tabelle di storia corrente i cui dati sono accessibili tramite le funzioni di storia - la tabella Ordini e la tabella Affare.

Il loro contenuto può essere influenzato solo attraverso le funzioni HistorySelect. E succede come segue

  • HistorySelect e HistorySelectByPosition - influenzano entrambe le tabelle contemporaneamente.
  • La HistoryDealSelect influenza SOLO la tabella Deals (non ha effetto sulla tabella Ordini-storia corrente).
  • HistoryOrderSelect influenza SOLO la tabella Ordini (non influenza la tabella Deals-history corrente).

 
Negli ordini è possibile impostare il campo Request.expiration fino a LONG_MAX + 2 incluso. Il suo valore sarà completamente disponibile tramite ORDER_TIME_EXPIRATION se l'ordine è attivo (non nella tabella della storia).
 
Il PositionIdentifier delle operazioni di saldo è zero. Quindi è facile scrivere, per esempio, questa funzione
// Возвращает сумму всех балансовых не торговых операций (начисления + списания)
double GetSumBalanceOperations( void )
{
  double Res = 0;
  
  if (HistorySelectByPosition(0))
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
      Res += HistoryDealGetDouble(HistoryDealGetTicket(i), DEAL_PROFIT);
      
  return(Res);
}

DEAL_ENTRY di tali operazioni è DEAL_ENTRY_IN (0).

Motivazione: