Forex Forum

Supporti e Resistenze

Indicatori personalizzati per i tuoi grafici

Supporti e Resistenze

Messaggioda lady_sabry » 21/05/2010, 12:09

Salve a tutti,
vorrei chiedere a chi ne sa piu' di me di programmazione se fosse possibile visualizzare i seguenti valori.
Considerando un grafico a 15 minuti e analizzando 3 giorni di contrattazioni : è possibile ottenere una serie di quotazioni dove i prezzi corrispondono di piu' l'uno all'altro tenendo conto anche solo le chiusure delle barre ?
Cioè rilevare quei prezzi che piu' si assomigliano (considerando una tolleranza)nell'arco dei tre giorni.
Dubito che sia possibile ma chiedo visto le mie scarse nozioni di programmazione.
Ringrazio anticipatamente tutti.
lady_sabry
Studente
Studente
 
Messaggi: 41
Iscritto il: 20/04/2010, 13:39

Re: Supporti e Resistenze

Messaggioda dail » 22/05/2010, 0:02

Ciao,
sinceramente non ho capito bene cosa vorresti fare :-)
precisamente cosa intendi per: "una serie di quotazioni dove i prezzi corrispondono di piu' l'uno all'altro" e "prezzi che piu' si assomigliano".

Fammi sapere ;)
Avatar utente
dail
Moderatore
Moderatore
 
Messaggi: 306
Iscritto il: 12/03/2010, 13:38

Re: Supporti e Resistenze

Messaggioda lady_sabry » 22/05/2010, 6:14

dail ha scritto:Ciao,
sinceramente non ho capito bene cosa vorresti fare :-)
precisamente cosa intendi per: "una serie di quotazioni dove i prezzi corrispondono di piu' l'uno all'altro" e "prezzi che piu' si assomigliano".

Fammi sapere ;)

Ciao Dail
provo a spiegarmi meglio : quello che vorrei visualizzare è il prezzo piu' "battuto" nell'arco di 3 giorni di scambi su un grafico a 15 min, cioè trovare le chiusure delle candele che si sono fermate il maggior numero di volte sullo stesso prezzo (considerando una tolleranza di qualche punto).
Nel disegno qui sotto potrai vedere come le candele 1-2-3-4-5 hanno la chiusura quasi uguale; ecco io volevo visualizzare quel prezzo o le serie di prezzi che piu' hanno coinciso.
http://clip2net.com/clip/m19204/1274501572-clip-4kb.png
Pensi sia possibile?
Fammi sapere se mi sono spiegata meglio. Grazie.
lady_sabry
Studente
Studente
 
Messaggi: 41
Iscritto il: 20/04/2010, 13:39

Re: Supporti e Resistenze

Messaggioda dail » 22/05/2010, 9:32

Si, non credo ci siano problemi a fare una cosa del genere.

Per visualizzare questi livelli ti bastano linee orizzontali come hai mostrato? altra cosa, lo scarto di quanti pip deve essere? (magari qui lo facciamo variabile cosi sarai tu a decidere quanto mettere, che ne pensi?)

l'unico problemino potrebbe essere quello di avere troppe linee orizzontali vicine..

Fammi sapere che mi metto all'opera
Avatar utente
dail
Moderatore
Moderatore
 
Messaggi: 306
Iscritto il: 12/03/2010, 13:38

Re: Supporti e Resistenze

Messaggioda lady_sabry » 22/05/2010, 18:45

dail ha scritto:Si, non credo ci siano problemi a fare una cosa del genere.

Per visualizzare questi livelli ti bastano linee orizzontali come hai mostrato? altra cosa, lo scarto di quanti pip deve essere? (magari qui lo facciamo variabile cosi sarai tu a decidere quanto mettere, che ne pensi?)

l'unico problemino potrebbe essere quello di avere troppe linee orizzontali vicine..

Fammi sapere che mi metto all'opera

Grande Dail, non pensavo si potesse.
Credo che tracciare delle linee orizzontali e uno scarto variabile sia la miglior cosa.
Per le linee troppo vicine si potrebbe ridurle diminuendo lo scarto....cmq vediamo prima cosa ne esce: che dici ?
Ancora grazie per la tua disponibilita'.
lady_sabry
Studente
Studente
 
Messaggi: 41
Iscritto il: 20/04/2010, 13:39

Re: Supporti e Resistenze

Messaggioda dail » 24/05/2010, 10:54

Ok, allora butto giu qualcosa e lo posto qui.
Magari sarebbe interessante avere un array dove mettere in modo ordinato dal prezzo più "toccato" a quello meno toccato e poi creare delle linee orizzontali solo su quelli più interessanti.

Vedo cosa fare, a presto.
Avatar utente
dail
Moderatore
Moderatore
 
Messaggi: 306
Iscritto il: 12/03/2010, 13:38

Re: Supporti e Resistenze

Messaggioda lady_sabry » 24/05/2010, 10:57

dail ha scritto:Ok, allora butto giu qualcosa e lo posto qui.
Magari sarebbe interessante avere un array dove mettere in modo ordinato dal prezzo più "toccato" a quello meno toccato e poi creare delle linee orizzontali solo su quelli più interessanti.

Vedo cosa fare, a presto.


....esatto Dail : è proprio quello che intendevo....
Grazie
lady_sabry
Studente
Studente
 
Messaggi: 41
Iscritto il: 20/04/2010, 13:39

Re: Supporti e Resistenze

Messaggioda dail » 25/05/2010, 13:41

Ciao Lady... allora, andiamo per ordine :)
Ho buttato giu un pò di codice, qui potrai scaricare l'indicatore completo:

PriceLevel.mq4

(come puoi notare ho commentato diverse parti di codice proprio perché, come dicevamo, l'importante per ora è sapere quali siano i livelli migliori. Per disegnare le linee basterà usare le funzioni che ti ho predisposto).

Procedo con la spiegazione.
A noi serviva un modo per attribuire al prezzo di chiusura un giusto "peso", praticamente ho creato un array bidimensionale chiamato: prices[10][2] dove andremo a salvare PREZZO e NUMERO RIPETIZIONI.
Alla fine il risultato dovrebbe essere ad esempio:

1.2050 - 4
1.2340 - 3
1.2550 - 2
ecc ecc

dove quel numero accanto al prezzo indica proprio il numero di volte che quel prezzo si ripete.
Ora passo alla spiegazione del codice dell'indicatore.

Codice: Seleziona tutto
extern int    MARGIN = 2; 
extern int    PERIOD = 90;
extern color  COLOR  = DarkBlue;


- MARGIN: Numero di pip di margine. Praticamente quando sarà fatta la lettura del prezzo di chiusura conterà tutti gli altri prezzi all'interno del range PREZZO+MARGIN e PREZZO-MARGIN
- PERIOD: Semplicemente il numero delle barre da prendere in cosiderazione. Fai attenzione che l'indicatore si adatta al time frame del grafico.
- COLOR: Il colore che vuoi usare per le linee

Ora passiamo al cuore dell'indicatore:

Codice: Seleziona tutto
      for(int i=0; i < Bars-bar && i < PERIOD; i++){
     
         close  = Close[i];
         exists = false;

         for(int c=0;c <= counter; c++){
            if (prices[c][0]+(Poin*MARGIN) >= close && prices[c][0]-(Poin*MARGIN) <= close){
         
               prices[c][1] += 1;                   
               exists       = true;           
           
               break;
            }   
         }
         if (!exists) add(close);
      }   


praticamente in questo loop, come accennato in precedenza, vado a scorrere il numero delle barre impostate, poi faccio la lettura del prezzo di chiusura tramite l'array Close[], e poi vado a controllare nel mio array (dove salvo prezzo - ripetizioni) se il prezzo di chiusura è compreso nel range di un altro preso in precedenza. Se è compreso allora incremento il numero di ripetizioni di 1, altrimenti lo aggiungo nell'array prices.

Una volta trovati i prezzi e conteggiati, avremo un array disordinato, quindi tramite il seguente codice:

Codice: Seleziona tutto
      for(i=0; i<=counter-1; i++){         
         for(c=i; c<=counter; c++){
            if (prices[i][1] < prices[c][1]){
           
               p            = prices[c][0];
               times        = prices[c][1];
               
               prices[c][0] = prices[i][0];
               prices[c][1] = prices[i][1];
               
               prices[i][0] = p;
               prices[i][1] = times;
           
            }                                     
         }     
      }

andremo a spostare i vari prezzi ordinandoli da quello più ripetuto a quello meno.

La funzione add() diciamo è una funzione intelligente, praticamente autodimensiona l'array qualora i livelli siano maggiori del numero dichiarato.

Codice: Seleziona tutto
double prices[10][2];


Ora, avendo l'array ordinato, ed avendo la funzione(addLine()) che traccia una linea orizzontale al prezzo indicato. Credo ti venga facile concludere l'indicatore.

Sicuramente avrai qualche domanda da fare :)
Non ti preoccupare, per dubbi o altro, ti aiuto volentieri!

fammi sapere
Ciao
Questo messaggio ha dei contenuti visibli solo dagli iscritti, effettua il login oppure iscriviti.
Avatar utente
dail
Moderatore
Moderatore
 
Messaggi: 306
Iscritto il: 12/03/2010, 13:38

Re: Supporti e Resistenze

Messaggioda lady_sabry » 25/05/2010, 17:17

dail ha scritto: Credo ti venga facile concludere l'indicatore.



mmmm....Dail :scusami ma ho qualche problema a capire i tre blocchi finali del programma (sotto il return(0)) e non riesco a far comparire le linee orrizontali; non ho mai usato il void e add()....
lady_sabry
Studente
Studente
 
Messaggi: 41
Iscritto il: 20/04/2010, 13:39

Re: Supporti e Resistenze

Messaggioda dail » 25/05/2010, 17:52

no allora la funzione add() puoi lasciarla cosi com'è, non occorre toccarla.

Le altre due funzioni che vedi sotto servono soltanto ad aggiungere/rimuovere linee sul grafico.
Praticamente tu hai l'array ordinato quindi basterà fare un semplice ciclo per visualizzare le linee, ad esempio:

Codice: Seleziona tutto
      for (int x=0;x<=counter;x++){     
         if (prices[x][0]> 0) addLine(prices[x][0], x, COLOR);
      }


ovviamente, come puoi immaginare in questo modo ti scorre tutto l'array e ti crea moltissime linee, questo perché le prende tutte.
Ora non so bene come vuoi gestire questa cosa, ma comunque, l'array come ti dicevo è ordinato, quindi in base ai prezzi che vuoi visualizzare chiamando addLine() visualizzerai la rispettiva linea orizzontale.

Importante: ricordati di cancellare le righe dalla funzione deinit() altrimenti ti rimandono sul grafico anche se rimuovi l'indicatore.

E' molto semplice, praticamente per creare una linea devi creare un oggetto, e per liberartene lo devi cancellare.
Per crearlo basterà usare la funzione ObjectCreate() di MetaTrader invece per cancellarlo ObjectDelete().

Dimmi se ci sono altri punti non chiari...
Avatar utente
dail
Moderatore
Moderatore
 
Messaggi: 306
Iscritto il: 12/03/2010, 13:38

Prossimo

Torna a Indicatori

Chi c’è in linea

Visitano il forum: CommonCrawl [Bot] e 0 ospiti