Последние два ордера

 
Здравствуйте! Помогите пожалуйста, как можно определить, что последние два ордера были закрыты по StopLoss?
 
Tereshko:
Здравствуйте! Помогите пожалуйста, как можно определить, что последние два ордера были закрыты по 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?

 
Tereshko:
Здравствуйте! Помогите пожалуйста, как можно определить, что последние два ордера были закрыты по StopLoss?

Посмотрите во вкладке История счета на поле Комментарий у ордеров. Обычно в это поле брокер добавляет [sl] при закрытии по StopLoss

if(StringFind(OrderComment(),"[sl]")>=0) ....;

 
Tereshko:
Спасибо! Хорошее решение, но как с проскальзыванием быть, как его добавить к StopLoss?

Я всегда смотрю ордера с отрицательной прибылью, а по StopLoss они закрылись, или с проскальзыванием, или ещё как, это не важно на мой взгляд, главное что они в минусе или с нулевым результатом.

 if(OrderType()==OP_BUY)
           {
            if(OrderClosePrice()-OrderOpenPrice()<0)

_________________________________________________________________


if(OrderType()==OP_SELL)
           {
            if(OrderOpenPrice()-OrderClosePrice()<=0) (или равно 0, смотря какие цели)

Соответственно ордера сперва нужно выбрать из истории

 
Vladimir Deryagin:

Я всегда смотрю ордера с отрицательной прибылью, а по StopLoss они закрылись, или с проскальзыванием, или ещё как, это не важно на мой взгляд, главное что они в минусе или с нулевым результатом.

Вопрос был сформулирован именно про СЛ.

Например, встречающееся в ТЗ заказчиков требование:

Если ордер закрылся по СЛ - Выполнить Действие_1.
Если ордер закрылся по обратному сигналу индикатора - Выполнить Действие_2.

Оба варианта могут быть закрыты в Убыток, но ТЗ требует выяснить способ закрытия.

Метод STARIJ отличный, если бы не слово "Обычно"
 
Andrei Fandeev:
Вопрос был сформулирован именно про СЛ.

Например, встречающееся в ТЗ заказчиков требование:

Если ордер закрылся по СЛ - Выполнить Действие_1.
Если ордер закрылся по обратному сигналу индикатора - Выполнить Действие_2.

Оба варианта могут быть закрыты в Убыток, но ТЗ требует выяснить способ закрытия.

Метод STARIJ отличный, если бы не слово "Обычно"
Всегда.
 

Andrei Fandeev:
Вопрос был сформулирован именно про СЛ.

Например, встречающееся в ТЗ заказчиков требование:

Если ордер закрылся по СЛ - Выполнить Действие_1.
Если ордер закрылся по обратному сигналу индикатора - Выполнить Действие_2.

Оба варианта могут быть закрыты в Убыток, но ТЗ требует выяснить способ закрытия.

Метод STARIJ отличный, если бы не слово "Обычно"



*** Тут надо сделать какой-то допуск в пипсах (плюс-минус), т.к. ордер может закрыться вроде бы по СЛ, но с проскальзыванием


Спорить конечно смысла нет Вы правы если требует т.з - ну а как тогда отличить закрылся по StopLoss или по индикатору если прилепить *** (*** Тут надо сделать какой-то допуск в пипсах (плюс-минус), т.к. ордер может закрыться вроде бы по СЛ, но с проскальзыванием), так как проскальзывание не всегда даёт  "ОрдерЦенаЗакрытия==ОредерСтопЛосс ***".

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Последние два ордера

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 или вынимать из торговой истории.

 
Tereshko:
Здравствуйте! Помогите пожалуйста, как можно определить, что последние два ордера были закрыты по StopLoss?

Forum on trading, automated trading systems and testing trading strategies

Last two orders

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));
}
 
Artyom Trishkin:
Всегда.

Нет.