Закрытие позиций в МТ5

 

Здравствуйте, вопрос такой:

имеется анализ открытых позиций

при превышении ТП или СЛ посылается асинхронный ордер на сделку тем же объемом, но противоположного направления (по идее это закрытие открытой ранее сделки).

Пока запрос обработается на сервере, и информация терминала об открытых позициях изменится -  приходят несколько тиков (около 10)  и терминал по старой информации несколько раз посылает запрос на сделку вместо одной.

Какие есть варианты?

Отказаться от асинхронной обработки ордеров + не обрабатывать новые тики, пока не обработается текущий?

Или городить систему прихода ответов на onTrade? (Что значительно усложнит код.)

В МТ4 было проще - послал запрос на закрытие сделки по ее номеру и все! Хоть 10 раз. В противоположную позицию терминал не откроется, как сейчас у меня выходит на МТ5.

Получается еще одно преимущество МТ4, которое в МТ5 решили не включать. Можно и асинхронную работу использовать и без усложнения кода закрывать позиции.

 
elibrarius:

Здравствуйте, вопрос такой:

имеется анализ открытых позиций

при превышении ТП или СЛ посылается асинхронный ордер на сделку тем же объемом, но противоположного направления (по идее это закрытие открытой ранее сделки).

Пока запрос обработается на сервере, и информация терминала об открытых позициях изменится -  приходят несколько тиков (около 10)  и терминал по старой информации несколько раз посылает запрос на сделку вместо одной.

Какие есть варианты?

Отказаться от асинхронной обработки ордеров + не обрабатывать новые тики, пока не обработается текущий?

Или городить систему прихода ответов на onTrade? (Что значительно усложнит код.)

В МТ4 было проще - послал запрос на закрытие сделки по ее номеру и все! Хоть 10 раз. В противоположную позицию терминал не откроется, как сейчас у меня выходит на МТ5.

Получается еще одно преимущество МТ4, которое в МТ5 решили не включать. Можно и асинхронную работу использовать и без усложнения кода закрывать позиции.

Огород не городите. Не было никогда в МТ4 асинхронных операций. 

Прежде чем использовать асинхронный режим четко определитесь с целями его использования. Если без него никуда - необходимо использовать блокировки, - запрет совершения торговых операций до момента завершения предыдущей операции.

Без асинхронного режима все также проста как в МТ4. Есть функция PositionSelect. Если она возвращает true, позиция существует и ее можно закрыть. Если false - позиции нет, и закрывать ее не нужно. Также класс CTrade Вам в помощь:

CTrade Trade;
if(Trade.PositionSelecet(Symbol()))
   Trade.PositionClose();

 Все.

 
+100
 
Vasiliy Sokolov:

Без асинхронного режима все также проста как в МТ4. Есть функция PositionSelect. Если она возвращает true, позиция существует и ее можно закрыть. Если false - позиции нет, и закрывать ее не нужно. 

Ну, неправда же.

Если стоп сработает на этом же тике, то PositionClose может открыть встречную сделку. По крайней мере, так было раньше.

 
Andrey Khatimlianskii:

Ну, неправда же.

Если стоп сработает на этом же тике, то PositionClose может открыть встречную сделку. По крайней мере, так было раньше.

так есть и сейчас на некоторых брокерах. например на Открытии.  там нужно заведомо ставить паузу после совершения операции. 
 
Vladislav Andruschenko:
так есть и сейчас на некоторых брокерах. например на Открытии.  там нужно заведомо ставить паузу после совершения операции. 
Не нужна пауза. Достаточно найти нужную сделку и посмотреть ее статус.
 
Andrey Khatimlianskii:
Не нужна пауза. Достаточно найти нужную сделку и посмотреть ее статус.

Не буду сейчас спорить не могу найти свою тему. 

Но я сталкивался с такой проблемой только на 1 брокере. когда выставляя сделку - я не получал ее тикет, сделка есть но в истории ее  нет, соответственно эксперт проверял наличие сделки - сделки нет - он выставлял вторую.  

Возможно это уже исправили в последнем билде .

Был трабл с копиром для мт5. помогло лишь пауза!

кстати сейчас попробую   

хм... демку уже закрыли....