Le barre e il volume non sono affidabili per rilevare una nuova barra.
Un computer lavora in nano secondi, quindi un EA ben codificato può fare molto in 20 ms.
- 2010.10.11
- Konstantin Gruzdev
- www.mql5.com
- www.mql5.com
Grazie Alain,
molto interessante ... esattamente quello che immagino . . . 10 volte più veloce ... hmmm.
Significa: TimeCurrent() è veloce e sincrono ai bordi delle barre?
Perché .... hmmm ...
Ho bisogno di un po' di tempo per pensarci.
Willbur
Ok - per le persone a cui piacciono queste cose: il mio studio su questo problema.
Ho scritto una frase in un file in ogni evento "OnTick".
TimeLocal (PC CLock), TimeCurrent(), usando SymbolInfoTick() alcune informazioni sull'ultimo tick arrivato e - usando CopyRates() - alcune informazioni sulla barra corrente.
Un esempio da "USD/JPY" - Il periodo è "M1":
Sono le 19:43:01 dell'orologio del PC quando arriva il primo tick del 43° minuto, allo stesso tempo è nata una nuova barra.
A parte il fakt, che il tick-volume non è 1. questo è il normale flusso delle cose.
A volte non è così facile - come in questo caso:
Il PC mostra già 19:42:00 quando sono arrivati altri tre tick della barra 41min. Hanno ancora un timestamp di 19:41:59.
Ora il mondo fa un respiro profondo - 8.150 msec di totale immobilità.
Poi - il PC mostra già 19:42:09 - il primo tick della nuova barra - la barra dei 42 minuti - arriva.
Il Tick è segnato con 19:42:07 e - poiché è la barra delle 19:42 che entra con essa - il timestamp della barra è 19:42:00
Ora .... hmmm ....
1. TimeCurrent() è sempre uguale al timestamp del tick?
Ho controllato 40.000 record e ho trovato solo cinque casi in cui TimeCurrent è già commutato mentre il timestamp dell'ultimo tick non lo è.
2. Il last_tick è sempre più avanti dell'apertura della nuova barra?
(da continuare)
TimeCurrent() è il tempo dell'ultimo tick dal server, dipende dal tuo codice se è dal tuo simbolo grafico o no.
Non capisco il tuo problema "ultimo tick", dovresti mostrare il codice che ha prodotto questo output.
Ciao Alain
Controllo il TimeCurrent() in OnTick() che dovrebbe garantire l'appartenenza al simbolo che tratto.
Bene, questo dovrebbe essere il mio "New Bar Identifier" - piccolo e veloce - che ne pensi?
//--- New Bar
bool NewBar = false;
long currPeriodSeconds;
double currPeriodProgress = 0;
int OnInit(void) //-----------------------------------------------
{
currPeriodSeconds = PeriodSeconds();
return(INIT_SUCCEEDED);
}
void OnTick() //--------------------------------------------------
{
if(MathMod(TimeCurrent(),currPeriodSeconds) < currPeriodProgress)
NewBar = true;
else NewBar = false;
currPeriodProgress = MathMod(TimeCurrent(),currPeriodSeconds);
Lo controllerò con questa sequenza:
//--- Just for testing
int ExtHdlFile1=0;
MqlRates rates[1];
//--- New Bar
bool NewBar = false;
long currPeriodSeconds;
double currPeriodProgress = 0;
int OnInit(void) // -------------------------------------------------------
{
currPeriodSeconds = PeriodSeconds();
ExtHdlFile1=FileOpen("NewBarTest.csv",FILE_READ|FILE_WRITE|FILE_CSV);
FileSeek (ExtHdlFile1,0,SEEK_END);
FileWrite(ExtHdlFile1, "TimeLocal",
"TimeCurrent",
"rates[0].time",
"rates[0].tick");
return(INIT_SUCCEEDED);
}
void OnTick() // -----------------------------------------------------------
{
if(MathMod(TimeCurrent(),currPeriodSeconds) < currPeriodProgress)
NewBar = true;
else NewBar = false;
currPeriodProgress = MathMod(TimeCurrent(),currPeriodSeconds);
//--- lets check this
if(NewBar)
{
// last Time Stamp of old Bar
FileWrite(ExtHdlFile1, " ",
" ",
TimeToString(rates[0].time, TIME_MINUTES|TIME_SECONDS),
IntegerToString(rates[0].tick_volume));
// get the new bar
if(CopyRates(Symbol(),Period(),0,1,rates)!= 1) return;
// first Time Stamp of new Bar
FileWrite(ExtHdlFile1,TimeToString(TimeLocal(),TIME_MINUTES|TIME_SECONDS),
TimeToString(TimeCurrent(), TIME_MINUTES|TIME_SECONDS),
TimeToString(rates[0].time, TIME_MINUTES|TIME_SECONDS),
IntegerToString(rates[0].tick_volume));
}
if(CopyRates(Symbol(),Period(),0,1,rates)!= 1) return; // != clean code - just a test
}
void OnDeinit(const int reason)
{
FileClose(ExtHdlFile1);
return;
}
Ciao Alain
Controllo il TimeCurrent() in OnTick() che dovrebbe garantire l'appartenenza al simbolo che tratto.
Bene, questo dovrebbe essere il mio "New Bar Identifier" - piccolo e veloce - cosa ne pensi?
Ecco la mia versione finale.
In effetti sono un po' preoccupato perché è così facile.
Alain: Sarebbe bello se tu rilasciassi la benedizione.
// -----------------------------------------------------------------------
bool NewBar(void)
{
bool iNewBar = false;
static double currPeriodProgress = 0;
currPeriodProgress = MathMod(TimeCurrent(),PeriodSeconds());
return(iNewBar);
}
// ------------------------------------------------------------------------
void OnTick()
{
if(NewBar()) PlaySound("tick.wav");
Saluti da Colonia
Willbur
Il modo più semplice:
static datetime tlastbar=0;
datetime tnewbar=iTime(NULL,PERIOD_CURRENT,0);
bool isnewbar=tnewbar!=tlastbar;
tlastbar=tnewbar;
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
Mi chiedo come indicare quando una nuova barra vede la luce.
Principalmente mi preoccupo delle prestazioni. Su alcuni simboli ho visto tick ogni 20 ms. Non c'è molto tempo per reagire.
Un'idea è tassi.tick_volume
Mqlrates rates[1];
OnInit()
{
if(CopyRates(_Symbol,_Period,0,1,rates) < 1)
if(rates[0].tick_volume == 1)
{
... deal with new bar ...
}
Un'altra idea potrebbe essere il controllo se il numero di barre è stato incrementato
OnInit()
{
if(BarsOld < Bars(_Symbol,_Period))
{
BarsOld = Bars(_Symbol,_Period);
... deal with new bar ...
}
Ho controllato anche OnChartEvent, ma non ho trovato alcun modo per differenziare le nuove barre da altre cose.
Grazie per la tua valutazione
WIllbur