Как более грамотно поймать закрытие ордера в MQL5.

 

Доброго времени суток!

Понадобился значит мне копировальщик сделок (дублирование позиций из терминала А в терминал Б). Бесплатных нет, а покупать для меня дорого.

Написал функции: 

  1. получение списка открытых ордеров
  2. запись в файл
  3. чтение из файла
  4. открытие ордера
  5. изменение ордера (T/P и S/L)
  6. закрытие ордера

После столкнулся с вопросом - как правильно ловить закрытие ордеров для дальнейшей их обработки (т.е. передачи второму терминалу для закрытия дублирующей сделки)?

До этого я думал воспользоваться событиями - OnTrade или OnTradeTransaction, но опытным путём было установлено, что на закрытие или открытие ордера данное событие срабатывает 10 раз. На изменение 4 раза. В OnTradeTransaction тоже более 1 раза, но менее чем 10. В моём же представлении было, что данные события будут срабатывать по 1 разу на каждую операцию. 

Теперь я даже немного в растерянности, как мне грамотно отлавливать закрытие ордеров. Хотя примерные варианты в голове есть (быть может брать информацию из истории закрытых ордеров, ещё можно считать кол-во срабатываний и обрабатывать только после 10 срабатываний, но мне кажется это порнухой, вдруг у другого провайдера этих срабатываний будет меньше) и все их можно пересмотреть, но боюсь, что из-за недостаточно сильных познаний в данной сфере, самый верный вариант будет обойдён стороной. 

В общем прошу помочь мне советом. Заранее благодарен! 

 

Пока в голове только одна более-менее здравая на мой взгляд идея:

Запомнить количество открытых ордеров и сравнивать с текущим в данный момент, если их стало больше - открытие, меньше - закрытие.

 
federal24:

Пока в голове только одна более-менее здравая на мой взгляд идея:

Запомнить количество открытых ордеров и сравнивать с текущим в данный момент, если их стало больше - открытие, меньше - закрытие.

Закрытие ордера - в принципе нет такой операции. ОТЛОЖЕННЫЙ ордер можно УДАЛИТЬ, а ПОЗИЦИЮ можно ЗАКРЫТЬ.

Сначала определитесь - что же Вы хотите: работать с ПОЗИЦИЕЙ или с ОТЛОЖЕННЫМ ордером?

 
federal24:

Доброго времени суток!

Понадобился значит мне копировальщик сделок (дублирование позиций из терминала А в терминал Б). Бесплатных нет, а покупать для меня дорого.

Написал функции: 

  1. получение списка открытых ордеров
  2. запись в файл
  3. чтение из файла
  4. открытие ордера
  5. изменение ордера (T/P и S/L)
  6. закрытие ордера

После столкнулся с вопросом - как правильно ловить закрытие ордеров для дальнейшей их обработки (т.е. передачи второму терминалу для закрытия дублирующей сделки)?

До этого я думал воспользоваться событиями - OnTrade или OnTradeTransaction, но опытным путём было установлено, что на закрытие или открытие ордера данное событие срабатывает 10 раз. На изменение 4 раза. В OnTradeTransaction тоже более 1 раза, но менее чем 10. В моём же представлении было, что данные события будут срабатывать по 1 разу на каждую операцию. 

Теперь я даже немного в растерянности, как мне грамотно отлавливать закрытие ордеров. Хотя примерные варианты в голове есть (быть может брать информацию из истории закрытых ордеров, ещё можно считать кол-во срабатываний и обрабатывать только после 10 срабатываний, но мне кажется это порнухой, вдруг у другого провайдера этих срабатываний будет меньше) и все их можно пересмотреть, но боюсь, что из-за недостаточно сильных познаний в данной сфере, самый верный вариант будет обойдён стороной. 

В общем прошу помочь мне советом. Заранее благодарен! 

 if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
   {
    if(!HistoryDealSelect(trans.deal))
      Print(GetLastError());
    if(trans.symbol == _Symbol)
     {
      if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN && HistoryDealGetInteger(trans.deal, DEAL_MAGIC) == magick)
        Print("Позиция открылась");
      if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_OUT)
        Print("Позиция закрылась");
     }
   }

Это кусок кода из OnTradeTransaction. Проблема только в том, что если надо определять магик закрывшейся позиции, то надо поколдовать с историей. Магик закрывающей сделки не совпадает с магиком закрываемой позиции.

 
federal24:

Доброго времени суток!

Понадобился значит мне копировальщик сделок (дублирование позиций из терминала А в терминал Б). Бесплатных нет, а покупать для меня дорого.

Написал функции: 

  1. получение списка открытых ордеров
  2. запись в файл
  3. чтение из файла
  4. открытие ордера
  5. изменение ордера (T/P и S/L)
  6. закрытие ордера

После столкнулся с вопросом - как правильно ловить закрытие ордеров для дальнейшей их обработки (т.е. передачи второму терминалу для закрытия дублирующей сделки)?

До этого я думал воспользоваться событиями - OnTrade или OnTradeTransaction, но опытным путём было установлено, что на закрытие или открытие ордера данное событие срабатывает 10 раз. На изменение 4 раза. В OnTradeTransaction тоже более 1 раза, но менее чем 10. В моём же представлении было, что данные события будут срабатывать по 1 разу на каждую операцию. 

Теперь я даже немного в растерянности, как мне грамотно отлавливать закрытие ордеров. Хотя примерные варианты в голове есть (быть может брать информацию из истории закрытых ордеров, ещё можно считать кол-во срабатываний и обрабатывать только после 10 срабатываний, но мне кажется это порнухой, вдруг у другого провайдера этих срабатываний будет меньше) и все их можно пересмотреть, но боюсь, что из-за недостаточно сильных познаний в данной сфере, самый верный вариант будет обойдён стороной. 

В общем прошу помочь мне советом. Заранее благодарен! 

Копировщик лучше писать синхронизируя не события, а состояния. Если дублирующая сделка есть, а на мастере ее родителя нет, значит она закрылась, удалилась и т.д. Можно смело искать в истории, если нужно. 

С открытием такая же история.

 
federal24:

Доброго времени суток!

Понадобился значит мне копировальщик сделок (дублирование позиций из терминала А в терминал Б). Бесплатных нет, а покупать для меня дорого.

Написал функции: 

  1. получение списка открытых ордеров
  2. запись в файл
  3. чтение из файла
  4. открытие ордера
  5. изменение ордера (T/P и S/L)
  6. закрытие ордера

После столкнулся с вопросом - как правильно ловить закрытие ордеров для дальнейшей их обработки (т.е. передачи второму терминалу для закрытия дублирующей сделки)?

До этого я думал воспользоваться событиями - OnTrade или OnTradeTransaction, но опытным путём было установлено, что на закрытие или открытие ордера данное событие срабатывает 10 раз. На изменение 4 раза. В OnTradeTransaction тоже более 1 раза, но менее чем 10. В моём же представлении было, что данные события будут срабатывать по 1 разу на каждую операцию. 

Теперь я даже немного в растерянности, как мне грамотно отлавливать закрытие ордеров. Хотя примерные варианты в голове есть (быть может брать информацию из истории закрытых ордеров, ещё можно считать кол-во срабатываний и обрабатывать только после 10 срабатываний, но мне кажется это порнухой, вдруг у другого провайдера этих срабатываний будет меньше) и все их можно пересмотреть, но боюсь, что из-за недостаточно сильных познаний в данной сфере, самый верный вариант будет обойдён стороной. 

В общем прошу помочь мне советом. Заранее благодарен! 

изучите матчасть вначале как работает и чем отличаются  ордер - сделки - позиция, тогда и выстроится правильная логика. В мт5 надо уходить от решений для работы с позициями используемых в мт4.

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

 
Alexandr Gavrilin:

изучите матчасть вначале как работает и чем отличаются  ордер - сделки - позиция, тогда и выстроится правильная логика. В мт5 надо уходить от решений для работы с позициями используемых в мт4.

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

   Спасибо! Буквально вчера пришлось разобраться что такое сделка, позиция и ордер. Хотел получить свойства закрытого ордера, но думал что это сделка. Как только понял, что нужных данные от сделки мне не получить, тут то и пришло осознание в ошибочных действиях и понимании всей этой терминологии. 

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

  1. навыки разработки на незнакомом языке (MQL5) + сравниваю и ощущаю разницу между PHP и Си;
  2. познания по терминалу, MetaEditor и хоть какое-то понимание процессов работы всей этой кухни от клиента до сервера;
  3. экономия средств (как от затрат на покупку готового решения, так и от затрат на обучение).
 
Andrey Barinov:

Копировщик лучше писать синхронизируя не события, а состояния. Если дублирующая сделка есть, а на мастере ее родителя нет, значит она закрылась, удалилась и т.д. Можно смело искать в истории, если нужно. 

С открытием такая же история.

   Благодарю за совет! Обязательно поищу в документации и посмотрю. 
Причина обращения: