Qui, all'incirca così - https://www.mql5.com/it/code/183. Il punto è che la copia dei dati da altri simboli non viene eseguita tutta in una volta, ma una barra alla volta. Durante tale copia, da altri simboli, la barra verrà copiata esattamente in corrispondenza del momento della barra del grafico su cui è visualizzato l'indicatore. Se non c'è una barra corrispondente, allora da una barra precedente (come la funzione iBarShift() in MQL4). In questo indicatore viene copiata una barra alla volta, ma per la correlazione potrebbe essere necessario copiare il numero corrispondente al periodo di correlazione. Si può fare diversamente: copiare una barra alla volta e metterla nel buffer dell'indicatore. Utilizzando il buffer si può fare tutto il più velocemente possibile (naturalmente a scapito di un maggiore consumo di memoria). È possibile farlo senza un buffer aggiuntivo, con un paio di variabili statiche.... È lungo da spiegare, probabilmente è necessario scrivere un articolo:)
Ok, ieri ci siamo un po' sovraeccitati, immagino che anche tu abbia festeggiato come me la "Giornata delle guardie di frontiera".
Puoi darmi un link per la corretta sincronizzazione delle battute, perché anch'io uso questo metodo di sincronizzazione con l'ultima battuta e basta?
Non le darò un link (perché non l'ho ancora incontrato), ma le descriverò il metodo.
Il metodo riguarda la sincronizzazione di strumenti diversi, anche se può essere utilizzato per la sincronizzazione di TF diversi.
Mi sono occupato di questo problema per molto tempo e persino SD ha realizzato un bug-fix per i bug di questo metodo che ho identificato.
Il problema della sincronizzazione è legato al fatto che strumenti diversi hanno un numero diverso di barre. Approssimativamente lo stesso è un falso criterio, tutto deve essere esatto. Da barra a barra. Altrimenti si perde il significato di sincronizzazione.
Il secondo aspetto di questo problema è come visualizzare una barra se non c'è nessuna barra sullo strumento corrente?
L'essenza del metodo è semplice: i dati sullo strumento vengono richiesti rigorosamente per tempo...
count=CopyRates(symbol,tf,time0,time1,rates); если нужно несколько баров
или
count=CopyRates(symbol,tf,time0,1,rates); если нужен один
e il campione di tempo viene preso dal buffer standard dell'indicatore time[]. In questo modo, si ha sempre la certezza di trovarsi di fronte a una barra che è arrivata in sincronia con una barra su un altro strumento.
Anche in questo caso, se non esiste una barra di questo tipo nello strumento corrente, non verrà richiesta. E se lo strumento richiesto non ha una barra di questo tipo come campione, si otterrà uno zero nel conteggio e si potrà normalmente gestire questa eccezione, a seconda della logica del programma.
double GetPrice( string Symb, int time )
{
double Price;
Price = iClose(Symb, Period(), iBarShift(Symb, Period(), time));
return(Price);
}
int GetNextTime( int CurrTime )
{
staticint Pos[TWO_SYMBOLS];
int i, MinTime, Tmp = -1;
for (i = 0; i < TWO_SYMBOLS; i++)
{
Pos[i] = iBarShift(Symbols[i], Period(), CurrTime) - 1;
if (Pos[i] >= 0)
Tmp = i;
}
if (Tmp < 0)
return(Time[0]);
MinTime = iTime(Symbols[Tmp], Period(), Pos[Tmp]);
i = Tmp - 1;
while (i >= 0)
{
if (Pos[i] >= 0)
{
Tmp = iTime(Symbols[i], Period(), Pos[i]);
if (Tmp < MinTime)
MinTime = Tmp;
}
i--;
}
return(MinTime);
}
void GetBaseMatrix()
{
int i, NextTime;
NextTime = GetNextTime(CurrTime);
while (NextTime < Time[0])
{
CurrTime = NextTime;
for (i = 0; i < TWO_SYMBOLS; i++)
BaseMatrix[i][MatrixRows + Shifts[i]] = MathLog(GetPrice(Symbols[i], CurrTime));
Times[MatrixRows] = CurrTime;
MatrixRows++;
NextTime = GetNextTime(CurrTime);
}
return;
}
Cioè tutto è abbastanza semplice. Un'altra cosa è che la classica rappresentazione barometrica (discretizzazione a tempo costante) dei prezzi BP non è l'unica, e tanto meno è sempre corretta. A volte è estremamente utile sincronizzare i prezzi BP di un'altra dimensione temporale. Cioè, introducendo distorsioni non lineari dal punto di vista del tempo classico. Di conseguenza, la correlazione mostrerà interrelazioni non lineari di due VR classici.
Ribadisco la necessità di un'ottimizzazione algoritmica per tutti gli indicatori. E anche per il meccanismo integrato di calcolo dei valori dell'indicatore in memoria (file), in modo che durante l'ottimizzazione del tester l'indicatore non calcoli la stessa cosa, ma prenda valori già pronti da lì.
hrenfx: Ribadisco la necessità di un'ottimizzazione algoritmica per tutti gli indicatori. E anche per un meccanismo integrato di calcolo dei valori dell'indicatore in memoria (file), in modo che durante l'ottimizzazione del tester l'indicatore non calcoli la stessa cosa, ma prenda valori già pronti da lì.
Potreste mostrare un esempio in cui ciò è già stato fatto?
L'ottimizzazione algoritmica per ogni indicatore è diversa. Per i diversi modi di utilizzare la correlazione, ho fatto, ad esempio, questo e questo.
La lettura a memoria dei valori degli indicatori calcolati in anticipo per l'intera storia è stata effettuata solo nella mia calcolatrice. Cioè, non ho un meccanismo universale, perché uso solo le mie soluzioni, che non sono affatto belle. Ma poiché sono per il miglioramento di tutto, sarebbe bello avere un meccanismo universale nel caso dell'ottimizzatore del tester MT5, perché dà un'accelerazione di diversi ordini di grandezza (esperienza di utilizzo nella mia calcolatrice), cioè supera Cloud in termini di efficienza.
A volte passo il tempo a distorcere i codici di altri, di solito i risultati di un programma incompleto o incompleto, sia per mancanza di tempo che per mancanza di abilità.
Questa volta avrei cercato di distorcere questo meraviglioso indicatore, e ho provato a fare qualcosa del genere:
- Disegnare solo una linea, non una linea tratteggiata di tracciatura
- Variante visiva: una linea colorata per ciascuna delle coppie di valute correlazione 1 linea spessa che è solo la media di 7 linee ((A+B+C+D+E+F+G)/7)
- Nessuna variante visiva: 1 sola linea, che è il risultato della formula di cui sopra ((A+B+C+D+D+E+F+G)/7)
Quasi come se si aggiungessero 7 (o 8) indicatori di correlazione originali, ma tutti sommati in modo da ottenere solo le medie come con la versione, una delle quali è costituita da 7 linee + 1 (media), e l'altra versione con 1 linea (solo media).
Qualcosa del genere:
buf[i]= (
(v1/sqrt(v2*v3))+
(v4/sqrt(v2*v6))+
(v7/sqrt(v2*v9))+
(v10/sqrt(v2*v12))+
(v13/sqrt(v2*v15))+
(v16/sqrt(v2*v18))+
(v19/sqrt(v2*v21))
)/7; // media semplice dei valori.
buf2[i]=buf[i];
c=getPlotColor(buf[i]);
colors1[i]=c;
colors2[i]=c;
Per una serie di ragioni il codice confuso non fa quello che voglio a causa di errori completamente logici.
Il problema principale riguarda i buffer, la sincronizzazione e la rientranza ricorsiva del codice:
sono state aggiunte alcune funzioni Print() per aiutare nel caso di tracciamento dei valori delle variabili e sono state commentate le istruzioni return 0 per trovare dove il codice fallisce logicamente.
Ok, ieri ci siamo un po' sovraeccitati, immagino che anche tu abbia festeggiato come me la "Giornata delle guardie di frontiera".
Puoi darmi un link per la corretta sincronizzazione delle battute, perché anch'io uso questo metodo di sincronizzazione con l'ultima battuta e basta?
Non le darò un link (perché non l'ho ancora incontrato), ma le descriverò il metodo.
Il metodo riguarda la sincronizzazione di strumenti diversi, anche se può essere utilizzato per la sincronizzazione di TF diversi.
Mi sono occupato di questo problema per molto tempo e persino SD ha realizzato un bug-fix per i bug di questo metodo che ho identificato.
Il problema della sincronizzazione è legato al fatto che strumenti diversi hanno un numero diverso di barre. Approssimativamente lo stesso è un falso criterio, tutto deve essere esatto. Da barra a barra. Altrimenti si perde il significato di sincronizzazione.
Il secondo aspetto di questo problema è come visualizzare una barra se non c'è nessuna barra sullo strumento corrente?
L'essenza del metodo è semplice: i dati sullo strumento vengono richiesti rigorosamente per tempo...
e il campione di tempo viene preso dal buffer standard dell'indicatore time[]. In questo modo, si ha sempre la certezza di trovarsi di fronte a una barra che è arrivata in sincronia con una barra su un altro strumento.
Anche in questo caso, se non esiste una barra di questo tipo nello strumento corrente, non verrà richiesta. E se lo strumento richiesto non ha una barra di questo tipo come campione, si otterrà uno zero nel conteggio e si potrà normalmente gestire questa eccezione, a seconda della logica del programma.
Implementazione della sincronizzazione (in MQL4) per un numero qualsiasi di IF(da qui):
Per analogia per due simboli(da qui):
Cioè tutto è abbastanza semplice. Un'altra cosa è che la classica rappresentazione barometrica (discretizzazione a tempo costante) dei prezzi BP non è l'unica, e tanto meno è sempre corretta. A volte è estremamente utile sincronizzare i prezzi BP di un'altra dimensione temporale. Cioè, introducendo distorsioni non lineari dal punto di vista del tempo classico. Di conseguenza, la correlazione mostrerà interrelazioni non lineari di due VR classici.Grazie per l'aiuto!
Mi sono sbagliato, lo ammetto, non pensavo che la sincronizzazione fosse così complicata.
Cercherò di capirlo e di sincronizzare le barre direttamente su questo indicatore, dato che ne ho molto bisogno.
Grazie a tutti per le informazioni!
Ho riscritto un po'l'indicatore. Ora, presumibilmente, dovrebbe saltare le parti negative della storia.
Visto che abbiamo iniziato, vi prego di controllare gli errori :)
Ribadisco la necessità di un'ottimizzazione algoritmica per tutti gli indicatori. E anche per un meccanismo integrato di calcolo dei valori dell'indicatore in memoria (file), in modo che durante l'ottimizzazione del tester l'indicatore non calcoli la stessa cosa, ma prenda valori già pronti da lì.
L'ottimizzazione algoritmica per ogni indicatore è diversa. Per i diversi modi di utilizzare la correlazione, ho fatto, ad esempio, questo e questo.
La lettura a memoria dei valori degli indicatori calcolati in anticipo per l'intera storia è stata effettuata solo nella mia calcolatrice. Cioè, non ho un meccanismo universale, perché uso solo le mie soluzioni, che non sono affatto belle. Ma poiché sono per il miglioramento di tutto, sarebbe bello avere un meccanismo universale nel caso dell'ottimizzatore del tester MT5, perché dà un'accelerazione di diversi ordini di grandezza (esperienza di utilizzo nella mia calcolatrice), cioè supera Cloud in termini di efficienza.
Ciao a tutti
A volte passo il tempo a distorcere i codici di altri, di solito i risultati di un programma incompleto o incompleto, sia per mancanza di tempo che per mancanza di abilità.
Questa volta avrei cercato di distorcere questo meraviglioso indicatore, e ho provato a fare qualcosa del genere:
- Disegnare solo una linea, non una linea tratteggiata di tracciatura
- Per aggiungere un sacco di simboli come
Poi ho creato 2 varianti del codice sorgente:
- Variante visiva: una linea colorata per ciascuna delle coppie di valute correlazione 1 linea spessa che è solo la media di 7 linee ((A+B+C+D+E+F+G)/7)
- Nessuna variante visiva: 1 sola linea, che è il risultato della formula di cui sopra ((A+B+C+D+D+E+F+G)/7)
Quasi come se si aggiungessero 7 (o 8) indicatori di correlazione originali, ma tutti sommati in modo da ottenere solo le medie come con la versione, una delle quali è costituita da 7 linee + 1 (media), e l'altra versione con 1 linea (solo media).
Qualcosa del genere:
Per una serie di ragioni il codice confuso non fa quello che voglio a causa di errori completamente logici.
Il problema principale riguarda i buffer, la sincronizzazione e la rientranza ricorsiva del codice:
if(bars1>bars2) { minBars=bars2; bars2=bars1-bars2; etc...+ oltre ad altri errori logici.
sono state aggiunte alcune funzioni Print() per aiutare nel caso di tracciamento dei valori delle variabili e sono state commentate le istruzioni return 0 per trovare dove il codice fallisce logicamente.
codice e file