MT4: Нюанс OrderClose - отставание в обновлении таблицы закрытых позиций - страница 2

 
getch писал(а) >>

Вы и Roger ошибаетесь, поскольку могли не видеть реализацию MT4-ECN-бриджей, где есть понятие Partial Fills.

Разработчики подобных бриджей вынуждены были немного изменить озвученное правило сохранения тикета из-за таких вот рыночных (не кухонных) обстоятельств нехватки ликвидности.

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

Это теперь только завтра можно проверить. Первый раз вижу, чтобы после регистрации нужно ждать более суток активизации счета.

 

Обошел проблему. Сравниваю суммарную позицию по символу закрываемого тикета до OrderClose и после. Величина изменения этой суммы и есть размер сработавшего OrderClose.

 
Поторопился с решением, после OrderClose помимо таблицы закрытых сделок не обновляется сразу и таблица открытых сделок.
 
getch >>:

Обошел проблему. Сравниваю суммарную позицию по символу закрываемого тикета до OrderClose и после. Величина изменения этой суммы и есть размер сработавшего OrderClose.

if (OrderCloseTime()>0) ... значит закрыт. Добавь эту проверку в перебор ордеров MODE_TRADES - думаю поможет.

 
JavaDev >>:

if (OrderCloseTime()>0) ... значит закрыт. Добавь эту проверку в перебор ордеров MODE_TRADES - думаю поможет.

Не помогло. Таблицы закрытых и открытых сделок не обновляются сразу. Только существенный (несколько секунд) Sleep позволяет избежать ошибок.

Попоробую проверить на данный баг другой MT4-ECN-бридж.

 
getch >>:

Не помогло. Таблицы закрытых и открытых сделок не обновляются сразу. Только существенный (несколько секунд) Sleep позволяет избежать ошибок.

Попоробую проверить на данный баг другой MT4-ECN-бридж.

Я согласен что не обновляется - но узнать какие ордера УЖЕ закрыты(но ещё не ушли в историю) - можно.

CloseTime обновляется моментально.

А открытие - OrderSend возвращает тикет.

... или пользуеш несколько терминалов на 1 счёт ?

 
JavaDev >>:

Я согласен что не обновляется - но узнать какие ордера УЖЕ закрыты(но ещё не ушли в историю) - можно.

CloseTime обновляется моментально.

А открытие - OrderSend возвращает тикет.

... или пользуеш несколько терминалов на 1 счёт ?

Использую один терминал. Вот так закрываю:

double GetSymbolVolume( string Symb )
{
  double Sum = 0;
  int Pos = OrdersTotal() - 1;
  
  while (Pos >= 0)
  {
    OrderSelect(Pos, SELECT_BY_POS);
    
    if ((OrderCloseTime() == 0) && (OrderSymbol() == Symb))
    {
      if (OrderType() == OP_BUY)
        Sum += OrderLots();
      else if (OrderType() == OP_SELL)
        Sum -= OrderLots();
    }
    
    Pos--;
  }
  
  return(Sum);
}

double _OrderClose( int _ticket, double _lots, double _price, int _slippage)
{
  int _GetLastError;
  double Vol = 0;
  string _symbol;
  int Type;
  
  OrderSelect(_ticket, SELECT_BY_TICKET);
  _symbol = OrderSymbol();
  Type = OrderType();
  
  Vol = GetSymbolVolume(_symbol);
  
  OrderClose(_ticket, _lots, _price, _slippage);
  _GetLastError = GetLastError();
 
  if (Type == OP_BUY)
    Vol -= GetSymbolVolume(_symbol);
  else // (Type == OP_SELL)
    Vol = GetSymbolVolume(_symbol) - Vol;
    
  Print("(", _symbol, ") = OrderClose(", _ticket, ", ", _lots, ", ", DoubleToStr(_price, MarketInfo(_symbol, MODE_DIGITS)),
        ", ", _slippage, ") - ", ErrorDescription(_GetLastError), ", Lots = ", Vol);
  
  return(Vol);
}

Получаю вот такой результат:

ׂ 
Сверху закладка Account History, снизу - Experts

С OrderSend проблем пока не испытывал. Не знаю, что возвращает OrderSend, если открытие произошло не на весь заявленный объем. Предполагаю, возвратит -1.
 
Мда... при частичном закрытии позиции... Я на эти грабли (потеря тикета) наступил при OrderCloseBy. У меня идей NULL. Sorry.
 
JavaDev >>:
Мда... при частичном закрытии позиции... Я на эти грабли (потеря тикета) наступил при OrderCloseBy. У меня идей NULL. Sorry.

К сожалению, на скрине выше не частичное закрытие, а полноценное: после этого закрытия открытых позиций по USDJPY не осталось.

 
getch >>:

К сожалению, на скрине выше не частичное закрытие, а полноценное: после этого закрытия открытых позиций по USDJPY не осталось.

double _OrderClose( int _ticket, double _lots, double _price, int _slippage)
{
  
//...  
  OrderClose(_ticket, _lots, _price, _slippage);
  _GetLastError = GetLastError();
  if (OrderSelect(_ticket,SELECT_BY_TICKET)) Print("OrderClose Debug:" , OrderCloseTime());
  
//Может так данные обновяться ?
}
(я понимаю что идиотизм) - но за неимением лучших идей. :)