Aiuto per la codifica - pagina 38

 

...

Nell'indicatore l'unico modo per farlo sarebbe quello di tenerlo in un ciclo infinito fino a quando qualche evento (tastiera, mouse, ...) viene rilevato

Ma questo significherebbe anche che l'esecuzione del resto delle funzioni del terminale si ferma (è lo stesso di quando avete un cattivo indicatore che si blocca - blocca il vostro metatrader) Quindi, non è una buona soluzione. La funzione che di solito è usata per questo (sleep) che permette l'esecuzione di altro codice mentre il vostro codice è in pausa (che sarebbe il tempo in cui permettete al resto delle cose nel terminale di fare il lavoro) è disabilitata negli indicatori quindi non può essere usata per una soluzione

marley60:
se c'è un allarme, fa un suono "pling" una volta. c'è la possibilità di riprodurre un suono di allarme finché non lo fermo? (motivo: non voglio sentire un solo "pling" quando sono in bagno o in cucina) ho sostituito il suono dell'allarme con una canzone ma preferirei avere una scelta tra play una volta/play untill stoped (come era in tradestation).
 

Domanda sull'indice

Ciao Mladen;

Ho visto che qualcuno chiama un indicatore come Ind[3][0][1] in questo modo, cosa significa primo e secondo indice definito?

thanls in anticipo

kemal

 

Problema di ZigZag in EA

Salve,

Uso l'indy Zigzag standard nel mio EA. Uso il seguente codice per determinare i nodi dello zigzag. Ho notato che a volte MT4 restituisce i nodi zigzag dal time frame sbagliato. Per esempio, quando cerco di ottenere i nodi zigzag H1, MT4 restituisce i valori dei nodi zigzag M15. Qualcuno si è già imbattuto in questo problema? Se conoscete altre informazioni sullo zigzag e sulla possibile area del problema, per favore consigliatemi.

Molte grazie.

FFJason

nota: TF è il time frame che alimenta diversi valori per ottenere i nodi zigzag da diversi time frame. In qualche modo MT4 ha confuso i valori dei nodi quando viene usato un TF specifico.

void vGetNode2(int TF,double& lwnd2[2],double& hgnd2[2])

{ int t=0; int p=0; int q=0; double nd2i;

for (i=0; i<=150; i++)

{ nd2i=iCustom(NULL,TF,"ZigZag",13,8,5,0,i);

if (nd2i==iLow(NULL,TF,i)) {if (p<=1) {lwnd2[p]=nd2i; p++;}}

if (nd2i==iHigh(NULL,TF,i)) {if (q<=1) {hgnd2[q]=nd2i; q++;}}

if (p==2 && q==2) break;

}

return;

}

 

Come aprire un nuovo ordine dopo il S/L dell'ordine precedente?

Aprire un nuovo ordine dopo S/L dell'ordine precedente.
Caro signore;

C'è qualcuno che conosce il programma per l'EA che dopo aver chiuso l'ordine in base al S/L apre un nuovo ordine?

Saluti
 

...

Probabilmente hai un caso in cui il picco ZigZag di un time frame è lo stesso del picco ZigZag di un altro time frame (che non è un caso insolito dato che stanno cercando dei picchi). Per quanto riguarda i time frame, stai ottenendo valori di time frame corretti con quel codice. Forse si deve fare solo un cambiamento nel codice per assicurarsi di ottenere 4 ultimi valori di ZigZag, e poi il codice sarebbe come questo

void vGetNode2(int TF,double& lwnd2[2],double& hgnd2[2])

{

int p=0; int q=0; int max=iBarShift(NULL,TF,0); double nd2i;

for (int i=0; i<max; i++)

{

nd2i=iCustom(NULL,TF,"ZigZag",13,8,5,0,i);

if (nd2i==iLow(NULL,TF,i)) {if (p<=1) {lwnd2[p]=nd2i; p++;}}

if (nd2i==iHigh(NULL,TF,i)) {if (q<=1) {hgnd2[q]=nd2i; q++;}}

if (p==2 && q==2) break;

}

return;

}

[/PHP]

As you can see only the loop end is changed from "150" to "Bars-1"

novalight:
Hi,

I use standard Zigzag indy in my EA. I use the following code to determine the zigzag nodes. I noticed that sometimes the MT4 returns the zigzag nodes from the wrong time frame. For example, when I try to get H1 zigzag nodes, MT4returns M15 zigzag node values. Has anyone come across such problem before? If you know more info about zigzag and the possible problem area, please advise.

Many thanks.

FFJason

note: TF is the time frame which I feed different values for getting zigzag nodes from different time frame. Somehow MT4 mixed up the node values when a specific TF is used.

[PHP]

void vGetNode2(int TF,double& lwnd2[2],double& hgnd2[2])

{ int t=0; int p=0; int q=0; double nd2i;

for (i=0; i<=150; i++)

{ nd2i=iCustom(NULL,TF,"ZigZag",13,8,5,0,i);

if (nd2i==iLow(NULL,TF,i)) {if (p<=1) {lwnd2[p]=nd2i; p++;}}

if (nd2i==iHigh(NULL,TF,i)) {if (q<=1) {hgnd2[q]=nd2i; q++;}}

if (p==2 && q==2) break;

}

return;

}

 

Problema di ZigZag in EA

Ciao Maiden,

Grazie mille per il tuo aiuto.

Ho letto qualcosa su iBarShift, e il tuo iBarShift(NULL,TF,0) sembra ottenere il numero totale di barre sul grafico. Per favore correggimi se ho frainteso la tua intenzione di usare iBarShift.

Guardo quei casi in cui ZigZag ha restituito valori di nodo sbagliati, e il numero di ricerca (io uso 150) non era il problema. Inoltre, capisco che alcuni nodi sono gli stessi per diversi time frame, ma gli errori che ho trovato erano due o più nodi e i numeri di barra corrispondenti puntavano tutti a un diverso time frame. Questo era il problema che mi lasciava perplesso.

Oggi ho trovato un problema più sconcertante con Zigzag. Uso Alert per visualizzare i nodi restituiti dalla routine e ho scoperto che a volte la routine restituisce una coppia corretta di nodi e il loro numero di barra, ma l'altro nodo e il numero di barra erano entrambi 0. Questo è davvero strano. Ho migliorato ulteriormente la routine assicurandomi che nessun nodo abbia valore 0 con i seguenti codici. Spero solo che non sia MT4 che salta un battito cardiaco o uno stallo, e butta fuori spazzatura al mio EA. Il motivo per cui dico questo è che il mio altro EA che mostra messaggi di avviso quando il mio programma cerca di inserire SL e TP, o raccogliere i valori OP, ed è successo abbastanza spesso che MT4 ha appena saltato questi passaggi, e restituito 0 valori. Devo migliorare il mio programma per cercare questi casi e assicurarmi che questi compiti vengano eseguiti correttamente.

Per favore, consigliatemi. Sono alla fine del mio spirito. Il vostro aiuto è molto apprezzato. Grazie,

Novalight

int iGetNode4(int TF, double& lwnd4, double& hgnd4, int& lwnd4bar, int& hgnd4bar)

{ lwnd4=0; hgnd4=0; lwnd4bar=0; hgnd4bar=0; int t=0,p=0; //node 4 = arrow

for (i=0; i<=120; i++)

{ double lowi=iLow(NULL,TF,i); double highi=iHigh(NULL,TF,i);

if (iCustom(NULL,TF,"ZigZag",80,35,12,0,i)==lowi && lowi!=0) {if (t==0) {lwnd4=iLow(NULL,TF,i); lwnd4bar=i; t++; if(lwnd4==0) Alert(lwnd4);}}

if (iCustom(NULL,TF,"ZigZag",80,35,12,0,i)==highi && highi!=0) {if (p==0) {hgnd4=iHigh(NULL,TF,i); hgnd4bar=i; p++;if (hgnd4==0) Alert(hgnd4);}}

if (t==1 && p==1) break;

}

if (lwnd4bar<hgnd4bar) return(1); //current node 4 is a low node for Long

if (lwnd4bar>hgnd4bar) return(-1); //current node 4 is a high node for Short

return;

}

[/PHP]

mladen:
You probably have a case when the ZigZag peak of one time frame is the same as the ZigZag peak of another time frame (which is not an unusual case since they are looking for peaks). As far as time frames are concerned, you are getting correct time frame values with that code. Maybe just one change in the code has to be done in order to ensure that you get 4 last ZigZag values, and then the code would be like this

[PHP]void vGetNode2(int TF,double& lwnd2[2],double& hgnd2[2])

{

int p=0; int q=0; int max=iBarShift(NULL,TF,0); double nd2i;

for (int i=0; i<max; i++)

{

nd2i=iCustom(NULL,TF,"ZigZag",13,8,5,0,i);

if (nd2i==iLow(NULL,TF,i)) {if (p<=1) {lwnd2[p]=nd2i; p++;}}

if (nd2i==iHigh(NULL,TF,i)) {if (q<=1) {hgnd2[q]=nd2i; q++;}}

if (p==2 && q==2) break;

}

return;

}

As you can see only the loop end is changed from "150" to "Bars-1"
 

...

Per quanto riguarda iBarShift(NULL,TF,0): sì, restituisce il totale delle barre di un time frame target. Ma il ciclo non sarà eseguito così tante volte, esisterà non appena gli ultimi 4 picchi ZigZag saranno trovati.

Ora, per amor di discussione, immaginate questo: chiamate la funzione per un time frame e avete il limite di 150 barre per cercare gli ultimi 4 picchi. La funzione fa il suo lavoro e poi si cerca in un altro time frame. E, tanto per dire, immaginate che il 4° picco sia al di fuori delle prime 150 barre. Cosa succederà. Dato che i tuoi array non sono stati puliti, alcuni risultati per il time frame cercato in precedenza sono ancora lì, dato che alla 150esima barra non sono stati trovati tutti e 4 i picchi e alcuni picchi trovati in precedenza sono rimasti lì come sono stati trovati nel time frame attualmente ricercato

Questo era lo scopo dell'aggiunta di quel codice: assicurarsi che trovasse effettivamente gli ultimi 4 picchi. A volte ci vorranno 10 barre, a volte 1000 (dipende interamente da ZigZag e non è un numero fisso di barre) ma non farà un loop di "barre" volte. Farà il loop solo le volte necessarie e si assicurerà che tutti i 4 picchi siano del time frame di destinazione

Per quanto riguarda la confusione dei time frame non credo che stia accadendo. Il modo in cui vengono aperti i file di cronologia per i time frame di destinazione (semplicemente aggiungendo i minuti del time frame di destinazione al nome del simbolo) rende impossibile leggere i dati da 2 time frame in un singolo ciclo se il parametro del time frame non viene alterato (solo 1 file di cronologia viene aperto in quel caso e non può accedere ai dati da time frame diversi).

novalight:
Ciao Maiden,

Grazie mille per il tuo aiuto.

Ho letto qualcosa su iBarShift, e il tuo iBarShift(NULL,TF,0) sembra ottenere il numero totale di barre sul grafico. Per favore correggimi se ho frainteso la tua intenzione di usare iBarShift.

Guardo quei casi in cui ZigZag ha restituito valori di nodo sbagliati, e il numero di ricerca (io uso 150) non era il problema. Inoltre, capisco che alcuni nodi sono gli stessi per diversi time frame, ma gli errori che ho trovato erano due o più nodi e i numeri di barra corrispondenti puntavano tutti a un diverso time frame. Questo era il problema che mi lasciava perplesso.

Oggi ho trovato un problema più sconcertante con Zigzag. Uso Alert per visualizzare i nodi restituiti dalla routine e ho scoperto che a volte la routine restituisce una coppia corretta di nodi e il loro numero di barra, ma l'altro nodo e il numero di barra erano entrambi 0. Questo è davvero strano. Ho migliorato ulteriormente la routine assicurandomi che nessun nodo abbia valore 0 con i seguenti codici. Spero solo che non sia MT4 che salta un battito cardiaco o uno stallo, e butta fuori spazzatura al mio EA. Il motivo per cui dico questo è che il mio altro EA che mostra messaggi di avviso quando il mio programma cerca di inserire SL e TP, o raccogliere i valori OP, ed è successo abbastanza spesso che MT4 ha appena saltato questi passaggi, e restituito 0 valori. Devo migliorare il mio programma per cercare questi casi e assicurarmi che questi compiti vengano eseguiti correttamente.

Per favore, consigliatemi. Sono alla fine del mio spirito. Il vostro aiuto è molto apprezzato. Grazie,

Novalight

int iGetNode4(int TF, double& lwnd4, double& hgnd4, int& lwnd4bar, int& hgnd4bar)

{ lwnd4=0; hgnd4=0; lwnd4bar=0; hgnd4bar=0; int t=0,p=0; //node 4 = arrow

for (i=0; i<=120; i++)

{ double lowi=iLow(NULL,TF,i); double highi=iHigh(NULL,TF,i);

if (iCustom(NULL,TF,"ZigZag",80,35,12,0,i)==lowi && lowi!=0) {if (t==0) {lwnd4=iLow(NULL,TF,i); lwnd4bar=i; t++; if(lwnd4==0) Alert(lwnd4);}}

if (iCustom(NULL,TF,"ZigZag",80,35,12,0,i)==highi && highi!=0) {if (p==0) {hgnd4=iHigh(NULL,TF,i); hgnd4bar=i; p++;if (hgnd4==0) Alert(hgnd4);}}

if (t==1 && p==1) break;

}

if (lwnd4bar<hgnd4bar) return(1); //current node 4 is a low node for Long

if (lwnd4bar>hgnd4bar) return(-1); //current node 4 is a high node for Short

return;

}

 

Problema di ZigZag in EA

Ciao Maiden,

Hai assolutamente ragione! Ho rivisto il mio codice e ho scoperto che 150 è insufficiente per un grande zigzag, e se non vengono trovati tutti e 4 i nodi, l'intera logica di identificare quale nodo viene per primo o per ultimo andrà in tilt.

In conclusione, non c'è nulla di sbagliato in Zigzag né in MT4, è puramente un mio errore nell'impostare un numero di ricerca troppo piccolo. Ti ringrazio per il tuo tempo, la tua pazienza e soprattutto la tua disponibilità ad aiutare ......

Abbi cura di te .....

Novalight

mladen:
Per quanto riguarda iBarShift(NULL,TF,0): sì, restituisce il totale delle barre di un time frame di destinazione. Ma il ciclo non sarà eseguito così tante volte, esisterà non appena gli ultimi 4 picchi ZigZag saranno trovati.

Ora per amor di discussione immagina questo: chiami la funzione per un time frame e hai il limite di 150 barre per cercare gli ultimi 4 picchi. Fa il lavoro e poi cerchi in un altro time frame. E, tanto per dire, immaginate che il 4° picco sia al di fuori delle prime 150 barre. Cosa succederà. Dato che i tuoi array non sono stati puliti, alcuni risultati per il time frame cercato in precedenza sono ancora lì, dato che alla 150esima barra non sono stati trovati tutti e 4 i picchi e alcuni picchi trovati in precedenza sono rimasti lì come sono stati trovati nel time frame attualmente ricercato

Questo era lo scopo dell'aggiunta di quel codice: assicurarsi che trovasse effettivamente gli ultimi 4 picchi. A volte ci vorranno 10 barre, a volte 1000 (dipende interamente da ZigZag e non è un numero fisso di barre) ma non farà un loop di "barre" volte. Farà il loop solo le volte necessarie e si assicurerà che tutti i 4 picchi siano del time frame di destinazione

Per quanto riguarda la confusione dei time frame non credo che stia accadendo. Il modo in cui vengono aperti i file di cronologia per i time frame di destinazione (semplicemente aggiungendo i minuti del time frame di destinazione al nome del simbolo) rende impossibile leggere i dati di 2 time frame in un singolo ciclo se il parametro del time frame non viene alterato (solo 1 file di cronologia viene aperto in quel caso e non può accedere ai dati di diversi time frame).
 

Aiuto con il codice

Qualcuno sarebbe così gentile da aggiungere del codice all'indicatore SnakeBorders per aggiungere i due seguenti grafici:

1. Un grafico a linee che traccia il centro dell'intervallo bianco (come rappresentato dalla linea rossa nella foto).

2. Un grafico a linee che traccia l'estremo opposto del grafico a linee gialle (come rappresentato dalla linea ciano nella foto).snakeborders.mq4

File:
sb.gif  39 kb
 

per favore qualcuno mi aiuti a creare questo indicatore per me

Indicatore che voglio

Condizione

Comprare quando il prezzo della candela del corpo attraversa sopra l'indicatore ma e rsi > rsi 50 dopo la chiusura della candela aprire una nuova candela iniziare una freccia blu e linea blu fino a vendere

Vendere quando il prezzo della candela del corpo attraversa il fondo dell'indicatore ma e rsi < rsi 50 dopo la chiusura della candela aprire una nuova candela iniziare una freccia rossa e la linea rossa fino a quando si compra

si prega di aggiungere l'input per cambiare anche il valore

Scusate il mio pessimo inglese

Grazie mille

Motivazione: