Одновременная торговля одним экспертом на нескольких парах.

 
Здррасте.
Что нужно знать и на что обращать внимание, для того, чтобы торговать на одном счёте, одним экспертом, запущеным на нескольких парах.
Например эксперт открывает только одну позицию посредством проверки if(OrdersTotal()<1). Это значит, что он откроет только одну позицию на ВСЕ пары?
Как корректно использовать мейджики для такой торговли?
Спасибо.
 
мейджики нужны если на одном символе несколько совтников, а если на символ по одному, то достаточно сравнивать Symbol() и OrderSymbol(). Ну и каждый советник должен свои ордера считать - если Symbol()==OrderSymbol() и если мейджики используются то приподсчете ордеров и их проверять.
 
ок... как насчёт OrdersTotal()? Как бы так, чтобы ограничивался одним ордером на пару, а не одним ордером вообще?
 
CTPAYC:
ок... как насчёт OrdersTotal()? Как бы так, чтобы ограничивался одним ордером на пару, а не одним ордером вообще?
Ответ - выше =)
В цикле проверять все ордера, и если есть ордер с OrderSymbol() == Symbol(), считать что открытая позиция есть. Иначе - считать, что нету.
Примерно так:
int _OrdersTotal = OrdersTotal(), _GetLastError = 0; for ( int z = _OrdersTotal - 1; z >= 0; z -- ) { if ( !OrderSelect( z, SELECT_BY_POS ) ) { _GetLastError = GetLastError(); Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError ); continue; } if ( OrderSymbol() == Symbol() ) { return(-1); } }
 

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

Если надо торговать одним экспертом на одной паре, но на разных тайм-фреймах? Мейджики? Или можно что-нибудь другое посравнивать?

 

Все просто.

Symbol() - разделяет торгуемые символы.

Для дополнительного разделения ордеров в рамках одного или нескольких экспертов можно использовать Magic.

Так что таймфрейм можно просто вписывать вместо параметра Magic.

Тогда узнать, есть ли такой ордер с таким символом и относящийся к такому то таймфрейму можно так

int GetOrder(string symbol, int period) {
  int cnt = OrdersTotal();  for (int i=0; i < cnt; i++) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if (OrderSymbol() != symbol) continue; if (OrderMagicNumber() != period) continue;
    return (OrderSymbol());
  }
  return (-1); }
Причина обращения: