C++ executer function 1 fois

Résolu/Fermé
pgforex Messages postés 5 Date d'inscription samedi 10 octobre 2009 Statut Membre Dernière intervention 5 novembre 2009 - 4 nov. 2009 à 05:49
pgforex Messages postés 5 Date d'inscription samedi 10 octobre 2009 Statut Membre Dernière intervention 5 novembre 2009 - 5 nov. 2009 à 02:26
Bonjour, je ne connais pas grand chose en C++. Je ne sais pas si les termes que j'emploie sont exact.

J'aimerais que le code suivant s'execute une seule fois, meme si les conditions sont renconter plus d'une fois.

if(int a>=10)
{
instruction.....
}

C'est surement une question de true/false mais je m'y connais pas.

Merci!

4 réponses

Bonjour

Il suffit d'ajouter une autre variable qui se rappelle si tu as déja fait le traitement ou pas :

int dejafait=0;
...
if ((int a>=10) && (dejafait=0))
{
dejafait=1;  // comme ça on n'y reviendra plus
instruction.....
} 
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
4 nov. 2009 à 12:07
Ouai, mais si c'est au sein d'une fonction, il y a un souci. à ce moment là il faut mettre la fonction static.
Bref, si nous n'avons pas les condition de boucle et l'environnement de l'appel, il est très difficile de t'aider !
0
pgforex Messages postés 5 Date d'inscription samedi 10 octobre 2009 Statut Membre Dernière intervention 5 novembre 2009
4 nov. 2009 à 15:32
Merci de vos réponses. Je n'ai pas affiché le code complet car ce n'est pas vraiment du C++. C'est plutôt du mql4 https://www.mql4.com/ . C'est un langage réservé a la platform de trading MetaTrader4 https://www.metaquotes.net/ . Le problème c'est que le seul forum digne de s'appeler forum est en anglais. Je n'ais jamais codé de ma vie, donc c'est encore plus dure de comprend en anglais.

Voici mon premier code à vie. En même temps, j'ai un erreur de bracket dans la loop for (unbalanced bracket) si vous la trouvé.

Les deux chose qui doivent être exécuté 1 seule fois sont commenté avec ceci:
//---- Take Profit half position execut only once

Merci!

//+------------------------------------------------------------------+
//| |
//| Copyright © 2009, Pascal Gignac |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Pascal Gignac"
#property link ""

//---- Input Parameters
extern int TakeProfit = 20;
extern int FirstTarget = 15;
extern int FirstStop = 1;
extern int StopLoss = 20;
extern int EMA_Period1 = 5;
extern int EMA_Period2 = 10;

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
int cnt, ticket, total, EMA_1, EMA_2;
double CloseLots;
//----
for(cnt = 0; cnt < total; cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES==true))
if(OrderType() == OP_SELL && OrderSymbol() == Symbol())
{

CloseLots = OrderLots() / 2;
EMA_1 = iMA(Symbol(),0,EMA_Period1,0,MODE_EMA,PRICE_CLOSE,0);
EMA_2 = iMA(Symbol(),0,EMA_Period2,0,MODE_EMA,PRICE_CLOSE,0);

//---- Max Stop Loss OP_SELL
if(Bid >= (OrderOpenPrice()+(StopLoss*Point))
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);
return(0);
} //---- Modify when hit First Target
if(Bid <= OrderOpenPrice()-(FirstTarget*Point))
{
OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() - (FirstStop*Point),0, 0, Blue);
return(0);
} //---- Take Profit half position execut only once
if(Bid <= OrderOpenPrice()-(TakeProfit*Point)
{
OrderClose(OrderTicket(),CloseLots, Bid,3,Green);
return(0);
//---- Take Profit second half position when EMA crosse
}
if(EMA_1 > EMA_2)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Lime);
return(0);
}
}
else //---- Sinon OP_BUY
//---- Max StopLoss on OP_BUY
{
if(Ask <= (OrderOpenPrice()-(StopLoss * Point)))
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
return(0);
}
//---- Modify when hit First Target
if(Ask >= OrderOpenPrice()+(FirstTarget*Point))
{
OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+(FirstStop*Point),0,0, Blue);
return(0);
}
//---- Take Profit half position execute only once
if(Ask >= OrderOpenPrice()+(TakeProfit*Point))
{
OrderClose(OrderTicket(),CloseLots, Ask,3,Green);
return(0);
}
//---- Take Profit second half position when EMA crosse
if(EMA_1 < EMA_2)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Lime);
return(0);
}
return(0);
}
}
}

//----
return(0);
}

//+------------------------------------------------------------------+
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298 > pgforex Messages postés 5 Date d'inscription samedi 10 octobre 2009 Statut Membre Dernière intervention 5 novembre 2009
4 nov. 2009 à 16:35
comme on a dit, mais une fonction de flag. selon que tu veux que la première fois soit absolue, il faut mettre une variable global, si tu veux que ça soit la première fois à chaque appel de la fonction start(), il faut mettre la variable dans la fonction start. (sans static).
Pour les problèmes d'accolades et de parenthèses, il y a deux solutions :
indenter correctement ton code, comme ça tu verras visuellement où il manque une accolade.
Et encore plus simple, avoir un éditeur qui repère les paires. La plupart des éditeurs de C++ le fond (des fois il faut l'activer dans les options). En plaçant ton curseur sur l'accolade, l'accolade correspondante doit être surligner.
0
Merci de la précision, tu as tout à fait raison. Mais, sauf que c'est la variable qui doit être static :
static int dejafait=0;
(ou globale, n'ayons peur de rien)
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
4 nov. 2009 à 14:38
au temps pour moi. erreur d'expression. Global c'est ce qu'il y a de plus sur !
0
pgforex Messages postés 5 Date d'inscription samedi 10 octobre 2009 Statut Membre Dernière intervention 5 novembre 2009
5 nov. 2009 à 02:26
Excellent tout est réglé.

Merci!
pgforex
0