Библиотеки: MT4Orders - страница 45

 
traveller00:

Я так понимаю, выбран тейк, чтобы для хеджа можно было отправлять 1 запрос тейка на сервер вместо 2-отдельного лимитника и CloseBy? А для неттинга это уже без разницы.

CloseBy-операция не является торговой, поэтому нет особой разницы.

 
В MT5 очень легко находить частичное исполнение.
// true - сделка в результате частичного исполнения.
bool IsPartial( const ulong TicketDeal )
{
  const ulong TicketOrder = HistoryDealGetInteger(TicketDeal, DEAL_ORDER);
  
  return((HistoryDealGetInteger(TicketDeal, DEAL_TYPE) <= DEAL_TYPE_SELL) &&
         (!TicketOrder ||
          (HistoryDealGetDouble(TicketDeal, DEAL_VOLUME) != HistoryOrderGetDouble(TicketOrder, ORDER_VOLUME_INITIAL))));
}


На примере этой функции покажу особенность совместного использования MT5-style и MT4-style.

// Вывод всех частично-исполненных сделок.

#include <MT4Orders.mqh>

input datetime inFrom = D'2020.01.01';

void OnStart()
{
  if (HistorySelect(inFrom, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong TicketDeal = HistoryDealGetTicket(i);
      
      if (IsPartial(TicketDeal))
      {
        Print(TicketDeal);
        
        if (OrderSelect(TicketDeal, SELECT_BY_TICKET) && // После OrderSelect по тикету меняет таблицу истории,
            HistorySelect(inFrom, INT_MAX))              // поэтому при необходимости ее нужно вернуть.
          OrderPrint();        
      }
    }
  }
}

Учитывайте это, если работаете с HistorySelect+MT4Orders.

 

В нескольких местах происходит выбор ордера по позиции. С комментарием 

// Во время перебора может измениться количество ордеров

поставлена проверка, что число ордеров может поменяться. Но, строго говоря, может быть ситуация, что число ордеров не поменялось, но сами ордера поменялись, типа 1 закрыт и 1 новый открыт. И тогда нумерация посреди дела может поползти. Такая ситуация за всё время использования ни разу не происходила? Отсутствие более строгих проверок - это баг или сознательное игнорирование маловероятной ситуации, чтобы чрезмерно не усложнять код? Или я что просмотрел, и тут нет ошибки?

 
traveller00:

В нескольких местах происходит выбор ордера по позиции. С комментарием 

поставлена проверка, что число ордеров может поменяться. Но, строго говоря, может быть ситуация, что число ордеров не поменялось, но сами ордера поменялись, типа 1 закрыт и 1 новый открыт. И тогда нумерация посреди дела может поползти. Такая ситуация за всё время использования ни разу не происходила? Отсутствие более строгих проверок - это баг или сознательное игнорирование маловероятной ситуации, чтобы чрезмерно не усложнять код? Или я что просмотрел, и тут нет ошибки?

Не помню. Знаю только, что делал много стресс-тестов, чтобы проверить все ситуации.

 

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

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2020.04.09 05:34

На хедже позиция может состоять из нескольких IN-сделок. Это происходит при частичном исполнении.

При этом ордер, что частично исполняется, меняет свой ORDER_TIME_SETUP(_MSC) на время исполнения первой (возможно, предпоследней) сделки. Т.е. по истории нельзя будет определить, когда, например, был выставлен BuyLimit.


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

В этой ситуации через MT4Orders OrderOpenPrice/OrderOpenTime такой MT4-позиции будут равны соответствующим значениям первой MT5-сделки.

Т.е. дробной цены открытия позиции не будет, к сожалению. Это редкая ситуация, но имеет место быть.

 

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

Библиотеки: MT4Orders

fxsaber, 2020.03.18 03:47

Реджект тейка.

Такая ситуация может возникать часто:

  1. Цена дошла до тейка открытой позиции.
  2. MT5 сформировал маркет-ордер. На провайдера ликвидности ушел соответствующий лимитный ордер.
  3. Лимитный ордер зареджектился. Тогда MT5-ордер, что соответствует тейку, удаляется.
  4. Переход на п.1.
Хорошая реализация, т.к. в истории можно видеть отлупы провайдеров. Ну и насильная внутренняя реализация тейков, как лимитников.

В таких ситуациях реджекта тейка, а также в случаях, когда тейк-ордер был исполнен частично, а затем отменен, MT4Orders эти MT5-ордера не показывает. И это правильно!

 

Последний релизный MT5 2361 с использованием MT4Orders, реал, хедж. Несколько советников, различаются магиками. Ситуация из одного из советников.

Был выставлен ордер на BUY, тикет 216684. Через некоторое время пришла пора закрыть позицию, был выставлен лимитник на SELL для закрытия и ещё лимитник на SELL на открытие обратной позиции, тикеты 216975 и 216978. Все ордера одинаковой лотности. Когда лимитник 216978 сработал, 216684 и 216978 были схлопнуты через CloseBy и остался только 216975.

Часть лога из Журнала

2020.04.15 07:33:24.203 : deal #107485 sell 0.15 XXXXXX at 1.05555 done (based on order #216978)
2020.04.15 07:33:24.203 : close position #216684 buy 0.15 XXXXXX by position #216978 sell 0.15 XXXXXX
2020.04.15 07:33:24.305 : accepted close position #216684 buy 0.15 XXXXXX by position #216978
2020.04.15 07:33:24.307 : deal #107487 sell 0.15 XXXXXX at 1.05555 done (based on order #216986)
2020.04.15 07:33:24.307 : close position #216684 buy 0.15 XXXXXX by position #216978 done in 103.841 ms
2020.04.15 07:33:24.309 : deal #107489 sell 0.15 XXXXXX at 1.05563 done (based on order #216975)

Часть лога из советника

2020.04.15 07:33:24.180 OrdersTotal 216978 216975 216684
2020.04.15 07:33:24.305 OrdersTotal

Т.е. видно, что ордера было 3. Но в процессе схлопывания 2 из них и перехода в маркет 3-го список ордеров оказался пустой, хотя должен был остаться 1. Ситуация может привести к двойному открытию позиции.

Ордера получаю через следующий код

  int PrevTotal;
  ulong OrderTickets[];
  do
  {
    PrevTotal=OrdersTotal();
    for(int i=PrevTotal-1;i>=0;--i)
    {
      int Total=OrdersTotal();
      if(Total!=PrevTotal)
      {
        PrevTotal=Total;
        i=PrevTotal;
        ArrayFree(OrderTickets);
        continue;
      }
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES) || OrderMagicNumber()!=inTradeMagic)
        continue;

      ArrayResize(OrderTickets,ArraySize(OrderTickets)+1);
      OrderTickets[ArraySize(OrderTickets)-1]=OrderTicket();
    }
  }while(PrevTotal!=OrdersTotal());

И так вставил проверку, вдруг изменилось число во время перечисления. Но, похоже, этого не хватает. Это баг, фича или я залез в недоделанную область?

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
traveller00:

список ордеров оказался пустой, хотя должен был остаться 1. Ситуация может привести к двойному открытию позиции.

Это баг MT5.

 
fxsaber:

Это баг MT5.

А в историю ордер попадает? Явно не хватает помимо PositionsTotal, OrdersTotal распринтовки HistoryOrdersTotal. Если оно меняется и последний ордер был исполнен, значит нужно ждать изменения позиции. В любом случае дело идет к тому, что нужно иметь копию окружения и сверяться с ней, придерживаясь правила, что если где-то убудет/прибудет, то в другом месте наоборот прибудет/убудет.

 
Stanislav Korotky:

А в историю ордер попадает?

Попадает, но не сразу.

Явно не хватает помимо PositionsTotal, OrdersTotal распринтовки HistoryOrdersTotal. Если оно меняется и последний ордер был исполнен, значит нужно ждать изменения позиции. В любом случае дело идет к тому, что нужно иметь копию окружения и сверяться с ней, придерживаясь правила, что если где-то убудет/прибудет, то в другом месте наоборот прибудет/убудет.

Да, только через копию.

Причина обращения: