Aide au codage - page 195

 
shtopr:
спасибо за ответ.

проверил h1, m30, m15, m5, m1

по-прежнему работает только один цвет, красный.

C'est ce que je vous ai dit : pour une 3ème couleur (quand les deux valeurs sont dans la même fourchette de valeurs) vous devez modifier le code pour ajouter une option pour la 3ème couleur.

 
mladen:
Voici une version qui utilise une seule colonne. Si vous souhaitez une troisième couleur, vous devez ajouter une nouvelle option.

Sur un graphique renko live 2min, il y a juste 2 barres vertes en haut et c'est tout pour toutes les paires sur lesquelles je l'ai utilisé, est-ce normal ?

 
drunkpips:
sur un graphique renko live 2min, il y a juste 2 barres vertes en haut et c'est tout pour toutes les paires sur lesquelles je l'ai utilisé, est-ce normal ?

Je n'utilise pas de graphiques renko

Il utilise les indicateurs intégrés (iBEarsPower() et iBullsPower()), donc si des problèmes surviennent, c'est que le problème est déjà lié aux indicateurs intégrés eux-mêmes.

 
mladen:
C'est ce que je t'ai dit : pour une 3ème couleur (quand les deux valeurs sont dans la même fourchette de valeurs) il faut modifier le code pour ajouter une option pour la 3ème couleur.

Ок. Спасибо ! !!

 

mladen,

J'ai étudié et joué avec 'simple mtf' du post #1874.

Note : C'est une MA d'une MA, et une MTF capable.

J'ai quelques questions :

Quoi que je fasse avec le code, je n'arrive pas à comprendre ce que fait le 'returnBars', s'il y a quelque chose.

1. Qu'est-ce qui détermine si le nombre de barres modifiées dans l'intervalle de temps cible est requis et pourquoi ?

2. En ce qui concerne cette ligne :

returnBars = TimeFrame == "returnBars" ; // vérifier si le nombre de barres modifiées est demandé.

Je ne suis pas un programmeur de haut niveau. Je ne connais pas cette construction composée. Je ne connais pas non plus les règles pour mélanger les types de variables.

Il semble que la variable Timeframe obtienne la valeur de la variable booléenne returnBars.

Puis elle assigne la valeur à returnBars - encore une fois. ? ?

Puisque returnBars est booléen, il faut attribuer '1' si TimeFrame est supérieur à 0, sinon attribuer '0' ?

3. Je règle l'indicateur sur une TF plus élevée, et je teste en direct (en avant) de nombreuses barres, ou dans le testeur de stratégie. Je peux éliminer la ligne qui l'utilise, et n'obtenir AUCUN changement sur les lignes de l'indicateur :

if (returnBars) Comment("returnBars ",returnBars, " Tick ",Volume(0)) ;

// if (returnBars) { ma1[0] = limit+1 ; return(0) ; }

La ligne de commentaire à l'écran indiquera "returnBars 1".

Je ne sais pas où il obtient la valeur '1'.

Sans la partie 'if', il affiche toujours '0'.

Même résultat si on l'insère dans Init().

Big Be

 
Big Be:
mladen,

J'ai étudié et joué avec 'simple mtf' du post #1874.

Note : Il s'agit d'une MA d'une MA, et d'une MTF capable.

J'ai quelques questions :

Peu importe ce que je fais avec le code, je n'arrive pas à comprendre ce que fait le 'returnBars', s'il y a quelque chose.

1. Qu'est-ce qui détermine si le nombre de barres modifiées dans l'intervalle de temps cible est requis et pourquoi ?

2. En ce qui concerne cette ligne :

returnBars = TimeFrame == "returnBars" ; // vérifier si le nombre de barres modifiées est demandé.

Je ne suis pas un programmeur de haut niveau. Je ne connais pas cette construction composée. Je ne connais pas non plus les règles pour mélanger les types de variables.

Il semble que la variable Timeframe obtienne la valeur de la variable booléenne returnBars.

Puis elle assigne la valeur à returnBars - encore une fois. ? ?

Puisque returnBars est booléen, il faut attribuer '1' si TimeFrame est supérieur à 0, sinon attribuer '0' ?

3. Je règle l'indicateur sur une TF plus élevée, et je teste en direct (en avant) de nombreuses barres, ou dans le testeur de stratégie. Je peux éliminer la ligne qui l'utilise, et n'obtenir AUCUN changement sur les lignes de l'indicateur :

if (returnBars) Comment("returnBars ",returnBars, " Tick ",Volume(0)) ;

// if (returnBars) { ma1[0] = limit+1 ; return(0) ; }

La ligne de commentaire à l'écran indiquera "returnBars 1".

Je ne sais pas où il obtient la valeur '1'.

Sans la partie 'if', il affiche toujours '0'.

Même résultat si on l'insère dans Init().

Big Be

Big Be

Imaginez ceci :

1. Vous travaillez sur un graphique de 15 minutes et votre indicateur montre des données d'une heure. Combien de barres ont changé au dernier tick sur le graphique de 15 minutes et combien sur le graphique d'une heure ? Return bars vérifie cela. Ce nombre ne doit pas être une valeur supposée (choisissez un cadre temporel que vous n'avez pas visité depuis longtemps et voyez ce qui se passe lorsque metatrader commence à télécharger des données pour ce cadre temporel - vous devez vérifier combien de nouvelles barres ont été téléchargées, sinon vous devrez faire des allers-retours entre les cadres temporels afin d'avoir un état précis des barres passées d'un indicateur multi-cadre temporel).

2. Of returnBars = TimeFrame == "returnBars" ;

Vous avez une affectation ici (le "=") et une comparaison logique ici (le "==") Cela signifie que returnBars doit recevoir le résultat de la comparaison logique de deux chaînes (TimeFrame et "returnBars").

3. ReturnBars est une variable de type booléen. Elle peut avoir deux valeurs : 0 qui équivaut à "false" et 1 qui équivaut à "true". C'est pourquoi vous obtenez 1 pour returnBars (ce qui signifie que returnBars a la valeur "true").

______________

PS : si c'était pour les règles C/C++ pour les booléens, alors toute valeur différente de 0 serait considérée comme vraie, et vous pouvez tester les variables metatrader de la même manière (par exemple if(someDoubleValue) testerait si someDoubleValue est différent de 0), mais metatrader assigne 0 et 1 à une variable de type booléen

 

Cher Mladen

Je n'arrive pas à comprendre comment l'indicateur Poalln se repeint. Je sais que iRSI(NULL,0,RSI,PRICE_TYPICAL,i-8) ou iCCI(NULL,0,CCI,PRICE_TYPICAL,i-8) signifie des valeurs futures, cependant lors du calcul de la dernière barre il n'y a pas de données pour i-8.

Il serait zéro je pense. Alors comment Pollan repeint-il ?

C'est mieux,

 
-IXI-:
Cher Mladen

Je n'arrive pas à comprendre comment l'indicateur Poalln se repeint. Je sais que iRSI(NULL,0,RSI,PRICE_TYPICAL,i-8) ou iCCI(NULL,0,CCI,PRICE_TYPICAL,i-8) signifie des valeurs futures, cependant lors du calcul de la dernière barre il n'y a pas de données pour i-8.

Il serait zéro je pense. Alors comment Pollan repeint-il ?

Le meilleur,

IXI

A une barre actuelle, il obtient les valeurs 0 pour ces barres. A une première barre passée, il obtient 1 valeur future et 7 zéros. Et ainsi de suite.

Au fur et à mesure que de nouvelles barres se forment, les barres qui obtenaient des zéros pour les résultats des valeurs futures obtiennent en fait de vrais résultats futurs et ces valeurs sont modifiées en fonction de ces "nouvelles" valeurs futures.

 

Comment puis-je faire fonctionner cet indicateur sur les paires JPY ?

Bonjour,

Cet indicateur fait une ligne avec chaque nombre rond et une ligne de 15 pips de chaque côté du nombre rond.

Mais il ne fonctionne pas avec les paires JPY.

Que faut-il changer pour qu'il fonctionne ?

#property indicator_chart_window

extern color UpperLineColor = Red;

extern color MainLineColor = Red;

extern color LowerLineColor = Red;

extern double HighOffset = 150;

extern double LowOffset = 150;

extern int LineStyle = 2;

extern string LineStyleInfo = "0=Solid,1=Dash,2=Dot,3=DashDot,4=DashDotDot";

double LineSpaceOld;

double Hoch;

double Tief;

bool FirstRun = true;

double LineSpace = 1.0; // 1 unit = 0.01 of basic value (e.g. 1 USD cent)

string LineText = "RoundNr ";

string LineText1 = "RoundNr1 ";

string LineText2 = "RoundNr2 ";

int deinit()

{

double AbSpace = 0.01*LineSpace;

double Oben = MathRound(110*Hoch)/100;

double Unten = MathRound(80*Tief)/100;

for(double i=0; i<=Oben; i+=AbSpace)

{

if(i<Unten) { continue; }

ObjectDelete(LineText+DoubleToStr(i,2));

ObjectDelete(LineText1+DoubleToStr(i,2));

ObjectDelete(LineText2+DoubleToStr(i,2));

}

return(0);

}

int start()

{

if(FirstRun)

{

Hoch = NormalizeDouble( High, 2 );

Tief = NormalizeDouble( Low, 2 );

FirstRun = false;

}

else if(LineSpace != LineSpaceOld)

{

deinit();

Hoch = NormalizeDouble( High, 2 );

Tief = NormalizeDouble( Low, 2 );

}

DrawLines();

LineSpaceOld = LineSpace;

return(0);

}

void DrawLines()

{

double AbSpace = 0.01*LineSpace;

double Oben = MathRound(110*Hoch)/100;

double Unten = MathRound(80*Tief)/100;

for(double i=0; i<=Oben; i+=AbSpace)

{

if(i<Unten) { continue; }

string StringNr = DoubleToStr(i,2); // 2 digits number in object name

if (ObjectFind(LineText+StringNr) != 0) // HLine not in main chartwindow

{

ObjectCreate(LineText+StringNr, OBJ_HLINE, 0, 0, i);

ObjectSet(LineText+StringNr, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText+StringNr, OBJPROP_COLOR, MainLineColor);

}

else // Adjustments

{

ObjectSet(LineText+StringNr, OBJPROP_PRICE1, i);

ObjectSet(LineText+StringNr, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText+StringNr, OBJPROP_COLOR, MainLineColor);

}

//#######################################################################

if(i<Unten) { continue; }

string StringNr1 = DoubleToStr(i,2); // 2 digits number in object name

if (ObjectFind(LineText1+StringNr1) != 0) // HLine not in main chartwindow

{

ObjectCreate(LineText1+StringNr1, OBJ_HLINE, 0, 0, i+(HighOffset/100000));

ObjectSet(LineText1+StringNr1, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText1+StringNr1, OBJPROP_COLOR, UpperLineColor);

}

else // Adjustments

{

ObjectSet(LineText1+StringNr1, OBJPROP_PRICE1, i+(HighOffset/100000));

ObjectSet(LineText1+StringNr1, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText1+StringNr1, OBJPROP_COLOR, UpperLineColor);

}

//#######################################################################

if(i<Unten) { continue; }

string StringNr2 = DoubleToStr(i,2); // 2 digits number in object name

if (ObjectFind(LineText2+StringNr2) != 0) // HLine not in main chartwindow

{

ObjectCreate(LineText2+StringNr2, OBJ_HLINE, 0, 0, i-(LowOffset/100000));

ObjectSet(LineText2+StringNr2, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText2+StringNr2, OBJPROP_COLOR, LowerLineColor);

}

else // Adjustments

{

ObjectSet(LineText2+StringNr2, OBJPROP_PRICE1, i-(LowOffset/100000));

ObjectSet(LineText2+StringNr2, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText2+StringNr2, OBJPROP_COLOR, LowerLineColor);

}

}

WindowRedraw();

}
 
Georgebaker:
Bonjour,

Cet indi fait une ligne avec chaque nombre rond et une ligne de 15 pips de chaque côté du nombre rond.

Mais il ne fonctionne pas avec les paires JPY.

Que faut-il changer pour que cela fonctionne ?

#property indicator_chart_window

extern color UpperLineColor = Red;

extern color MainLineColor = Red;

extern color LowerLineColor = Red;

extern double HighOffset = 150;

extern double LowOffset = 150;

extern int LineStyle = 2;

extern string LineStyleInfo = "0=Solid,1=Dash,2=Dot,3=DashDot,4=DashDotDot";

double LineSpaceOld;

double Hoch;

double Tief;

bool FirstRun = true;

double LineSpace = 1.0; // 1 unit = 0.01 of basic value (e.g. 1 USD cent)

string LineText = "RoundNr ";

string LineText1 = "RoundNr1 ";

string LineText2 = "RoundNr2 ";

int deinit()

{

double AbSpace = 0.01*LineSpace;

double Oben = MathRound(110*Hoch)/100;

double Unten = MathRound(80*Tief)/100;

for(double i=0; i<=Oben; i+=AbSpace)

{

if(i<Unten) { continue; }

ObjectDelete(LineText+DoubleToStr(i,2));

ObjectDelete(LineText1+DoubleToStr(i,2));

ObjectDelete(LineText2+DoubleToStr(i,2));

}

return(0);

}

int start()

{

if(FirstRun)

{

Hoch = NormalizeDouble( High, 2 );

Tief = NormalizeDouble( Low, 2 );

FirstRun = false;

}

else if(LineSpace != LineSpaceOld)

{

deinit();

Hoch = NormalizeDouble( High, 2 );

Tief = NormalizeDouble( Low, 2 );

}

DrawLines();

LineSpaceOld = LineSpace;

return(0);

}

void DrawLines()

{

double AbSpace = 0.01*LineSpace;

double Oben = MathRound(110*Hoch)/100;

double Unten = MathRound(80*Tief)/100;

for(double i=0; i<=Oben; i+=AbSpace)

{

if(i<Unten) { continue; }

string StringNr = DoubleToStr(i,2); // 2 digits number in object name

if (ObjectFind(LineText+StringNr) != 0) // HLine not in main chartwindow

{

ObjectCreate(LineText+StringNr, OBJ_HLINE, 0, 0, i);

ObjectSet(LineText+StringNr, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText+StringNr, OBJPROP_COLOR, MainLineColor);

}

else // Adjustments

{

ObjectSet(LineText+StringNr, OBJPROP_PRICE1, i);

ObjectSet(LineText+StringNr, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText+StringNr, OBJPROP_COLOR, MainLineColor);

}

//#######################################################################

if(i<Unten) { continue; }

string StringNr1 = DoubleToStr(i,2); // 2 digits number in object name

if (ObjectFind(LineText1+StringNr1) != 0) // HLine not in main chartwindow

{

ObjectCreate(LineText1+StringNr1, OBJ_HLINE, 0, 0, i+(HighOffset/100000));

ObjectSet(LineText1+StringNr1, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText1+StringNr1, OBJPROP_COLOR, UpperLineColor);

}

else // Adjustments

{

ObjectSet(LineText1+StringNr1, OBJPROP_PRICE1, i+(HighOffset/100000));

ObjectSet(LineText1+StringNr1, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText1+StringNr1, OBJPROP_COLOR, UpperLineColor);

}

//#######################################################################

if(i<Unten) { continue; }

string StringNr2 = DoubleToStr(i,2); // 2 digits number in object name

if (ObjectFind(LineText2+StringNr2) != 0) // HLine not in main chartwindow

{

ObjectCreate(LineText2+StringNr2, OBJ_HLINE, 0, 0, i-(LowOffset/100000));

ObjectSet(LineText2+StringNr2, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText2+StringNr2, OBJPROP_COLOR, LowerLineColor);

}

else // Adjustments

{

ObjectSet(LineText2+StringNr2, OBJPROP_PRICE1, i-(LowOffset/100000));

ObjectSet(LineText2+StringNr2, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText2+StringNr2, OBJPROP_COLOR, LowerLineColor);

}

}

WindowRedraw();

}

Georgebaker,

Pourquoi n'utilisez-vous pas certains des indicateurs comme celui-ci : https://www.mql5.com/en/forum/180648/page307 comme base pour votre indicateur ? Cela pourrait vous faire gagner du temps de codage.

Raison: