Работа советника с разными парами

 

Уважаемые Гуру!

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

Я соорудил вот такую конструкцию:

==================================================== 

string Pair;

double CCI;

int cnt;

int Total;

int ticket;

int pause=180000;

int error;

    Total = OrdersTotal();

   if(Total>0)

   {//1

for(cnt = Total; cnt >= 0; cnt--)

   {//2

   if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)==true)

     {//3

     if(OrderProfit() > 0)

        {//4

     Pair = OrderSymbol();

     CCI = 0;

     CCI = iCCI(Pair,PERIOD_H1,24,PRICE_TYPICAL,0);

 //Close BUY-------------------------------------------

      if(OrderType() == OP_BUY && CCI >= 115.0)

        {//5

        ticket = OrderClose(OrderTicket(),OrderLots(),Bid,30,White);

 и т.д.

=============================================================================

(Это одно из условий, есть другие, но речь не об этом.)

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

Подскажите, насколько работоспособен вот такой принцип (Pair = OrderSymbol();) разделения по парам, и, может быть, подскажите другой путь решения этой проблемы.

 

Заранее Благодарен!

 

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

 

Проверка OrderSymbol() спасёт.

OrderSymbol - Торговые функции - Справочник MQL4
OrderSymbol - Торговые функции - Справочник MQL4
  • docs.mql4.com
OrderSymbol - Торговые функции - Справочник MQL4
 
Andrei Fandeev:

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


Да, это основная проблема кода.

Также более мелкие проблемы:

  1. Цикл перебора организовывать от Total - 1. Индекса Total в списке нет.
  2. Убрать проверку if(Total>0). Она дублирует условия цикла.
  3. Приводить код, используя кнопку SRC.

 
Andrei Fandeev:

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


Очень верно! Как-то не пришло в голову...
Тогда как-то через 

double vbid    = MarketInfo(Pair,MODE_BID);

ticket = OrderClose(OrderTicket(),OrderLots(),vbid,30,White);

или?

 
Ihor Herasko:

Да, это основная проблема кода.

Также более мелкие проблемы:

  1. Цикл перебора организовывать от Total - 1. Индекса Total в списке нет.
  2. Убрать проверку if(Total>0). Она дублирует условия цикла.
  3. Приводить код, используя кнопку SRC.


1.Цикл перебора организовывать от Total - 1. 

                                   == не понял, почему?

Индекса Total в списке нет.

                                   == int Total; - это разве не то? Или Вы что-то другое имеете ввиду?


2. Убрать проверку if(Total>0). Она дублирует условия цикла.

                                   == отчасти согласен, но, как мне кажется, если Total==0, то и самого перебора не будет за ненадобностью. Кроме того, это - только часть кода, разумеется. Там дальше, под общим условием  if(Total>0) ещё куча всего, что при нуле выполнять не надо.

 

Господа, всё, что вы говорите - верно, но!

Если, как пишет Andrei Fandeev, Bid берётся от другого инструмента, то ордер попросту НЕ ЗАКРОЕТСЯ и выдаст ошибку. Но беда в том, что он - зараза! - именно закрывается по "местному" Bid'у, но...............вот тут я и не понимаю: то ли по каким-то "чужим", из других пар, ТЕКУЩИМ условиям, то ли отказывается перед расчётом индекса обнулять его значение, полученное ранее:

 CCI = 0;

     CCI = iCCI(Pair,PERIOD_H1,24,PRICE_TYPICAL,0);

И в результате мы имеем неправильный CLOSE, который никак не отвечает заложенной в код логике.

А то и хуже того: иногда имеем, иногда - нет. О как!

А Print() после CLOSE выдаёт иной раз вообще бред, типа CCI=56743876501,540056
 
Artemij:

Господа, всё, что вы говорите - верно, но!

Если, как пишет Andrei Fandeev, Bid берётся от другого инструмента, то ордер попросту НЕ ЗАКРОЕТСЯ и выдаст ошибку. Но беда в том, что он - зараза! - именно закрывается по "местному" Bid'у, но...............вот тут я и не понимаю: то ли по каким-то "чужим", из других пар, ТЕКУЩИМ условиям, то ли отказывается перед расчётом индекса обнулять его значение, полученное ранее:

 CCI = 0;

     CCI = iCCI(Pair,PERIOD_H1,24,PRICE_TYPICAL,0);

И в результате мы имеем неправильный CLOSE, который никак не отвечает заложенной в код логике.

А то и хуже того: иногда имеем, иногда - нет. О как!

Я бы написал так

double vbid = MarketInfo(OrderSymbol(),MODE_BID);
ticket = OrderClose(OrderTicket(),OrderLots(),vbid,30,White);
 
Vitaly Muzichenko:

Я бы написал так


Ещё точнее, верно, согласен.

 

если ордер перед этим выбран, то можно так)

bool i2=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),30,White);
 
Taras Slobodyanik:

если ордер перед этим выбран, то можно так)


...а если "ордер перед этим выбран", но ЕЩЁ НЕ ЗАКРЫТ, то OrderClosePrice() = это что?.......