Проблемы с закрытием ордеров

 
Добрый день всем. Пишу свой советник. По какой-то мне непонятной причине функция закрытия ордера корректно не функционирует так как мне нужно.
 Посматрите пж-та где ошибка.
В коде допускается один ордер.

void SetOrder(int Oper) {
   int result;
 
   if(OrderSet == false) { //если наших ордеров еще нет
 
      if(Oper == STATUS_BUY) {
         //Print("Set new buy order first");
         RefreshRates();
         result = OrderSend(Symbol(), OP_BUY, LotsOptimized(), Ask, 0, StopLoss, TakeProfit, "test", MAGIC_NUMBER, 0, Blue);
         if(result == -1) Print("Buy OrderSend error GLE: " + GetLastError());
         OrderSet = true;
         return;
      }
      if(Oper == STATUS_SELL) {
         //Print("Set new sell order first");
         RefreshRates();
         result = OrderSend(Symbol(), OP_SELL, LotsOptimized(), Bid, 0, StopLoss, TakeProfit, "test", MAGIC_NUMBER, 0, Red);
         if(result == -1) Print("Buy OrderSend error GLE: " + GetLastError());
         OrderSet = true;
         return;
      }
   }
 
   double ClosePrice;
   //допустим у нас может быть только один наш ордер на одной паре, тогда это будет выглядеть так:
   for(int i = 0; i < OrdersTotal(); i++) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
      if(OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC_NUMBER) {   
         while(true) {
            if(Oper == STATUS_BUY) {
               ClosePrice = MarketInfo(OrderSymbol(), MODE_BID);
               ClosePrice = NormalizeDouble(ClosePrice, Digits);
               result = OrderClose(OrderTicket(), OrderLots(), ClosePrice, 10, Red);
            } else {
               ClosePrice = MarketInfo(OrderSymbol(), MODE_ASK);
               ClosePrice = NormalizeDouble(ClosePrice, Digits);
               result = OrderClose(OrderTicket(), OrderLots(), ClosePrice, 10, Blue);
            }
            if(result == false) {
               if(GetLastError() == ERR_INVALID_PRICE) {
                  Print("ERR_INVALID_PRICE");
                  Sleep(CLOSE_PAUSE);
               } else break;
            } else {
               Print("Order close GLE: " + GetLastError());
               return;
            }
         }
 
         if(Oper == STATUS_BUY) {
            //Print("Set new buy order");
            result = OrderSend(Symbol(), OP_BUY, LotsOptimized(), Ask, 0, StopLoss, TakeProfit, "test", MAGIC_NUMBER, 0, Blue);
            if(result == -1) Print("Buy OrderSend error GLE: " + GetLastError());
         }
         if(Oper == STATUS_SELL) {
            //Print("Set new sell order");
            result = OrderSend(Symbol(), OP_SELL, LotsOptimized(), Bid, 0, StopLoss, TakeProfit, "test", MAGIC_NUMBER, 0, Red);
            if(result == -1) Print("Buy OrderSend error GLE: " + GetLastError());
         }
      }
   }
}//+------------------------------------------------------------------+
 
ps. обычно это ошибка 129
 
pingved:
Добрый день всем. Пишу свой советник. По какой-то мне непонятной причине функция закрытия ордера корректно не функционирует так как мне нужно.
Посматрите пж-та где ошибка.
В коде допускается один ордер.


Ну и стиль у Вас... Не вижу где перед закрытием проверка на тип ордера OP_BUY или OP_SELL, хотя не зная логики эксперта сложно сказать нужна она или нет. Добавьте проверки типа if(OrderType()==OP_BUY) перед закрытием, может статься что Вы закрываетесь не по той цене.

ERR_INVALID_PRICE 129 Неправильная цена

Походу и правда при закрытие попутаны Bid и Ask...

 

if(OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC_NUMBER) {
while(true) {
if(Oper == STATUS_BUY) {
ClosePrice = MarketInfo(OrderSymbol(), MODE_BID); ClosePrice = NormalizeDouble(ClosePrice, Digits);
result = OrderClose(OrderTicket(), OrderLots(), ClosePrice, 10, Red);
} else {
ClosePrice = MarketInfo(OrderSymbol(), MODE_ASK);
ClosePrice = NormalizeDouble(ClosePrice, Digits);
result = OrderClose(OrderTicket(), OrderLots(), ClosePrice, 10, Blue);
}

Вы тут не верно определяете тип открытой позиции.

есть ф-ия OrderType() она возвращает какого типа выбранная позиция

Вместо этого напишите

if(Oper == STATUS_BUY) {

if(OrderType() == OP_BUY) и все будет корректно.

Хотя вы и так сильно намудрили. я бы разнес такие действия как открытие закрытие в отдельные ф-ии. Один раз написали забыл как про это))

 
да, намудрил действительно. Спасибо большое. :)
Причина обращения: