MT não consegue converter lotes fracionários em inteiros?

 

Por favor, se eu tenho 100 ativos de PETR4, ou qualquer outro, e vendo 1 fracionário, o MT registra como mantendo os 100 PETR4 e operando vendido 1 PETR4F?

Como fazer essa conversão no MQL? Eu teria que vender o lote inteiro de 100 unidades e comprar os 99 com símbolo fracionário?

 
Zoltan PauliniPor favor, se eu tenho 100 ativos de PETR4, ou qualquer outro, e vendo 1 fracionário, o MT registra como mantendo os 100 PETR4 e operando vendido 1 PETR4F? Como fazer essa conversão no MQL? Eu teria que vender o lote inteiro de 100 unidades e comprar os 99 com símbolo fracionário?

São símbolos distintos, com especificações independentes... O MetaTrader não reconhece a relação entre os dois, sendo necessário implementar a lógica de conversão... O processo consiste em vender o lote inteiro do símbolo padrão (PETR4) e comprar a quantidade desejada no símbolo fracionário (PETR4F)... Aqui está um exemplo básico (não testado) do ChatGPT de como isso pode ser feito:

#include <Trade\Trade.mqh>

// Criar uma instância da classe CTrade
CTrade trade;

void OnStart()
{
   // Definir os símbolos
   string symbol_regular = "PETR4";
   string symbol_fractional = "PETR4F";

   // Selecionar os símbolos no terminal
   if (!SymbolSelect(symbol_regular, true) || !SymbolSelect(symbol_fractional, true))
   {
      Print("Erro ao selecionar os símbolos.");
      return;
   }

   // Verificar a posição no ativo regular
   double volume_pos = 0;
   if (PositionSelect(symbol_regular))
   {
      volume_pos = PositionGetDouble(POSITION_VOLUME);
      Print("Posição atual em ", symbol_regular, ": ", volume_pos);
   }
   else
   {
      Print("Nenhuma posição aberta em ", symbol_regular);
      return;
   }

   // 1. Vender o lote inteiro do ativo regular
   if (volume_pos > 0)
   {
      if (!trade.Sell(volume_pos, symbol_regular))
      {
         Print("Falha ao vender o lote inteiro de ", symbol_regular, ". Erro: ", GetLastError());
         return;
      }
      else
      {
         Print("Venda de ", volume_pos, " unidades de ", symbol_regular, " realizada com sucesso.");
      }
   }

   // 2. Comprar no ativo fracionário
   double fractional_volume = volume_pos - 1; // Comprar 99 unidades no fracionário
   if (fractional_volume > 0)
   {
      if (!trade.Buy(fractional_volume, symbol_fractional))
      {
         Print("Falha ao comprar o ativo fracionário ", symbol_fractional, ". Erro: ", GetLastError());
         return;
      }
      else
      {
         Print("Compra de ", fractional_volume, " unidades de ", symbol_fractional, " realizada com sucesso.");
      }
   }
}