I am developing an Expert Advisor (EA) in MetaTrader 5 (MT5) to monitor floating profits and close positions when a certain profit threshold is reached.
I encounter implicit conversion errors when trying to concatenate numeric values (such as integers and doubles) with strings for output to the log.
The error message during compilation:
pgsql
Copy
Edit
implicit conversion from 'number' to 'string' floatingprofit.mq5 56 46
implicit conversion from 'number' to 'string' floatingprofit.mq5 17 42
I am trying to iterate over all open positions, calculate the total floating profit, and close the positions if the total floating profit exceeds a threshold. In the process, I am attempting to print information such as the total number of positions, individual position profits, and ticket numbers.
When concatenating numeric values (e.g., IntegerToString()
or DoubleToString()
) with strings for printing purposes, I get the following implicit conversion errors:
Line 56: When concatenating the floating profit with strings for printing.
Line 17: When printing the number of open positions.
mq5
Copy
Edit
Print("Total open positions: " + total_positions); // Error: implicit conversion
Print("Position #" + i + " Ticket: " + ticket + " Profit: " + position_profit); // Error: implicit conversion
IntegerToString()
and DoubleToString()
for explicit conversion, but the error still occurs.Position details (like ticket numbers and profits) should be printed in the log.
The last code I compiled. No errors. It's only calculating profit for first position accurately, all following positions for same symbol are seen as the first.
#include <Trade\Trade.mqh>
CTrade trade;
input double ProfitThreshold = 5.00; // Set your profit threshold here
// Function to calculate the total floating profit
double CalculateFloatingProfit() {
double total_profit = 0.0;
int total_positions = PositionsTotal();
// Debugging: Check how many positions are open
string total_positions_str = IntegerToString(total_positions);
Print("Total open positions: " + total_positions_str);
for (int i = 0; i < total_positions; i++) {
if (PositionSelect(Symbol())) {
double position_profit = PositionGetDouble(POSITION_PROFIT);
total_profit += position_profit;
string position_profit_str = DoubleToString(position_profit, 2);
Print("Position #" + IntegerToString(i) + " Profit: " + position_profit_str);
} else {
// If PositionSelect fails, print the index
Print("Failed to select position at index: " + IntegerToString(i));
}
}
return total_profit;
}
int OnInit() {
Print("EA initialized successfully");
return INIT_SUCCEEDED;
}
void OnDeinit(const int reason) {
string reason_str = IntegerToString(reason); // Explicit conversion of integer to string
Print("EA deinitialized, reason: " + reason_str);
}
void OnTick() {
double floating_profit = CalculateFloatingProfit();
// Convert floating profit to string explicitly
string floating_profit_str = DoubleToString(floating_profit, 2);
// Print total floating profit
Print("Current total floating profit: " + floating_profit_str);
// If the floating profit exceeds the threshold, close all positions
if (floating_profit >= ProfitThreshold) {
Print("Floating profit threshold reached. Closing all positions.");
int total_positions = PositionsTotal();
for (int i = total_positions - 1; i >= 0; i--) {
if (PositionSelect(Symbol())) {
ulong ticket = PositionGetInteger(POSITION_TICKET);
string ticket_str = IntegerToString((int)ticket); // Convert ticket number to string explicitly
bool result = trade.PositionClose(ticket);
if (result) {
Print("Position " + ticket_str + " closed successfully.");
} else {
int error_code = GetLastError();
string error_code_str = IntegerToString(error_code); // Convert error code to string
Print("Failed to close position " + ticket_str + ". Error: " + error_code_str);
}
} else {
Print("Failed to select position " + IntegerToString(i));
}
}
Print("All positions closed as floating profit reached: " + floating_profit_str);
}
}
The below code does not work as you expecete:
for (int i = 0; i < total_positions; i++)
if (PositionSelect(Symbol()))
To select individual positions, use the following code:
ulong ticket ;
for ( int i = 0 ; i < num_open_position ; i++) // iterate over all open positions
if((ticket = PositionGetTicket(i) ) > 0 )
if(PositionSelectByTicket(ticket) )
{
ulong magic = PositionGetInteger(POSITION_MAGIC) ;
double profit = PositionGetDouble(POSITION_PROFIT) ;
double volume = PositionGetDouble(POSITION_VOLUME) ;
double price_open = PositionGetDouble(POSITION_PRICE_OPEN) ;
double stop_loss = PositionGetDouble(POSITION_SL) ;
double take_profit = PositionGetDouble(POSITION_TP) ;
long type = PositionGetInteger(POSITION_TYPE) ;
string symbol = PositionGetString(POSITION_SYMBOL) ;
datetime open_time = (datetime)PositionGetInteger(POSITION_TIME) ;
}