Как в языке MQL4 определить тикет ордера, который возникает в результате закрытия встречных ордеров функцией OrderCloseBy() ? - страница 6
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
ну значит при его появлении проведите его модификацию ...
так создайте свой комент когда выставляете ордер и потом по нему и ищите ...
при закрытии ваш коммент будет удалён и добавлен свой ))
ну значит при его появлении проведите его модификацию ...
Пользователь может указать комментарий лишь при выставлении ордера. Всё.
Остальные записи в комментарий для нас закрыты. В них может писать дальше только брокер. И он впишет туда нужную информацию. Вот по ней и искать то, что нужно.
Следовательно если открывая ордер назначается комментарий, и ДЦ не затирает этот комментарий, то позиция с которой начинается тикет будет плавающей.
При закрытии по OrderCloseBy() Ваш комментарий трётся и добавляется свой типа to #12345678 или from#12345678 - по другому пока не видел, единственное что к этому from#12345678 они могут ещё что-то добавить , например: from#12345678[0] (это у меня так), но у меня этот вариант нормально отрабатывается, проверял.
А так да, если где-то делают как вы описали то надо делать Ваш вариант. В любом случае всё написанное сначала тестируется, проверяется, под конкретное ДЦ, а потом в бой ))
Уже обсуждалась похожая тема.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Получение истории по OrderCloseBy через MQL
Ihor Herasko, 2017.02.17 08:56
Чтобы установить соответствие между текущим выбранным ордером и его родителем после частичного или встречного закрытия, используйте следующий подход:
//| Определение наличия родительского ордера для текущего ордера (по итогам встречного или частичного закрытия) |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
int GetSignOfPartialOrCloseByClose()
{
string comment = OrderComment();
if (comment == "")
return 0;
// Ордер образовался вследствии частичного закрытия
int fromStart = StringFind(comment, "from #");
if (fromStart >= 0)
return GetTicketByPartialClose(comment, fromStart, OrderType(), OrderOpenTime());
// Ордер образовался вследствии встречного закрытия
if (StringFind(comment, "partial close") >= 0)
{
datetime openTime = OrderOpenTime();
int type = OrderType();
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
continue;
if (OrderOpenTime() != openTime)
continue;
if (OrderType() != type)
continue;
if (StringFind(OrderComment(), "partial close") < 0)
continue;
return OrderTicket();
}
}
return 0;
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Получение тикета родительского ордера после частичного закрытия |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
int GetTicketByPartialClose(string comment, int fromStart, int orderType, datetime openTime)
{
string sTicket = StringSubstr(comment, fromStart + 6);
int iTicket = (int)StringToInteger(sTicket);
int type = OrderType();
if (!OrderSelect(iTicket, SELECT_BY_TICKET))
return 0;
if (OrderType() == type) // Дочерний ордер указывает на родителя - уходим
return iTicket;
// Дочерний ордер указывает на противоположный ордер. Необходимо искать родительский
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
continue;
if (OrderType() != orderType || OrderOpenTime() != openTime)
continue;
int iFind = StringFind(OrderComment(), "close hedge by #");
if (iFind < 0)
continue;
sTicket = StringSubstr(OrderComment(), iFind + 16);
int iNewTicket = (int)StringToInteger(sTicket);
if (iNewTicket != iTicket)
continue;
return OrderTicket();
}
return 0;
}