МТС "Корректор" - утилита для автоматического поиска и закрытия по встречной перекрытых ордеров

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

Скачать исходники советника "Корректор" можно по ссылке: http://bigforex.biz/load/2-1-0-169
 
Reshetov >>:

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

Скачать исходники советника "Корректор" можно по ссылке: http://bigforex.biz/load/2-1-0-169


нельзя ли пояснить что такое разворот по двойной встречной... я не так опытен, чтобы сразу врубиться)))
 

Чуть больше делает NettoTrading в режиме AntiSwap = TRUE - сразу "схлопывает" любые появляющиеся противоположные позиции по всем инструментам. Но он, как и Сorrector, не учитывает нюанс, когда закрыть по OrderCloseBy нельзя.

Учет этого нюанса реализован в функции CloseLock советника Trade-Arbitrage.

 

Посмотрел внимательнее Corrector. Вроде, он должен иногда работать некорректно, т.к. после OrderCloseBy идет неоднозначное (зависит от разницы объемов перекрываемых ордеров) появление позиций с новыми тикетами, и, соответсвенно, необходимо снова пробегаться по всем ордерам через OrdersTotal. Более корректный вариант видится, как вызов LockOFF(Symbol()) из NettoTrading:

int GetOrderTicket( string inSymbol, int Type )
{
  int Pos, Total = OrdersTotal();
  
  for (Pos = 0; Pos < Total; Pos++)
  {
    OrderSelect(Pos, SELECT_BY_POS);
    
    if (OrderSymbol() == inSymbol)
      if (OrderType() == Type)
        return(OrderTicket());
  }
  
  return(-1);
}

void LockOFF( string inSymbol )
{
  int BuyTicket, SellTicket;
    
  BuyTicket = GetOrderTicket(inSymbol, OP_BUY);
  SellTicket = GetOrderTicket(inSymbol, OP_SELL);
  
  while ((BuyTicket != -1) && (SellTicket != -1))
  {
    OrderCloseBy(BuyTicket, SellTicket);

    BuyTicket = GetOrderTicket(inSymbol, OP_BUY);
    SellTicket = GetOrderTicket(inSymbol, OP_SELL);
  }
  
  return;
}