Questão de lógica !! Por que esse código nunca vai dar certo?

 
double profit ;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void fechaUsandoProfit()
  {
   int magicNum = GetMagicNumber(Symbol());
   int total = PositionsTotal();
   for(int i = 0; i < total; i++)
     {
      if(PositionGetInteger(POSITION_MAGIC) == magicNum)
        {
         int positionType = PositionGetInteger(POSITION_TYPE);
         double profit = CalculateProfit(positionType, magicNum);

         // Feche a posição com base no lucro calculado
         ulong ticket = PositionGetInteger(POSITION_TICKET);
         if(profit < -0.50)    // Condição de lucro, pode ser ajustada conforme necessário
           {
            if(!PositionClose(ticket))
              {
               Print("Falha ao fechar a posição com ticket: ", ticket, profit);
              }
            else
              {
               Print("Posição com ticket ", ticket, " fechada com lucro: ", profit);
              }
           }
        }
     }
  }


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CalculateProfit(int orderType, int magicNumber)
  {
// Verifique se a posição existe
   if(!PositionSelect(magicNumber))
     {
      return 0.0; // Retorna 0 se a posição não for encontrada
     }

// Obtenha o tipo de posição (compra ou venda)
   int positionType = PositionGetInteger(POSITION_TYPE);

// Verifique se a ordem especificada corresponde ao tipo de posição
   if(orderType != positionType)
     {
      return 0.0; // Retorna 0 se a ordem não corresponder ao tipo de posição
     }

// Obtenha o preço de abertura da posição
   double openingPrice = PositionGetDouble(POSITION_PRICE_OPEN);

// Obtenha o preço atual de mercado
   double currentPrice;
   if(positionType == POSITION_TYPE_BUY)
     {
      currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); // Preço de venda para posições de compra
     }
   else
     {
      currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_ASK); // Preço de compra para posições de venda
     }

// Calcule o lucro
   double profit = CalculatePositionProfit(positionType, openingPrice, currentPrice);

// Imprima o lucro
   Print("Lucro para ordem ", orderType == POSITION_TYPE_BUY ? "compra" : "venda", " com número mágico ", magicNumber, ": ", profit);

   return profit; // Retorna o valor do lucro
  }

// Função auxiliar para calcular o lucro com base no tipo de posição
double CalculatePositionProfit(int positionType, double openingPrice, double currentPrice)
  {
   if(positionType == POSITION_TYPE_BUY)    // Posição de compra
     {
      return currentPrice - openingPrice;
     }
   else
      if(positionType == POSITION_TYPE_SELL)    // Posição de venda
        {
         return openingPrice - currentPrice;
        }
   return 0.0; // Caso contrário, retorne 0
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool PositionClose(ulong ticket)
  {
   for(int i = 0; i < PositionsTotal(); i++)
     {
      ulong ticket = PositionGetTicket(i);
      if(m_trade.PositionClose(ticket))
        {
         return true;
        }
      else
        {
         Print(" PositionClose - Erro ao fechar a posição com ticket: ", ticket, " - Erro: ", GetLastError());

        }

     }
   return false;
  }
//+------------------------------------------------------------------+
 
Edson Roberto Safra:

1. As funções são soltas e esqueceu de chamar? ;

2. fechaUsandoProfit percorre o vetor de posições, mas sempre fica na mesma sem pedir pra trocar a posição. Isso quer dizer que o primeiro IF dentro do FOR é invalido;

3. calculateProfit logo no primeiro IF indica que provavelmente foi gerado o código por quem não leu a documentação dado que ela é bem clara nesse ponto;

4. teste de orderType  e positionType claramente é uma contradição porque mesmo sendo conceitos semelhantes são completamente diferentes e não faz sentido compara-los;

5. não se engane com o PositionClose que ele possui erro também, já que esses geradores são burros. Qual o sentido de passar um ticket e percorrer uma lista? Voce deveria trocar o nome da função e retirar o parametro ou realizar a chamada direto ao close já que já tem o ticket.