Доброго времени суток!
Появилась одна идейка, но как реализовать не знаю.
У нас есть один обычный ордер и несколько отложников (некоторые из них уже открыты). По основной сделке выставлен стоп лосс. Как реализовать закрытие всех позиций(и удаление отложных ордеров) при достижении основной сделкой уровня стоп лосса и вообще возможно ли это?
Заранее спасибо!
Конечно возможно. Есть два варианта - учить MQL или заказать у тех, кто умеет ;)
По первому варианту - удаление отложек и закрытие рыночных в цикле, после того, как в истории сделок появился новый ордер, в комментарии которого есть слово "[sl]".
Вы сеткой ордеров торговать собираетесь? Не совсем понятно просто.
Например, в случае сетки:
1) открыть первый ордер: iFirstTicket = OrderSend(...)
2) открыть последующие ордера примерно так: iTicket = OrderSend(...)
В функции OnTick() или в функциях, вызываемых из нее, отслеживать, что iFirstTicket не оказался в истории:
bFirstTicketFind=OrderSelect(iFirstTicket,SELECT_BY_TICKET,MODE_TRADES);
if(!bFirstTicketFind)
{
CloseAndDeleteAllOrders();
iFirstTicket=0;
}
Это импровизация, по смыслу разберетесь, как доделать. Функцию CloseAndDeleteAllOrders() надо сделать самому ;-) И, конечно, это упрощенный и не единственный из возможных вариантов реализации.
Конечно возможно. Есть два варианта - учить MQL и заказать у тех, кто умеет ;)
По первому варианту - удаление отложек и закрытие рыночных в цикле, после того, как в истории сделок появился новый ордер, в комментарии которого есть слово "[sl]".
Вот тут то и вопрос, как определить что ордер закрыт по стопу) Дальше как, что в общем понятно
Вот тут то и вопрос, как определить что ордер закрыт по стопу) Дальше как, что в общем понятно
Так внимательней перечитайте что я выше писал:
после того, как в истории сделок появился новый ордер, в комментарии которого есть слово "[sl]".
Вы сеткой ордеров торговать собираетесь? Не совсем понятно просто.
Например, в случае сетки:
1) открыть первый ордер: iFirstTicket = OrderSend(...)
2) открыть последующие ордера примерно так: iTicket = OrderSend(...)
В функции OnTick() или в функциях, вызываемых из нее, отслеживать, что iFirstTicket не оказался в истории:
bFirstTicketFind=OrderSelect(iFirstTicket,SELECT_BY_TICKET,MODE_TRADES);
if(!bFirstTicketFind)
{
CloseAndDeleteAllOrders();
iFirstTicket=0;
}
Это импровизация, по смыслу разберетесь, как доделать. Функцию CloseAndDeleteAllOrders() надо сделать самому ;-) И, конечно, это упрощенный и не единственный из возможных вариантов реализации.
Я тут правильно понимаю, что переменной bFirstTicketFind мы возвращаем значение об открытом ордере по тикету и если значение ложно, то происходит закрытие? Просто хочу понять правильно ли я понял)))
Я же не знаю, сколько в Вашем программном коде функций и т. д., т. е. про возвращение, под которым я понимаю return я ничего не имел в виду, реализовать все можно разными способами.
Значение false в моем примере говорит о том, что ордер с номером iFirstTicket (переменная типа int, объявленная в др. месте) был закрыт.
В принципе, наверное, так лучше:
{
//...
bool bFirstTicketFind=false;
bFirstTicketFind=OrderSelect(iFirstTicket,SELECT_BY_TICKET,MODE_TRADES);
if(!bFirstTicketFind)
{
OrderSelect(iFirstTicket,SELECT_BY_TICKET,MODE_HISTORY)
if(OrderProfit()<0.0)
CloseAndDeleteAllOrders();
iFirstTicket=0;
}
}
Конечно возможно. Есть два варианта - учить MQL или заказать у тех, кто умеет ;)
По первому варианту - удаление отложек и закрытие рыночных в цикле, после того, как в истории сделок появился новый ордер, в комментарии которого есть слово "[sl]".
Вы так уверены, что в истории сделок всегда в комментарии будет "[sl]"? Во всяком случае, если смотреть историю счета вручную, то что-то я наблюдаю разную картину в зависимости от брокера.
Позже я писал про вариант сравнения цен закрытия и стоплосса ордера из истории и необходимость учитывать проскальзывание, это как раз для таких случаев, когда сервер не дописывает в комментарий нужные буквы.
Но уж точно не по вашему варианту с if(OrderProfit()<0.0), ордер может быть закрыт при перевороте с убытком, а не только при стоплоссе, да и мало ли какие ещё причины были для закрытия в убыток, например, скрытый стоп, когда серверу уровень стопа не отсылается, а за всем следит советник. Тогда сравнивать нужно цену закрытия и уровень стопа в настройках советника, или ещё как-то.
Я же не знаю, сколько в Вашем программном коде функций и т. д., т. е. про возвращение, под которым я понимаю return я ничего не имел в виду, реализовать все можно разными способами.
Значение false в моем примере говорит о том, что ордер с номером iFirstTicket (переменная типа int, объявленная в др. месте) был закрыт.
В принципе, наверное, так лучше:
{
//...
bool bFirstTicketFind=false;
bFirstTicketFind=OrderSelect(iFirstTicket,SELECT_BY_TICKET,MODE_TRADES);
if(!bFirstTicketFind)
{
OrderSelect(iFirstTicket,SELECT_BY_TICKET,MODE_HISTORY)
if(OrderProfit()<0.0)
CloseAndDeleteAllOrders();
iFirstTicket=0;
}
}
bFirstTicketFind=OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
if(!bFirstTicketFind)
{
OrderSelect(ticket,SELECT_BY_TICKET,MODE_HISTORY);
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
OrderDelete(OrderTicket(),Violet);
ticket=0;
}
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Доброго времени суток!
Появилась одна идейка, но как реализовать не знаю.
У нас есть один обычный ордер и несколько отложников (некоторые из них уже открыты). По основной сделке выставлен стоп лосс. Как реализовать закрытие всех позиций(и удаление отложных ордеров) при достижении основной сделкой уровня стоп лосса и вообще возможно ли это?
Заранее спасибо!