Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 67

 
fxsaber:
La sfumatura del confronto tra interi su un esempio reale

Avete intenzione di misurare esattamente un secondo con Sleep(1000)?

E non sa che il timer del processore ha un errore di 15 ms?

 
Slava:

Avete intenzione di far scivolare Sleep(1000) per misurare esattamente un secondo?

Sapete che il timer della CPU ha un margine di errore di 15 ms?


Ciao, potresti dirmi se c'è un modo per resettare il buffer del timer per eliminare l'errore di impostazione del timer?

 
Vladislav Andruschenko:

Ciao, potresti dirmi se c'è un modo per resettare il buffer del timer per evitare un errore di impostazione del timer?

Si verifica un errore di impostazione del timer perché la coda dei messaggi di sistema è piena. Ci potrebbero essere molte ragioni per questo. In genere, l'overflow della coda è temporaneo (se non lo è, non sarete in grado di lavorare sul vostro computer)

Usa OnTick per monitorare il timer. Se il timer non è impostato, impostatelo su OnTick

Nel frattempo, stiamo lavorando per rendere le impostazioni del timer indipendenti dallo stato della coda dei messaggi.

PS L'abilitazione del timer di sistema e l'impostazione del timer per un'applicazione non sono correlate

 
Slava:

Avete intenzione di far scivolare Sleep(1000) per misurare esattamente un secondo?

No, si tratta di queste due linee di confronto tra interi.

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

Caratteristiche del linguaggio mql5, sottigliezze e trucchi

fxsaber, 2018.01.24 21:48

La sfumatura del confronto tra interi con un esempio reale
//  if (GetMicrosecondCount() > StartTime + 1000000) // Неправильно
  if (GetMicrosecondCount() - StartTime > 1000000) // Правильно

A prima vista, entrambe le linee dovrebbero dare gli stessi risultati. Ma non è così. Il primo a volte darà un risultato sbagliato.

L'esempio con il tempo è scelto solo per chiarezza.
Slava:

E il fatto che il timer del processore abbia un errore di 15ms, vi è sconosciuto?

È strano che stiate ancora usando GetTickCount. È stato dimostrato sul forum (troppo pigro per cercare) che un timer di microsecondi non è più lento di un timer di millisecondi. Allo stesso tempo non ha nessun errore selvaggio.

 
fxsaber:

No, si tratta di queste due stringhe di confronto tra interi.

A prima vista, entrambe le stringhe dovrebbero dare gli stessi risultati. Ma non è questo il caso. Il primo darà a volte il risultato sbagliato.

L'esempio con il tempo è scelto solo per chiarezza.

È strano che stiate ancora usando GetTickCount. È stato dimostrato sul forum (sono troppo pigro per cercarlo) che il timer a microsecondi non è più lento di quello a millisecondi. Allo stesso tempo non ha nessun errore selvaggio.

Voglio dire Sleep(1000)
 
Slava:

Si verifica un errore del timer perché la coda dei messaggi di sistema è piena. Ci possono essere diverse ragioni per questo. Un overflow della coda di solito è temporaneo (se non lo è, non sarete in grado di lavorare sul vostro computer).

Usa OnTick per monitorare il timer. Se il timer non è impostato, impostatelo su OnTick

Nel frattempo stiamo lavorando per rendere le impostazioni del timer indipendenti dallo stato della coda dei messaggi.

PS Abilitare il timer di sistema e impostare il timer su un'applicazione sono questioni separate


Questo è esattamente quello che faccio,

L'errore del timer si verifica dopo un certo tempo - non immediatamente. ed esattamente a causa dell'overflow - quando ci sono molti dati, ad esempio la cronologia degli ordini, o ordini correnti di 50 o più.

Ho già provato e sto ancora cercando di usarlo, ma ho la sensazione che risolverò comunque il problema.

 
Slava:
Sto parlando di Sleep(1000).

Sì, hai impantanato l'argomento del confronto dei numeri interi.

 
fxsaber:

Sì, stai parlando di confrontare i numeri interi.

Non c'è nessun problema nel confrontare gli interi.

Mostra lo stesso senza slittamento e senza GetMicrosecondsCount

 
Slava:

Non c'è nessun problema nel confrontare gli interi.

Mostra lo stesso senza lo slittamento e senza GetMicrosecondsCount

ulong GetMicrosecondCount2()
{
  static ulong StartTime = 0;
  
  if (StartTime)
    StartTime += 1000001;            // При повторном - добавляем больше "секунды"
  else
    StartTime = ULONG_MAX - 1000000; // При первом запуске возвращаем это "время"
    
  return(StartTime);
}

void OnStart()
{
  const ulong StartTime = GetMicrosecondCount2();
  
//  Sleep(1000);
  
//  if (GetMicrosecondCount2() > StartTime + 1000000) // Неправильно
  if (GetMicrosecondCount2() - StartTime > 1000000) // Правильно
    Print("Прошло больше секунды.");
  else
    Print("Прошло меньше секунды."); 
}
E non è un problema, è una sottigliezza.
 

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

Discussione su "Il sistema di contabilità delle posizioni di copertura aggiunto a MetaTrader 5

fxsaber, 2018.01.25 10:14

  1. Mostra un esempio di una situazione di trading che Andrew ha evidenziato leggendo questo articolo.
  2. HistorySelectByPosition potrebbe non selezionare l'ordine che ha causato la negoziazione.
  3. L'ordine e l'affare che ha generato possono avere ID diversi.
Il secondo e il terzo punto dovrebbero almeno essere espressi da qualche parte. Cosa che ha fatto.

Stiamo parlando di analisi della storia del commercio anche manuale, non stiamo parlando di scrivere TS.

Per esempio, vogliamo capire come l'affare è sfuggito.
Motivazione: