Удивительное и неожиданное изменение значения константы!!

 

Добрый день всем! :)

Помогите, пожалуйста, разобраться со странной проблемой...


//Объявлено в глобальных
static int max_holding = 2500; // Истечение ордера в минутах (не держать позицию открытой более max_holding)

int start()
{
   ...
   closeExpiredOrders(); // Закрываем истекшие позиции
}

void closeExpiredOrders()
{
   datetime tc = TimeCurrent();
   int i = 0;
   
   for (i = 0; i < OrdersTotal(); i++)
   {
      if (OrderSelect(i, SELECT_BY_POS) == true)
      {
         if (tc >= OrderOpenTime() + max_holding)
         {
            Alert("tc: " + tc + " >> OrderOpenTime(): " + OrderOpenTime() + " ++ max_holding:" + max_holding);
            OrderClose(OrderTicket(), OrderLots(), Bid, 1, CLR_NONE);
         }
      }
   }
   
   return (0);
}


Заметил, что ордера закрываются в неожиданный момент разом... Поставил перед закрытием Алерт, а он мне выдаёт отрицательное значение для max_holding!!!

Сообщение алерта: tc: 1257914946; >> OrderOpenTime(): 1257902950; ++ max_holding-1959738368

 
void ЗакрытьЧерезХМинут(int min=0){
  if(min==0){return;}
  if(Digits==5||Digits==3){double mno=10;}else{mno=1;}
  int slip=MarketInfo(Symbol(),MODE_SPREAD)*mno;
  for(int i=OrdersTotal()+1;i>=0;i--){
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
      if(OrderOpenTime()+min*60>TimeCurrent()){
        if(OrderType()>1){
          OrderDelete(OrderTicket());
        }else{
          if(OrderType()==0){color col=Blue;}else{col=Red;}
          OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(OrderClosePrice(),Digits),slip,col);
        }
      }
    }
  }
  return;
}
 
dreamcutter писал(а) >>

Добрый день всем! :)

Помогите, пожалуйста, разобраться со странной проблемой...

Заметил, что ордера закрываются в неожиданный момент разом... Поставил перед закрытием Алерт, а он мне выдаёт отрицательное значение для max_holding!!!

Сообщение алерта: tc: 1257914946; >> OrderOpenTime(): 1257902950; ++ max_holding-1959738368

По такому куску кода разобраться невозможно. Причина где-то в другом месте. Кто-то прописывает память, занятую переменной max_holding (если, конечно, она явно не меняется в какой-либо другой функции)

 

Спасибо за помощь, разобрался =) Оказывается функция init() запускалась в ходе работы эксперта (кстати почему такое могло быть, вы не знаете?).

А в этой функции был перевод в минуты из секунд: max_holding *= 60;

 
Оказывается при смене периода на графике Init() вызывался!
Причина обращения: