mql4 MT4 OnTrade

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Pavel Kolchin
18963
Pavel Kolchin  

необходим аналог функции OnTrade для mql4

фактически необходимо в таймере отследить наступление одного из событий открытие ордера закрытие ордера изменение SL или TP

есть мысли как это сделать наиболее быстро желательно без переборов всех открытых сделок и всей истории 

fxsaber
17549
fxsaber  
Pavel Kolchin:

необходим аналог функции OnTrade для mql4

фактически необходимо в таймере отследить наступление одного из событий открытие ордера закрытие ордера изменение SL или TP

есть мысли как это сделать наиболее быстро желательно без переборов всех открытых сделок и всей истории

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

Организация цикла перебора ордеров

fxsaber, 2017.10.18 12:29

Версия без обращения к истории.
struct HISTORY_UNIT
{
  long Ticket;
  int Type;
  double Lots; 
    
  HISTORY_UNIT( void ) : Ticket(::OrderTicket()), Type(::OrderType()), Lots(::OrderLots())
  {
  }

  bool operator !=( const HISTORY_UNIT &Unit ) const
  {
    return((this.Ticket != Unit.Ticket) || (this.Type != Unit.Type) || (this.Lots != Unit.Lots));
  }
      
  bool IsChange( void )
  {
    const HISTORY_UNIT Tmp;
    const bool Res = (this != Tmp);
    
    if (Res)
      this = Tmp;
      
    return(Res);
  }
};

// Возвращает true только в случае, если с последнего вызова произошли торговые изменения
bool IsChange( void )
{
  static HISTORY_UNIT History[];  

  const int Total = OrdersTotal();  
  bool Res = (ArraySize(History) != Total);

  for (int i = 0, j = Res ? ArrayResize(History, 0, Total) : 0; i < Total; i++)      
    if (OrderSelect(i, SELECT_BY_POS))
    {
      if (Res || (Res = History[j].IsChange()))
        ArrayResize(History, j + 1, Total);
      
      j++;
    }
  
  return(Res);
}

Эта версия особенно актуальна для MT5 на VPS, т.к. MT5 работает с Историей очень медленно и затратно по вычислительным ресурсам.

Ihor Herasko
21867
Ihor Herasko  
Pavel Kolchin:

необходим аналог функции OnTrade для mql4

фактически необходимо в таймере отследить наступление одного из событий открытие ордера закрытие ордера изменение SL или TP

есть мысли как это сделать наиболее быстро желательно без переборов всех открытых сделок и всей истории 


По-другому никак не сделать. Чем не устраивает полный перебор? Возможно, Вы на каждом тике его делаете. Тогда - да, неэффективно получается.

Taras Slobodyanik
38399
Taras Slobodyanik  
Ihor Herasko:

По-другому никак не сделать. Чем не устраивает полный перебор? Возможно, Вы на каждом тике его делаете. Тогда - да, неэффективно получается.


Почему неэффективно?
Список ордеров-позиций уже готов в терминале, остается по нему пробежаться и сравнить на изменения тп/сл/закрытие/открытие.

Неэффективно это когда, в одном тике/прерывании, повторяют один и тот же перебор много раз.

Ihor Herasko
21867
Ihor Herasko  
Taras Slobodyanik:

Почему неэффективно?
Список ордеров-позиций уже готов в терминале, остается по нему пробежаться и сравнить на изменения тп/сл/закрытие/открытие.

Неэффективно это когда, в одном тике/прерывании, повторяют один и тот же перебор много раз.


А я о чем? Полный перебор на каждом тике не нужен. Выше fxsaber даже код привел готовый. Суть та же.

Taras Slobodyanik
38399
Taras Slobodyanik  
Ihor Herasko:

А я о чем? Полный перебор на каждом тике не нужен. Выше fxsaber даже код привел готовый. Суть та же.


нее.. перебор как раз и нужен, иначе как определить перетаскивание тп/сл/отложки?
и перебирать по таймеру, каждые 100-200 мс

у fxsaber-а  не вижу проверки этих изменеий

Ihor Herasko
21867
Ihor Herasko  
Taras Slobodyanik:

нее.. перебор как раз и нужен, иначе как определить перетаскивание тп/сл/цены отложки?
и перебирать по таймеру, каждые 100-200 мс

у fxsaber-а  не вижу проверки этих изменеий

Имел в виду только открытие, закрытие, установку и удаление, когда изменяется количество элементов списка в истории счета. В этом списке не отражаются изменения SL и TP.

А вот список рабочих ордеров, конечно же, нужно просматривать весь. Тут согласен. 

Со списком рабочих ордеров нет никаких проблем, кстати. Ведь он априори не может быть слишком большим. На своем веку видел максимум 1 000 ордеров, которые разрешает держать брокер. Ну а обычное количество - в районе 200 - 500. Цикл перебора даже не будет заметен.

Taras Slobodyanik
38399
Taras Slobodyanik  

Так историю вообще нет смысла перебирать, разве что при старте.

Ведь есть список тикетов в мт + свой список = сравнил, что не совпало значит соответствующий флаг: тп/сл/открытие/изменение...

Ihor Herasko
21867
Ihor Herasko  
Taras Slobodyanik:

Так историю вообще нет смысла перебирать, разве что при старте.

Ведь есть список тикетов в мт + свой список = сравнил, что не совпало значит соответствующий флаг: тп/сл/открытие/изменение...

Если на эти списки эксперт влияет только сам, то в вопросе вообще нет смысла. Я так понял, что нужно отслеживать изменения, совершаемые другим экспертом или же самим трейдером.
Pavel Kolchin
18963
Pavel Kolchin  

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

конечно отслеживать изменения сделанные самим пользователем вручную

просто обратиться и узнать делал что нибудь пользователь или нет, если нет - то ладно, если да - то запускаем переборы и ищем что он сделал

Konstantin Erin
2161
Konstantin Erin  
Pavel Kolchin:

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

конечно отслеживать изменения сделанные самим пользователем вручную

просто обратиться и узнать делал что нибудь пользователь или нет, если нет - то ладно, если да - то запускаем переборы и ищем что он сделал

А предложенную выше функцию пробовали?
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий