Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Ищешь единомышленников? На форуме их много!
kernel
334
kernel 2010.05.23 23:57 

Локальные переменные в функции, к примеру

int myVar;

Какое будет значение если при инициализации не указывать явно значение? В мкл4 было в хелпе написано, если не указывать явно начальное значение, то присваивается ноль, здесь не нашел.

Документация по MQL5: Основы языка / Переменные / Локальные переменные
Документация по MQL5: Основы языка / Переменные / Локальные переменные
  • www.mql5.com
Основы языка / Переменные / Локальные переменные - Документация по MQL5
Ruslan Khasanov
3027
Ruslan Khasanov 2010.05.24 00:38  

Для кучи:)

 

  double ClosePos=0.0;
   double x=0.0;
   
   ClosePos=BBPos[SymbPos][TFPos][SMALL_BB];  // массив типа double
   Print("Position-",ClosePos);
   x=ClosePos*100.0;
   Print("x-",x);

возвращает следующий результат:

2010.05.24 00:21:03    CH (EURUSD,H4)    x- 0
2010.05.24 00:21:03    CH (EURUSD,H4)    Position- 0.57

а должно быть 56.999999  или нет?

В чем фокус? может кто подскажет кто сталкивался с подобным.


причем, если изменить код на следующий

   double ClosePos=0.0;
   double x=0.0;
   
   ClosePos=0.57;
   Print("Position-",ClosePos);
   x=ClosePos*100.0;
   Print("x-",x);

то все как и должно быть, получаю ожидаемый результат:

2010.05.24 00:34:45    CH (EURUSD,H4)    x- 56.99999999999999
2010.05.24 00:34:45    CH (EURUSD,H4)    Position- 0.57




Vladimir Batrudinov
4863
Vladimir Batrudinov 2010.05.24 08:32  
kernelmd  писал(а)  :

Локальные переменные в функции, к примеру

int myVar;

Какое будет значение если при инициализации не указывать явно значение? В мкл4 было в хелпе написано, если не указывать явно начальное значение, то присваивается ноль, здесь не нашел.

Не знаю как локальные в функции, а вот если вынести их в начало кода то при инициализации вот такая фишка наблюдается:

- При первой инициализации int myVar примет значение равное 0 (если явно не указывать);

- При повторных инициализации (к примеру при смене ТФ) значение будет последним которое было до инициализации. т.е если в ходе работы значение явно указывалось то оно таким и будет, в противном случае будет 0.


PS

Как я понял тут фишка в смене алгоритма работы. В МТ4 такие переменные и динамические массивы обнулялись, а в MT5 этого не происходит.

kernel
334
kernel 2010.05.24 11:25  
да, в функциях замечается тоже самое, только повторная инициализация идет при повторном вызове функции.
Anton
1821
Anton 2010.05.24 12:00  
Документация по MQL5: Основы языка / Переменные / Инициализация переменных
Документация по MQL5: Основы языка / Переменные / Инициализация переменных
  • www.mql5.com
Основы языка / Переменные / Инициализация переменных - Документация по MQL5
kernel
334
kernel 2010.05.24 12:05  

Неявная инициализация не производится.

Понятно спасибо!

Ilyas
1182
Ilyas 2010.05.24 14:30  
Kos :

Для кучи:) 

возвращает следующий результат:

2010.05.24 00:21:03    CH (EURUSD,H4)    x- 0
2010.05.24 00:21:03    CH (EURUSD,H4)    Position- 0.57

а должно быть 56.999999  или нет?

Похоже на ошибку компилятора. Не могли бы прислать код воспроизводящий данную ошибку?
Ruslan Khasanov
3027
Ruslan Khasanov 2010.05.24 14:41  
mql5 :
Похоже на ошибку компилятора. Не могли бы прислать код воспроизводящий данную ошибку?
Ok! позже отправлю через сервисдеск.
Ruslan Khasanov
3027
Ruslan Khasanov 2010.05.24 16:42  

В результате тщательных исследований алгоритма выяснилось, что данный баг происходит, если  в коде есть секция #import.

Вот скрипт, который определяет позицию цены относительно среды Болинджера:
/+------------------------------------------------------------------+
//|                                                          bug.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#define     OPEN_PRICE                                           1
#define     HIGH_PRICE                                           2
#define     LOW_PRICE                                            3
#define     CLOSE_PRICE                                          4

/*
#import "JCPDS.ex5"
string   PatternDesc(int id,int LangID);
string   CandleDesc(int id,int LangID);
#import*/

 int    BBhandle;
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double pos=GetPricePos(1,CLOSE_PRICE);
   Print("position-"+DoubleToString(pos,2));   
  }
//+------------------------------------------------------------------+
double GetPricePos(int Index,uchar AppPrice)
  {
   double BBPos=0.0,
          Length=0.0,
          Width=0.0,
          Upper=0.0,
          Lower=0.0,
          Current=0.0;
          
   double price[1];
  
   
   int copied=0;
   BBhandle=iBands(_Symbol,_Period,120,0,2.0,PRICE_CLOSE);
   
   switch(AppPrice)
     {
      case CLOSE_PRICE:
         copied=CopyClose(_Symbol,_Period,Index,1,price);
         if(copied<0) return(0);
         break;

      case HIGH_PRICE:
         copied=CopyHigh(_Symbol,_Period,Index,1,price);
         if(copied<0) return(0);
         break;

      case LOW_PRICE:
         copied=CopyLow(_Symbol,_Period,Index,1,price);
         if(copied<0) return(0);
         break;

      case OPEN_PRICE:
         copied=CopyOpen(_Symbol,_Period,Index,1,price);
         if(copied<0) return(0);
         break;
     }

   Upper=GetBBValues(UPPER_BAND,Index);
   Lower=GetBBValues(LOWER_BAND,Index);
   Current=price[0];

   if(Current>0 && Upper>0 && Lower>0)
     {
      Length =Current-Lower;
      Width  =Upper-Lower;
      BBPos  =NormalizeDouble(Length/Width,2)*100.0;
     }
   return(BBPos);
  }
  
//+------------------------------------------------------------------+
//|Поучение значений индикатора BB                                   |
//+------------------------------------------------------------------+

double GetBBValues(uchar Buffer,int Index)
  {
   double BB[1];
   if(CopyBuffer(BBhandle,Buffer,Index,1,BB)!=1) BB[0]=0;
   return(BB[0]);
  }  

Результат выполнения :

2010.05.24 16:32:07    bug (EURUSD,H1)    position-47.00

но если активировать секцию 

#import "JCPDS.ex5"
string   PatternDesc(int id,int LangID);
string   CandleDesc(int id,int LangID);
#import

то результат выполнения

2010.05.24 16:28:52    bug (EURUSD,H1)    position-0.00

Как можно объяснить такую ситуацию?

Причем импортируемые функции работают как положено.





Ilyas
1182
Ilyas 2010.05.24 17:41  
Kos :

Как можно объяснить такую ситуацию?

Причем импортируемые функции работают как положено.

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