Здравствуйте! Помогите пожалуйста, как можно определить, что последние два ордера были закрыты по StopLoss?
Инициализируете две переменные int Ord1=0 и Ord2=0
Перебираете в цикле закрывшиеся for (int i= OrdersHistoryTotal(); i>=0; i--)
Если Ord1==0
Если ОрдерЦенаЗакрытия==ОредерСтопЛосс ***
Ord1=-1
Иначе
Ord1=1
Иначе
Если ОрдерЦенаЗакрытия==ОредерСтопЛосс ***
Ord2=-1
Иначе
Ord2=1
Если Ord1!=0 и Ord2!=0
break;
Если Ord1==-1 и Ord2==-1
return(true); // возвращаем результат проверки (два ордера закрылись по СЛ)
Иначе
return(false);
*** Тут надо сделать какой-то допуск в пипсах (плюс-минус), т.к. ордер может закрыться вроде бы по СЛ, но с проскальзыванием
Спасибо! Хорошее решение, но как с проскальзыванием быть, как его добавить к StopLoss?
Здравствуйте! Помогите пожалуйста, как можно определить, что последние два ордера были закрыты по StopLoss?
Посмотрите во вкладке История счета на поле Комментарий у ордеров. Обычно в это поле брокер добавляет [sl] при закрытии по StopLoss
if(StringFind(OrderComment(),"[sl]")>=0) ....;
Спасибо! Хорошее решение, но как с проскальзыванием быть, как его добавить к StopLoss?
Я всегда смотрю ордера с отрицательной прибылью, а по StopLoss они закрылись, или с проскальзыванием, или ещё как, это не важно на мой взгляд, главное что они в минусе или с нулевым результатом.
if(OrderType()==OP_BUY) { if(OrderClosePrice()-OrderOpenPrice()<0) _________________________________________________________________ if(OrderType()==OP_SELL) { if(OrderOpenPrice()-OrderClosePrice()<=0) (или равно 0, смотря какие цели)Соответственно ордера сперва нужно выбрать из истории
Я всегда смотрю ордера с отрицательной прибылью, а по StopLoss они закрылись, или с проскальзыванием, или ещё как, это не важно на мой взгляд, главное что они в минусе или с нулевым результатом.
Например, встречающееся в ТЗ заказчиков требование:
Если ордер закрылся по СЛ - Выполнить Действие_1.
Если ордер закрылся по обратному сигналу индикатора - Выполнить Действие_2.
Оба варианта могут быть закрыты в Убыток, но ТЗ требует выяснить способ закрытия.
Метод STARIJ отличный, если бы не слово "Обычно"
Вопрос был сформулирован именно про СЛ.
Например, встречающееся в ТЗ заказчиков требование:
Если ордер закрылся по СЛ - Выполнить Действие_1.
Если ордер закрылся по обратному сигналу индикатора - Выполнить Действие_2.
Оба варианта могут быть закрыты в Убыток, но ТЗ требует выяснить способ закрытия.
Метод STARIJ отличный, если бы не слово "Обычно"
Andrei Fandeev:
Вопрос был сформулирован именно про СЛ.
Например, встречающееся в ТЗ заказчиков требование:
Если ордер закрылся по СЛ - Выполнить Действие_1.
Если ордер закрылся по обратному сигналу индикатора - Выполнить Действие_2.
Оба варианта могут быть закрыты в Убыток, но ТЗ требует выяснить способ закрытия.
Метод STARIJ отличный, если бы не слово "Обычно"
*** Тут надо сделать какой-то допуск в пипсах (плюс-минус), т.к. ордер может закрыться вроде бы по СЛ, но с проскальзыванием
Спорить конечно смысла нет Вы правы если требует т.з - ну а как тогда отличить закрылся по StopLoss или по индикатору если прилепить *** (*** Тут надо сделать какой-то допуск в пипсах (плюс-минус), т.к. ордер может закрыться вроде бы по СЛ, но с проскальзыванием), так как проскальзывание не всегда даёт "ОрдерЦенаЗакрытия==ОредерСтопЛосс ***".
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Artyom Trishkin, 2017.12.23 10:39
Всегда.Тогда получается этот способ самый верный если "Всегда."
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
STARIJ, 2017.12.23 07:28
Посмотрите во вкладке История счета на поле Комментарий у ордеров. Обычно в это поле брокер добавляет [sl] при закрытии по StopLoss
if(StringFind(OrderComment(),"[sl]")>=0) ....;
Зачем эти нескончаемые мучения: закрылся или нет? Было проскальзывание или нет?
Переходите на MQL5, используйте перечисление ENUM_DEAL_REASON и проверяйте свойство СДЕЛКИ:
DEAL_REASON_SL | Сделка проведена в результате срабатывания ордера Stop Loss |
Данное свойство проставляет торговый сервер. То есть однозначная трактовка: сделка произошла в результате срабатывания Stop Loss. Данное свойство можно ловить в onTradeTransaction или вынимать из торговой истории.
Здравствуйте! Помогите пожалуйста, как можно определить, что последние два ордера были закрыты по StopLoss?
Forum on trading, automated trading systems and testing trading strategies
fxsaber, 2017.12.23 11:02
#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006 // Возврат тикетов последних Amount-сделок, закрытых по Reason-причине int GetLastHistoryPositions( long &Tickets[], int Amount = INT_MAX, const ENUM_DEAL_REASON Reason = DEAL_REASON_SL ) { int Count = ArrayResize(Tickets, 0); for (int i = OrdersHistoryTotal() - 1; (i >= 0) && (Count < Amount); i--) if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderCloseReason() == Reason)) Tickets[ArrayResize(Tickets, ++Count) - 1] = OrderTicket(); return(Count); } void OnStart() { long Tickets[]; // Последние две сделки, закрытые по SL for (int i = GetLastHistoryPositions(Tickets, 2) - 1; i >= 0; i--) Print(Tickets[i]); }
Addon for MT4
enum ENUM_DEAL_REASON { DEAL_REASON_CLIENT, DEAL_REASON_SL, DEAL_REASON_TP }; ENUM_DEAL_REASON OrderCloseReason( void ) { return((StringFind(OrderComment(), "[sl]") != -1) ? DEAL_REASON_SL : ((StringFind(OrderComment(), "[tp]") != -1) ? DEAL_REASON_TP : DEAL_REASON_CLIENT)); }

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования