Скачать MetaTrader 5

Время жизни переменных

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликуй статью. Миллионы трейдеров ждут хороших идей!
Alexandr Koptelov
13
Alexandr Koptelov 2016.08.08 12:11 

Написал код

   int VidachaRezultatAnalizaTemp=VidachaRezultatAnaliza(); 
   MqlDateTime tempdate,tempdateCur;
   TimeToStruct(time,tempdate);
   TimeToStruct(TimeCurrent(),tempdateCur);
   if(Zamedlenie>=30)
      return;
   if(VidachaRezultatAnalizaTemp<0 || FlagSystemaNakopitelnogoAnaliza)
     {
      if( _Period==PERIOD_H1)
      {
         if (tempdateCur.hour==tempdate.hour && StringFind(commentPosHistory,"sl")>-1  && !FlagRazvorota)
         {
            //эксперимент
            if (FlagSystemaNakopitelnogoAnaliza)
            {
            }
         }
         else
         {
            signal=ORDER_TYPE_SELL;
            velichinaStopaTemp=velichinaStopa/DelitelValut;
         }
      }
      else
      {
         signal=ORDER_TYPE_SELL;
         velichinaStopaTemp=velichinaStopa/DelitelValut;
      }
     }
   else if(VidachaRezultatAnalizaTemp>0)
     {
      if( _Period==PERIOD_H1)
      {
         if (tempdateCur.hour==tempdate.hour && StringFind(commentPosHistory,"sl")>-1  && !FlagRazvorota )
         {
         }
         else
         {
            signal=ORDER_TYPE_BUY;
            velichinaStopaTemp=-velichinaStopa/DelitelValut;
         }
      }
      else
      {
         signal=ORDER_TYPE_BUY;
         velichinaStopaTemp=-velichinaStopa/DelitelValut;
      }
     }
   
//эксперимент
   //эксперимент
   if (FlagSystemaNakopitelnogoAnaliza)
   {
      velichinaStopaTemp=velichinaStopa/DelitelValut;
      FlagRazvorotaPoNakopitItogam=!FlagRazvorotaPoNakopitItogam;
      signal=(FlagRazvorotaPoNakopitItogam? ORDER_TYPE_BUY:ORDER_TYPE_SELL);
      VidachaRezultatAnalizaTemp=PorogPriniatiaResheniaIstoria;
   }

 Так  вот переменная VidachaRezultatAnalizaTemp объявленная практически в начале процедуры даже в отладчике видима только лишь до  "//Эксперимент". Далее отладчик говорит что переменная не определена. Объявлена вне каких либо {} в одной процедуре. Просто уже не первый раз. Перед этим был код в котором обнаруживалась такая же потерянная переменная за большим закомментированным блоком. Закомментированный блок перенёс ниже блока в котором используется переменная и переменная нормально заработала! Что за чудеса не могу понять.

Примерно такая же ерунда со след куском была

   string commentPosHistory="";

   for(int i=total;i>0;i--)
   {
      deal_ticket=               HistoryDealGetTicket(total-1);
      if(HistoryDealGetString(deal_ticket,DEAL_SYMBOL)==_Symbol )
      {
         volume=                    HistoryDealGetDouble(deal_ticket,DEAL_VOLUME);
         time=(datetime)HistoryDealGetInteger(deal_ticket,DEAL_TIME);
         type=                 HistoryDealGetInteger(deal_ticket,DEAL_TYPE);
         commentPosHistory=         HistoryDealGetString(deal_ticket,DEAL_COMMENT);
         profitIstor=               HistoryDealGetDouble(deal_ticket,DEAL_PROFIT);
         
         
         i=0; //выход т.к. получили посл сделку по валюте
      }
   }

 до цикла commentPosHistory есть т.е. в отладчике всё норм, после цикла переменной как будто и не было. Ну и совсем непонятно когда переменная объявлена глобальной а в процедуре потом не находится. Соответствие закрывающих открывающих скобок соблюдено и непонятно, если отладчик не видит переменную почему не ругается, что она не объявлена?

Vladimir Karputov
Модератор
46052
Vladimir Karputov 2016.08.08 12:16  
Вы соберите минимальный код, который можно будет воспроизвести, тогда можно будет говорить подробнее. Пока ничего не понятно.
Alexandr Koptelov
13
Alexandr Koptelov 2016.08.08 13:22  
Karputov Vladimir:
Вы соберите минимальный код, который можно будет воспроизвести, тогда можно будет говорить подробнее. Пока ничего не понятно.
Выкинул всё лишнее, собрал всё в 1 файл (по разным было раскидано). Ошибка не воспроизводится. Толи всё таки скобки (но тоже непонятно почему ошибок компилятор не выдаёт) то ли ещё чего. Смотрю дальше...
Alexandr Koptelov
13
Alexandr Koptelov 2016.08.16 20:56  

Всё равно не понятное поведение. Весь смысл как раз в том какой код есть. И самое непонятное - поведение программы меняется от наличия закоментированных строк. Поэтому собранный код для вас работает нормально, а код который является рабочим для меня выдаёт чудеса. Привожу ссылки на видео где запечатлено интересное поведение переменной "commentPosHistory" состояние которой меняется при наличие либо отсутствии закоментированных строк. в первом видео закоментированных строк меньше и состояние вроде как меняется после выхода из блока кода, НО в следующем видео видно, что состояние переменной меняется даже при отсутствии работы с ней. Переменная объявлена в начале процедуры и она не одна такая. просто на ней легче было показать. Разница между 1 и 2 видео только в большем количестве закоментированых строк. Сам код между видео не менялся

1. https://yadi.sk/i/9Kw8JKCcuGNdC

2. https://yadi.sk/i/11f7ga_UuGNyG

пропажа. Поведение переменной commentPosHistory.mp4
пропажа. Поведение переменной commentPosHistory.mp4
  • yadi.sk
Посмотреть и скачать с Яндекс.Диска
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий