// immediately after you send a trade, the trade may NOT show up in the
// order history, even though it exists according to ticket number.
// As a result, EA's which count history to check for trade entries
// may give many multiple entries, possibly blowing your account!
//
// This function will take a ticket number and loop until
// it is seen in the history.
//
// RETURN VALUE:
// TRUE if successful, FALSE otherwise
//
//
// FEATURES:
// * Re-trying under some error conditions, sleeping a random
// time defined by an exponential probability distribution.
//
// * Displays various error messages on the log for debugging.
//
// ORIGINAL AUTHOR AND DATE:
// Matt Kennel, 2010
bool O_R_CheckForHistory(int ticket)
{
//My thanks to Matt for this code. He also has the undying gratitude of all users of my trading robots
int lastTicket = OrderTicket();
int cnt = 0;
int err = GetLastError(); // so we clear the global variable.
err = 0;
bool exit_loop = false;
bool success=false;
while (!exit_loop) {
/* loop through open trades */
int total=OrdersTotal();
for(int c = 0; c < total; c++) {
if(OrderSelect(c,SELECT_BY_POS,MODE_TRADES) == true) {
if (OrderTicket() == ticket) {
success = true;
exit_loop = true;
}
}
}
if (cnt > 3) {
/* look through history too, as order may have opened and closed immediately */
total=OrdersHistoryTotal();
for(c = 0; c < total; c++) {
if(OrderSelect(c,SELECT_BY_POS,MODE_HISTORY) == true) {
if (OrderTicket() == ticket) {
success = true;
exit_loop = true;
}
}
}
}
cnt = cnt+1;
if (cnt > O_R_Setting_max_retries) {
exit_loop = true;
}
if (!(success || exit_loop)) {
Print("Did not find #"+ticket+" in history, sleeping, then doing retry #"+cnt);
O_R_Sleep(O_R_Setting_sleep_time, O_R_Setting_sleep_max);
}
}
// Select back the prior ticket num in case caller was using it.
if (lastTicket >= 0) {
bool k = OrderSelect(lastTicket, SELECT_BY_TICKET, MODE_TRADES);
}
if (!success) {
Print("Never found #"+ticket+" in history! crap!");
}
return(success);
}//End bool O_R_CheckForHistory(int ticket)
发表评论