Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 887

 
tuner:
сделай void start() и ошибки не будет
Спасибо! Ошибка исчезла, но позиция все равно не закрывается.
 
rapid_minus:
Спасибо! Ошибка исчезла, но позиция все равно не закрывается.
Недостаточно кода чтобы точно сказать в чем причина
 
tuner:
Недостаточно кода чтобы точно сказать в чем причина


Фрагмент:

   void CritCloseBuy()
   {
      if (((Yellow_0-Red_0)<(Yellow_1-Red_1) && ((MA_0<MA_1)&&(MA_1>MA_2))) || ((Yellow_0-Red_0)>(Yellow_1-Red_1) && ((MB_0<MB_1)&&(MB_1>MB_2))))
      while(true)
     {
        ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red);
        if (ord_close = false)
        {
        Comment("Закрытие позиции БАЙ завершилось с ошибкой #",GetLastError());         //Сообщение об ошибке
            break;
         } 
            else
            {          
            Ord=0;
            break;
            }                     
       
      }

Может причина в открытии:

 void CritOpen()
 {
      if (///условие открытия///)      

     while(true)
     {                                             
     ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,0,0,0,NULL,10011,0,clrNONE); //открываем ордер БАЙ, МАГИК 10011
         if(ticket<=0)
         {
         Comment("Открытие позиции БАЙ-10011 завершилось с ошибкой #",GetLastError());         

          break; 
         }
            else
            {
            Comment("Открыта позиция БАЙ-10011 лотом 0.1,цена", Ask);
            Ord=(Ord+1);
            break;          
            }
     }

 
rapid_minus:


Фрагмент:

  

...

перед ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red);

неплохо бы ордер-то выбрать функцией OrderSelect(). А смысла в таком построении цикла вокруг функции закрытия вообще не вижу...

 
evillive:

перед ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red);

неплохо бы ордер-то выбрать функцией OrderSelect().

так он у меня единственный. Но впрочем сначала так и было. Это я уже начал искать причину методом тыка. И я в цикле непойму смысла.

Просто шпарю по аналогии: раз открыл с циклом, значит и закрыть должен... 

 

У Игоря Кима наше такой пример:

void start() {
  ManagePositions();
}

//+----------------------------------------------------------------------------+
//|  Закрытие позиций по рыночной цене                                         |
//|  Параметры:                                                                |
//|    sym - наименование инструмента ("" - текущий символ)                    |
//|    op  - операция                 (-1 - любая позиция)                     |
//|    mn  - MagicNumber              (-1 - любой магик)                       |
//+----------------------------------------------------------------------------+
void ClosePositions(string sym="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();

  if (sym=="") sym=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sym && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy);
          }
          if (OrderType()==OP_SELL) {
            OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell);
          }
        }
      }
    }
  }

Но компилятор требует проверки возвращаемого значения OrderClose 

 
rapid_minus:

У Игоря Кима наше такой пример:


Но компилятор требует проверки возвращаемого значения OrderClose 

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

А проверку организовать совсем просто if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell)) Print("Ошибка закрытия №", GetLastError());

 
rapid_minus:

У Игоря Кима наше такой пример:

...

Но компилятор требует проверки возвращаемого значения OrderClose 

Это потому что в те времена когда Игорь писал свои функции, компилятор не требовал проверки возвращаемого значения, а современный компилятор ругается если не проверять
 
evillive:

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

А проверку организовать совсем просто if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell)) Print("Ошибка закрытия №", GetLastError());

Сделал так:              if (!OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red))
                  {
                  Comment("Закрытие позиции БАЙ завершилось с ошибкой #",GetLastError());       
                  break;
                  } 
                     else
                        {          
                        Ord=0;
                        break;
                        }

Продолжает требовать "return value should be checked .

Сделал так: 

ord_close=OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);
              if (ord_close = false)
                  {
                  Comment("Закрытие позиции БАЙ завершилось с ошибкой #",GetLastError());         //Сообщение об ошибке
                  break;
                  } 
                     else
                        {          
                        Ord=0;
                        break;
                        }

Молчит. Но и в том, и в другом случае не закрывает позицию  

ЗЫ: мне кажется, ошибка в определении условий закрытия и открытия поз 

В посте выше приведен пример условия закрытия. Что там может быть неправильно? 

 
rapid_minus:

Молчит. Но и в том, и в другом случае не закрывает позицию  

ЗЫ: мне кажется, ошибка в определении условий закрытия и открытия поз 

В посте выше приведен пример условия закрытия. Что там может быть неправильно? 

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

Тут скобки как-то не так расставлены:

if (((Yellow_0-Red_0)<(Yellow_1-Red_1) && ((MA_0<MA_1)&&(MA_1>MA_2))) || ((Yellow_0-Red_0)>(Yellow_1-Red_1) && ((MB_0<MB_1)&&(MB_1>MB_2))))

А если вот так?

if (((Yellow_0-Red_0<Yellow_1-Red_1) && (MA_0<MA_1 && MA_1>MA_2)) || ((Yellow_0-Red_0>Yellow_1-Red_1) && (MB_0<MB_1 && MB_1>MB_2)))