Как можно получить информацию о срабатывании Stoploss и Take profit, в
советнике? Мне необходимо реализовать задержку после закрытия
ордера. Если ордер закрыт через OrderClose, то всё нормально. Но как отловить когда он закрывается автоматически?
- Как Закрыть ордера автоматически при срабатывании ТП?
- Зависание терминала при подключенной DLL
- Работа с историей торговли
По-моему, здесь выхода два:
1) следить за текущим значением Bid, Ask и сравнивать их со стопом, профитом каждого работающего ордера.
Но не факт, что брокер закроет ордер, допустим, при сильном движении рынка. Это может случиться и через 5 сек, а может и через несколько минут.
2) запоминать все рабочие ордера (в любом серьезном советнике должна быть функция сбора информации о текущих ордерах), а на следующем тике сравнить с имеюшимися и узнать какой из них пропал.
Недостаток этого способа в том, что не знаешь конкретно, по профиту или стопу закрылся ордер. Потребуется обращение к истории сделок.
1) следить за текущим значением Bid, Ask и сравнивать их со стопом, профитом каждого работающего ордера.
Но не факт, что брокер закроет ордер, допустим, при сильном движении рынка. Это может случиться и через 5 сек, а может и через несколько минут.
2) запоминать все рабочие ордера (в любом серьезном советнике должна быть функция сбора информации о текущих ордерах), а на следующем тике сравнить с имеюшимися и узнать какой из них пропал.
Недостаток этого способа в том, что не знаешь конкретно, по профиту или стопу закрылся ордер. Потребуется обращение к истории сделок.
golem59:
Как можно получить информацию о срабатывании Stoploss и Take profit, в советнике? Мне необходимо реализовать задержку после закрытия ордера. Если ордер закрыт через OrderClose, то всё нормально. Но как отловить когда он закрывается автоматически?
Самое примитивное. Как можно получить информацию о срабатывании Stoploss и Take profit, в советнике? Мне необходимо реализовать задержку после закрытия ордера. Если ордер закрыт через OrderClose, то всё нормально. Но как отловить когда он закрывается автоматически?
Если есть открытый ордер, запоминай время. Если нет открытых позиций, жди столько сколько тебе надо, начиная отсчет от этой записанной переменной.
Vladimir11:
Если есть открытый ордер, запоминай время. Если нет открытых позиций, жди столько сколько тебе надо, начиная отсчет от этой записанной переменной.
Как реализовать задержку я знаю, меня интересует нет ли какой
нибудь функции возвращающей истину если на данном тике произошёл
выход по Stoploss и Take profit. Или придется запоминать в массив профиты
и лоссы всех открытых ордеров, и потом сравнивать текущую цену
с ними? Есть ли гарантия что это поможет?
golem59:
Как можно получить информацию о срабатывании Stoploss и Take profit, в советнике? Мне необходимо реализовать задержку после закрытия ордера. Если ордер закрыт через OrderClose, то всё нормально. Но как отловить когда он закрывается автоматически?
Самое примитивное. Как можно получить информацию о срабатывании Stoploss и Take profit, в советнике? Мне необходимо реализовать задержку после закрытия ордера. Если ордер закрыт через OrderClose, то всё нормально. Но как отловить когда он закрывается автоматически?
Если есть открытый ордер, запоминай время. Если нет открытых позиций, жди столько сколько тебе надо, начиная отсчет от этой записанной переменной.
Прямого способа отследить закрытие ордера по s/l || t/p в МТ нет.
Придется вести в эксперте внутренний реестр ордеров, по мере
надобности обращаясь к истории сделок. Несколько морочно, зато
надежно.
//+----------------------------------------------------------------------------+ //| Возвращает флаг закрытия последней позиции по стопу. | //| Параметры: | //| sym - наименование инструмента ("" - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ bool isCloseLastPosByStop(string sym="", int op=-1, int mn=-1) { datetime t; double ocp, osl; int dg, i, j=-1, k=OrdersHistoryTotal(); if (sym=="") sym=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol()==sym) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderCloseTime()) { t=OrderCloseTime(); j=i; } } } } } } } if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) { dg=MarketInfo(sym, MODE_DIGITS); if (dg==0) if (StringFind(sym, "JPY")<0) dg=4; else dg=2; ocp=NormalizeDouble(OrderClosePrice(), dg); osl=NormalizeDouble(OrderStopLoss(), dg); if (ocp==osl) return(True); } return(False); } //+----------------------------------------------------------------------------+ //| Возвращает флаг закрытия последней позиции по тейку. | //| Параметры: | //| sym - наименование инструмента ("" - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ bool isCloseLastPosByTake(string sym="", int op=-1, int mn=-1) { datetime t; double ocp, otp; int dg, i, j=-1, k=OrdersHistoryTotal(); if (sym=="") sym=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol()==sym) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderCloseTime()) { t=OrderCloseTime(); j=i; } } } } } } } if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) { dg=MarketInfo(sym, MODE_DIGITS); if (dg==0) if (StringFind(sym, "JPY")<0) dg=4; else dg=2; ocp=NormalizeDouble(OrderClosePrice(), dg); otp=NormalizeDouble(OrderTakeProfit(), dg); if (ocp==otp) return(True); } return(False); }
А коментарий ордера посмотреть, разве не подойдет...
как-то так:
как-то так:
string sCom=OrderComment(); int len=StringLen(sCom); if(len>=4){sCom=StringSubstr(sCom,len-3,3); if(sCom=="sl]") len=1; //exit type SL else if(sCom=="tp]") len=2; //exit type TP else len=0; //exit type "???" } else len=0; //exit type "???" return(len);
События в МetaТrader 4 [ en ]
Статья посвящена программному отслеживанию событий в терминале МetaТrader 4, таких как открытие, закрытие и модификация ордеров, и рассчитана на пользователя, обладающего базовыми навыками работы с терминалом и программирования на MQL4.
KimIV:
//+----------------------------------------------------------------------------+ //| Возвращает флаг закрытия последней позиции по стопу. | //| Параметры: | //| sym - наименование инструмента ("" - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ bool isCloseLastPosByStop(string sym="", int op=-1, int mn=-1) { datetime t; double ocp, osl; int dg, i, j=-1, k=OrdersHistoryTotal(); if (sym=="") sym=Symbol(); for (i=0; i<k; i++) { ...
Думаю экономичнее запоминать количество ордеров в истории на момент предыдущего вызова и перебирать только вновь появившиеся
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь