Zerar variável após um um tempo

 

Boa tarde pessoal;

Alguém poderia me ajudar? Criei um código que me fornece o último lucro e a última perda.

Somado a isso, a variável Opa2 vai somando estes valores de loss e gain. Sendo que, após um certo período de soma, ao final do dia, eu gostaria que esta variável Opa2 zerasse novamente para que no próximo dia ela não venha com a soma acumulado do dia anterior.

Já  tentei usar o Ontimer, mas não obtive êxito. Segue o código:

void OnTrade()
{
        static int previous_open_positions = 0;
        int current_open_positions = PositionsTotal();
        if(current_open_positions < previous_open_positions)             // a position just got closed:
        {
                previous_open_positions = current_open_positions;
                HistorySelect(TimeCurrent()-300, TimeCurrent()); // 5 minutes ago
                int All_Deals = HistoryDealsTotal();
                if(All_Deals < 1) Print("Some nasty shit error has occurred :s");
                // last deal (should be an DEAL_ENTRY_OUT type):
                ulong temp_Ticket = HistoryDealGetTicket(All_Deals-1); 
                // here check some validity factors of the position-closing deal 
                // (symbol, position ID, even MagicNumber if you care...)
               double LAST_TRADE_PROFIT = HistoryDealGetDouble(temp_Ticket , DEAL_PROFIT);
                Print("Last Trade Profit : ", DoubleToString(LAST_TRADE_PROFIT));
                Opa = LAST_TRADE_PROFIT;
                Opa2 += Opa;
                Print("OPa2 : ", DoubleToString(Opa2));               
        }
        else if(current_open_positions > previous_open_positions)       // a position just got opened:
                previous_open_positions = current_open_positions; 

}
 

Rapaz, vc tá bem perdido, hein?

Vamos lá ...

1) Vc não precisa da variável Opa. Vc pode usar direto:

Opa2 += LAST_TRADE_PROFIT;

2) Lá no início da função OnTrade(), vc vai precisar declarar a variável Opa2 para poder usá-la. Como vc quer usar DoubleToString(), ela precisará ser do tipo "double" e, como vc quer que ela preserve o valor entre diferentes eventos OnTrade(), vai precisar declará-la como "static":

static double Opa2 = 0;

3) Para zerar a variável Opa2 na virada de um pregão pra outro, vc pode fazer assim, logo no início da OnTrade():

static long nDaysSince1970 = 0;

long n = (long)TimeCurrent() / (24*60*60);

if ( n > nDaysSince1970 )
{
   nDaysSince1970 = n;
   Opa2 = 0;
}

Espero que ajude.

 
Trader_Patinhas:

Rapaz, vc tá bem perdido, hein?

Vamos lá ...

1) Vc não precisa da variável Opa. Vc pode usar direto:

2) Lá no início da função OnTrade(), vc vai precisar declarar a variável Opa2 para poder usá-la. Como vc quer usar DoubleToString(), ela precisará ser do tipo "double" e, como vc quer que ela preserve o valor entre diferentes eventos OnTrade(), vai precisar declará-la como "static":

3) Para zerar a variável Opa2 na virada de um pregão pra outro, vc pode fazer assim, logo no início da OnTrade():

Espero que ajude.

Kkkkk. Rapaz, estava perdido mesmo. É a segunda vez que você me ajuda irmão.

Fiz um teste rápido aqui e parece que está funcionando perfeitamente. Vou realizar mais testes e te falo.

Mais uma vez muito obrigado irmão. 

Valeu!!!!!!

 
tito.vinicius:

Kkkkk. Rapaz, estava perdido mesmo. É a segunda vez que você me ajuda irmão.

Fiz um teste rápido aqui e parece que está funcionando perfeitamente. Vou realizar mais testes e te falo.

Mais uma vez muito obrigado irmão. 

Valeu!!!!!!

Então, o Opa2 zera na virada de um pregão pra outro. Porém quando aciono minha regra de cálculo profit, a mesma funciona só em um dia. Nos outros consta como eu já estivesse alcançado meu limite.

if(UseLimit==true)
{
   if (Opa2 >= MaximumProfit || Opa2 <=MaximumLoss)
      {
         TradeNow = 0;
         Print("Profit limit was reached");
         Comment("Profit limit was reached");
            if(OpenOrders(_Symbol) > 0)
               {
                  CLOSEALL(0);CLOSEALL(1);

               }
      }
else 
   {
   TradeNow = 1;
   }
}
Razão: