Закрытие определенных ордеров при заданном условии

 

Добрый день.

Описание проблемы:

1. Вычисляю суммарный профит по Buy

2. Если он положительный и приходит сигнал на продажу даю команду на закрытие позиций

3. Советник закрывает прибыльную позицию и перестает дальше закрывать остальные т.к. суммарный профит стал отрицательным.

Вопрос:

Как сделать так, чтобы советник не начинал анализировать рынок пока не отработает команду по закрытию ордеров Buy

вот код закрытия:


// Функция закрытия позиций

void CloseThisSymbolAll(int CmdClose)
   {
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
      {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
    
      if (OrderSymbol() == Symbol())
         {
         if (OrderType() == OP_BUY)
            {
            if (CmdClose == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, 3, Blue);
            }
         if (OrderType() == OP_SELL)
            {
            if (CmdClose == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, 3, Red);
            }
         Sleep(10);
         }
      }
   
   }

 
Dm_egorov:

Добрый день.

Описание проблемы:

1. Вычисляю суммарный профит по Buy

2. Если он положительный и приходит сигнал на продажу даю команду на закрытие позиций

3. Советник закрывает прибыльную позицию и перестает дальше закрывать остальные т.к. суммарный профит стал отрицательным.

Вопрос:

Как сделать так, чтобы советник не начинал анализировать рынок пока не отработает команду по закрытию ордеров Buy

вот код закрытия:

...

//+------------------------------------------------------------------+
void CloseThisSymbolAll(string symbol, int cmd, int magic, int slippage) {
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS)) {
         if(OrderMagicNumber()!=magic) continue;
         if(OrderSymbol()!=symbol)     continue;
         if(OrderType()>1)             continue;
         double pp=(cmd==OP_BUY)?MarketInfo(OrderSymbol(),MODE_BID):MarketInfo(OrderSymbol(),MODE_ASK);
         color  cl=(cmd==OP_BUY)?clrBlue:clrRed;
         bool res=(OrderClose(OrderTicket(),OrderLots(),pp,slippage,cl));
         }
      }
} 
//+------------------------------------------------------------------+

Это только в общем приближении, т.к. нет никаких обработок кодов возврата сервера. Вместо OrderClose() нужно вызывать полноценную функцию закрытия позиций с обработкой всех ошибок...

Но для тестера пойдёт.

ЗЫ. Не проверял. "На коленке" набросал.

 
artmedia70:

ЗЫ. Не проверял. "На коленке" набросал.



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

Измени

 if(OrderType()>1)             continue;

 на

 if(OrderType()!= cmd)             continue;
 
Roger:


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

Измени

 на

 

Ну-у-у ... вполне... ага...

Последствия "письма второпях на коленке" :)))

 
Как вариант - создать переключатель (к примеру с 0 на 1 - закрыться, и наоборот - не закрывать), т.е. прежде чем закрыть задать состояние переключателя (1) и произвести анализ - закрылись ли нужные оредера. По выполнению - перключиться в 0. Можно принять состояние переключателя в 0 по умолчанию.
 

Большое спасибо всем.

Почему мой код не работает корректно при долгом исполнении брокера?

 
Dm_egorov:

Большое спасибо всем.

Почему мой код не работает корректно при долгом исполнении брокера?

Проскальзывание цены. Пока ваш ДЦ "исполняет", цена уже уходит от заявленной в вашем торговом приказе на величину, больше, чем задано в параметре slippage (в пунктах), посему сервер возвращает вам ошибку. А обработки кодов возврата сервера у вас нет. Соответственно - заявка более не обрабатывается. В журнал терминала загляните - там записан код ошибки, которую в данном случае нужно было обработать и принять решение - пытаться закрыть ещё раз, иль уже нет.