peter888 писал(а) >>
Мне надо знать, какой ордер был закрыт последним, бай или селл, и как определить, закрыт он по лосю или по трейку?
У мну так:
bool LastWasLoss(int MN, int type = -1) { datetime max = 0; int ticket = -1; for(int i = 0; i < OrdersHistoryTotal(); i++) { // already closed if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false) continue; // not current symbol if(OrderSymbol() != Symbol()) continue; // order was opened in another way if(OrderMagicNumber() != MN) continue; if(OrderType() != OP_BUY && OrderType() != OP_SELL) continue; datetime current = OrderOpenTime(); if (current > max) { max = current; ticket = OrderTicket(); } } if (!OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) return (false); if (OrderType() == OP_BUY) { if (type == OP_BUY || type == -1) { return (OrderClosePrice() < OrderStopLoss() + 0.5*Point); } else { return (false); } } else if (OrderType() == OP_SELL) { if (type == OP_SELL || type == -1) { return (OrderClosePrice() > OrderStopLoss() - 0.5*Point); } else { return (false); } } return (false); }У Игоря еще можете посмотреть.
Пишу советник в котором используеться отложные ордера.
Мне надо знать, какой ордер был закрыт последним, бай или селл, и как определить, закрыт он по лосю или по трейку?
Большое спасибо.
можно проще вот пример скрипта
int start()
{
if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
{
double PROFIT =OrderProfit();//определяем закрылся в плюсе или в минусе
int TUPE =OrderType();//определяем ордер
}
Comment("PROFIT= "+PROFIT," TUPE= "+TUPE);
}
Поройтесь а кимовских функциях, или напишите свою подобную : перебор всех ордеров и фильтр по времени закрытия - обязателен...
можно проще вот пример скрипта
int start()
{
if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
{
double PROFIT =OrderProfit();//определяем закрылся в плюсе или в минусе
int TUPE =OrderType();//определяем ордер
}
Comment("PROFIT= "+PROFIT," TUPE= "+TUPE);
}
Не верно, у вас отобразиться последний ордер по тикету а не по времени.
Ордер 1 открыт.
Ордер 2 Открыт.
Ордер 2 закрыт.
Ордео 1 закрыт.
То в током случае я по вашей формуле выведу лишь Ордер 2, а я хочу увидеть отрер 1 так как он закрыт был позже.
Я выход нашел один, это вывести массив ордеров(очень важно учесть количество их сколько последних ордеров вы будете сортировать) и отсортировать по времени закрытию, а не как у вас по номеру тикета.
Пишу советник в котором используеться отложные ордера.
Мне надо знать, какой ордер был закрыт последним, бай или селл
Последний закрытый, предположу, ищут для определенных действий, параметры которых зависят от параметров последнего закрытого. Тк мт работает по тикам, а за один тик может быть закрыто более одного ордера, то может получиться что между поисками последнего может быть закрыто более одного, из которых учтен будет только последний.
Последний закрытый, предположу, ищут для определенных действий, параметры которых зависят от параметров последнего закрытого. Тк мт работает по тикам, а за один тик может быть закрыто более одного ордера, то может получиться что между поисками последнего может быть закрыто более одного, из которых учтен будет только последний.
в 2 прохода перебора ордеров решается такая задача: на первом проходе находите ордер с самым большим временем закрытия, на втором проходе ищете ордера со временем равным времени закрытия самого последнего ордера, вот что то похожее делал
https://www.mql5.com/ru/forum/247136#comment_7557763
в моем примере нужно добавить динамический массив и на втором проходе положить в него все тикеты которые равны времени закрытия самого последнего ордера, а потом зная размер массива знаем сколько ордеров было закрыто одновременно, но лучше такую задачу решать под конкретные цели
- 2018.05.24
- www.mql5.com
в 2 прохода перебора ордеров решается такая задача: на первом проходе находите ордер с самым большим временем закрытия, на втором проходе ищете ордера со временем равным времени закрытия самого последнего ордера, вот что то похожее делал
https://www.mql5.com/ru/forum/247136#comment_7557763
в моем примере нужно добавить динамический массив и на втором проходе положить в него все тикеты которые равны времени закрытия самого последнего ордера, а потом зная размер массива знаем сколько ордеров было закрыто одновременно, но лучше такую задачу решать под конкретные цели
я лишь указал что возможность такой ситуации, при соотв обстоятельствах, стоит учитывать.
А про решение, если на вскидку, то я бы записывал тикет последнего и при новом поиске сравнивал записанный с предпоследним и нулем в while
А про решение, если на вскидку, то я бы записывал тикет последнего и при новом поиске сравнивал записанный с предпоследним и нулем в while
я тоже раньше так пытался делать - сохранять тикеты в массивы или переменные, но тут проблема - если не будет связи, будете думать как восстановить работоспособность, все равно проще пересчитать все ордера и найти свои ордера по магику... но опять же реализация зависит от целей
Как-то так. Возврат функции сам придумывай (пофит, убыток, по стопу и т.п.).
ENUM_LAST_RESULT LastOrder(){ for (int i=OrdersHistoryTotal()-1;i>=0;i--) if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)||OrderType()>1) continue; else return(LastResult()); return(RESULT_NONE);} //------------------------------------------------------------------------- ENUM_LAST_RESULT LastResult(){ Здесь сам изобретай велосипед, под mql5 элементарно решается, а в 4-ке нет возврата причины закрытия позиции. Поэтому или профит/убыток или больше/меньше уровня стопа, в любом случае неопределенность остается. }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Пишу советник в котором используеться отложные ордера.
Мне надо знать, какой ордер был закрыт последним, бай или селл, и как определить, закрыт он по лосю или по трейку?
Большое спасибо.