А почему не работает удаление ордера?

 
Хотел написать простого эксперта, получился какой-то монстр и всё из-за такой вот проблемы:

Всё происходит в реальной торговле на 3-ем метатрейдере. Удаляю отложенный ордер. Команда DeleteOrder точно выполняется, но эффект бывает через раз. В большинстве случаев удаляет, иногда нет. Такая же проблема была с выставлением ордеров. Смирился, пришлось изощрятся и выставлять ордера в некоем подобии цикла "пока реально не выставлю n ордеров, посылаю запросы на выставление". С горем пополам работает. Но извольте, я думал такая лажа будет только с выставлением, оказывается - не только. Уверен, что с ModifyOrder та же история. Подскажите, может я делаю что-то не совсем то? Slippage ставлю равный 3 (вообще, как он влияет на работу?). 10-секундные промежутки учитываются, денег хватает (может есть ещё какие-то ограничения?).
 
Удаляю отложенный ордер. Команда DeleteOrder точно выполняется, но эффект бывает через раз.

Выдерживаете ли таймаут 10 секунд между торговыми операциями?
Торговой является любая операция, изменяющая/удаляющая ордер.
 
Да, я это знаю. Таймаут учитывается. Пробовал выставлять даже больше, чем 10 секунд - результат не изменился.
(упомяну, что в тестере всё работает идеально)
 
Да, я это знаю. Таймаут учитывается. Пробовал выставлять даже больше, чем 10 секунд - результат не изменился.
(упомяну, что в тестере всё работает идеально)

Тогда остается одно решение - выложите код эксперта (в тегах pre) в форуме, пожалуйста.
 
Сомневаюсь стоит ли выкладывать абсолютно весь код, он очень большой и принципиально не важен. Выложу только то, что не работает.

//начало

if CurTime < LastTradeTime + 11 Then exit;

//...
// много-много  непринципиального кода
//...

If DOrders[1] > 1 then
{			
	for i=1 to TotalTrades
    	{			
		if Ord(i,VAL_TICKET) == DOrders[DOrders[1]] then
		{
			DeleteOrder(Ord(i,VAL_TICKET),Green);
			exit;
		};
	};			
	DOrders[1]=DOrders[1]-1;
	exit;					
};

//ещё всякий код
//...



DOrders - массив в котором хранятся тикеты выставленных мной ордеров. Он заполнен правильно на 100%, в этом ошибки быть не может. В первом элементе массива хранится его длина. После высылания команды на удаление выхожу, жду 10 секунд и возвращаюсь опять. Пробовал вставлять между вызовом DeleteOrder команды Print("начало удаления"), Print("конец удаления") - в логе было отмечено это, то есть команда ТОЧНО выполнялась, но эфекта не было никакого. Выводил также тикеты - с ними тоже не оказалось проблем. Что тогда?

 
Сделайте вывод в лог при каждой торговой операции, а потом проверяйте фактическое время когда идут попытки удаления ордера. Скорее всего не соблюдаются таймауты. Кстати, таймауты считаются от времени фактического завершения торговой операции, а не от времени посылки команды на торговую операцию.
 
Хорошо, и как мне тогда соблюбдать такие таймауты? Я же не имею никаких данных по завершению торговой операции!
 
Хорошо, и как мне тогда соблюбдать такие таймауты? Я же не имею никаких данных по завершению торговой операции!

К сожалению, в MT3 есть сложности с определением статуса проводимых торговых операций.
Воспользуйтесь переменной LastTradeTime, которая дает время совершения последней операции.
Но не нужно торговать на границе 10 сек, лучше для гарантии увеличить время ожидания на несколько секунд.

If CurTime - LastTradeTime < 300 Then Exit;
 
а в МТ4 будет всё ОК?
 
а в МТ4 будет всё ОК?

Да, в МетаТрейдере 4 каждая торговая операция ждет своего завершения и на выходе всегда получаете код завершения (или тикет ордера).
 
Спасибо за ответы.
Причина обращения: