Insider 3000 - Forums
Insider 3000 - Forums
Home | Profile | Active Topics | Members | Search | FAQ
 All Forums
 Problemi con "Insider 3000 versione 3"
 Problemi col linguaggio di programmazione
 numero istruzioni

Note: You must be registered in order to post a reply.

Screensize:
UserName:
Password:
Format Mode:
Format: BoldItalicizedUnderlineStrikethrough Align LeftCenteredAlign Right Horizontal Rule Insert HyperlinkInsert Email Insert CodeInsert QuoteInsert List
   
Message:

* HTML is OFF
* Forum Code is ON
Smilies
Smile [:)] Big Smile [:D] Cool [8D] Blush [:I]
Tongue [:P] Evil [):] Wink [;)] Clown [:o)]
Black Eye [B)] Eight Ball [8] Frown [:(] Shy [8)]
Shocked [:0] Angry [:(!] Dead [xx(] Sleepy [|)]
Kisses [:X] Approve [^] Disapprove [V] Question [?]

   
   

T O P I C    R E V I E W
giodie Posted - 10 April 2006 : 19:03:13
ciao e grazie per la tempestiva ed esauriente risposta di sabato sera.
una semplice questione da porti.
penso che l'indicatore che mi trovo a dover inserire nel software necessiterà di un 2000 righe.
Nell'editor, al momento della compilazione, è possibile inserire un numero così elevato di istruzioni?
ciao e buona serata

14   L A T E S T    R E P L I E S    (Newest First)
SupportoTecnico Posted - 20 April 2006 : 10:49:20
Puoi utilizzare sempre la funzione DAYOFWEEK.

Per esempio:

if (abs(DAYOFWEEK - DAYOFWEEK(-1)) > 1) then
if ((DAYOFWEEK <> 1) and (DAYOFWEEK <> 7)) then
.......
endif
endif

N.B. 1 e 7 sono la domenica e il sabato

Inoltre non ho considerato tutti i casi.. di sicuro c'è qualche condizione in più da scrivere.. ma il mio era solo un esempio per indicarti la via.
giodie Posted - 20 April 2006 : 09:19:06
CIAO E BUONA GIORNATA,
COME VEDI NON HO ANCORA RINUNCIATO E VOGLIO ANDARE FINO IN FONDO.
HO UNA DOMANDA DA PORTI.
I VALORI SCARICATI NON CONTEMPLANO I GIORNI DI CHIUSURA DELLA BORSA.
QUINDI COME FACCIO A DIRE AL SOFTWARE CHE SE E' GIORNO DI CHIUSURA DEVE PRENDERE IL VALORE DI BORSA APERTA PRECEDENTE?
INFATTI CI0' MI SERVE PER IL CALCOLO DI UNA MEDIA MOBILE SU UN DATO GIORNO DELLA SETTIMANA.
PER ESEMPIO IL DATO DEL VENERDI', SE SI PRESENTA UN VENERDI' DI CHIUSURA MI SALTA UNA SETTIMANA MENTRE IO VORREI CHE IL CODICE PRENDESSE IL VALORE DEL GIOVEDI' PRECEDENTE SE E' BORSA APERTA.
GRAZIE

SupportoTecnico Posted - 19 April 2006 : 11:23:16
L'esecuzione sarebbe più veloce ma a mio avviso non basterebbe per avere una discreta velocità. Quindi nel limite del possibile cerca di ottimizzare il codice, è l'unica strada percorribile.
giodie Posted - 19 April 2006 : 10:02:14
Sono in possesso di un pentium 4 1700 mhz,
nel caso comperassi un pentium 4 3600 mhz con 2 giga di ram
ho qualche possibilità di realizzare il mio indicatore?
Un infinito grazie.......

SupportoTecnico Posted - 18 April 2006 : 18:05:51

Bravo! alla fine c'hai provato sul serio! :-)

L'interprete del linguaggio di Insider 3000 è ottimo per il 99% dei trading system ed Indicatori.
Con ottimo intendo dire che è veloce ed estremamente versatile se scritto con una certa cura.

Purtroppo tu sei incappato in quel 1%. Il tuo indicatore è veramente complesso e complicato da calcolare, e se da una parte è vero che il linguaggio di Insider 3000 ti da la possibilità di programmarlo (grazie alla sua versatilità), dall'altra purtroppo la complessità, l'utilizzo di molti cicli "FOR", ecc... riduce sensibilmente la velocità di esecuzione.

Aumentare la RAM non serve, semmai ciò che si dovrebbe aumentare è la velocità di calcolo della CPU.

Ad ogni modo, ho provato il codice con l'editor e ho notato che mano a mano che il CurrentBar aumenta, la velocità di esecuzione diminuisce.
Ora non so se si può fare nel tuo caso, ma se ci riesci cerca di non far partire da 1 i vari cicli "FOR" ma dal periodo minimo che ti serve per i vari calcoli. Così facendo eviti di fare calcoli inutili.

giodie Posted - 18 April 2006 : 17:31:06
SONO ARRITVATO AD ELABORARE UNA PARTE DEL MIO INDICATORE COME DI SEGUITO TI SPECIFICO:
Function Main()
DIM ICOUNT AS Numeric = 0
DIM I AS Numeric
DIM A AS Numeric = 0
DIM E AS Numeric = 0
DIM F AS Numeric = 0
DIM G AS Numeric
DIM DMYLUN AS Numeric() = 0
DIM DMYMEDIA3LUN AS Numeric() = 0
DIM DMYROC3LUN AS Numeric() = 0
DIM DMY3MM3LUN AS Numeric() = 0
DIM DMY3MM3ESPLUN AS Numeric() = 0
DIM DMYMAR AS Numeric() = 0
DIM DMYMEDIA3MAR AS Numeric() = 0
DIM DMYROC3MAR AS Numeric() = 0
DIM DMY3MM3MAR AS Numeric() = 0
DIM DMY3MM3ESPMAR AS Numeric() = 0
DIM DMYMER AS Numeric() = 0
DIM DMYMEDIA3MER AS Numeric() = 0
DIM DMYROC3MER AS Numeric() = 0
DIM DMY3MM3MER AS Numeric() = 0
DIM DMY3MM3ESPMER AS Numeric() = 0
DIM DMYGIO AS Numeric() = 0
DIM DMYMEDIA3GIO AS Numeric() = 0
DIM DMYROC3GIO AS Numeric() = 0
DIM DMY3MM3GIO AS Numeric() = 0
DIM DMY3MM3ESPGIO AS Numeric() = 0
DIM DMYVEN AS Numeric() = 0
DIM DMYMEDIA3VEN AS Numeric() = 0
DIM DMYROC3VEN AS Numeric() = 0
DIM DMY3MM3VEN AS Numeric() = 0
DIM DMY3MM3ESPVEN AS Numeric() = 0
DIM DMY3MM3ESPTOT AS Numeric() = 0
FOR I = CURRENTBAR - 1 TO 0 STEP - 1
IF (DAYOFWEEK( - I) = 2) THEN
ICOUNT = ICOUNT + 1
DMYLUN(ICOUNT) = CLOSE( - I)
ENDIF
NEXT I
FOR ICOUNT = 1 TO UBOUND(DMYLUN())
A = A + 1
DMYMEDIA3LUN(A) = (DMYLUN(ICOUNT) + DMYLUN(ICOUNT - 1) + DMYLUN(ICOUNT - 2)) / 3
NEXT ICOUNT
FOR A = 1 TO UBOUND(DMYMEDIA3LUN())
E = E + 1
DMYROC3LUN(E) = DMYMEDIA3LUN(A) - DMYMEDIA3LUN(A - 1)
NEXT A
FOR E = 1 TO UBOUND(DMYROC3LUN())
F = F + 1
DMY3MM3LUN(F) = (DMYROC3LUN(E) + DMYROC3LUN(E - 1) + DMYROC3LUN(E - 2)) / 3
NEXT E
FOR F = 1 TO UBOUND(DMY3MM3LUN())
DMY3MM3ESPLUN(G) = (21 / 41) * DMY3MM3LUN(F) + (1 - (21 / 41)) * DMYROC3LUN(F)
NEXT F
FOR I = CURRENTBAR - 1 TO 0 STEP - 1
IF (DAYOFWEEK( - I) = 3) THEN
ICOUNT = ICOUNT + 1
DMYMAR(ICOUNT) = CLOSE( - I)
ENDIF
NEXT I
FOR ICOUNT = 1 TO UBOUND(DMYMAR())
A = A + 1
DMYMEDIA3MAR(A) = (DMYMAR(ICOUNT) + DMYMAR(ICOUNT - 1) + DMYMAR(ICOUNT - 2)) / 3
NEXT ICOUNT
FOR A = 1 TO UBOUND(DMYMEDIA3MAR())
E = E + 1
DMYROC3MAR(E) = DMYMEDIA3MAR(A) - DMYMEDIA3MAR(A - 1)
NEXT A
FOR E = 1 TO UBOUND(DMYROC3MAR())
F = F + 1
DMY3MM3MAR(F) = (DMYROC3MAR(E) + DMYROC3MAR(E - 1) + DMYROC3MAR(E - 2)) / 3
NEXT E
FOR F = 1 TO UBOUND(DMY3MM3MAR())
DMY3MM3ESPMAR(G) = (21 / 41) * DMY3MM3MAR(F) + (1 - (21 / 41)) * DMYROC3MAR(F)
NEXT F
FOR I = CURRENTBAR - 1 TO 0 STEP - 1
IF (DAYOFWEEK( - I) = 4) THEN
ICOUNT = ICOUNT + 1
DMYMER(ICOUNT) = CLOSE( - I)
ENDIF
NEXT I
FOR ICOUNT = 1 TO UBOUND(DMYMER())
A = A + 1
DMYMEDIA3MER(A) = (DMYMER(ICOUNT) + DMYMER(ICOUNT - 1) + DMYMER(ICOUNT - 2)) / 3
NEXT ICOUNT
FOR A = 1 TO UBOUND(DMYMEDIA3MER())
E = E + 1
DMYROC3MER(E) = DMYMEDIA3MER(A) - DMYMEDIA3MER(A - 1)
NEXT A
FOR E = 1 TO UBOUND(DMYROC3MER())
F = F + 1
DMY3MM3MER(F) = (DMYROC3MER(E) + DMYROC3MER(E - 1) + DMYROC3MER(E - 2)) / 3
NEXT E
FOR F = 1 TO UBOUND(DMY3MM3MER())
DMY3MM3ESPMER(G) = (21 / 41) * DMY3MM3MER(F) + (1 - (21 / 41)) * DMYROC3MER(F)
NEXT F
FOR I = CURRENTBAR - 1 TO 0 STEP - 1
IF (DAYOFWEEK( - I) = 5) THEN
ICOUNT = ICOUNT + 1
DMYGIO(ICOUNT) = CLOSE( - I)
ENDIF
NEXT I
FOR ICOUNT = 1 TO UBOUND(DMYGIO())
A = A + 1
DMYMEDIA3GIO(A) = (DMYGIO(ICOUNT) + DMYGIO(ICOUNT - 1) + DMYGIO(ICOUNT - 2)) / 3
NEXT ICOUNT
FOR A = 1 TO UBOUND(DMYMEDIA3GIO())
E = E + 1
DMYROC3GIO(E) = DMYMEDIA3GIO(A) - DMYMEDIA3GIO(A - 1)
NEXT A
FOR E = 1 TO UBOUND(DMYROC3GIO())
F = F + 1
DMY3MM3GIO(F) = (DMYROC3GIO(E) + DMYROC3GIO(E - 1) + DMYROC3GIO(E - 2)) / 3
NEXT E
FOR F = 1 TO UBOUND(DMY3MM3GIO())
DMY3MM3ESPGIO(G) = (21 / 41) * DMY3MM3GIO(F) + (1 - (21 / 41)) * DMYROC3GIO(F)
NEXT F
FOR I = CURRENTBAR - 1 TO 0 STEP - 1
IF (DAYOFWEEK( - I) = 6) THEN
ICOUNT = ICOUNT + 1
DMYVEN(ICOUNT) = CLOSE( - I)
ENDIF
NEXT I
FOR ICOUNT = 1 TO UBOUND(DMYVEN())
A = A + 1
DMYMEDIA3VEN(A) = (DMYVEN(ICOUNT) + DMYVEN(ICOUNT - 1) + DMYVEN(ICOUNT - 2)) / 3
NEXT ICOUNT
FOR A = 1 TO UBOUND(DMYMEDIA3VEN())
E = E + 1
DMYROC3VEN(E) = DMYMEDIA3VEN(A) - DMYMEDIA3VEN(A - 1)
NEXT A
FOR E = 1 TO UBOUND(DMYROC3VEN())
F = F + 1
DMY3MM3VEN(F) = (DMYROC3VEN(E) + DMYROC3VEN(E - 1) + DMYROC3VEN(E - 2)) / 3
NEXT E
FOR F = 1 TO UBOUND(DMY3MM3VEN())
DMY3MM3ESPVEN(G) = (21 / 41) * DMY3MM3VEN(F) + (1 - (21 / 41)) * DMYROC3VEN(F)
NEXT F
DMY3MM3ESPTOT(I) = DMY3MM3ESPLUN(I) + DMY3MM3ESPMAR(I) + DMY3MM3ESPMER(I) + DMY3MM3ESPGIO(I) + DMY3MM3ESPVEN(I)
RETURN ROUND(DMY3MM3ESPTOT(I), 5)
Endfunction
MI SI PRESENTA UN DUPLICE PROBLEMA:
1° L'INDICATORE COSI COSTRUITO GIRA LENTAMENTE
2° QUESTA E' SOLO UNA PARTE DEL MIO INDICATORE.
MI CHIEDO SE LA LENTEZZA DEL PROGRAMMA SIA DOVUTA AD UNA INSUFFICIENTE MEMORIA DEL MIO COMPUTER OPPURE AD UNA MANCHEVOLEZZA DEL
SOFTWARE
TI CHIEDO CIO' NELLA SPERANZA DI POTER RISOLVERE LA QUESTIONE CON L'AGGIUNTA DI RAM.
QUESTO PERCHE' TROVO UTILE ED EFFICACE INSIDER 3000


SupportoTecnico Posted - 13 April 2006 : 12:15:31
Secondo me mettendoci tanto impegno alla fine dovresti farcela a scrivere l'indicatore. Resta però il fatto della possibile lentezza nell'esecuzione del codice da parte del compilatore.

Vista la mole di calcoli e il modo in cui vengono fatti, basandomi sulla mia esperienza ti posso dire che la probabilità che il codice risulti lento, anche molto lento, è davvero alta.

Comunque non è necessario arrivare fino alla fine per accorgersene. Incomincia seguendo la strada degli Array accennata sopra e testa di tanto in tanto la velocità. Se ad un certo punto risulta insostenibile almeno c'hai tentato!

giodie Posted - 12 April 2006 : 18:36:47
ciao,
ciò che ti ho scritto riguardo all'indicatore che intendo costruire è solo parte delle istruzioni che ho necessità di utilizzare.
Il tutto l'ho già effettuato tramite excel incontrando notevoli problemi legati all'elaborazione di dati su una base di cinquant'anni. Se tu mi dici che si potrebbero avere problemi di operatività con solo questa breve procedura ritengo sia per me impossibile procedere con l'utilizzo di questo software e molto probabilmente sarà bene che approfondisca lo studio di excel per cercare di migliorare l'utilizzo delle formule in esso contenute così da poter procedere nei miei tests.
Altro problema sarà quello di scaricare i dati ottenuti tramite internet in excel sperando di non incontrare difficoltà. Questo era un altro motivo per il quale avevo fatto ricorso a questo software, perchè tramite bull&bear potevo realizzare quanto detto.
Se tu hai qualche consigli da darmi riguardo alla soluzione di questo duplice problema te ne sarei grato.
Comunque ti ringrazio per la collaborazione!

SupportoTecnico Posted - 11 April 2006 : 23:54:27
Caspita! ma è davvero complicatissimo!

C'ho pensato un po' ma davvero non saprei suggerirti un modo veloce per affrontare il problema.

La complicazione primaria sta nella divisione in 5 parti della serie storica (in base ai giorni della settimana) e poi il calcolo su quei dati delle varie altre cose.

In pratica, se abbiamo una serie storica di 1000 giorni ci troviamo ad avere 5 serie storiche ognuna di 200 giorni e tra l'altro non siamo nemmeno certi che siano corrette. Nel senso che può capitare che per qualche festività o altro non ci sia ad esempio qualche lunedì. Ma questo lo potremmo risolvere controllando il giorno con la funzione "DayOfWeek".

Il calcolo delle medie, proprio per l'anomalia della serie storica divisa in 5 parti va fatta "a mano" nel senso che non è possibile utilizzare funzioni standard.

Si dovranno utilizzare gli array.

Faccio un esempio:

lCount = 0
For i = CurrentBar - 1 to 0 Step -1
If (DayOfWeek(-i) = 2) then
lCount = lCount + 1
dMyLun(lCount) = Close(-i)
EndIf
Next i

Il codice qui sopra estrapola tutte le chiusure dei vari lunedì antecedenti la barra corrente (barra corrente compresa), e li sistema in un array.

A questo punto per calcolare le varie medie mobili dovrai scrivere una cosa del tipo:

For i = 1 to Ubound(dMyLun())
dMyMedia3(i) = (dMyLun(i) + dMyLun(i - 1) + dMyLun(i - 2)) / 3
Next i

dMyMedia3 è un altro array che contiene la media mobile a 3 periodi della serie storica dei lunedì..

e via così...

la cosa la vedo davvero complicata e specialmente non ho idea di quanto lenta possa diventare l'esecuzione del codice.


Per caso non hai del codice già scritto, magari in un altro linguaggio di programmazione? Se ce l'hai si potrebbe tentare di tradurlo.

giodie Posted - 11 April 2006 : 18:14:54
Divido i dati in base ai 5 giorni della settimana ottenendo dei valori weekly per il lunedì martedì.,mercoled’ giovedì e venerdì.
Su ciascuno di questi cinque insiemi procedo al calcolo delle medie mobili 1- 2 – 3 – 4 –5.
Su ogni singola media mobile calcolo i Roc a 5 a 11 a 17
Per ogni gruppo a tre di Roc ne effettuo la media semplice e di queste medie semplici calcolo a sua volta la media mobile semplice a 40 periodi
Le cinque medie mobili semplici a quaranta le utilizzo nel calcolo di una media mobile ponderata .
Quest’ultima media mobile è il risultato che raggiungo per ogni singolo giorno della settimana
Vale a dire: il lunedì ,il martedì, il mercoledì, il giovedì, il venerdì.
Questi risultati mi permettono infine di ottenere un’ultima media mobile semplice a 5 come segue :
per il lunedì =(l1+b2+g2+me2+ma2)/5
per il martedì=(ma1+l1+b2+g2+me2)/5
per il mercoledì=(me1+ma+l1+b2+g2)/5
per il giovedì=(g1+me1+ma1+l1+b2)/5
per il venerdì=(b1+g1+me1+ma1+l1)/5 e così via….
Dove 1 rappresenta la settimana più vicina 2 la settimana precedente.
Spero di essere stato esaustivo


SupportoTecnico Posted - 11 April 2006 : 15:43:41

Non mi è chiaro il procedimento per arrivare a calcolare il valore dell'indicatore per un periodo, diciamo il primo.

Spiegalo in dettaglio passo passo. Solo il primo periodo.

giodie Posted - 11 April 2006 : 14:53:04
Il mio problema è la costruzione di un indicatore che calcoli la media mobile a cinque del ROC a 5, a 11 e a 17 delle medie mobili da 1 a 5 su ciascun giorno della settimana.
Per cui mi trovo a dover calcolare innanzitutto le medie mobili a 1,2,3,4,5 su ciascun giorno per cui penso dovro' scrivere formule di questo tipo (ad es. per la 2)
a=(close()+close(-5))/2
b=(close(-1)+close(-6))/2
c=(close(-2)+close(-7))/2
d=(close(-3)+close(-8))/2
e=(close(-4)+close(-9))/2
a1=(close(-25)+close(-30))/2
b1=(close(-26)+close(-31))/2
..........
e quindi
f=(a-a1)/a1
g=(b-b1)/b1
..........
il che mi comporta un gran numero di righe da scrivere come ti avevo anticipato.
Ti chiedevo appunto se c'era una formula riassuntiva per avere una media mobile di valori non consecutivi come nel caso di MOVEAV ma che potesse tener presente valori che saltano di cinque in cinque.
E per il roc idem ma, mi hai gia' spiegato che il ROC effettua il calcolo solo sui dati di chiusura per cui se necessito di un ROC del genere me lo devo costruire io. Se c'è però una qualche soluzione ben venga.
Il problema non è tanto la costruzione dell'indicatore in sè che eventualmente comporta solo tanta pazienza ed attenzione nello scrivere tutte le istruzioni, quanto il fatto di voler fare successivamente dei test sullo stesso cambiando magari il numero e l'entità sia delle medie mobili che dei ROC. Vorrebbe dire riscrivere nuovamente tutto quanto mentre con una formula sarebbe necessario modificare solo quella.
Come sempre ti ringrazio per l'aiuto veramente parecchio importante.

SupportoTecnico Posted - 10 April 2006 : 23:54:51

Stai utilizzando un approccio super sbagliato per affrontare il problema!

Ma forse non hai capito bene qualche concetto fondamentale..

Perchè mai dovresti scrivere 2000 volte la stessa istruzione?? Eventualmente esistono i cicli FOR e DO Until da utilizzare!

Ma credo che a te non servano nemmeno questi.

In pratica, nella funzione Main di un indicatore devi scrivere le istruzioni per calcolare il valore del tuo indicatore in 1 solo periodo e non di tutta la serie storica. Poi ci penserà il compilatore a calcolare per ogni periodo i vari valori del tuo indicatore.

Insomma quello che avevi scritto nell'altro post:

FUNCTION MAIN()
DIM A AS NUMERIC

A=((((close()+close(-5)+close(-10))/3)+((close(-2)+close(-7)+close(-12))/3))/((close(-2)+close(-7)+close(-12))/3)

return Round(A, 3)

ENDFUNCTION


è più che sufficiente per calcolare l'intero indicatore.

Poi per calcolare la media mobile del tuo ROC puoi utilizzare tranquillamente la sintassi =>

Moveav(MyROC, 40, "s")

dove MyROC è il nome che hai dato al tuo indicatore utente appena costruito.

giodie Posted - 10 April 2006 : 19:23:19
le righe da scrivere penso che debbano essere ben oltre 2000 per il seguente motivo:
devo calcolare una serie di medie mobili i cui elementi abbiano una distanza di cinque posizioni l'un dall'altro, per esempio:
a=(close()+close(-5)+close(-10))/3
b=(close(-1)+close(-6)+close(-11))/3
ecc.
non esiste una formula che mi permetta di abbreviare le sopra citate istruzioni?
ed ancora, una volta calcolato il roc sulle succitate medie mobili, ne devo calcolare un'altra media mobile a 40 sul roc stesso.
anche in questo caso è possibile calcolare il tutto in questo modo, posto il roc=a:
moveav(a,40,"s")?
se non fosse possibile le istruzioni che devo dare al software sarebbero approssimativamente 20.800! UN'INFINITA'
ti chiedo un grande aiuto
ciao e buona serata


Insider 3000 - Forums © Copyright 2003-2016 Tradersoft s.r.l. Go To Top Of Page
Powered By: Snitz Forums 2000 Version 3.4.07