Author |
Topic  |
|
kairen
Nuovo Utente
13 Posts |
Posted - 09 April 2004 : 01:04:55
|
Potete spiegarmi perche non funziona
Property Periodo as Numeric Default (14) Range (1, 400) Endproperty
Dim SumD1 as Numeric = 0 Dim SumD12 as Numeric = 0 Dim SumD2 as Numeric = 0 Dim SumD22 as Numeric = 0 Dim SumD1D2 as Numeric = 0 Dim Cnt as Numeric = 0
Function Corr(Data1 as Numeric(), Data2 as Numeric()) as Numeric Dim New as Numeric Dim Old as Numeric Dim Ix as Numeric Dim Num as Numeric = 0 Dim Den as Numeric = 1 Dim Ret as Numeric New = CurrentBar Old = CurrentBar - Periodo
If Old <= 0 then for Ix = 1 to Periodo step 1 SumD1 = SumD1 + Data1(Ix) SumD2 = SumD2 + Data2(Ix) SumD12 = SumD12 + Data1(Ix) * Data1(Ix) SumD22 = SumD22 + Data2(Ix) * Data2(Ix) SumD1D2 = SumD1D2 + Data1(Ix) * Data2(Ix) next Ix else SumD1 = SumD1 - Data1(Old) SumD1 = SumD1 + Data1(New) SumD2 = SumD2 - Data2(Old) SumD2 = SumD2 + Data2(New) SumD12 = SumD12 - Data1(Old) * Data1(Old) SumD12 = SumD12 + Data1(New) * Data1(New) SumD22 = SumD22 - Data2(Old) * Data2(Old) SumD22 = SumD22 + Data2(New) * Data2(New) SumD1D2 = SumD1D2 - Data1(Old) * Data2(Old) SumD1D2 = SumD1D2 + Data1(New) * Data2(New) Endif
Num = Abs(SumD1D2 - 1 / Periodo * SumD1 * SumD2) Den = Abs((SumD12 - SumD1 * SumD1 / Periodo) * (SumD22 - SumD2 * SumD2 / Periodo)) Den = Sqr(Den) Ret = (Num * Num) / (Den * Den) Return Ret
Endfunction
Function Main() Dim X as Numeric() Dim Y as Numeric() Dim I1 as Numeric Dim Rt as Numeric Cnt = Cnt + 1 x(Cnt) = currentbar y(Cnt) = close(0) if CurrentBar < Periodo then Return 0 Else Return Corr(X, Y) Endif Endfunction
Quando tento di accedere all'array in posizione Old mi da sempre risultato uguale a zero
Quello che voglio fare ? sottrai a SumD1,SumD2,... il valore degli array nella posizione che ? uscita dal calcolo. Somma a SumD1,SumD2 la posizione che ? appena entrata nel calcolo Questo per velocizzare l'elaborazione dell'indice di correlazione altrimenti ci mette tempi "biblici".
|
|
SupportoTecnico
Forum Admin
1261 Posts |
Posted - 09 April 2004 : 11:13:42
|
E' sbagliata la costruzione degli array nella funzione Main:
x(Cnt) = currentbar y(Cnt) = close(0)
prima di tutto cosa rappresenta x e cosa y?
Poi hai dichiarato le due variabili a livello di funzione e quindi essendo due array numerici tutti gli elementi verranno inizializzati ad ogni passaggio a zero tranne l'ultimo al quale fai l'assegnazione specifica.
In pratica supponi di avere currentbar = 20 avrai 19 elementi a zero e l'ultimo uguale a currentbar (per l'array x).
N.B. currentbar ? il numero della barra corrente, non il valore!
|
 |
|
kairen
Nuovo Utente
13 Posts |
Posted - 09 April 2004 : 12:40:51
|
praticamente volevo gli array costruiti in questo modo x ( 1, 2, 3, 4, 5, 6, 7) y ( close(1) , close(2) , close(3) , close (4), ...)
e caricare un elemento ad ogni giro della funzione main senza perdere i precedenti, devo forse dichiarare x e y come variabili di modulo.
p.s. dove close(1) intendo il valore della chiusura nella 1 barra close(2) intendo la chiusura nella seconda barra , ...
Lo scopo ?: se periodo ? 14 Non fare nulla per le prime 14 barre Calcola il coefficiente di correlazione per le barre seguenti
p.p.s close(0) ritorna il valore di close nella barra corrente?
p.p.p.s: Iil coefficiente di correlazione riesco a calcolarlo comunque caricandomi nella funzione main gli array per X e Y per gli elementi che mi servono ma: Supponiamo il numero totale di barre sia 1000 e il periodo sia 50 Stima numero operazioni = 50*1000*2 + (50 * 5 * 1000 ) = 350000 per 1000 barre del titolo (ci mette grosso modo 30/40 secondi a elaborare l'indicatore) Con il mio metodo grosso modo il tempo ? all'incirca 1000*10 + 1000 circa 11000 operazioni credo che 30 volte pi? veloce sia un buon risultato
Ciao e grazie Kairen Luca G.
|
 |
|
SupportoTecnico
Forum Admin
1261 Posts |
Posted - 09 April 2004 : 17:07:34
|
Per mantenere i valori precedenti gli array X, Y devono essere dichiarati a livello di modulo.
Il parametro passato alla funzione Close ? l'offset dalla barra corrente. In pratica Close(1) ritorna la chiusura della barra successiva a quella corrente.
Nel tuo caso non ti serve l'argomento di Close. Scrivi semplicemente:
y(Cnt) = Close
Close senza argomento ritorna la chiusura della barra corrente, come del resto anche Close(0). Ma visto che lo zero non serve ? inutile metterlo.
|
 |
|
kairen
Nuovo Utente
13 Posts |
Posted - 10 April 2004 : 14:41:38
|
un'altra domanda riguardo gli array. Esiste una funzione che ritorna il numero di elementi di un'array ?
Ciao e grazie Luca G.
|
 |
|
SupportoTecnico
Forum Admin
1261 Posts |
Posted - 10 April 2004 : 14:59:14
|
Certo.
La funzione ? Ubound() dove come paramentro passi il nome dell'array:
Ubound(Data1())
|
 |
|
kairen
Nuovo Utente
13 Posts |
Posted - 10 April 2004 : 16:26:16
|
grazie mille sempre solerte
ciao
Kairen Luca Giuliato
|
 |
|
kairen
Nuovo Utente
13 Posts |
Posted - 12 April 2004 : 07:51:04
|
Altra domanda riguardo agli array
E' possibile definire una matrice ? Spiego quello che voglio fare: Ho costruito un modulo Mio_modulo che utilizza a livello di modulo alcune variabili di cui due sono array e altre sono delle variabili intermedie numeriche. Adesso ho bisogno di utilizzare Mio_modulo per due volte all'interno di un indicatore pi? complesso. La soluzione 1 ? quella di prendere il Mio_modulo e duplicarlo per il numero di volte che serve La soluzione 2 ? quella di utilizzare una matrice per gli array e n array per le variabili numeriche. e l'occorrenza viene passata alle funzioni per calcolare l'indicatore. Mi spiego con un esempio. Mi sono costruito una versione personalizzata della funzione Roc costruita nel seguente modo. ----------- Data1(Ubound(Data1)+1)) = close
Function MyRoc(Periodo as Numeric) as Numeric Dim New as Numeric Dim Old as Numeric New = Ubound(Data1) Old = New - Periodo if Old < 1 then Return 0 else if Data1(Old) <> 0 then Return Data1(New)/Data1(Old) else Return 0 endif endif EndFunction ------------ Adesso ho bisogno di utilizzare l'indicatore Myroc 2 volte uno per il close e l'altro per high con Data1(x,1) = Close e con Data1(x,2) = Rsi(Close,14) e passando l'occorrenza 1 se voglio calcolare il Roc sulle chiusure e 2 se voglio calcolare il Roc sull'Rsi
Ciao e grazie Kairen
|
 |
|
SupportoTecnico
Forum Admin
1261 Posts |
Posted - 12 April 2004 : 14:01:27
|
Il linguaggio ora come ora non permette di costruire matrici.
Non puoi scrivere una cosa del genere per individuare un elemento:
Data1(1,5)
Ma nel tuo caso perch? non passi all'indicatore MyRoc l'array giusto?
Comunque, l'unica soluzione ? avere n array per le varie attivit? che ti servono. Nel tuo caso uno per la chiusura e l'altro per l'High.
|
 |
|
|
Topic  |
|