L'apprendimento automatico nel trading: teoria, modelli, pratica e algo-trading - pagina 2064

 
Aleksey Nikolayev:

Cerca Di - il quadrato medio degli incrementi per l'i-esimo minuto del giorno. Poi dividete tutti gli incrementi per il loro corrispondente di=sqrt(Di). Aggiungete gli incrementi al quadrato e cercate le deviazioni dalla SB nella nuova serie. Il prezzo è sbilanciato, ma il tempo non cambia.

Che senso hanno 2 mesi per ogni minuto? I cambiamenti ad ogni minuto saranno piccoli, e i calcoli saranno grandi. O un minuto all'indietro o un mese all'indietro e un mese in avanti. Codice per la prima barra.

for(int i = 1,i<= 43200*2, i++);
{
Di+=pow((iClose(NULL,1,i) - iOpen(NULL,1,i)),2)/i ;
}
di=sqrt(Di);

Nuova fila

for(int i = 1,i<= 43200*2, i++);
{
NewClose[i]=iClose(NULL,1,i)/di;
NewOpen[i]=iOpen(NULL,1,i)/di ;
}

È corretto?

 
Valeriy Yastremskiy:

È corretto?


Non credo.

Ho capito l'algoritmo in questo modo: supponiamo che l'ora sia 10:00, si calcola Di per le barre m1 di questo tempo e poi per 10:00-minuti (close[i] - open[i])/di e così per ogni minuto.

 
Evgeniy Chumakov:


Non credo.

Ho capito l'algoritmo in questo modo: diciamo che sono le 10:00, si calcola Di per m1 barre di questo tempo e poi per 10:00 minuto (close[i] - open[i])/di e così per ogni minuto.

Codice per la prima barra. Dovete spostarlo più in profondità, è un altro ciclo in cima.
 
Evgeniy Chumakov:


Non credo.

Ho capito l'algoritmo in questo modo: diciamo che sono le 10:00, si calcola Di per le barre m1 di questo tempo e poi per il minuto 10:00 (close[i] - open[i])/di e così per ogni minuto.

Questo è corretto. Creiamo due archivi - reale e intero con dimensioni 1440=24*60. Nel primo, sommate i quadrati degli incrementi, e nel secondo - il numero di barre per un dato minuto, e poi dividete il primo per il secondo (per i numeri con numero di barre maggiore di 1). Poi estraiamo la radice quadrata e solo allora rinormalizziamo gli incrementi e assembliamo la somma cumulativa - una nuova serie, che poi esaminiamo per vedere se differisce da SB.

 
Aleksey Nikolayev:

Sì, questo è corretto. Abbiamo due archivi - reale e intero, dimensione 1440=24*60. Nel primo, sommate i quadrati degli incrementi, e nel secondo - il numero di battute per un dato minuto, e poi dividete il primo per il secondo (per i numeri con un numero di battute maggiore di 1). Poi estraiamo la radice quadrata e solo dopo rinormalizziamo gli incrementi e li cumuliamo in una nuova serie, che esaminiamo per vedere se differisce da SB.

In altre parole, la media quadrata delle minuzie per 24 ore, e così per 2 mesi di minuzie. Numero della barra dei minuti? Qual è la somma dei quadrati divisa per 1440?

 
Valeriy Yastremskiy:

Dividi la somma dei quadrati per 1440?


Si divide la somma dei quadrati per il numero di barre per un particolare minuto e poi si estrae la radice.

 
Aleksey Nikolayev:

Sì, questo è corretto. Abbiamo due archivi, uno reale e uno intero di dimensioni 1440=24*60.


cioè dobbiamo costruire la somma cumulativa giornaliera = 1440 minuti?

 
Evgeniy Chumakov:


Si divide la somma dei quadrati per il numero di barre di un particolare minuto e poi si estrae la radice.

Allora non capisco. Per la profondità della barra 3 la somma sarà tre e questo valore sarà calcolato per la terza barra o per la prima. Capisco che la media deve essere calcolata per lo stesso numero di barre e non cumulativamente. Sarebbe meglio dare la formula subito. Tutti capiamo le parole in modo diverso).

for(int i = 1,i<= 1440, i++);
{
Di+=pow((iClose(NULL,1,i) - iOpen(NULL,1,i)),2)/i ;
di=sqrt(Di);
DVal[i]=(iClose(NULL,1,i) - iOpen(NULL,1,i)/di; 
}

Non mi sembra giusto.

 
Valeriy Yastremskiy:


Non mi sembra giusto.


codice sbagliato

 

Supponendo che non ci siano vuoti nella storia e che ci siano 1440 minuti in tutti i giorni (meno il venerdì) allora il codice dovrebbe essere come questo

double di = 0;

int n = 40; // глубина 40 суток (два месяца)

int pos = 0; // текущий бар

int step = 0; // шаг


for(int i = 0; i < n; i++){

di += MathPow( close[pos + step] - open[pos + step],2);

step += 1440;
}

di = MathSqrt(di/n);

double x = (close[pos] - open[pos])/di;