Disegnare linea sul grafico

Sezione dedicata a metatrader (ed altre piattaforme) ed al suo linguaggio di programmazione per il trading automatico
Avatar utente
rikslk
Messaggi: 202
Iscritto il: 02/07/2014, 11:42

Disegnare linea sul grafico

Messaggio da rikslk » 04/06/2019, 16:26

Ciao ragazzi, sto creando un EA che mi disegna una riga sul grafico prendendo in considerazione la chiusura più bassa delle ultime 90 candele.
A tal proposito, la riga viene disegnata, ma non riesco a capire perché assume il valore di 2480. In realtà dovrebbe assumere il valore della variabile PRZ che ho definito in alto.

Qui vi posto il codice:

double PRZ=iLowest(Symbol(),0,0,90,1);

int OnInit()

{

ObjectCreate(Symbol(),"LINEA EA RIKI",OBJ_HLINE,0,0,PRZ);

return(INIT_SUCCEEDED);
}


Grazie a chi risponderà.

Buona giornata e buon trading a tutti!
La continuità che cercate è nella vostra mente non nei mercati.

Avatar utente
carlo10
Messaggi: 2331
Iscritto il: 08/05/2014, 21:17

Re: Disegnare linea sul grafico

Messaggio da carlo10 » 06/06/2019, 8:21

Puoi dichiarare la variabile come globale fuori dalla OnInit ma l'inizializzazione la sposterei dentro la OnInit.

https://docs.mql4.com/basis/variables/global
A global variable can be initialized only by a constant or constant expression that corresponds to its type.

Avatar utente
Dainesi
Messaggi: 401
Iscritto il: 12/05/2014, 12:10
Località: Castellanza (VA)

Re: Disegnare linea sul grafico

Messaggio da Dainesi » 11/06/2019, 8:36

Due errori macroscopici: il primo è nell'implementazione della chiamata della ObjectCreate.

Se chiami la ObjectCreate NON devi passargli il nome del simbolo sul grafico ma il puntatore al grafico! Quindi non Symbol() ma ChartID()

Tu hai scritto
ObjectCreate(Symbol(),"LINEA EA RIKI",OBJ_HLINE,0,0,PRZ);

Ed invece avresti dovuto scrivere
ObjectCreate(ChartID(),"LINEA EA RIKI",OBJ_HLINE,0,0,PRZ);

Il problema del minimo in sè sta tutto nella funzione che hai utilizzato per catturare il minimo: iLowest ritorna l'offset della candela contenente il minimo del range passato ma NON la sua quotazione !!! :happy: Inoltre, per come l'hai scritta ottieni la posizione dell'Open più basso delle penultime 90 barre. Capisco che alle volte sintetizzare è utile ma ricorrendo ai numeri evitando le costanti enumerative è facile cadere in equivoci. Alle volte è meglio essere più ... "verbosi" ed essere sicuri che criptici e catastrofici :whist:

Se vuoi ottenere il valore devi utilizzare il valore ritornato dalla iLowest (che è un intero) come argomento dell'array storico della serie Low oppure, generalizzando, con l'analoga funzione iLow :yes:

Codice: Seleziona tutto


//Serie storica
double PRZ=Low[iLowest(Symbol(),Period(),MODE_LOW,90,1)];

//oppure con la funzione generalista
PRZ=iLow(Symbol(), Period(),iLowest(Symbol(),Period(),MODE_LOW,90,1));

rikslk ha scritto:
04/06/2019, 16:26
Ciao ragazzi, sto creando un EA che mi disegna una riga sul grafico prendendo in considerazione la chiusura più bassa delle ultime 90 candele.
A tal proposito, la riga viene disegnata, ma non riesco a capire perché assume il valore di 2480. In realtà dovrebbe assumere il valore della variabile PRZ che ho definito in alto.

Qui vi posto il codice:

double PRZ=iLowest(Symbol(),0,0,90,1);

int OnInit()

{

ObjectCreate(Symbol(),"LINEA EA RIKI",OBJ_HLINE,0,0,PRZ);

return(INIT_SUCCEEDED);
}


Grazie a chi risponderà.

Buona giornata e buon trading a tutti!

Avatar utente
rikslk
Messaggi: 202
Iscritto il: 02/07/2014, 11:42

Re: Disegnare linea sul grafico

Messaggio da rikslk » 11/06/2019, 11:40

Grazie ragazzi per la disponibilità e per la chiarezza delle spiegazioni.

questo è quello che ho scritto,

-----

double PRZ=Low[iLowest(Symbol(),Period(),MODE_CLOSE,130,1)];

int OnInit()

{

ObjectCreate(ChartID(),"LINEA EA RIKI",OBJ_HLINE,0,0,PRZ);


----


in realtà funziona e ringrazio Dainesi per avermi fatto notare l'errore di sintassi. Il problema è che nonostante io abbia applicato la modalità CLOSE piuttosto che quella LOW la riga mi viene disegnata sempre sul minimo :( ... come posso risolvere il problema?

Vi posto lo screenshot P.s. ho aumentato le candele a 130
y1j4WPu.png
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.
La continuità che cercate è nella vostra mente non nei mercati.

Avatar utente
Dainesi
Messaggi: 401
Iscritto il: 12/05/2014, 12:10
Località: Castellanza (VA)

Re: Disegnare linea sul grafico

Messaggio da Dainesi » 16/06/2019, 17:25

Quasi tutto giusto a parte ....

Se cerchi il Close più basso perchè usi questa funzione ?

double PRZ=Low[iLowest(Symbol(),Period(),MODE_CLOSE,130,1)];

La funzione corretta sarebbe l'interrogazione della serie storica del prezzo cercato, ovvero il Close:

double PRZ=Close[iLowest(Symbol(),Period(),MODE_CLOSE,130,1)];

rikslk ha scritto:
11/06/2019, 11:40
Grazie ragazzi per la disponibilità e per la chiarezza delle spiegazioni.

questo è quello che ho scritto,

-----

double PRZ=Low[iLowest(Symbol(),Period(),MODE_CLOSE,130,1)];

int OnInit()

{

ObjectCreate(ChartID(),"LINEA EA RIKI",OBJ_HLINE,0,0,PRZ);


----


in realtà funziona e ringrazio Dainesi per avermi fatto notare l'errore di sintassi. Il problema è che nonostante io abbia applicato la modalità CLOSE piuttosto che quella LOW la riga mi viene disegnata sempre sul minimo :( ... come posso risolvere il problema?
...

Avatar utente
rikslk
Messaggi: 202
Iscritto il: 02/07/2014, 11:42

Re: Disegnare linea sul grafico

Messaggio da rikslk » 17/06/2019, 18:10

Grazie caro,

avevo risolto inserendo un ciclo if facendo il controllo su ogni singola barra, ma effettivamente con questa funzione il programma risulta essere molto più leggero.

Grazie :)
La continuità che cercate è nella vostra mente non nei mercati.

Chi c’è in linea

Visitano il forum: CC [Bot] e 0 ospiti