MQL5: Closed order detail
void lastclosedorder()
{
uint TotalNumberOfDeal = HistoryDealsTotal();
ulong Ticket = 0;
long OrderType, DealEntry, Reason;
string MySymbol = "";
double price = 0, stoploss = 0, target = 0;
double ltp = iClose(Symbol(), PERIOD_CURRENT, 0); // Last tick price or market price
// Persistent static array to store processed tickets
static ulong ProcessedTickets[];
static int ProcessedTicketsCount = 0;
HistorySelect(0, TimeCurrent()); // Select the history for the current time range
for(uint i = 0; i < TotalNumberOfDeal; i++)
{
// Get the ticket ID
if((Ticket = HistoryDealGetTicket(i)) > 0)
{
// Check if this ticket has already been processed
if(IsTicketProcessed(Ticket, ProcessedTickets, ProcessedTicketsCount))
continue; // Skip this ticket if already processed
// Retrieve deal information
OrderType = HistoryDealGetInteger(Ticket, DEAL_TYPE);
MySymbol = HistoryDealGetString(Ticket, DEAL_SYMBOL);
DealEntry = HistoryDealGetInteger(Ticket, DEAL_ENTRY);
Reason = HistoryDealGetInteger(Ticket, DEAL_REASON);
// price = HistoryDealGetDouble(Ticket, DEAL_PRICE);
stoploss = HistoryDealGetDouble(Ticket, DEAL_SL);
target = HistoryDealGetDouble(Ticket, DEAL_TP);
long magic_number = HistoryOrderGetInteger(Ticket, ORDER_MAGIC);
// Check if this deal matches the current symbol and is an exit deal
if(MySymbol == Symbol() && DealEntry == DEAL_ENTRY_OUT&&int(magic_number)==int(MagicNumber))
{
printf("OrderType: " + IntegerToString(OrderType) +
" MySymbol: " + MySymbol +
" DealEntry: " + IntegerToString(DealEntry) +
" Reason: " + IntegerToString(Reason)+
" price: " + IntegerToString(price)+
" stoploss: " + IntegerToString(stoploss)+
" target: " + IntegerToString(target));
if(Reason == 4 && OrderType == 1)
{
price = stoploss+InitialTradeSl;
if(ltp < price)
{
for(int i = 0; i < ArraySize(parts); i++)
{
trade.SetExpertMagicNumber(MagicNumber);
PlaceLimitOrder(Symbol(), price,DoubleToString(parts[i], 2),ORDER_TYPE_BUY_STOP,stoploss, target);
}
}
if(ltp > price)
{
for(int i = 0; i < ArraySize(parts); i++)
{
trade.SetExpertMagicNumber(MagicNumber);
PlaceLimitOrder(Symbol(), price,DoubleToString(parts[i], 2),ORDER_TYPE_BUY_LIMIT,stoploss, target);
}
}
}
if(Reason == 4 && OrderType == 0)
{
price = stoploss-InitialTradeSl;
if(ltp < price)
{
for(int i = 0; i < ArraySize(parts); i++)
{
trade.SetExpertMagicNumber(MagicNumber);
PlaceLimitOrder(Symbol(), price,DoubleToString(parts[i], 2),ORDER_TYPE_SELL_LIMIT,stoploss, target);
}
}
if(ltp > price)
{
for(int i = 0; i < ArraySize(parts); i++)
{
trade.SetExpertMagicNumber(MagicNumber);
PlaceLimitOrder(Symbol(), price,DoubleToString(parts[i], 2),ORDER_TYPE_SELL_STOP,stoploss, target);
}
}
}
}
// Mark this ticket as processed
ArrayResize(ProcessedTickets, ProcessedTicketsCount + 1);
ProcessedTickets[ProcessedTicketsCount++] = Ticket;
}
}
}
// Function to check if a ticket is already processed
bool IsTicketProcessed(ulong ticket, ulong &processedTickets[], int processedCount)
{
for(int i = 0; i < processedCount; i++)
{
if(processedTickets[i] == ticket)
return true; // Ticket already processed
}
return false;
}
Comments
Post a Comment