Insider 3000 - Forums
Insider 3000 - Forums
Home | Profile | Active Topics | Members | Search | FAQ
Username:
Password:
Save Password
Forgot your Password?

 All Forums
 Problemi con "Insider 3000 versione 3"
 Problemi col linguaggio di programmazione
 array
 New Topic  Reply to Topic
 Printer Friendly
Author Previous Topic Topic Next Topic  

kairen
Nuovo Utente

13 Posts

Posted - 09 April 2004 :  01:04:55  Show Profile  Reply with Quote
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  Show Profile  Reply with Quote
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!


Go to Top of Page

kairen
Nuovo Utente

13 Posts

Posted - 09 April 2004 :  12:40:51  Show Profile  Reply with Quote
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.


Go to Top of Page

SupportoTecnico
Forum Admin

1261 Posts

Posted - 09 April 2004 :  17:07:34  Show Profile  Reply with Quote
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.




Go to Top of Page

kairen
Nuovo Utente

13 Posts

Posted - 10 April 2004 :  14:41:38  Show Profile  Reply with Quote
un'altra domanda riguardo gli array.
Esiste una funzione che ritorna il numero di elementi di un'array ?

Ciao e grazie
Luca G.

Go to Top of Page

SupportoTecnico
Forum Admin

1261 Posts

Posted - 10 April 2004 :  14:59:14  Show Profile  Reply with Quote
Certo.

La funzione ? Ubound() dove come paramentro passi il nome dell'array:

Ubound(Data1())


Go to Top of Page

kairen
Nuovo Utente

13 Posts

Posted - 10 April 2004 :  16:26:16  Show Profile  Reply with Quote
grazie mille sempre solerte

ciao

Kairen
Luca Giuliato

Go to Top of Page

kairen
Nuovo Utente

13 Posts

Posted - 12 April 2004 :  07:51:04  Show Profile  Reply with Quote
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

Go to Top of Page

SupportoTecnico
Forum Admin

1261 Posts

Posted - 12 April 2004 :  14:01:27  Show Profile  Reply with Quote
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.

Go to Top of Page
  Previous Topic Topic Next Topic  
 New Topic  Reply to Topic
 Printer Friendly
Jump To:
Insider 3000 - Forums © Copyright 2003-2016 Tradersoft s.r.l. Go To Top Of Page
Powered By: Snitz Forums 2000 Version 3.4.07