T O P I C R E V I E W |
VpV |
Posted - 20 January 2011 : 10:33:08 Buon dì,
Non ho trovato riferimenti del mio caso e quindi Vi devo chiedere aiuto; ho la necessità di importare i dati di alcuni titoli per sviluppare degli indicatori.
Vi chiedo quindi se esiste un altro modo per sommare questi dati di fonti diverse ovvero se è per forza necessario avere i "sottostanti" caricati in un gruppo di lavoro.
Il problema quindi è quello di dover attivare un certo numero di titoli/sottostanti in un gruppo di lavoro e questo comporta una bella perdita di tempo, oltre che avere un gran numero di titoli caricati su quel gruppo di lavoro.
Quindi, non è per caso possibile utilizzare la funzione DB senza il "gruppo di lavoro" ovvero richiamando i dati direttamente dalla cartella Insider ?
Vi ringrazio per la risposta.  |
10 L A T E S T R E P L I E S (Newest First) |
VpV |
Posted - 27 January 2011 : 17:50:42 [quote]Originally posted by SupportoTecnico
Facendo un po' le somme, se quello che dici è corretto, e cioè che singolarmente i due indicatori funzionano, potrei azzardare questa ipotesi:
- il calcolo dell'indicatore all'interno del ciclo "Do Until" supera i 10 secondi. In pratica, l'interprete del linguaggio, esce da ciclo "Do Until" se un certo tipo di calcolo impiega più di 10 secondi (per singolo passaggio all'interno del ciclo). Insomma trattasi di un timeout proprio perchè il ciclo "do until" per sua natura potrebbe essere un ciclo infinito.
-----------------------------------------------
Adesso funziona tutto, grazie. E' lento, molto lento ma non importa per adesso, vedrò se riesco a velocizzare.

|
SupportoTecnico |
Posted - 27 January 2011 : 14:39:06 Facendo un po' le somme, se quello che dici è corretto, e cioè che singolarmente i due indicatori funzionano, potrei azzardare questa ipotesi:
- il calcolo dell'indicatore all'interno del ciclo "Do Until" supera i 10 secondi. In pratica, l'interprete del linguaggio, esce da ciclo "Do Until" se un certo tipo di calcolo impiega più di 10 secondi (per singolo passaggio all'interno del ciclo). Insomma trattasi di un timeout proprio perchè il ciclo "do until" per sua natura potrebbe essere un ciclo infinito.
La soluzione è sostituire il "Do until" con un ciclo "for":
Property v1() As Numeric
Default (100)
EndProperty
Property v2() As Numeric
Default (40)
EndProperty
Function Main()
dim i as Numeric = 0
dim voltot1 as Numeric = 0
dim volup1 as Numeric = 0
dim voldown1 as Numeric = 0
dim MioVolume as numeric
dim MioVolume_Ciclo as numeric
dim a as Numeric
MioVolume = VOLMIB
'gestisce il primo passo di calcolo
voltot1 = MioVolume
if close > close( - 1) then
volup1 = volup1 + MioVolume
else
if close = close( - 1) then
volup1 = volup1 + MioVolume
voldown1 = voldown1 + MioVolume
else
voldown1 = voldown1 + MioVolume
endif
endif
for a = 1 to 1000000
if (voltot1 > v2 * moveav(volmib, v1)) then
goto ExitFor
endif
i = i + 1
MioVolume_Ciclo = value(volmib, - i)
voltot1 = voltot1 + MioVolume_Ciclo
if close( - i) > close( - i - 1) then
volup1 = volup1 + MioVolume_Ciclo
else
if close( - i) = close( - i - 1) then
volup1 = volup1 + MioVolume_Ciclo
voldown1 = voldown1 + MioVolume_Ciclo
else
voldown1 = voldown1 + MioVolume_Ciclo
endif
endif
next a
ExitFor:
return 100 * (1 - voldown1 / (volup1 + voldown1))
Endfunction
|
VpV |
Posted - 27 January 2011 : 12:08:24 quote: Originally posted by SupportoTecnico
Preso singolarmente il tuo indicatore "volmib" funziona? Cioè riesci a visualizzarne il grafico?
E preso come è in originale l'indicatore VOLFAB funziona? riesci a visualizzarne il grafico?
Se si allora il problema potrebbe stare nel fatto che VOLMIB è un po' pesante come calcolo e viene usato troppe volte nel codice.
Puoi ovviare a questo, assegnando il valore dell'indicatore solo una volta ad una variabile e poi utilizzare quella nei vari calcoli:
Property v1() As Numeric
Default (100)
EndProperty
Property v2() As Numeric
Default (40)
EndProperty
Function Main()
dim i as Numeric = 0
dim voltot1 as Numeric = 0
dim volup1 as Numeric = 0
dim voldown1 as Numeric = 0
dim MioVolume as numeric
dim MioVolume_Ciclo as numeric
MioVolume = VOLMIB
'gestisce il primo passo di calcolo
voltot1 = MioVolume
if close > close( - 1) then
volup1 = volup1 + MioVolume
else
if close = close( - 1) then
volup1 = volup1 + MioVolume
voldown1 = voldown1 + MioVolume
else
voldown1 = voldown1 + MioVolume
endif
endif
do until voltot1 > v2 * moveav(volmib, v1)
i = i + 1
MioVolume_Ciclo = value(volmib, - i)
voltot1 = voltot1 + MioVolume_Ciclo
if close( - i) > close( - i - 1) then
volup1 = volup1 + MioVolume_Ciclo
else
if close( - i) = close( - i - 1) then
volup1 = volup1 + MioVolume_Ciclo
voldown1 = voldown1 + MioVolume_Ciclo
else
voldown1 = voldown1 + MioVolume_Ciclo
endif
endif
loop
return 100 * (1 - voldown1 / (volup1 + voldown1))
Endfunction
Quusto serve per aumentare la velocità.
Allora, ho provato quanto da Voi esposto ma ancora nulla ergo ora Vi scrivo quali prove ho fatto, ulteriormente, per capire cosa non possa andare. Devo dire però che il codice sopra è certamente più veloce, adesso la schermata bianca arriva sotto al minuto...ma rimane bianca ovvero senza indicatore.
A) ovviamente il mio UI e VolFab funzionano correttamente, presi singolarmente.
B)Ho fatto un test per capire se poteva essere altro problema al di fuori del mio indicatore e tutto funziona...quindi il problema è mio. Ho preso i volumi del Dax, attraverso DBEXP ovvero un database, è ho creato l'UI VOLDAX. Ho sostituito come da Vostra sorgente il nuovo UIVOLDAX e tutto funziona correttamente, il VolFab su volumi Dax e il VolFab sul VOLDAX sono identici, stessi valori ergo il problema deve risiedere necessariamente nel mio UIVOLMIB che adesso vi plotto, anche se rimane una semplice somma...lenta, ma pur sempre una semplice addizione.
Grazie.
Ecco il codice di VOLMIB:
Database A2A("Lavoro", "A2A.MI", "N") Database ANSALDOSTS("Lavoro", "STS.MI", "N") Database ATLANTIA("Lavoro", "ATL.MI", "N") Database AUTOGRILL("Lavoro", "AGL.MI", "N") Database AZIMUT("Lavoro", "AZM.MI", "N") Database BANCAMPS("Lavoro", "BMPS.MI", "N") Database BANCAPOPOLARE("Lavoro", "BP.MI", "N") Database BCAPOPMILANO("Lavoro", "PMI.MI", "N") Database BULGARI("Lavoro", "BUL.MI", "N") Database BUZZIUNICEM("Lavoro", "BZU.MI", "N") Database CAMPARI("Lavoro", "CPR.MI", "N") Database DIASORIN("Lavoro", "DIA.MI", "N") Database ENEL("Lavoro", "ENEL.MI", "N") Database ENELGP("Lavoro", "EGPW.MI", "N") Database ENI("Lavoro", "ENI.MI", "N") Database EXOR("Lavoro", "EXO.MI", "N") Database FIAT("Lavoro", "F.MI", "N") Database FIATINDUST("Lavoro", "FI.MI", "N") Database FINMECCANICA("Lavoro", "FNC.MI", "N") Database FONDIARIASAI("Lavoro", "FSA.MI", "N") Database GENERALI("Lavoro", "G.MI", "N") Database IMPREGILO("Lavoro", "IPG.MI", "N") Database INTESASAMP("Lavoro", "ISP.MI", "N") Database LOTTOMATICA("Lavoro", "LTO.MI", "N") Database LUXOTTICAGROUP("Lavoro", "LUX.MI", "N") Database MEDIASET("Lavoro", "MS.MI", "N") Database MEDIOBANCA("Lavoro", "MB.MI", "N") Database MEDIOLANUM("Lavoro", "MED.MI", "N") Database PARMALAT("Lavoro", "PLT.MI", "N") Database PIRELLI("Lavoro", "PC.MI", "N") Database PRYSMIAN("Lavoro", "PRY.MI", "N") Database SAIPEM("Lavoro", "SPM.MI", "N") Database SNAM("Lavoro", "SRG.MI", "N") Database STM("Lavoro", "STM.MI", "N") Database TELECOM("Lavoro", "TIT.MI", "N") Database TENARIS("Lavoro", "TEN.MI", "N") Database TERNA("Lavoro", "TRN.MI", "N") Database TOD("Lavoro", "TOD.MI", "N") Database UBI("Lavoro", "UBI.MI", "N") Database UNICREDIT("Lavoro", "UCG.MI", "N")
Function Main() DIM F1 AS Numeric DIM F2 AS Numeric DIM F3 AS Numeric DIM F4 AS Numeric DIM F5 AS Numeric DIM F6 AS Numeric DIM F7 AS Numeric DIM F8 AS Numeric DIM F9 AS Numeric DIM F10 AS Numeric DIM F11 AS Numeric DIM F12 AS Numeric DIM F13 AS Numeric DIM F14 AS Numeric DIM F15 AS Numeric DIM F16 AS Numeric DIM F17 AS Numeric DIM F18 AS Numeric DIM F19 AS Numeric DIM F20 AS Numeric DIM F21 AS Numeric DIM F22 AS Numeric DIM F23 AS Numeric DIM F24 AS Numeric DIM F25 AS Numeric DIM F26 AS Numeric DIM F27 AS Numeric DIM F28 AS Numeric DIM F29 AS Numeric DIM F30 AS Numeric DIM F31 AS Numeric DIM F32 AS Numeric DIM F33 AS Numeric DIM F34 AS Numeric DIM F35 AS Numeric DIM F36 AS Numeric DIM F37 AS Numeric DIM F38 AS Numeric DIM F39 AS Numeric DIM F40 AS Numeric DIM SOMMA AS Numeric
F1 = Dbexp(Volume, "A2A") F2 = Dbexp(Volume, "ANSALDOSTS") F3 = Dbexp(Volume, "ATLANTIA") F4 = Dbexp(Volume, "AUTOGRILL") F5 = Dbexp(Volume, "AZIMUT") F6 = Dbexp(Volume, "BANCAMPS") F7 = Dbexp(Volume, "BANCAPOPOLARE") F8 = Dbexp(Volume, "BCAPOPMILANO") F9 = Dbexp(Volume, "BULGARI") F10 = Dbexp(Volume, "BUZZIUNICEM") F11 = Dbexp(Volume, "CAMPARI") F12 = Dbexp(Volume, "DIASORIN") F13 = Dbexp(Volume, "ENEL") F14 = Dbexp(Volume, "ENELGP") F15 = Dbexp(Volume, "ENI") F16 = Dbexp(Volume, "EXOR") F17 = Dbexp(Volume, "FIAT") F18 = Dbexp(Volume, "FIATINDUST") F19 = Dbexp(Volume, "FINMECCANICA") F20 = Dbexp(Volume, "FONDIARIASAI") F21 = Dbexp(Volume, "GENERALI") F22 = Dbexp(Volume, "IMPREGILO") F23 = Dbexp(Volume, "INTESASAMP") F24 = Dbexp(Volume, "LOTTOMATICA") F25 = Dbexp(Volume, "LUXOTTICAGROUP") F26 = Dbexp(Volume, "MEDIASET") F27 = Dbexp(Volume, "MEDIOBANCA") F28 = Dbexp(Volume, "MEDIOLANUM") F29 = Dbexp(Volume, "PARMALAT") F30 = Dbexp(Volume, "PIRELLI") F31 = Dbexp(Volume, "PRYSMIAN") F32 = Dbexp(Volume, "SAIPEM") F33 = Dbexp(Volume, "SNAM") F34 = Dbexp(Volume, "STM") F35 = Dbexp(Volume, "TELECOM") F36 = Dbexp(Volume, "TENARIS") F37 = Dbexp(Volume, "TERNA") F38 = Dbexp(Volume, "TOD") F39 = Dbexp(Volume, "UBI") F40 = Dbexp(Volume, "UNICREDIT")
SOMMA = F1 + F2 + F3 + F4 + F5 + F6 + F7 + F8 + F9 + F10 + F11 + F12 + F13 + F14 + F15 + F16 + F17 + F18 + F19 + F20 + F21 + F22 + F23 + F24 + F25 + F26 + F27 + F28 + F29 + F30 + F31 + F32 + F33 + F34 + F35 + F36 + F37 + F38 + F39 + F40
return SOMMA
Endfunction
Sicuramente può essere scritto meglio ma mi interessava avere il risultato finale poi mi sarei preoccupato di verificare l'ottimizzazione.
Grazie ancora. |
SupportoTecnico |
Posted - 26 January 2011 : 19:14:54 Preso singolarmente il tuo indicatore "volmib" funziona? Cioè riesci a visualizzarne il grafico?
E preso come è in originale l'indicatore VOLFAB funziona? riesci a visualizzarne il grafico?
Se si allora il problema potrebbe stare nel fatto che VOLMIB è un po' pesante come calcolo e viene usato troppe volte nel codice.
Puoi ovviare a questo, assegnando il valore dell'indicatore solo una volta ad una variabile e poi utilizzare quella nei vari calcoli:
Property v1() As Numeric
Default (100)
EndProperty
Property v2() As Numeric
Default (40)
EndProperty
Function Main()
dim i as Numeric = 0
dim voltot1 as Numeric = 0
dim volup1 as Numeric = 0
dim voldown1 as Numeric = 0
dim MioVolume as numeric
dim MioVolume_Ciclo as numeric
MioVolume = VOLMIB
'gestisce il primo passo di calcolo
voltot1 = MioVolume
if close > close( - 1) then
volup1 = volup1 + MioVolume
else
if close = close( - 1) then
volup1 = volup1 + MioVolume
voldown1 = voldown1 + MioVolume
else
voldown1 = voldown1 + MioVolume
endif
endif
do until voltot1 > v2 * moveav(volmib, v1)
i = i + 1
MioVolume_Ciclo = value(volmib, - i)
voltot1 = voltot1 + MioVolume_Ciclo
if close( - i) > close( - i - 1) then
volup1 = volup1 + MioVolume_Ciclo
else
if close( - i) = close( - i - 1) then
volup1 = volup1 + MioVolume_Ciclo
voldown1 = voldown1 + MioVolume_Ciclo
else
voldown1 = voldown1 + MioVolume_Ciclo
endif
endif
loop
return 100 * (1 - voldown1 / (volup1 + voldown1))
Endfunction
Quusto serve per aumentare la velocità. |
VpV |
Posted - 26 January 2011 : 18:57:11 quote: Originally posted by SupportoTecnico
Non puoi fare una semplice sostituzione! 
Proprio perch� "Volume" ha un suo paramentro (offset) che significa una certa cosa. In particolare quel "- i" significa prendi il valore del periodo precedente.
Il tuo indicatore non ha quel paramentro (propriet�), e non ne puoi creare una per simulare lo stesso funzionamento della funzione "Volume".
Esiste come quasi sempre la via alternativa.
La soluzione � usare la funzione "Value":
voltot1 = voltot1 + Value(volmib, - i)
Grazie, adesso salva senza problemi/errori ma non funziona nulla.
Il pc lavora per un minuto buono, si pianta, e poi compare una schermata bianca ovvero nessun indicatore.
E' lo stesso problema che si ha quando si omette un parametro o insider non riesce a trovare una corrispondenza nell'UI.
Ma sinceramente qui non so proprio cosa possa non funzionare anche perchè di segnali di errori non ne dà .
Ho sosituito come avete scritto Voi, prima solo nelle parti (-i) e poi, visto il risultato, anche su tutto il resto ma schermata bianca uguale.
Ho provato a chiamare il mio UI SOMMA attraverso altro UI, così per provare, e tutto funziona perfettamente.
Le apparenze mi dicono che VOLFAB non lavora il mio UISOMMA ma non capisco il perchè, probabilmente è un problema di indirizzo.
Grazie. |
SupportoTecnico |
Posted - 26 January 2011 : 16:53:41 Non puoi fare una semplice sostituzione! 
Proprio perchè "Volume" ha un suo paramentro (offset) che significa una certa cosa. In particolare quel "- i" significa prendi il valore del periodo precedente.
Il tuo indicatore non ha quel paramentro (proprietà), e non ne puoi creare una per simulare lo stesso funzionamento della funzione "Volume".
Esiste come quasi sempre la via alternativa.
La soluzione è usare la funzione "Value":
voltot1 = voltot1 + Value(volmib, - i)
|
VpV |
Posted - 26 January 2011 : 15:59:58 quote: Originally posted by SupportoTecnico
In teoria non ci dovrebbero essere problemi nel fare quello che dici.
Per risponderti giustamente per�, abbiamo bisogno del codice sorgente in modo da capire esattamente quale sia il problema nel tuo caso. Quindi, scrivici pure alla nostra email (se l'indicatore deve rimanere segreto), spedendoci il codice sorgente dell'indicatore e il codice dove andrebbe usato.
Grazie per la rapidità ma il problema non è mio(segreto) ma, probabilmente, dell'autore o Vostro poichè l'indicatore, che avete, è scaricabile solo per chi ha comprato il programma, ecco perchè non ho riportato tale indicatore, non mi sembrava corretto per Voi e per l'autore stesso.
Tuttavia il mio indicatore è solo una somma di volumi dei titoli presenti nel MIB40 ma, come dicevo, alla sostituzione con il mio (VOLMIB vs volume) ricevo il messaggio di errore "numero di argomenti errati riga 32" .
Se volete provvedo comunque all'invio via mail di tutto, ma se sostituite la voce volume presente nell'algoritmo con un vostro indicatore, magari un UI di volume di due indici o titoli(somma), dovreste avere lo stesso problema.
In estrema sintesi : voltot1 = voltot1 + volume( - i)
voltot1 = voltot1 + volmib( - i)
Ovviamente in tutti i campi di "volume".
Grazie ancora per il servizio. ;) |
SupportoTecnico |
Posted - 26 January 2011 : 15:21:09 In teoria non ci dovrebbero essere problemi nel fare quello che dici.
Per risponderti giustamente però, abbiamo bisogno del codice sorgente in modo da capire esattamente quale sia il problema nel tuo caso. Quindi, scrivici pure alla nostra email (se l'indicatore deve rimanere segreto), spedendoci il codice sorgente dell'indicatore e il codice dove andrebbe usato. |
VpV |
Posted - 26 January 2011 : 13:05:16 quote: Originally posted by SupportoTecnico
Parliamo della funzione "Database" del linguaggio di programmazione vero? Purtroppo, il gruppo di lavoro � un paramentro obbligatorio per quella funzione e quindi non � possibile farne a meno accedendo direttamente al file dati.
Riprendo da quin per non aprire un nuovo post.
La domanda rimane attinente alla precedente poichè ho ovviato al problema facendo tutto il lavoro di carico su un Gruppo di lavoro e successiva creazione di indicatore.
Ora però necessito di un Vostro aiuto perchè i l'indicatore che ho creato deve, vorrei, essere utilizzato per un indicatore presente nelle dispense del sito ovvero VOLFAB.
Ho provveduto a sostituire la voce volume con quella dell'indicatore da me creato che alto non è che una somma di volumi ma, contrariamente in quello che avviene in altri casi, qui non riesco a farlo funzionare poichè l'editor mi dà errore di sintassi.
Ho provato vari passaggi, dalla creazione di una dim, ad un nome diverso e via dicendo ma l'errore rimane.
E' come se non mi prendesse l'indicatore come valore numero eppure il volume presente nella formula lo è.
Grazie |
SupportoTecnico |
Posted - 20 January 2011 : 15:28:28 Parliamo della funzione "Database" del linguaggio di programmazione vero? Purtroppo, il gruppo di lavoro è un paramentro obbligatorio per quella funzione e quindi non è possibile farne a meno accedendo direttamente al file dati.
|
|
|