Как сохранять данные переменных от тика к тику?

 

В учебнике написанно, что переменная, определенная до int start(), глобальна для всей программы. У меня есть такой кусок в проге:

double BidMax;


int start()
  {


Comment(" BidMax  ",BidMax,"   Bid  ",Bid);

   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
        OrderSymbol()==Symbol())  
       {


         if(OrderType()==OP_BUY)  
           {

            if(BidMax<Bid)  
              {
               BidMax=Bid;

                Comment("BidMax  ",BidMax);

              } 
           }

              } 
           }
   return;
  }

Но в первом комментарии он всегда показывает BidMax равным нулю, а во втором прыгает туда сюда вместе с Bid.!!!!!
 
double BidMax;

int start()
   {
   static int TickNomber = 0;
   TickNomber++;
   Alert(  "------------TickNomber = ",TickNomber);
   Alert(  "1-- BidMax = ",BidMax,"   Bid = ",Bid);
   Comment("1-- BidMax = ",BidMax,"   Bid = ",Bid);
   int total = OrdersTotal();
   for(int cnt=0; cnt<total; cnt++)
      {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())  
         {
         if(OrderType()==OP_BUY)  
            {

            if(BidMax<Bid)  
               {
               BidMax=Bid;
               Alert(  "2-- BidMax = ",BidMax,"   Bid = ",Bid);
               Comment("2-- BidMax = ",BidMax,"   Bid = ",Bid);
               } 
            }
         } 
      }
   return;
   }

Всё работает так, как написано в учебнике. Результаты работы советника полностью отвечают алгоритму в коде.

По-моему, Вы просто не открыли ордер. По этой причине управление ни разу не было передано в тело цикла for, т.е. значение переменной BidMax ни разу не было изменено.

Откройте ордер Buy и всё заработает (соответственно коду).

 
Проинициализируйте переменную нулём а не по умолчанию.
double BidMax=0;


int start()
  {...
 
Urain писал(а) >>
Проинициализируйте переменную нулём а не по умолчанию.

Спасибо всем, я нашел ошибку. Нужно дейстаительно проинициализировать переменную, но не нулем, а целым, положительным числом отличным от нуля. Почему так, я не понимаю. Это как у шамана - если плюнуть и постучать в бубен - пойдет дождь. Почему, никто не знает, но дождь действительно идет.

 
Urain писал(а) >>
Проинициализируйте переменную нулём а не по умолчанию.

Griggy писал(а) >>

Спасибо всем, я нашел ошибку. Нужно дейстаительно проинициализировать переменную, но не нулем, а целым, положительным числом отличным от нуля. Почему так, я не понимаю. Это как у шамана - если плюнуть и постучать в бубен - пойдет дождь. Почему, никто не знает, но дождь действительно идет.

Не нужно фантазий.
Глобальную переменную инициализировать нулём не обязательно.

Причина в том, что:

1. Код составлен небрежно.
2. Вы не до конца проанализировали как этот код исполняется.

 
SK. писал(а) >>

Не нужно фантазий.
Глобальную переменную инициализировать нулём не обязательно.

Причина в том, что:

1. Код составлен небрежно.
2. Вы не до конца проанализировали как этот код исполняется.

1. Извиняйте, дяденька, но я весь код не вывешивал - места не хватит. Просто вычленил проблемный кусок.

2. Чтож вы хочите, я ж не Программер, а мелкий гуманитарий. Подскажите, как анализировать, а лучше тестировать, а еще лучше тестировать пошагово, а то у меня весь текст пестрит от Comment( )!!!

 
Griggy писал(а) >>

1. Извиняйте, дяденька, но я весь код не вывешивал - места не хватит. Просто вычленил проблемный кусок.

2. Чтож вы хочите, я ж не Программер, а мелкий гуманитарий. Подскажите, как анализировать, а лучше тестировать, а еще лучше тестировать пошагово, а то у меня весь текст пестрит от Comment( )!!!

Используйте Print() и затем смотрите в журнале ход исполнения программы, а Сomment() на экране будет только последний, остальные промелькнут.

 
Griggy писал(а) >>

1. Извиняйте, дяденька, но я весь код не вывешивал - места не хватит. Просто вычленил проблемный кусок.

2. Чтож вы хочите, я ж не Программер, а мелкий гуманитарий. Подскажите, как анализировать, а лучше тестировать, а еще лучше тестировать пошагово, а то у меня весь текст пестрит от Comment( )!!!

Вы бы посмотрели как это выглядит со стороны..

Мало того, что Вам бесплатно помогают и указывают на ошибки, Вы ещё и нахальничаете.

--

На правах "дяденьки":

Программирование - это стиль мышления. У обычного начинающего босяка в голове каша из "тю, а чё оно работает не так, как я хочу?", "пивка бы хлебнуть", "чё он на меня прёт? я ж хороший" в перемешку с соответствующими эмоциями и малоосмысленными намерениями.

Программирование не терпит невнимательности и небрежности. Напротив, оно требует сосредоточенности и полной отдачи (особеннно на этапе изучения).

--

1. Весь код и не нужен. Смысл понятен. В моём сообщении дополнены необх. строки, представленный мною код работает. Запустите и посмотрите что к чему.

2. Я от Вас ничего не хочу. Разве что, немного помочь..

>> Как анализировать?

А. Обычно анализ кода заключается в том, чтобы понять ранее непознанное свойство оператора или алгоритма в целом. Работа сводится к тому, чтобы удалить всё несущественное и продумать ещё раз сущность проблемы.

В Вашем коде (с точки зрения анализа проблемы) "лишними" являются строки:

      if(OrderType()<=OP_SELL &&   

и

        if(OrderType()==OP_BUY) 

В. Используйте для отладки Alert(). В моём коде, например, есть строка

   Alert(  "------------TickNomber = ",TickNomber);

Это сообщение выдаётся в начале каждого тика. Удобно для отделения всего набора сообщений, выдаваемых на каждом тике.

С. Приведите код в порядок и пишите сообщения в каждой строке. Это существенно поможет Вам продвинуться в понимании порядка исполнения программы.

 
FION писал(а) >>

Используйте Print() и затем смотрите в журнале ход исполнения программы, а Сomment() на экране будет только последний, остальные промелькнут.

Спасибо!!!!