Подскажите, пожалуйста, функцию..........:)

 
Подскажите, пожалуйста, функцию, которая бы закрывала перечень ордеров с заранее указанными магическими номерами? Магических номеров может быть до 20 штук. В зависимости от условий. Нужна функция, которая бы при вызове, закрывала бы открытые ордера, с заранее заданными магическими номерами. Заранее Благодарю за помощь! :)
 
Сомневаюсь, что в кодобазе есть уже готовая функция такого типа - уж больно узкоспециальная она. Скорее всего что придётся Вам сделать её код самостоятельно.
 
int fArrExistIn_int(int aValue, int & aArray[]){
      for(int ti=0;ti<ArraySize(aArray);ti++){
         if(aValue==aArray[ti]){
            return(ti);
         }
      }
   return(-1);
}

В любую функцию, вместо if(OrderMagicNumber()==Magic){... сделать

if(fArrExistIn_int(OrderMagicNumber(),MagicAr)!=-1){...

MagicAr - массив со всеми магиками.

 
Integer:

В любую функцию, вместо if(OrderMagicNumber()==Magic){... сделать

if(fArrExistIn_int(OrderMagicNumber(),MagicAr)!=-1){...

MagicAr - массив со всеми магиками.

Благодарю! Integer. :-)

 

Значит. Применил я выше описанное. Получилась вот такая готовая функция по закрытию рыночных ордеров с определенным перечнем магиков.:)

/////////////////////////Функция: ЗАКРЫТИЕ ДИАПОЗОНА ОРДЕРОВ С ОПРЕДЕЛЕННЫМИ МАГИКАМИ /////////////////////////////////////       

int fArrExistIn_int(int aValue, int & aArray[])

  { // Начало функции.
int cnt,total=0,ticket=0,err=0,c=0,slip=7,tries=5;

   for(int ti=0;ti<ArraySize(aArray);ti++){
         if(aValue==aArray[ti]){

          if(fArrExistIn_int(OrderMagicNumber(),MagicAr)!=-1) // Где MagicAr - массив с магическими номерами.
          {
             switch(OrderType())
             {
                case OP_BUY      :
                   for(c=0;c<tries;c++)
                   {
                      RefreshRates();
                      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slip,Yellow);
                      err = GetLastError();
                      if (err==0)   break;
                      else
                      {
                         Print("Errors Closing BUY order");
                         Print(ErrorDescription(err),", error ",err);
                         if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Busy errors
                         { Sleep(3000); continue; }  
                      }
                   }   
                   break;
               
                case OP_SELL     :
                   for(c=0;c<tries;c++)
                   {
                      RefreshRates();
                      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slip,Yellow);
                      err = GetLastError();
                      if (err==0) break;
                      else
                      {
                         Print("Errors Closing SELL order");
                         Print(ErrorDescription(err),", error ",err);
                         if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Busy errors
                         { Sleep(3000); continue; } 
                      }
                   }   
                   break;
             } // switch 
          } // if 
          
      return(ti);
        }
     }
   return(-1);
} // Конец Функции.

////////////// Конец Функции: ЗАКРЫТИЕ ДИАПОЗОНА ОРДЕРОВ С ОПРЕДЕЛЕННЫМИ МАГИКАМИ ////////////////
 

Вот только возникает маленькая проблемка при вызове функции. Выдает ошибку 1062,17? Вызываю вот так fArrExistIn_int(); там, где нужно запустить ее. Что не так я делаю, как будет правильно? :)

 
MrSerj:

Значит. Применил я выше описанное. Получилась вот такая готовая функция по закрытию рыночных ордеров с определенным перечнем магиков.:)

/////////////////////////Функция: ЗАКРЫТИЕ ДИАПОЗОНА ОРДЕРОВ С ОПРЕДЕЛЕННЫМИ МАГИКАМИ /////////////////////////////////////       

int fArrExistIn_int(int aValue, int & aArray[])

  { // Начало функции.
int cnt,total=0,ticket=0,err=0,c=0,slip=7,tries=5;

   for(int ti=0;ti<ArraySize(aArray);ti++){
         if(aValue==aArray[ti]){

          if(fArrExistIn_int(OrderMagicNumber(),MagicAr)!=-1) // Где MagicAr - массив с магическими номерами.
          {
             switch(OrderType())
             {
                case OP_BUY      :
                   for(c=0;c<tries;c++)
                   {
                      RefreshRates();
                      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slip,Yellow);
                      err = GetLastError();
                      if (err==0)   break;
                      else
                      {
                         Print("Errors Closing BUY order");
                         Print(ErrorDescription(err),", error ",err);
                         if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Busy errors
                         { Sleep(3000); continue; }  
                      }
                   }   
                   break;
               
                case OP_SELL     :
                   for(c=0;c<tries;c++)
                   {
                      RefreshRates();
                      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slip,Yellow);
                      err = GetLastError();
                      if (err==0) break;
                      else
                      {
                         Print("Errors Closing SELL order");
                         Print(ErrorDescription(err),", error ",err);
                         if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Busy errors
                         { Sleep(3000); continue; } 
                      }
                   }   
                   break;
             } // switch 
          } // if 
          
      return(ti);
        }
     }
   return(-1);
} // Конец Функции.

////////////// Конец Функции: ЗАКРЫТИЕ ДИАПОЗОНА ОРДЕРОВ С ОПРЕДЕЛЕННЫМИ МАГИКАМИ ////////////////

 


  И как, работает ?  Буду удивлен ;).

Может ошибаюсь, но должно память забить "по самую макушку". Что такое рекурсия Вам известно (выделил в цитате болдом) ? Она не всегда полезна, а в данном случае тем более. Да и сделана для рекурсии неверно.

К тому же не выбирается ордер - от какого ордера берем магик, тип, лот ?.... И, интересно, какая может быть цена закрытия у еще не закрытого ордера ? Да там еще хватает...... Вы б сначала учебник то прочли. 

Удачи. 

ЗЫ или проще: возьмите функцию закрытия ордеров (просто найдите - здесь вариантов масса), добавьте функцию Дмитрия и именно так, как Вам сказали и будет Вам счастье. 

 
Согласен. Не много не то. Уже исправил. :) Спасибо. Пока экспериментирую
 

И, интересно, какая может быть цена закрытия у еще не закрытого ордера ?

Именно та цена и будет BId для OP_BUY и Ask для OP_SELL :)

 
xrust:

Именно та цена и будет BId для OP_BUY и Ask для OP_SELL :)


  Вы код смотрели ? Или так просто отметились  ;)  ? Показываю куда надо смотреть ;) :

 

 case OP_BUY      :
                   for(c=0;c<tries;c++)
                   {
                      RefreshRates();
                      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slip,Yellow);

 Удачи.

ЗЫ Для селл сами найдете ? ;)..... 

 
А что неправильно-то? Рефреш лишний и селекта нет, а так все в порядке.
Причина обращения: