C++ executer function 1 fois

Résolu
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!
Configuration: Windows XP
Firefox 3.5.4

4 réponses

  1. 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
    1. Contributeur
      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
      1. 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
      2. Contributeur
        @pgforexcomme 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
    2. 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
      1. Contributeur
        au temps pour moi. erreur d'expression. Global c'est ce qu'il y a de plus sur !
        0
    3. Excellent tout est réglé.

      Merci!
      pgforex
      0