Aide au codage - page 557

 
mntiwana:
Très cher MLADEN,

Il se peut que ma demande précédente ait été accidentellement supprimée, car la plupart des choses se déroulent ici et là, en cherchant et en ajustant leur place exacte, mais nous sommes faciles et à l'aise dans notre travail, pour rappel, je vous demande un simple stop suiveur avec le code BE que je veux ajouter/fusionner dans l'EA ci-joint que j'ai modifié avec votre aide et vos conseils, mais je ne suis pas pressé, quand c'est possible pour vous, je sais combien de choses sont étalées et vous attendent, merci.

Salutations

simple_ma_cross_eamod-hp.mq4

OK. Ce sera fait

 
 

Bonjour à tous,

Merci de prendre le temps de lire mon message. Je suis un débutant absolu en ce qui concerne le code. J'ai essayé plusieurs choses pour faire fonctionner cet EA mais ce n'était pas la solution. J'étudie les variables globales car je pense qu'il en a besoin pour se souvenir de ce qui s'est passé au lieu de redémarrer lorsqu'un rafraîchissement/rechargement, etc. s'est produit. Il fonctionne parfaitement dans un backtest mais, pour une raison quelconque, lorsqu'il est exécuté en direct, il cesse tout simplement de prendre des positions ou de les fermer, et je ne parviens pas à le comprendre. J'essaie également d'apprendre à faire ces choses, mais je ne fais que commencer, alors pardonnez-moi si je fais les choses de la mauvaise façon. L'EA a une heure de début et de fin et dans ce laps de temps, il peut ouvrir x transactions et lorsque celles-ci se ferment, un cycle se termine. Il est configuré pour n'autoriser qu'un seul cycle par période de temps.

Quelqu'un peut-il regarder ce code pour voir quel est le problème ? Merci beaucoup pour toute aide.

maa1

quantum_shaolin_1.3.2.mq4

quantum.mq4

Dossiers :
 

Bonjour Mladen,

J'ai un indicateur de scanner qui indique combien d'indicateurs indiquent une opportunité d'achat ou de vente sur un symbole particulier, et il scanne le symbole sur plusieurs timeframes.

Le problème est que l'indicateur dit qu'il y a toujours des indicateurs qui indiquent, même si en fait ce n'est pas le cas. Lorsque c'est le cas, le montant de l'indicateur est toujours le même.

Veuillez regarder le code ci-dessous :

double BufferALL[22];

int Timeframe[7][3]={15,,, 60,,, 240,,, 1440,,, 10080,,, 43200,, ,,};

for(x=0; x<=5; x++) {

if ((SymbolBars[y][x]==iBars(symbol[y],Timeframe[x][0]))&&(SymbolBars[y][x+1]==iBars(symbol[y],Timeframe[x+1][0]))) continue;

BufferALL[0]=indi1(symbol[y],Timeframe[x][0]);

//BufferALL[1]=ind2i(symbol[y],Timeframe[x][0]);

BufferALL[2]=ind3i(symbol[y],Timeframe[x][0]);

BufferALL[3]=ind4i(symbol[y],Timeframe[x][0]);

BufferALL[4]=ind5i(symbol[y],Timeframe[x][0]);

BufferALL[5]=indi(symbol[y],Timeframe[x][0]);

BufferALL[6]=indi(symbol[y],Timeframe[x][0]);

BufferALL[7]=indi(symbol[y],Timeframe[x][0]);

BufferALL[8]=indi(symbol[y],Timeframe[x][0]);

BufferALL[9]=indi(symbol[y],Timeframe[x][0]);

BufferALL[10]=indi(symbol[y],Timeframe[x][0]);

BufferALL[11]=indi(symbol[y],Timeframe[x][0]);

BufferALL[12]=indi(symbol[y],Timeframe[x][0]);

BufferALL[13]=indi(symbol[y],Timeframe[x][0]);

BufferALL[14]=indi(symbol[y],Timeframe[x][0]);

BufferALL[15]=indi(symbol[y],Timeframe[x][0]);

BufferALL[16]=indi(symbol[y],Timeframe[x][0]);

BufferALL[17]=indi(symbol[y],Timeframe[x][0]);

BufferALL[18]=indi(symbol[y],Timeframe[x][0]);

BufferALL[19]=indi(symbol[y],Timeframe[x][0]);

BufferALL[20]=indi(symbol[y],Timeframe[x][0]);

BufferALL[21]=indi(symbol[y],Timeframe[x][0]);

for(z=0; z<=14; z++){

if (BufferALL[z] >=534653647457) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=543456346463) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 22345654) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 11111111111) Timeframe[x][1]=Timeframe[x][1]+1; //<

}

} // end of timeframe loop 6 iterations

Lorsque tout est affiché dans un message d'alerte, j'obtiens quelque chose comme EURUSD : 15m/60m/4u/1d/1w/1mo indique une opportunité d'achat 7/7/7/7/7/7/.

Cela signifie qu'il a additionné 7 indicateurs pour chaque période, ce qui est clairement erroné. Il le dit même lorsque je retire tous les appels de fonction. Lorsque je fais cela, tous les éléments de BufferALL[] sont vides.

Mais apparemment la valeur EMPTY est toujours une valeur qui peut être comparée à une autre valeur comme 534653647457 par exemple. Lorsque j'utilise la comparaison >= ou = 534653647457 pour == 534653647457 les messages /7/7/7/7/7/7/7 s'arrêtent. Comment puis-je remédier à ce problème ?

 
mrcodix:
Bonjour Mladen,

J'ai un indicateur de scanner qui indique combien d'indicateurs indiquent une opportunité d'achat ou de vente sur un symbole particulier, et il scanne le symbole sur plusieurs échelles de temps.

Le problème est que l'indicateur dit qu'il y a toujours des indicateurs qui indiquent, même si ce n'est pas le cas. Lorsque c'est le cas, le montant de l'indicateur est toujours le même.

Veuillez regarder le code ci-dessous :

double BufferALL[22];

int Timeframe[7][3]={15,,, 60,,, 240,,, 1440,,, 10080,,, 43200,, ,,};

for(x=0; x<=5; x++) {

if ((SymbolBars[y][x]==iBars(symbol[y],Timeframe[x][0]))&&(SymbolBars[y][x+1]==iBars(symbol[y],Timeframe[x+1][0]))) continue;

BufferALL[0]=indi1(symbol[y],Timeframe[x][0]);

//BufferALL[1]=ind2i(symbol[y],Timeframe[x][0]);

BufferALL[2]=ind3i(symbol[y],Timeframe[x][0]);

BufferALL[3]=ind4i(symbol[y],Timeframe[x][0]);

BufferALL[4]=ind5i(symbol[y],Timeframe[x][0]);

BufferALL[5]=indi(symbol[y],Timeframe[x][0]);

BufferALL[6]=indi(symbol[y],Timeframe[x][0]);

BufferALL[7]=indi(symbol[y],Timeframe[x][0]);

BufferALL[8]=indi(symbol[y],Timeframe[x][0]);

BufferALL[9]=indi(symbol[y],Timeframe[x][0]);

BufferALL[10]=indi(symbol[y],Timeframe[x][0]);

BufferALL[11]=indi(symbol[y],Timeframe[x][0]);

BufferALL[12]=indi(symbol[y],Timeframe[x][0]);

BufferALL[13]=indi(symbol[y],Timeframe[x][0]);

BufferALL[14]=indi(symbol[y],Timeframe[x][0]);

BufferALL[15]=indi(symbol[y],Timeframe[x][0]);

BufferALL[16]=indi(symbol[y],Timeframe[x][0]);

BufferALL[17]=indi(symbol[y],Timeframe[x][0]);

BufferALL[18]=indi(symbol[y],Timeframe[x][0]);

BufferALL[19]=indi(symbol[y],Timeframe[x][0]);

BufferALL[20]=indi(symbol[y],Timeframe[x][0]);

BufferALL[21]=indi(symbol[y],Timeframe[x][0]);

for(z=0; z<=14; z++){

if (BufferALL[z] >=534653647457) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=543456346463) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 22345654) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 11111111111) Timeframe[x][1]=Timeframe[x][1]+1; //<

}

} // end of timeframe loop 6 iterations

Lorsque tout est affiché dans un message d'alerte, j'obtiens quelque chose comme EURUSD : 15m/60m/4u/1d/1w/1mo indique une opportunité d'achat 7/7/7/7/7/7/.

Cela signifie qu'il a additionné 7 indicateurs pour chaque période, ce qui est clairement erroné. Il le dit même lorsque je retire tous les appels de fonction. Lorsque je fais cela, tous les éléments de BufferALL[] sont vides.

Mais apparemment la valeur EMPTY est toujours une valeur qui peut être comparée à une autre valeur comme 534653647457 par exemple. Lorsque j'utilise la comparaison >= ou = 534653647457 pour == 534653647457, les messages /7/7/7/7/7/7/7 s'arrêtent. Comment puis-je remédier à ce problème ?

mrcodix

Sans savoir exactement ce que font les indicateurs (quelles sont leurs valeurs de retour), je ne peux que faire des suppositions, et cela ne m'aiderait pas du tout.

 
mladen:

mrcodix

Sans savoir exactement ce que font les indicateurs (quelles sont leurs valeurs de retour), je ne peux que faire des suppositions, et cela ne m'aide pas du tout.

Cher Mladen,

Vous n'avez pas besoin de connaître les valeurs de retour car ce ne sont pas les indicateurs qui sont en cause. Vous voyez, le même problème se produit lorsque je désactive toutes les fonctions d' appel en ajoutant un "//" devant chaque ligne de code (les transformant en lignes de commentaires). Il en va de même pour les valeurs derrière le = à cet endroit :

for(z=0; z<=14; z++){

if (BufferALL[z] >=534653647457) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=543456346463) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 22345654) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 11111111111) Timeframe[x][1]=Timeframe[x][1]+1; //<

}[/CODE]

it might aswell be something like

for(z=0; z<=14; z++){

if (BufferALL[z] >=1111111111111) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=2222222222222) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 333333333333) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 444444444444) Timeframe[x][1]=Timeframe[x][1]+1; //<

}

it will give the same exact alert message that says /15m/60m/4u/1d/1w/1mo/ is indicating a buying opportunity /7/7/7/7/7/7/. I disabled all the function call lines with // so the BufferALL[22] elements should be EMPTY, they shoulden't contain any value whatsoever. Yet, when the computer comes at the if condition parts BufferALL[z] >=1111111111111 etc it ALWAYS states that the "value" thats inside BufferALL[z] is larger then 11111111111 (or any value you wish to put behind it). The only way to make these additions stop is by changing the if condition = into ==. When the computer asks whether the empty value of BufferALL[z] is exactly the same as 11111111 or 22222 or whatever value you wish to compare, it doesen't return a true and Timeframe is not added with +1. Please try it for youself. I will add the message construction code below:

[CODE]

int SymbolBars[216][7];

if (((Timeframe[0][1] > 0) && (Timeframe[1][1] > 0) && (SymbolBars[y][0]!=iBars(symbol[y],Timeframe[0][0]))&&(SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))) || ((Timeframe[1][1] > 0) && (Timeframe[2][1] > 0)&& (SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))&&(SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))) || ((Timeframe[2][1] > 0) && (Timeframe[3][1] > 0)

&& (SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))&&(SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))) || ((Timeframe[3][1] > 0) && (Timeframe[4][1] > 0) && (SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))&&(SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0]))) || ((Timeframe[4][1] > 0) && (Timeframe[5][1] > 0)&& (SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0])) &&(SymbolBars[y][5]!=iBars(symbol[y],Timeframe[5][0]))))

{

if (Timeframe[0][1]>0)

{

StringAdd(alarmbericht,"15m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[0][1],"/"));

SymbolBars[y][0]=iBars(symbol[y],15);

}

if (Timeframe[1][1]>0)

{

StringAdd(alarmbericht,"60m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[1][1],"/"));

SymbolBars[y][1]=iBars(symbol[y],60);

}

if (Timeframe[2][1]>0)

{

StringAdd(alarmbericht,"4u/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[2][1],"/"));

SymbolBars[y][2]=iBars(symbol[y],240);

}

if (Timeframe[3][1]>0)

{

StringAdd(alarmbericht,"1d/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[3][1],"/"));

SymbolBars[y][3]=iBars(symbol[y],1440);

}

if (Timeframe[4][1]>0)

{

StringAdd(alarmbericht,"1w/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[4][1],"/"));

SymbolBars[y][4]=iBars(symbol[y],10080);

}

if (Timeframe[5][1]>0)

{

StringAdd(alarmbericht,"1mo/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[5][1],"/"));

SymbolBars[y][5]=iBars(symbol[y],43200);

}

Alert(+symbol[y]+" "+alarmbericht+" are indicating a selling opportunity. " +indicatoraantal+".");

alarmbericht = "";

indicatoraantal = "";

}

if (((Timeframe[0][2] > 0) && (Timeframe[1][2] > 0) && (SymbolBars[y][0]!=iBars(symbol[y],Timeframe[0][0]))&&(SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))) || ((Timeframe[1][2] > 0) && (Timeframe[2][2] > 0)&& (SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))&&(SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))) || ((Timeframe[2][2] > 0) && (Timeframe[3][2] > 0)

&& (SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))&&(SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))) || ((Timeframe[3][2] > 0) && (Timeframe[4][2] > 0) && (SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))&&(SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0]))) || ((Timeframe[4][2] > 0) && (Timeframe[5][2] > 0)&& (SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0])) &&(SymbolBars[y][5]!=iBars(symbol[y],Timeframe[5][0]))))

{

if (Timeframe[0][2]>0)

{

StringAdd(alarmbericht,"15m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[0][2],"/"));

SymbolBars[y][0]=Bars(symbol[y],15);

}

if (Timeframe[1][2]>0)

{

StringAdd(alarmbericht,"60m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[1][2],"/"));

SymbolBars[y][1]=Bars(symbol[y],60);

}

if (Timeframe[2][2]>0)

{

StringAdd(alarmbericht,"4u/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[2][2],"/"));

SymbolBars[y][2]=Bars(symbol[y],240);

}

if (Timeframe[3][2]>0)

{

StringAdd(alarmbericht,"1d/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[3][2],"/"));

SymbolBars[y][3]=Bars(symbol[y],1440);

}

if (Timeframe[4][2]>0)

{

StringAdd(alarmbericht,"1w/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[4][2],"/"));

SymbolBars[y][4]=Bars(symbol[y],10080);

}

if (Timeframe[5][2]>0)

{

StringAdd(alarmbericht,"1mo/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[5][2],"/"));

SymbolBars[y][5]=Bars(symbol[y],43200);

}

Alert(+symbol[y]+" "+alarmbericht+" are indicating a buying oppertunity. " +indicatoraantal+".");

alarmbericht = "";

indicatoraantal = "";

}
 

Mladen,

Voici un exemple de message d'alerte continu lorsque je supprime tous les appels d'indicateurs en les transformant en lignes de commentaires.

Quand il s'agit d'une opportunité d'achat, la somme de tous les indicateurs dans tous les cadres temporels possibles est de 15. Quand il s'agit d'une opportunité de vente, elle est de 7. Le BufferALL[] est VIDE donc cela n'a aucun sens.

Enfin, je voudrais vous mentionner quelque chose hors sujet. Dans le passé, j'ai demandé quelque chose à propos de l'indicateur scanner qui scanne plusieurs symboles successivement. Je me demandais s'il n'obtiendrait pas tous les ticks dans les symboles qui changent plus fréquemment quand l'indicateur est attaché à un graphique dont le symbole courant ne se met pas à jour aussi fréquemment (moins de ticks par seconde). Cela signifierait qu'en théorie, l'indicateur pourrait encore être dans la barre de 5 minutes de 20:05 alors que les symboles qui se mettent à jour plus rapidement et qu'il est aussi censé scanner sont déjà à 20:10. Tout simplement parce qu'une nouvelle barre commence au premier tick après 20:04:59, et non lorsque l'horloge atteint 20:05:00. Vous avez répondu à cela en disant que tous les symboles seront vérifiés avec une vitesse de vérification fixe parce que dans la nouvelle version de metatrader la procédure start {return} n'est plus activée à chaque nouveau tick. Elle est activée à un rythme fixe. Il s'est avéré que ce n'était pas vrai. Après avoir transformé tous mes indicateurs en fonctions qui sont incluses dans le code de mon indicateur de scanner lui-même, l'indicateur entier faisait toujours geler mt4 quand je l'exécutais. L'utilisation de iCustom() pour appeler le code ou en insérant le code et en le transformant en fonction interne ne fait aucune différence, il se bloque toujours. Mais j'ai trouvé une solution à ce problème en abandonnant la boucle for maître longue de 215 itérations (chaque itération traite un symbole différent parmi les symboles[y]) et en la remplaçant par une variable qui reçoit un ajout après chaque tic. Je l'utilise pour indiquer à l'ordinateur quel symbole il doit utiliser. Ainsi, au lieu d'essayer d'analyser les 216 symboles à chaque tic (ce qui fait geler l'ensemble), un seul symbole est analysé à chaque tic. Lorsque la variable d'addition atteint 215, elle est remise à 0 et le cycle 216 recommence. Maintenant, tous les symboles sont analysés, bien qu'un peu plus lentement que s'ils avaient été analysés tous les 216 symboles à chaque tick (si le système ne s'était pas figé bien sûr). .... Quoi qu'il en soit. Le fait est que Start{} n'est activé que lorsque le symbole actuel du graphique est mis à jour. Cela signifie qu'il faut plus de temps pour parcourir les 216 symboles lorsque l'indicateur est un symbole moins actif (comme une action) par opposition à un symbole très actif (comme EURUSD). Ainsi, Start{} est toujours activé à chaque nouveau tick.

Dossiers :
 

Bonjour Mladen et Mrtools, je vous demande un grand plaisir.

Il serait gentil de résoudre le problème de deux erreurs lors de la compilation de l'indicateur ci-joint.

Merci d'avance

Moreno

PS : Je suis désolé pour mon anglais :-)

Dossiers :
 
morenokosta:
Bonjour Mladen et Mrtools, je demande un grand plaisir.

Il serait bien de résoudre le problème des deux erreurs lors de la compilation de l'indicateur ci-joint.

Merci d'avance

Moreno

PS : Je suis désolé pour mon anglais :-)

morenokosta

Cet indicateur est OK tel quel

Pas besoin de modifier le code

 

Bonjour Mladen

Pouvez-vous s'il vous plaît ajouter une alerte sur cet indicateur, je suis un débutant.

Merci

Dossiers :
cross.mq4  2 kb