Comment coder ? - page 312

 

...

Comment votre LastProfitHigh est-il déclaré ?

Si elle est déclarée dans le corps de la fonction (start() par exemple), elle changera toujours de valeur si vous ne la déclarez pas comme statique. Donc, si elle est déclarée comme locale (dans la fonction), essayez de la déclarer à la portée globale ou comme variable statique et de cette façon, elle "héritera" des valeurs entre deux ticks.

aud4xtrader:
Bonjour à tous,

Je suis nouveau dans le codage et j'ai lentement appris le langage et la syntaxe mais j'ai une question sur la façon dont MT4 met à jour les variables.

J'ai essayé de coder un simple EA qui affiche le profit le plus élevé d'une transaction actuellement ouverte et qui ne devrait être mis à jour que si un nouveau sommet est atteint, mais ce qui se passe, c'est que le montant descend et monte en même temps que le profit, je ne peux pas voir mon erreur dans la logique du code.

Je vérifie que la transaction sélectionnée est toujours ouverte.

t_CloseTime=OrderCloseTime() ; //renvoie 0 si l'ordre n'est pas fermé

if(t_CloseTime==0) //L'ordre est fermé s'il n'est pas nul.

{

if(OrderProfit() > LastProfitHigh) LastProfitHigh=OrderProfit() ;

if(LastProfitHigh >= MinProfit && MinProfitReached==false) MinProfitReached=true ;

}//endif

Si la logique est correcte, pourquoi la variable " LastProfitHigh " monte et descend-elle ? ....

Merci pour votre aide.
 

Nouveau dans le codage

mladen:
Comment est déclarée la variable LastProfitHigh ? Si elle est déclarée dans le corps de la fonction (start() par exemple), elle changera toujours de valeur si vous ne la déclarez pas comme statique. Donc, si elle est déclarée comme locale (dans la fonction), essayez de la déclarer à la portée globale ou comme variable statique et de cette façon, elle "héritera" des valeurs entre deux ticks.

Bonjour mladen,

J'ai maintenant déplacé la variable en dehors du func start() et l'ai déclarée "static double", merci pour la réponse et croisons les doigts pour qu'elle s'affiche correctement.

La logique du code est correcte ???

 

aud4xtrader

La logique est correcte

Si vous déplacez la variable en dehors du début, vous n'avez pas besoin de la déclarer statique (elle est automatiquement une variable globale lorsqu'elle se trouve en dehors du corps d'une fonction - et elle est "visible" dans tout le code). Si vous voulez que la variable reste locale à une fonction et conserve son état précédent (l'état d'un tick précédent, par exemple), vous la déclarez statique.

Voici deux exemples qui aboutissent au même résultat

double previousProfit=0;

int start()

{

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

[/PHP]

or the same thing but with static variable

[PHP]

int start()

{

static double previousProfit=0;

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

aud4xtrader:
Bonjour mladen,

J'ai maintenant déplacé la variable en dehors de la fonction start() et je l'ai déclarée "static double", merci pour la réponse et croisons les doigts pour qu'elle s'affiche correctement.

La logique du code est correctement énoncée ? ??
 

Comment coder ?

Cela fonctionne très bien, merci encore pour l'excellente aide.

mladen:
aud4xtrader

La logique est correcte

Si vous déplacez la variable en dehors du début, vous n'avez pas besoin de la déclarer statique (c'est automatiquement une variable globale lorsqu'elle se trouve en dehors du corps d'une fonction - et elle est "visible" dans tout le code). Si vous voulez que la variable reste locale à une fonction et conserve son état précédent (l'état d'un tick précédent, par exemple), vous la déclarez statique.

Voici deux exemples qui aboutissent au même résultat

double previousProfit=0;

int start()

{

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

[/PHP]

or the same thing but with static variable

[PHP]

int start()

{

static double previousProfit=0;

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

 

Parfait ! Merci.

mladen:
Essayez ces 2 fonctions
: La première est de savoir s'il y a un ordre avec exactement le même prix ouvert déjà

. La seconde est de vérifier s'il y a un ordre qui est à moins de nnn points du prix désiré

.

Les deux fonctions retournent vrai si le prix est égal ou si la distance du prix de certains ordres actuellement ouverts est inférieure à la distance spécifiée.

bool existsAtSamePrice(int magicNumber, double price)

{

for (int i=OrdersTotal()-1; i>=0 ; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol()!=Symbol()) continue;

if (OrderMagicNumber()!=magicNumber) continue;

if (CompareDouble(OrderOpenPrice(),price)) return(true);

}

return(false);

}

//

//

//

//

//

bool existsAtApproximatePrice(int magicNumber, double price, double distance)

{

for (int i=OrdersTotal()-1; i>=0 ; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol()!=Symbol()) continue;

if (OrderMagicNumber()!=magicNumber) continue;

if (MathAbs(OrderOpenPrice()-price)< distance) return(true);

}

return(false);

}

//

//

//

//

//

bool CompareDouble(double val1, double val2)

{

return(NormalizeDouble(val1,Digits)==NormalizeDouble(val2,Digits));

}

 

Comment coder ?

Bonjour Pip,

Merci pour les extraits de code, c'est génial la façon dont les gens peuvent partager des idées et des styles de codage, au fur et à mesure que mes connaissances se développent, je peux tirer des leçons de personnes comme toi et mladen.

Pip:
Parfait ! Merci.
 

Bonjour,

J'ai une demande.

Si je veux supprimer tous les objets qui contiennent dans le nom le mot "exemple" avec la commande ObjectDelete comment je dois écrire le code ?

Pour Exemple

Nom de l'objet

"Exemple13241"

"Exemple453623"

Je veux supprimer tous les objets qui contiennent le mot "Exemple".

Merci beaucoup

 

...

Utilisez quelque chose comme ceci (cela supprimera tous les objets dont le nom commence par "Exemple") :

string lookFor = "Example";

int lookForLength = StringLen(lookFor);

for (int i=ObjectsTotal()-1; i>=0; i--)

{

string objectName = ObjectName(i);

if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName);

}

dasio:
Bonjour,

J'ai une demande.

Si je veux supprimer tous les objets qui contiennent dans le nom le mot "exemple" avec la commande ObjectDelete comment je dois écrire le code ?

Pour Exemple

Nom de l'objet

"Exemple13241"

"Exemple453623"

Je veux supprimer tous les objets qui contiennent le mot "Exemple".

Merci beaucoup.
 
mladen:
Utilisez quelque chose comme ceci (cela supprimera tous les objets dont le nom commence par "Exemple") :
string lookFor = "Example";

int lookForLength = StringLen(lookFor);

for (int i=ObjectsTotal()-1; i>=0; i--)

{

string objectName = ObjectName(i);

if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName);

}

Merci, c'est parfait.

J'ai une autre question ^^.

Je crée un segment de ligne de tendance dans le graphique avec une longueur déclarée. Je peux définir la couleur et c'est bon. Je voudrais savoir s'il est possible de définir plus d'une couleur dans la même ligne de tendance.

Par exemple pour la première partie 1/3 une couleur, pour la partie 2/3 une autre couleur et pour la partie 3/3 une autre.

C'est possible ?

Merci^^

 

..

En bref, si vous faites référence aux objets, la réponse est non. Il faudrait créer 3 objets pour cela

Si vous utilisez des tampons pour cela, alors vous auriez besoin de 5 tampons de dessin pour une ligne de 3 couleurs sans repeinture, et comme il n'y a que 8 tampons de dessin, cela vous limite de manière significative.

dasio:
Merci, c'est parfait.

J'ai une autre question ^^.

Je crée un segment de ligne de tendance dans le graphique avec une longueur déclarée. Je peux définir la couleur et c'est bon. Je voudrais savoir s'il est possible de définir plus d'une couleur dans la même ligne de tendance.

Par exemple pour la première partie 1/3 une couleur, pour la partie 2/3 une autre couleur et pour la partie 3/3 une autre.

Est-ce possible ?

Merci^^