Aide au codage - page 38

 

...

Dans l'indicateur, la seule façon de le faire serait de le maintenir dans une boucle sans fin jusqu'à ce qu'un événement (clavier, souris, ...) soit détecté.

Mais cela signifierait également que l'exécution du reste des fonctions du terminal est arrêtée (c'est la même chose que lorsque vous avez un mauvais indicateur qui plante - bloque votre metatrader) Donc, ce n'est pas une bonne solution. La fonction qui est habituellement utilisée pour cela (sleep), qui permet l'exécution d'un autre code pendant que votre code est en pause (c'est le moment où vous laissez le reste des fonctions du terminal faire le travail), est désactivée dans les indicateurs et ne peut donc pas être utilisée comme solution.

marley60:
S'il y a une alarme, elle émet un son "pling" une fois. Y a-t-il une possibilité de jouer un son d'alarme jusqu'à ce que je l'arrête ? (J'ai remplacé le son de l'alarme par une chanson mais je préférerais avoir le choix entre jouer une fois/jouer jusqu'à ce que je l'arrête (comme c'était le cas dans tradestation).
 

Question sur l'index

Bonjour Mladen ;

J'ai vu que quelqu'un appelle un indicateur tel que Ind[3][0][1] comme ça, que signifie le premier et le deuxième indice défini ?

Merci d'avance

kemal

 

Problème de zigzag dans l'EA

Bonjour,

J'utilise l'indy Zigzag standard dans mon EA. J'utilise le code suivant pour déterminer les nœuds du zigzag. J'ai remarqué que parfois le MT4 renvoie les nœuds de zigzag à partir du mauvais cadre temporel. Par exemple, lorsque j'essaie d'obtenir les nœuds zigzag de H1, MT4renvoie les valeurs des nœuds zigzag de M15. Quelqu'un a-t-il déjà rencontré un tel problème ? Si vous avez plus d'informations sur le zigzag et les problèmes possibles, merci de nous les communiquer.

Merci beaucoup.

FFJason

note : TF est le cadre temporel dans lequel j'ai introduit différentes valeurs pour obtenir les nœuds zigzag de différents cadres temporels. D'une manière ou d'une autre, MT4 a mélangé les valeurs des nœuds lorsqu'un TF spécifique est utilisé.

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;

}

 

Comment ouvrir un nouvel ordre après le S/L de l'ordre précédent ?

Ouvrir un nouvel ordre après le S/L de l'ordre précédent.
Cher Monsieur ;

Est-ce que quelqu'un connaît le programme qui permet à EA d'ouvrir un nouvel ordre après avoir fermé l'ordre basé sur le S/L ?

Salutations
 

...

Vous avez probablement un cas où le pic ZigZag d'un cadre temporel est le même que le pic ZigZag d'un autre cadre temporel (ce qui n'est pas un cas inhabituel puisqu'ils recherchent des pics). En ce qui concerne les cadres temporels, vous obtenez des valeurs de cadre temporel correctes avec ce code. Peut-être qu'un seul changement dans le code doit être fait afin de s'assurer que vous obtenez 4 dernières valeurs ZigZag, et alors le code serait comme ceci

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;

}

 

Problème de zigzag dans l'EA

Salut Maiden,

Merci beaucoup pour votre aide.

J'ai fait quelques recherches sur iBarShift, et votre iBarShift(NULL,TF,0) semble obtenir le nombre total de barres sur le graphique. Veuillez me corriger si j'ai mal compris votre intention d'utiliser iBarShift.

Je regarde les cas où ZigZag a renvoyé des valeurs de nœud erronées, et le nombre de recherche (j'utilise 150) n'était pas le problème. De plus, je comprends que certains nœuds sont les mêmes pour différentes périodes de temps, mais les erreurs que j'ai trouvées étaient deux nœuds ou plus et les numéros de barre correspondants pointaient tous vers une période de temps différente. C'était le problème qui me rendait perplexe.

Aujourd'hui, j'ai trouvé un autre problème avec Zigzag. J'ai utilisé Alert pour afficher les nœuds renvoyés par la routine et j'ai constaté que parfois la routine renvoie une paire correcte de nœuds et son numéro de barre, mais l'autre nœud et le numéro de barre étaient tous deux nuls. C'est vraiment étrange. J'ai encore amélioré la routine en m'assurant qu'aucun nœud n'a la valeur 0 avec les codes suivants. J'espère seulement que ce n'est pas MT4 qui saute un battement de cœur ou qui décroche, et qui envoie des déchets à mon EA. La raison pour laquelle je dis cela est que mon autre EA qui montre des messages d'alerte lorsque mon programme essaie d'insérer SL et TP, ou de recueillir des valeurs OP, et il est arrivé assez souvent que MT4 a juste sauté ces étapes, et a retourné des valeurs 0. Je dois améliorer mon programme afin de repérer ces cas et m'assurer que ces tâches sont effectuées correctement.

Veuillez me conseiller. Je suis à bout de nerfs. Votre aide est très appréciée. Merci,

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"
 

...

Quant à iBarShift(NULL,TF,0) : oui, il renvoie le nombre total de barres d'un intervalle de temps cible. Mais la boucle ne sera pas exécutée autant de fois, elle existera dès que les 4 derniers pics de ZigZag seront trouvés.

Maintenant, pour les besoins de l'argumentation, imaginez ceci : vous appelez la fonction pour une période et vous avez la limite de 150 barres pour rechercher les 4 derniers pics. Elle fait le travail et ensuite vous regardez dans un autre cadre temporel. Et, juste pour le plaisir d'argumenter, imaginez que le 4ème pic est en dehors des 150 premières barres. Ce qui va se passer. Puisque vos tableaux n'ont pas été nettoyés, certains résultats de l'intervalle de temps précédemment recherché sont toujours là, car à la 150ème barre, les 4 pics n'ont pas tous été trouvés et certains pics précédemment trouvés sont laissés là car ils ont été trouvés dans l'intervalle de temps actuellement recherché.

C'était le but de l'ajout de ce code : s'assurer qu'il trouve réellement les 4 derniers pics. Parfois, cela prendra 10 barres, parfois 1000 (cela dépend entièrement de ZigZag et n'est pas un nombre fixe de barres), mais il ne bouclera pas les "barres" fois. Il ne bouclera que les fois nécessaires et s'assurera que les 4 pics sont tous issus du cadre temporel cible.

En ce qui concerne la confusion entre les périodes, je ne pense pas qu'elle se produise. La façon dont les fichiers historiques pour les périodes cibles sont ouverts (en ajoutant simplement les minutes de la période cible au nom du symbole) rend impossible la lecture des données de deux périodes dans une seule boucle si le paramètre de la période n'est pas modifié (un seul fichier historique est ouvert dans ce cas et il ne peut pas accéder aux données de différentes périodes).

novalight:
Salut Maiden,

Merci beaucoup pour votre aide.

J'ai fait quelques recherches sur iBarShift, et votre iBarShift(NULL,TF,0)semble obtenir le nombre total de barres sur le graphique. Veuillez me corriger si j'ai mal compris votre intention d'utiliser iBarShift.

Je regarde les cas où ZigZag a renvoyé des valeurs de nœud erronées, et le nombre de recherche (j'utilise 150) n'était pas le problème. De plus, je comprends que certains nœuds sont les mêmes pour différentes périodes de temps, mais les erreurs que j'ai trouvées étaient deux nœuds ou plus et les numéros de barre correspondants pointaient tous vers une période de temps différente. C'était le problème qui me rendait perplexe.

Aujourd'hui, j'ai trouvé un autre problème avec Zigzag. J'ai utilisé Alert pour afficher les nœuds renvoyés par la routine et j'ai constaté que parfois la routine renvoie une paire correcte de nœuds et son numéro de barre, mais l'autre nœud et le numéro de barre étaient tous deux nuls. C'est vraiment étrange. J'ai encore amélioré la routine en m'assurant qu'aucun nœud n'a la valeur 0 avec les codes suivants. J'espère seulement que ce n'est pas MT4 qui saute un battement de cœur ou qui décroche, et qui envoie des déchets à mon EA. La raison pour laquelle je dis cela est que mon autre EA qui montre des messages d'alerte lorsque mon programme essaie d'insérer SL et TP, ou de recueillir des valeurs OP, et il est arrivé assez souvent que MT4 a juste sauté ces étapes, et a retourné des valeurs 0. Je dois améliorer mon programme afin de repérer ces cas et m'assurer que ces tâches sont effectuées correctement.

Veuillez me conseiller. Je suis à bout de nerfs. Votre aide est très appréciée. Merci,

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;

}

 

Problème de zigzag dans l'EA

Salut Maiden,

Vous avez tout à fait raison ! J'ai revu mon code et j'ai trouvé que 150 est insuffisant pour un grand zigzag, et si les 4 nœuds ne sont pas tous trouvés, toute la logique d'identification du premier ou du dernier nœud sera déréglée.

En conclusion, il n'y a aucun problème avec Zigzag ou MT4, c'est purement ma propre erreur en fixant un nombre de recherche trop petit. Je vous remercie de votre temps, de votre patience et surtout de votre volonté d'aider .......

Prenez soin de vous .....

Novalight

mladen:
Quant à iBarShift(NULL,TF,0) : oui, il renvoie le nombre total de barres d'un intervalle de temps cible. Mais la boucle ne sera pas exécutée autant de fois, elle existera dès que les 4 derniers pics de ZigZag seront trouvés.

Maintenant, pour les besoins de l'argumentation, imaginez ceci : vous appelez la fonction pour une période de temps et vous avez la limite de 150 barres pour rechercher les 4 derniers pics. Elle fait le travail et ensuite vous regardez dans un autre cadre temporel. Et, juste pour le plaisir d'argumenter, imaginez que le 4ème pic est en dehors des 150 premières barres. Ce qui va se passer. Puisque vos tableaux n'ont pas été nettoyés, certains résultats de l'intervalle de temps précédemment recherché sont toujours là, car à la 150ème barre, les 4 pics n'ont pas tous été trouvés et certains pics précédemment trouvés sont laissés là car ils ont été trouvés dans l'intervalle de temps actuellement recherché.

C'était le but de l'ajout de ce code : s'assurer qu'il trouve réellement les 4 derniers pics. Parfois, il faudra 10 barres, parfois 1000 (cela dépend entièrement de ZigZag et n'est pas un nombre fixe de barres), mais il ne bouclera pas les "barres" fois. Il ne bouclera que les fois nécessaires et s'assurera que les 4 pics proviennent de l'intervalle de temps cible.

En ce qui concerne la confusion des cadres temporels, je ne pense pas que cela se produise. La façon dont les fichiers historiques pour les périodes cibles sont ouverts (en ajoutant simplement les minutes de la période cible au nom du symbole) rend impossible la lecture des données de 2 périodes dans une seule boucle si le paramètre de la période n'est pas modifié (un seul fichier historique est ouvert dans ce cas et il ne peut pas accéder aux données de différentes périodes).
 

Aide pour le code

Quelqu'un aurait-il la gentillesse d'ajouter du code à l'indicateur SnakeBorders pour ajouter les deux graphiques suivants :

1. Un graphique linéaire qui trace le milieu de la plage blanche (comme représenté par la ligne rouge sur l'image).

2. Un tracé de ligne qui trace l'extrême opposé du tracé de ligne jaune (comme décrit par la ligne cyan sur l'image).snakeborders.mq4

Dossiers :
sb.gif  39 kb
 

S'il vous plaît, quelqu'un peut m'aider à créer cet indicateur

Indicateur que je veux

Condition

Acheter quand le prix de la bougie du corps traverse l'indicateur ma et rsi > rsi 50 après la fermeture de la bougie ouvrir une nouvelle bougie commencer une flèche bleue et une ligne bleue jusqu'à la vente.

Vendre quand le prix de la bougie du corps traverse l'indicateur ma inférieur et rsi < rsi 50 après la fermeture de la bougie ouvrir une nouvelle bougie commencer une flèche rouge et la ligne rouge jusqu'à l'achat.

s'il vous plaît ajouter l'entrée pour changer la valeur aussi

Désolé pour mon mauvais anglais

Merci beaucoup