//+------------------------------------------------------------------+
//| LatencyEA.mq4 |
//| MellyForex |
//| http://www.mellyforex.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, MellyForex"
#property link "http://www.mellyforex.com"
//--- input parameters
extern int testOrderFrequency = 5;
datetime lastTestOrderSent = 0;
int testOrderFrequencySeconds;
int magic = 4156434123;
int minExecutionTime = 99999999;
int maxExecutionTime = 0;
int avExecutionTime = 0;
int totalExecutionTime = 0;
int totalTestTrades = 0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
testOrderFrequencySeconds = testOrderFrequency * 60;
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
Comment("");
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
int openTicket = openTestOrderTicket();
if(openTicket > 0) closeTestOrder(openTicket);
string text = "The Latency EA is sending test orders at "+testOrderFrequency+" minute intervals\n";
if(minExecutionTime < 99999999) {
text = text + "Maximum Latency = "+maxExecutionTime+" milliseconds\n";
text = text + "Minimum Latency = "+minExecutionTime+" milliseconds\n";
text = text + "Average Latency = "+avExecutionTime+" milliseconds";
}
if(TimeCurrent() - lastTestOrderSent < testOrderFrequencySeconds) {
Comment(text);
return(0);
}
if(openTicket == 0) openTestOrder();
//----
return(0);
}
//+------------------------------------------------------------------+
void openTestOrder() {
int ticket=0;
int err=0;
int c = 0;
int attempts = 20;
double testOrderPrice = 1 / MathPow(10, Digits);
double size = MarketInfo(Symbol(),MODE_MINLOT);
while(ticket <= 0 && c < attempts){
int xyz = 1; //if the waiting time is exceeded (-1 is returned), let's recheck every 15 secs
while(xyz == 1){
if( !IsTradeAllowed() ) {
Sleep(15000);
c++;
Print("A Trade Context delay prevented the Latency EA from opening a test order at attempt #"+c);
continue;
}
if( IsTradeAllowed() ) break;
if(c >= attempts) {Alert("Trade attempts on "+Symbol()+" maxed at "+attempts); return;}
}
int startOrderTimestamp = GetTickCount();
int elapsed = 0;
ticket = OrderSend(Symbol(), OP_BUYLIMIT, size, NormalizeDouble(testOrderPrice, Digits), 0, 0, 0, "Latency EA", magic, 0, CLR_NONE);
elapsed = GetTickCount() - startOrderTimestamp;
if (ticket > 0) {
Print("The Latency EA took "+elapsed+" milliseconds to open test LIMIT BUY ticket #"+ticket);
if(elapsed < minExecutionTime) minExecutionTime = elapsed;
if(elapsed > maxExecutionTime) maxExecutionTime = elapsed;
totalExecutionTime += elapsed;
totalTestTrades ++;
avExecutionTime = totalExecutionTime / totalTestTrades;
return;
}
if(ticket < 0) {
Print("A LIMIT BUY order send failed with error #", GetLastError());
return;
}
}
}
void closeTestOrder(int ticket) {
int startOrderTimestamp = GetTickCount();
int elapsed = 0;
bool success = OrderDelete(ticket, CLR_NONE);
elapsed = GetTickCount() - startOrderTimestamp;
if(success) {
Print("The Latency EA took "+elapsed+" milliseconds to close test LIMIT BUY ticket #"+ticket);
if(elapsed < minExecutionTime) minExecutionTime = elapsed;
if(elapsed > maxExecutionTime) maxExecutionTime = elapsed;
totalExecutionTime += elapsed;
totalTestTrades ++;
avExecutionTime = totalExecutionTime / totalTestTrades;
lastTestOrderSent = TimeCurrent();
return;
}
return;
}
int openTestOrderTicket() {
int Total = OrdersTotal();
int ret = 0;
for (int i = 0; i < Total; i ++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic ) {
ret = OrderTicket();
}
}
return(ret);
}
lares